commit d3e574f0af46ebf5edb22d37230735492cef3e94 Author: Maddie Date: Tue Aug 4 22:10:32 2026 -0500 init diff --git a/engine/OpenAL32.dll b/engine/OpenAL32.dll new file mode 100644 index 0000000..c8f637b Binary files /dev/null and b/engine/OpenAL32.dll differ diff --git a/engine/SDL2.dll b/engine/SDL2.dll new file mode 100644 index 0000000..2317a7c Binary files /dev/null and b/engine/SDL2.dll differ diff --git a/engine/changes.txt b/engine/changes.txt new file mode 100644 index 0000000..5ac6018 --- /dev/null +++ b/engine/changes.txt @@ -0,0 +1,1440 @@ +LOVE 11.5 [Mysterious Mysteries] +-------------------------------- + +Released: 2023-12-03 + +* Added "LÖVE Loader" launcher on Android for easier loading of .love files. + +* Changed iOS game selector to alphabetically sort the list of .love files. +* Changed JIT compilation on macOS arm64 (Apple Silicon) to be off by default, since performance and available JIT memory isn't reliable. + +* Fixed inconsistent and buggy behaviour of 'pairs' by updating LuaJIT. +* Fixed "unexpected alignment" errors when running love on some 32 bit Linux systems. +* Fixed running fused games on Windows when the executable has been code-signed. +* Fixed undefined behaviour in love.data.hash's implementation. +* Fixed writing files when a symlink exists in the save directory's path. +* Fixed love.threaderror not being called if the error message is an empty string. +* Fixed a race condition when a Thread is destroyed immediately after Thread:start. +* Fixed unexpectedly slow first frames on macOS. +* Fixed love.joystick.setGamepadMapping when replacing an existing mapping. +* Fixed love.joystick.getGamepadMappingString. +* Fixed duplicate platform fields in love.joystick.saveGamepadMappings. +* Fixed DistanceJoint type information. +* Fixed time drift in Source:tell after a Source loops. +* Fixed audio not always pausing when the app is minimized on Android. +* Fixed RecordingDevice:start to return false instead of hard-crashing on iOS. +* Fixed identical frames in Ogg Theora videos being skipped. +* Fixed love.font.newBMFontRasterizer's single file parameter variant. +* Fixed the original window size not always being restored when exiting fullscreen on Linux. +* Fixed some cases of framerate hitches in Windows when vsync is enabled in windowed mode. +* Fixed colors appearing over-saturated on P3 displays in macOS. +* Fixed textures looking washed out when gamma-correct rendering is used on some Android devices. +* Fixed images with mipmaps when ANGLE is used with an AMD GPU. +* Fixed line rendering when duplicate points are used in the line. +* Fixed line rendering with miter and bevel line join modes when antiparallel lines are formed. +* Fixed a crash when calling Text:add with an empty string parameter. + +LOVE 11.4 [Mysterious Mysteries] +-------------------------------- + +Released: 2022-01-02 + +* Added native arm64 support on macOS. +* Added a variant of love.filesystem.newFileData which accepts a Data object. +* Added Body:getLocalPoints. +* Added Font:getKerning. +* Added support for r16, rg16, and rgba16 pixel formats in Canvases. +* Added Shader:send(name, matrixlayout, data, ...) variant, whose argument order is more consistent than Shader:send(name, data, matrixlayout, ...). + +* Changed all builds and platforms where LOVE provides LuaJIT to use LuaJIT 2.1 instead of 2.0. +* Changed love.timer.getTime to start at 0 when the module is first loaded. +* Changed certain out-of-Lua-memory situations to show a message box instead of instantly crashing. +* Changed the naming scheme of LOVE's embedded Lua files for improved integration with Lua chunkname APIs. + +* Fixed build-time compatibility with Lua 5.4. +* Fixed code compatibility with math.mod and string.gfind when LuaJIT 2.1 is used. +* Fixed errors on some systems related to > 53 bit pointer addresses, when recent versions of LuaJIT 2.1 are used. +* Fixed the default error handler showing a blank screen on some mobile devices. +* Fixed drag-and-drop to open a love game on macOS causing love.event.quit("restart") to fail. +* Fixed fused macOS apps opening other love games when drag-and-drop is used (if the fused app hasn't already removed .love files from recognized document types). +* Fixed File:isEOF when called on a dropped file. +* Fixed support for > 2GB dropped files on desktops. +* Fixed ByteData and DataView missing Data:clone implementations. +* Fixed love.physics meter scale value persisting after love.event.quit("restart"). +* Fixed audio to resume properly after interruption on iOS. +* Fixed love.graphics.newVideo to error instead of crash when an invalid video file is given. +* Fixed initial window creation to set the window's title during creation instead of after. +* Fixed the window's screen position when exiting fullscreen via love.window.setFullscreen. +* Fixed love.displayrotated being given a boolean instead of an enum string. +* Fixed memory corruption and a crash when drawing smooth lines. +* Fixed a crash in Canvas:newImageData when the pixel format's pixel byte size multiplied by its width isn't a multiple of 4. +* Fixed love.graphics.newVolumeImage when explicit mipmaps are provided. +* Fixed freezes and crashes in automatic batching when an AMD GPU is used. +* Fixed love.graphics.print and Image:replacePixels on more AMD/ATI GPUs. +* Fixed Font:setFallbacks to account for different DPI scales in each fallback font. +* Fixed Font:getWrap to not remove trailing newlines. +* Fixed Text:getWidth when the Text's string only contains spaces. +* Fixed a crash with some Intel graphics drivers on Linux. +* Fixed a hang with some Intel graphics drivers on Windows, by preventing gamma correct rendering on affected systems. +* Fixed a crash with some Intel graphics drivers on Windows when mipmapped Canvases are used. +* Fixed texture memory reported by love.graphics.getStats when a volume or array Canvas is created. +* Fixed DXT1 textures which use 1 bit alpha-cutout. +* Fixed rare issues where textures were not sent to shaders correctly. +* Fixed Shader:send(name, data, matrixlayout, ...). +* Fixed quad offsets in ParticleSystems when ParticleSystem:setOffset is not used. +* Fixed a performance issue with setting a small subrange of data in non-stream Meshes and SpriteBatches. +* Fixed rounded rectangles breaking if the rx or ry parameters are negative. +* Fixed rounded rectangle automatic points calculation when rx or ry are more than half the rectangle's size. +* Fixed source code compilation on Xcode 12+. +* Fixed source code compilation on Linux systems that don't provide posix_spawn APIs. + +LOVE 11.3 [Mysterious Mysteries] +-------------------------------- + +Released: 2019-10-27 + +* Added support for FLAC audio files. +* Added support for microphone recording on Android. +* Added t.audio.mic (false by default). On Android, setting it to true requests microphone recording permission from the user. +* Added Decoder:clone. +* Added Data:getFFIPointer. +* Added Joystick:getDeviceInfo. +* Added Joystick:getGamepadMappingString and love.joystick.getGamepadMappingString(guid). +* Added love.math.colorToBytes and love.math.colorFromBytes. +* Added 'usedpiscale' boolean (true by default) to love.window.setMode and love.conf. Disables automatic DPI scaling when false. +* Added love.window.getDisplayOrientation and a love.displayrotated callback. +* Added love.window.get/setVSync, to allow setting vsync without recreating the window. +* Added love.window.getSafeArea. +* Added an optional vertex count parameter to Mesh:setVertices. +* Added support for rgba4, rgb5a1, rgb565, rgb10a2, rg11b10f, r8, rg8, r16, rg16, r16f, rg16f, r32f, and rg32f formats in ImageData and Images. +* Added support for loading .dds files that contain uncompressed pixel data. + +* Changed audio file type detection, so it probes all supported backends for unrecognized extensions. + +* Fixed "bad lightuserdata" errors when running love on some arm64 devices. +* Fixed boot.lua's line numbers in stack traces to match its source code. +* Fixed the deprecation system not fully restarting when love.event.quit("restart") is used. +* Fixed love.isVersionCompatible. +* Fixed named Channels persisting across love.event.quit("restart") occurrences. +* Fixed race conditions when different love.physics Worlds are used in different threads. +* Fixed World:getJoints to return the fully resolved type of the Joint, instead of the base type. +* Fixed love.timer.sleep(0) to return control to the OS scheduler instead of being a no-op. +* Fixed love.math.randomNormal incorrectly using cached state after love.math.setRandomSeed or setRandomState. +* Fixed love.data.hash returning an incorrect hash for certain input sizes. +* Fixed love.data.newByteData to cause a Lua error instead of crashing when invalid arguments are used. +* Fixed the Data-returning variant of love.filesystem.read and File:read to return the number of bytes that were read. +* Fixed love.filesystem's require loaders to error instead of crashing when no argument is given. +* Fixed love.filesystem.mount(Data). +* Fixed a memory leak when loading files in some situations. +* Fixed t.audio.mixwithsystem. +* Fixed audio clicks immediately after playing a Source on iOS. +* Fixed Source:play + Source:stop + Source:play looping the first few ms of sound for streaming Sources on iOS. +* Fixed Source:play + Source:seek looping the first few ms of sound for streaming Sources on iOS. +* Fixed occasional pops in streaming sources on iOS. +* Fixed love.audio.play(sources) to use previously set playback positions on stopped Sources. +* Fixed Source:setEffect(name, true) and Source:getEffect(name) when the effect has no associated Filter. +* Fixed love.audio.newSource(filename, "queue") to cause a Lua error. +* Fixed Source:setPitch to error if the given pitch is <= 0, NaN, or infinity. +* Fixed video seeking and pausing in various scenarios. +* Fixed an audio Source memory leak when a Video gets garbage collected after playing it. +* Fixed video playback support on some Adreno-based Android devices. +* Fixed black fringes around text in some situations. +* Fixed extreme flickering when text moves along non-integer coordinates. +* Fixed the first character in a string sometimes not being processed during text vertex generation. +* Fixed Text:set(" ") not clearing any previously set text in a Text object. +* Fixed love.graphics.getTextureTypes to return a table with boolean values in its fields instead of number values. +* Fixed lines not rendering properly if a single line has more than 65,000 vertices. +* Fixed a pixel shader performance regression on some graphics drivers when OpenGL 3 or OpenGL ES 3 is used. +* Fixed text not showing up on Radeon HD 3000-series graphics cards on Windows. +* Fixed non-integer DPI scale values being truncated to integers in love.graphics.newCanvas. +* Fixed creating depth canvases on Windows systems when using an Intel HD 3000 GPU. +* Fixed automatic batching performance to be more consistent on all operating systems. +* Fixed gammaToLinearPrecise in shaders not being as precise as it should be. +* Fixed ImageData:paste and ImageData:setPixel to have more consistent clamping and rounding of color values when different formats are used. + +LOVE 11.2 [Mysterious Mysteries] +-------------------------------- + +Released: 2018-11-25 + +* Added Source:setAirAbsorption and Source:getAirAbsorption. +* Added Body:setTransform and Body:getTransform. + +* Improved performance of love.graphics.draw slightly on iOS and Android. + +* Fixed filesystem initialization on Windows 10 update 1809. +* Fixed compatibility with Lua 5.2 and 5.3. +* Fixed the explicit format + Data argument variant of love.data.decompress. +* Fixed love.joystick.setGamepadMapping not being able to change existing mappings. +* Fixed a crash on quit on Linux if a custom cursor is active when quitting. +* Fixed a crash in the Data variant of Shader:send when it's called after love.window.setMode. +* Fixed a love.graphics.setCanvas error message to be less confusing. + +LOVE 11.1 [Mysterious Mysteries] +-------------------------------- + +Released: 2018-04-15 + +* Fixed love.graphics.setCanvas failing randomly. +* Fixed love.graphics.clear(colortable) when no Canvas is active. +* Fixed stencil and depth support on older phones. +* Fixed love.event.quit causing crashes and other unexpected behaviour if a Canvas is active. +* Fixed Fixture:getShape crashing when returning a ChainShape. +* Fixed love.joystick.loadJoystickMappings outputting a deprecation warning about love.filesystem.isFile. +* Fixed Source:queue to show the correct argument name in the error message when an invalid data parameter is given. +* Fixed t.console=true causing an error on Windows if lovec.exe is used. + +LOVE 11.0 [Mysterious Mysteries] +-------------------------------- + +Released: 2018-04-01 + + * Added Object:release. + * Added Data:clone. + * Added queueable audio sources. + * Added audio input support. + * Added Source filters: low gain, high gain and band pass. + * Added audio effect APIs (reverb, echo, etc.) + * Added variants of SoundData:getSample/setSample which take a channel parameter. + * Added variants of all table-with-fields-returning get* functions, the new variants take an existing table to fill in. + * Added a variant to World:update, which accepts the number of iterations to run. The defaults are now 8 and 3. + * Added Body:isTouching. + * Added RopeJoint:setMaxLength. + * Added a click count argument to love.mousepressed and love.mousereleased. + * Added variants of love.filesystem.mount which accept a Data or FileData object containing zipped data. + * Added love.filesystem.get/setCRequirePath, and use that to find c libraries for require. + * Added variants of File:read and love.filesystem.read which take an enum to determine whether they return a FileData or a string. + * Added love.data module. It includes hex/base64 encoding functions, MD5 and SHA hashing, string packing, compression APIs, and more. + * Added Channel:hasRead, which checks if a message has been read. Takes an id, which Channel:push will now return. + * Added variants of Channel:demand and Channel:supply which take a timeout argument. + * Added Transform objects to love.math. + * Added support for different ImageData formats, including RGBA8 (the default), RGBA16, RGBA16F, and RGBA32F. + * Added the ability to load Radiance HDR, OpenEXR, and 16 bit PNG images. + * Added love.graphics.getImageFormats (replaces love.graphics.getCompressedImageFormats). + * Added the ability to specify a per-object pixel density scale factor when creating Images, Canvases, Fonts, and Videos. Affects drawing. + * Added Texture:getPixelWidth/Height and love.graphics.getPixelWidth/Height. + * Added Texture:getPixelDensity, love.graphics.getPixelDensity, and Font:getPixelDensity. + * Added Texture:getMipmapCount, getFormat, getLayerCount, getDepth, and getTextureType. + * Added Array, Cubemap, and Volume texture types and corresponding Image and Canvas APIs. + * Added love.graphics.getTextureTypes, returns a table with fields indicating support for each texture type. + * Added mipmapping support to Canvases, including both auto-generated mipmaps and manually rendering to a specific mipmap level. + * Added 'stencil8', 'depth24stencil8', 'depth32fstencil8', 'depth16', 'depth24', and 'depth32f' pixel formats for Canvases. + * Added variant of love.graphics.newCanvas which accepts a table of settings. + * Added optional 'readable' boolean field to the table passed into love.graphics.newCanvas. + * Added optional 'depthstencil' field to the table passed into love.graphics.setCanvas, for using a depth/stencil Canvas. + * Added optional 'depth' and 'stencil' boolean fields to the table passed into setCanvas, for enabling depth and stencil buffers if 'depthstencil' isn't used. + * Added shadow sampler support for Canvases. + * Added love.graphics.setDepthMode for using the depth buffer for depth testing/writes. Depth values of rendered objects can only be set via shaders. + * Added love.graphics.setMeshCullMode, for culling back- or front-facing triangles when drawing a Mesh. + * Added love.graphics.setFrontFaceWinding. + * Added variant of love.graphics.getCanvasFormats which takes a 'readable' boolean. + * Added love.graphics.drawLayer and SpriteBatch:add/setLayer for easily drawing layers of Array Textures. + * Added variants of love.graphics.print and printf which take a Font argument. + * Added variants of love.graphics.clear to control how the active depth and stencil buffers are cleared. + * Added love.graphics.applyTransform and love.graphics.replaceTransform. + * Added love.graphics.transformPoint and love.graphics.inverseTransformPoint. + * Added love.graphics.getStackDepth. + * Added love.graphics.flushBatch for manually flushing automatically batched draws. + * Added SpriteBatch:setDrawRange. + * Added per-shader opt in support for the GLSL 3.30 and GLSL ES 3.00 shading languages. + * Added 'void effect()' pixel shader entry point. + * Added love.graphics.validateShader. + * Added Shader:hasUniform. + * Added support for non-square shader uniform matrices on desktop platforms and on mobile GLSL 3. + * Added Shader:send(matrixname, is_column_major, matrix, ...) which specifies how to interpret the matrix table arguments. + * Added Shader:send variants which accept a Data object. + * Added 'borderellipse' and 'borderrectangle' ParticleSystem distributions. + * Added variant of ParticleSystem:setEmissionArea which accepts an area angle and a flag for whether particle directions are relative to the center of the area. + * Added ParticleSystem:set/getAreaSpreadAngle and set/getAreaSpreadIsRelativeDirection. + * Added love.graphics.captureScreenshot (replaces love.graphics.newScreenshot). + * Added 'glsl3', 'instancing', 'fullnpot','pixelshaderhighp', and 'shaderderivatives' graphics features. + * Added 'anisotropy' graphics limit. + * Added Mesh instancing support via love.graphics.drawInstanced and Mesh:attachAttribute. + * Added a Mesh:attachAttribute variant that takes a different target attribute name. + * Added Mesh:detachAttribute. + * Added a variant of Mesh:setVertexMap which accepts a Data object. + * Added love.window.updateMode. + * Added love.window.isMinimized. + * Added love.window.restore. + * Added the ability to prevent love from creating a stencil buffer for the window. + * Added cycle detection to Variant's table serialization, cycles now cause an error, rather than a stack overflow. + * Added love.graphics.newShader File and FileData variants. + * Added a default love.threaderror callback, which raises the error in the main thread. + * Added checks for invalid constants passed to love.keyboard.isDown/isScancodeDown. + * Added deprecation warnings, on by default for non-fused games. + * Added love.filesystem.getInfo. + * Added 'drawcallsbatched' to love.graphics.getStats. + * Added support for header-less DEFLATE to love.data.compress/decompress. + + * Deprecated love.filesystem.exists / isFile / isDirectory / isSymlink / getLastModified / getSize (use getInfo instead). + * Deprecated love.math.compress / decompress (use love.data.compress / decompress instead). + + * - All renamed APIs are formally deprecated rather than completely removed. + * Renamed love.window.getPixelScale to love.window.getDPIScale. + * Renamed love.mouse.hasCursor to love.mouse.isCursorSupported. + * Renamed ParticleSystem:setAreaSpread to ParticleSystem:setEmissionArea. + * Renamed love.errhand to love.errorhandler. + * Renamed Source/SoundData/Decoder:getChannels to getChannelCount. + * Renamed PrismaticJoint/RevoluteJoint:hasLimitsEnabled to areLimitsEnabled. + * Renamed love.audio.getSourceCount to love.audio.getActiveSourceCount. + * Renamed all get[Object]List functions to get[Object]s. + + * Removed the default source type for love.audio.newSource. + * Removed variant of love.filesystem.newFileData which takes base64 data, use love.data.decode instead. + * Removed the no-argument variant of Text:set, use Text:clear instead. + * Removed love.graphics.getCompressedImageFormats, use love.graphics.getImageFormats instead. + * Removed the 'void effects(...)' pixel shader entry point. Use the new 'void effect()' instead. + * Removed Shader:getExternVariable, use Shader:hasUniform instead. + * Removed love.graphics.newScreenshot, use love.graphics.captureScreenshot instead. + * Removed deprecated enet function host:socket_get_address. + * Removed functions deprecated in LÖVE 0.10.2: + * Removed Shader:sendInt, Shader:sendBoolean, Shader:sentFloat, Shader:sendMatrix, and Shader:sendTexture (use Shader:send instead). + * Removed love.window.isCreated (use love.window.isOpen instead). + + * Improved performance when drawing textures, shapes, lines, and points by automatically batching their draw calls together when possible. + * Improved performance of Shader:send when the Shader is not active. + * Improved performance of love.math.randomNormal when LuaJIT's JIT compiler is enabled. + * Improved performance of love.filesystem.lines and File:lines, especially when reading from a file inside a zip/.love. + + * Changed all color values to be in the range 0-1, rather than 0-255. + * Changed high-dpi functionality to require much less code (often none at all) for graphics to appear at the correct sizes and positions. + * Changed love.graphics.print and friends to ignore carriage returns. + * Changed the 'multiply' blend mode to error if not used with the 'premultiplied' blend alpha mode, since the formula only works with that anyway. + * Changed some love.graphics, love.window, and love.event APIs to cause an error if a Canvas is active. + * Changed stenciling functionality with a Canvas active to require stencil=true (or a custom stencil-formatted Canvas) to be set in setCanvas. + * Changed Mesh:setDrawRange to take 'start' and 'count' parameters instead of 'min' and 'max'. + * Changed the 'vsync' field of love.window.setMode and t.window in love.conf. It's now an integer with 0 disabling vsync. + * Changed the audio playback APIs drastically. + * Changed enet to no longer set the 'enet' global, again matching luasocket. + * Changed Source seeking behaviour, all kinds of Sources now behave similarly when seeking past the boundaries. + * Changed love.timer.step, it now returns dt. + * Changed love.run and love.errhand to return a function for their main loop, which gets called until love quits. + + * Updated and improved command line argument handling. + * Updated the boot sequence to show an error instead of the no-game screen, if a nonexistant folder is passed in as the source game directory. + * Updated 'love.exe --version' on Windows to print to the parent console. + * Updated Android print rerouting and JIT compilation disabling to apply inside threads. + * Updated invalid enum value error messages to show a list of the valid enum values. + * Updated Source:seek to work if the Source isn't playing. + * Updated love.event.poll to stop allocating memory unnecessarily. + * Updated love.math.random to have improved numeric distribution. + * Updated love.graphics to support Core Profile OpenGL 3.3+ when available. + * Updated shaders to always expose derivative functions (dFdx, dFdy, fwidth) when available in OpenGL ES. + * Updated shaders to allow using VERTEX and PIXEL in shader code. + * Updated love.graphics.circle/ellipse/arc/rectangle to take transformation scale into account when determining the number of segments to use. + * Updated Font glyph generation to improve antialiasing. + * Updated Canvas:newImageData to return an ImageData with a format that matches the Canvas' as closely as possible. + * Updated love.graphics.newImage to treat file names ending with "@2x", "@3x", etc. as a pixel density scale factor if none is explicitly supplied. + * Updated the error message when bad values are given to love.graphics.line. + * Updated the maximum love.graphics transformation/state stack depth from 64 to 128. + * Updated the default error handler to allow copying the error to the clipboard when the user decides to do so. + * Updated love.filesystem.setRequirePath to support multiple template '?' characters in each path. + * Updated luasocket to version 3.0rc1. + * Updated love.joystick.loadGamepadMappings so it doesn't error when given an empty string. + * Updated love.joystick.setGamepadMapping to use the controller's name for the new mapping when possible. + + * Fixed error in default error handler when the error message contains non UTF-8 bytes. + * Fixed a memory leak when sending love objects to threads which never load that object's module. + * Fixed a memory leak in enet when peer:send fails. + * Fixed os.execute always returning -1 in Linux. + * Fixed the default reference angle for WeldJoint, PrismaticJoint, and RevoluteJoint. + * Fixed Fixture:getShape to reuse the existing internal Fixture-owned shape. + * Fixed MouseJoint:setFrequency to error instead of crashing if a frequency of 0 is set. + * Fixed love.system.set/getClipboardText to error instead of crashing, when a window hasn't been created. + * Fixed Joystick:getGamepadMapping to work with xinput controllers. + * Fixed love.joystick.setGamepadMapping's replacement code. + * Fixed baseline calculation when rendering text. + * Fixed VaryingTexCoords and love_ScreenSize in shaders to be 'highp' in OpenGL ES, when supported. + * Fixed ParticleSystem:setParticleLifetime to error if a negative value is given. + * Fixed Shader:send and Shader:sendColor ignoring the last argument for an array. + * Fixed a crash when love.graphics.pop is called after a love.window.setMode while the transformation stack was not empty. + * Fixed love.window.isMaximized. + * Fixed video playback to work with a wider range of Ogg Theora files. + * Fixed video seeking to be faster. + * Fixed BezierCurves to error instead of hanging in some situations. + * Fixed compilation of luasocket with newer luajit 2.1.0 beta versions. + +LOVE 0.10.2 [Super Toast] +------------------------- + +Released: 2016-10-31 + + * Added lovec.exe in Windows. It is the same as love.exe but built with the Console subsystem, so it always uses or provides a console. + * Added the ability to restart the game via love.event.quit("restart"). + * Added support for passing a table to love.mouse.isDown, love.keyboard.isDown, love.keyboard.isScancodeDown, Joystick:isDown, and Joystick:isGamepadDown. + * Added love.window.isMaximized. + * Added 'shaderswitches' field to the table returned by love.graphics.getStats. + * Added Quad:getTextureDimensions. + * Added 'ellipse' area distribution to ParticleSystems. + * Added support for BC4-7 compressed texture formats in KTX files. + * Added PrismaticJoint:getAxis and WheelJoint:getAxis. + * Added 2-point version of love.physics.newRevoluteJoint. + * Added table variants of Fixture:setCategory and Fixture:setMask. + * Added getNextVertex and getPreviousVertex to ChainShape and EdgeShape. + * Added optional reference angle arguments to RevoluteJoint, PrismaticJoint, and WeldJoint constructors. + * Added RevoluteJoint:getReferenceAngle, PrismaticJoint:getReferenceAngle, and WeldJoint:getReferenceAngle. + + * Deprecated undocumented Shader:sendTexture, Shader:sendMatrix, Shader:sendInt, and Shader:sendFloat functions. + + * Fixed love on iOS 6. + * Fixed os.execute always returning -1 on Linux. + * Fixed the love.lowmemory callback to call collectgarbage() after the callback has fired, instead of before. + * Fixed love.math.noise(nil) to error instead of returning nil. + * Fixed an occasional crash when a Thread ends. + * Fixed a hang at the end of video playback with some video files. + * Fixed the video decoding thread to not do any work when there are no videos to decode. + * Fixed love.graphics.newVideo(file) to no longer error if love.audio is disabled. + * Fixed a rare bug in Source:play for streaming Sources if the associated OpenAL source object was previously used for a static Source. + * Fixed corrupted Font glyphs in rare cases. + * Fixed stencils inside Canvases on some OpenGL ES 2 devices. + * Fixed an OpenGL error in OpenGL ES 3 when multiple render targets are used. + * Fixed love.window.setMode crashing when called with a Canvas active. + * Fixed love.window.maximize to update the reported window dimensions immediately. + * Fixed gamma correction of ImageFonts and BMFonts with colored images. + * Fixed the default shader improperly applying gamma correction to per-vertex colors when gamma correction is requested but not supported on OpenGL ES. + * Fixed text coloring breaking because of an empty string. + * Fixed large burst of particles when dramatically increasing the emission rate of a ParticleSystem. + * Fixed SpriteBatch:setBufferSize to keep old sprite data if it can fit. + * Fixed MouseJoint:getBodies unconditionally erroring. + * Fixed memory leak in Text:set. + * Fixed incorrect kerning caused by using kerning information for the wrong character in some fonts. + * Fixed ImageData:setPixel/getPixel/mapPixel and SoundData:setSample/getSample to properly handle non-integer coordinates. + + * Improved performance of Channel methods by roughly 2x in many cases. + * Improved performance of Shader:send when small numbers of arguments are given. + + * Updated love.filesystem.mount to accept a DroppedFile as the first parameter. + * Updated Shader:send to do type and argument checking based on the specified uniform variable's information instead of the arguments to the function. + * Updated Shader:send to accept a flat table for matrix uniforms. + + +LOVE 0.10.1 [Super Toast] +------------------------- + +Released: 2016-02-14 + + * Added a new love.conf flag t.externalstorage, which determines whether files are saved in internal or external storage on Android devices. + * Added a new variant of love.graphics.arc which can draw different types of arcs ("pie", "open", or "closed"). + * Added "lighten" and "darken" BlendModes. They can only be used with the "premultiplied" BlendAlphaMode. + * Added the "lighten" GraphicsFeature constant. + * Added the ability to avoid clearing specific Canvases when calling love.graphics.clear, if multiple Canvases are active at once via love.graphics.setCanvas. + * Added Text:getDimensions. + * Added optional "collideconnected" argument to love.physics.newMotorJoint. + + * Fixed a Lua error in the no-game screen if the window's height is too small. + * Fixed the default error handler to reset the mouse Cursor. + * Fixed love.filesystem functions crashing when called if liblove is used directly without calling love.filesystem.init. + * Fixed audio on Android to pause when the app is inactive, and resume when the app becomes active again. + * Fixed the Video decoding thread hanging after Video:seek or when a Video finishes. + * Fixed Video:isPlaying to always return false after it finishes playing. + * Fixed RandomGenerator:random crashing if a nil 'self' is used. + * Fixed loading BMFont files which have characters with 0 width or height (a space character, for example). + * Fixed love.graphics.newFont causing crashes if FileData is passed in. + * Fixed love.graphics.clear(colortable) causing crashes on OpenGL ES 2 systems when a Canvas is active. + * Fixed a driver bug on some Android devices which caused all objects to show up as black. + * Fixed a driver bug on Windows with AMD graphics cards where love.graphics.clear would not always work. + * Fixed Shader:sendColor incorrectly converting alpha values from sRGB to linear RGB when gamma-correct rendering is enabled. + * Fixed love.graphics.newMesh(vertices) double-converting colors from sRGB to linear RGB when gamma-correct rendering is enabled. + * Fixed love.graphics.new* crashing when there is no graphics context/window. + + * Updated the Windows executable to prefer the high-powered AMD graphics card on systems which have switchable Intel+AMD GPUs. + * Updated love.touch.getTouches to return the list of IDs in the relative order that the touches initially happened, instead of being in a random order. + * Updated the error messages caused by invalid or bad arguments to ImageData and SoundData methods to be more descriptive. + + +LOVE 0.10.0 [Super Toast] +------------------------- + +Released: 2015-12-22 + + * Added an iOS port. + * Added an Android port. + * Added the flag t.accelerometerjoystick to love.conf. Disables accelerometer-as-joystick functionality on mobile devices when false. + * Added the flag t.gammacorrect to love.conf (replaces t.window.srgb.) Enabling it globally enables gamma-correct rendering, when supported. + * Added video playback support for Ogg Theora videos, via love.graphics.newVideo and Video objects. + * Added love.video module. It is not used for displaying videos on-screen, only decoding them. + * Added love.touch module. Note that it has important differences from the touch implementation in the LÖVE 0.9 Android and iOS ports. + * Added love.touchpressed, love.touchreleased, and love.touchmoved. + * Added love.system.vibrate. + * Added love.filesystem.setRequirePath and love.filesystem.getRequirePath. + * Added an optional program exit argument to love.event.quit. + * Added love.filedropped and love.directorydropped event callback functions. + * Added love.lowmemory event callback function, called when the app is running out of memory on mobile operating systems. + * Added love.textedited event callback function, called when the user is compositing text (e.g. via an IME.) + * Added love.wheelmoved event callback function (replaces "wu" and "wd" constants for love.mousepressed.) + * Added love.mouse.hasCursor. + * Added a boolean argument to love.mousepressed and love.mousereleased indicating whether the button event originated from a touch press. + * Added optional x/y/width/height arguments to love.keyboard.setTextInput. They tell the system where text will show up so on-screen keyboards can avoid that area. + * Added Source:getType (replaces Source:isStatic.) + * Added Source:getDuration and Decoder:getDuration. + * Added an optional string argument containing raw pixel byte data to the width/height variant of love.image.newImageData. + * Added love.graphics.ellipse. + * Added rounded-rectangle support to love.graphics.rectangle. + * Added love.graphics.points (replaces love.graphics.point.) + * Added love.graphics.intersectScissor. + * Added an optional argument to love.graphics.setBlendMode which indicates whether to treat the colors of drawn objects as having pre-multiplied alpha. + * Added love.graphics.getSupported (replaces love.graphics.isSupported.) + * Added love.graphics.getSystemLimits (replaces love.graphics.getSystemLimit.) + * Added love.graphics.stencil and love.graphics.set/getStencilTest (replaces love.graphics.setStencil.) + * Added love.graphics.isActive. + * Added color arguments to love.graphics.clear. It no longer always uses the background color value. + * Added love.graphics.discard. + * Added love.graphics.isGammaCorrect. + * Added the "clampzero" WrapMode. + * Added the ability to specify custom mipmaps when creating an image, via love.graphics.newImage(filename, {mipmaps={mip1, mip2, ...}}) + * Added optional x/y/width/height arguments to Image:refresh and Canvas:newImageData. + * Added Image:getFlags. + * Added one- and two-channel Canvas formats: r8, rg8, r16f, rg16f, r32f, and rg32f. + * Added support for different formats in each Canvas when using multi-canvas rendering. Added the "multicanvasformats" Graphics Feature constant. + * Added support for OpenGL ES 2 and 3. + * Added support for loading ETC, EAC, PVRTC, and ASTC compressed textures on systems that support them. + * Added custom vertex attribute support for Meshes via new variants of love.graphics.newMesh. + * Added Mesh:setVertexAttribute and Mesh:getVertexAttribute. + * Added Mesh:getVertexFormat. + * Added Mesh:flush. + * Added an optional 'startvertex' argument to Mesh:setVertices. + * Added the ability for love.graphics.newMesh and Mesh:setVertices to accept a Data object. + * Added Mesh:setAttributeEnabled and Mesh:isAttributeEnabled. + * Added Mesh:attachAttribute. + * Added SpriteBatch:attachAttribute. + * Added Shader:sendColor. + * Added new shader functions: gammaCorrectColor, gammaToLinear, and linearToGamma. The functions also have 'precise' and 'fast' variants. + * Added Text objects and love.graphics.newText. + * Added per-character color support to love.graphics.print/printf and to Text objects. + * Added BMFont bitmap font file support to love.graphics.newFont and love.font. + * Added kerning support for TrueType/OpenType and BMFont Fonts. + * Added an optional font hinting argument to love.graphics.newFont when loading TrueType fonts. + * Added an optional spacing argument to love.graphics.newImageFont, which applies additional spacing to all rendered glyphs. + * Added Font:setFallbacks. + * Added love.window.maximize. + * Added love.window.close. + * Added love.window.requestAttention. + * Added love.window.setDisplaySleepEnabled and love.window.isDisplaySleepEnabled. + * Added BezierCurve:renderSegment and BezierCurve:removeControlPoint. + * Added BezierCurve:getSegment. + * Added love.math.compress and love.math.decompress. + * Added Channel:performAtomic. + + * Changed love.mousepressed, love.mousereleased, and love.mouse.isDown to use button numbers instead of named button constants. + * Changed love.keypressed to be love.keypressed(key, scancode, isrepeat). + * Changed love.keyreleased to be love.keyreleased(key, scancode). + * Changed Font:getWrap's second return value to be a table containing the text split into lines. + * Changed love.graphics.newImage's optional second argument to be a table of flags (flags are "mipmaps" and "linear".) + * Changed the arguments for the standard variants of love.graphics.newMesh to newMesh(vertices [, drawmode, usage]) and newMesh(vertexcount [, drawmode, usage]). + * Changed ImageData:encode to return a FileData object. ImageData:encode's first parameter is now the format to encode to, and the second parameter is an optional filename to write to. + + * Renamed the "normal" Fullscreen Type to "exclusive". + * Renamed the DistanceModel constants "inverse clamped", "linear clamped", and "exponent clamped" to "inverseclamped", "linearclamped", and "exponentclamped". + * Renamed the "additive", "subtractive", and "multiplicative" BlendModes to "add", "subtract", and "multiply". + * Renamed the KeyConstant and Scancode representing the spacebar from " " to "space". + * Renamed File:eof to File:isEOF. + * Renamed Canvas:getImageData to Canvas:newImageData. + * Renamed love.image's CompressedData type to CompressedImageData. + + * Removed callback variant of love.filesystem.getDirectoryItems. + * Removed the "wu" and "wd" constants for love.mousepressed (replaced by love.wheelmoved.) + * Removed the named mouse button constants (replaced by button numbers.) + * Removed Source:isStatic (replaced by Source:getType.) + * Removed image loading support for all (non-compressed texture) file formats except for PNG, JPEG, TGA, and BMP. + * Removed JPEG encoding support from ImageData:encode. + * Removed love.graphics.point (replaced by love.graphics.points.) + * Removed love.graphics.setPointStyle and love.graphics.getPointStyle. + * Removed love.graphics.isSupported (replaced by love.graphics.getSupported.) + * Removed love.graphics.getSystemLimit (replaced by love.graphics.getSystemLimits.) + * Removed love.graphics.setStencil (replaced by love.graphics.stencil and love.graphics.setStencilTest.) + * Removed the "canvas", "shader", "npot", "subtractive", and "mipmap" Graphics Feature constants (the features always have guaranteed support now.) + * Removed the "multicanvas" Graphics Feature constant (use love.graphics.getSystemLimits instead.) + * Removed the "srgb" Graphics Feature constant (use love.graphics.isGammaCorrect() or love.graphics.getCanvasFormats().srgb instead.) + * Removed the "srgb" flag in love.window.setMode and in the t.window table in love.conf (Replaced by t.gammacorrect.) + * Removed the "premultiplied" blend mode (love.graphics.setBlendMode("alpha", "premultiplied") now does the same thing.) + * Removed Canvas:getPixel (use Canvas:newImageData instead.) + * Removed Canvas:clear (use love.graphics.clear instead.) + * Removed Mesh:getVertices. + * Removed Mesh:setVertexColors and Mesh:hasVertexColors (use Mesh:setAttributeEnabled("VertexColor", enable) instead.) + * Removed functions deprecated in LOVE 0.9.1 and 0.9.2: + * Removed love.graphics.getMaxImageSize and love.graphics.getMaxPointSize (replaced by love.graphics.getSystemLimits.) + * Removed Mesh:set/getImage, SpriteBatch:set/getImage, and ParticleSystem:set/getImage (replaced by set/getTexture.) + * Removed SpriteBatch:bind/unbind. + * Removed Canvas:getFSAA and the "fsaa" flag in love.conf and love.window.setMode (replaced by Canvas:getMSAA and "msaa".) + * Removed the "dxt" and "bc5" Graphics Feature constant (replaced by love.graphics.getCompressedImageFormats.) + * Removed the "hdrcanvas" Graphics Feature constant (replaced by love.graphics.getCanvasFormats.) + * Removed love.window.getWidth/getHeight/getDimensions (use love.graphics.getWidth/getHeight/getDimensions or love.window.getMode instead.) + + * Fixed utf8.char. + * Fixed detection of fused love games. + * Fixed World:getCallbacks and World:getContactFilter when used in coroutines. + * Fixed crashes when objects which store Lua callback functions are garbage collected after being used in coroutines. + * Fixed memory leaks in love.physics if World:destroy is never called. When a World is GCed it now destroys all objects it owns. + * Fixed love.keyboard.getKeyFromScancode crashing when an invalid scancode is given. + * Fixed decoding of 8-bit WAV files. + * Fixed a crash issue when rewinding streaming ogg Sources, when certain versions of libvorbis are used. + * Fixed love.audio.stop() not rewinding streaming Sources. + * Fixed the stencil buffer in Canvases when an unsupported MSAA value is used to create the Canvas. + * Fixed Canvas:renderTo to restore the previous Canvas if an error occurs in the passed function. + * Fixed love.graphics.draw(canvas) to cause an error if that Canvas is the active one. + * Fixed Mesh:getVertexMap to return nil rather than an empty table, if no vertex map has been set. + * Fixed love.graphics.getColorMask. + * Fixed the default offset for particles when ParticleSystem:setQuads or ParticleSystem:setTexture is used. + * Fixed love.graphics.shear resetting all love.graphics transformations. + * Fixed the "add" and "subtract" blend modes to no longer modify the alpha of the Canvas / screen. + + * Improved the performance of World:rayCast and World:queryBoundingBox. + * Improved the performance of love.graphics.line and other line drawing functions, when the "smooth" LineStyle is used. + * Improved the performance of Shader:send when matrices are used. + * Improved the performance of ImageData and SoundData methods when LuaJIT's JIT compiler is enabled, by using efficient FFI code. + * Improved the performance of love.math.noise, love.math.gammaToLinear, love.math.linearToGamma, love.math.random, and RandomGenerator:random when LuaJIT's JIT compiler is enabled. + + * Updated the compatibility warning notice to use a message box and to show the version specified in love.conf. + * Updated the compatibility warning notice to display before main.lua is loaded. + * Updated the __tostring metamethod of love objects to output the pointer value, similar to tostring(table). + * Updated World:setCallbacks, World:setContactFilter, World:queryBoundingBox, and World:rayCast to have improved argument type checking. + * Updated threads to load love.filesystem automatically. + * Updated love.filesystem to enable symlinks by default. + * Updated love.math.setRandomSeed and RandomGenerator:setSeed to produce better results for the first few random() calls. + * Updated love.math.random and RandomGenerator:random to produce slightly better results in general. + * Updated Source methods that deal with spatial audio to error rather than failing silently if the Source isn't mono. + * Updated the 3D and 4D variants of love.math.noise to use Perlin noise rather than Simplex noise, to avoid patent issues. + * Updated ImageFonts to no longer treat separator pixels as spacing. + * Updated the default font to use less memory. + * Updated the behavior of text wrapping with love.graphics.printf and Font:getWrap to work better. + * Updated love.graphics.print and love.graphics.printf to no longer automatically round the x and y position arguments. + * Updated some error messages for love.graphics.newImage to be more descriptive. + * Updated love.graphics color functions to automatically apply love.math.gammaToLinear to color values when gamma-correct rendering is enabled. + * Updated the 'normal' Canvas format to internally use 'srgb' rather than 'rgba8' when gamma-correct rendering is enabled. + * Updated love.graphics.setColor to affect all drawn objects, including ParticleSystems, SpriteBatches, and Meshes. + * Updated the default fullscreen type to be "desktop" rather than "exclusive". + * Updated the minimum runtime system requirements of LOVE to require OpenGL 2.1 or OpenGL ES 2 support. + * Updated the pixel shader effect function so screen_coords.y is 0 at the top of the screen instead of the bottom. + * Updated Images to require setting the mipmaps flag to true on creation in order to use mipmaps. + * Updated Images to allow mipmaps for non-power-of-two sizes. + +LOVE 0.9.2 [Baby Inspector] +--------------------------- + + Released: 2015-02-14 + + * Added Lua 5.3's UTF-8 module (via utf8 = require("utf8")). + * Added Shader:getExternVariable. + * Added several new canvas texture formats. + * Added love.graphics.getCanvasFormats. + * Added love.graphics.getCompressedImageFormats. + * Added ParticleSystem:setQuads. + * Added ParticleSystem:setLinearDamping. + * Added SpriteBatch:flush. + * Added love.graphics.getStats. + * Added "mirroredrepeat" wrap mode. + * Added love.audio.setDopplerScale and love.audio.getDopplerScale. + * Added optional duration argument to Joystick:setVibration. + * Added love.joystick.loadGamepadMappings and love.joystick.saveGamepadMappings. + * Added Joint:setUserData and Joint:getUserData. + * Added Joint:getBodies. + * Added GearJoint:getJoints. + * Added Contact:getFixtures and Body:getContactList. + * Added Body:getWorld. + * Added Body:getJointList. + * Added Body/Contact/Fixture/Joint/World:isDestroyed. + * Added love.mousemoved event callback. + * Added love.mouse.setRelativeMode and love.mouse.getRelativeMode. + * Added Scancode enums, love.keyboard.getKeyFromScancode, and love.keyboard.getScancodeFromKey. + * Added love.window.getDisplayName. + * Added love.window.minimize. + * Added love.window.showMessageBox. + * Added 'refreshrate' field to the table returned by love.window.getMode. + * Added love.window.toPixels and love.window.fromPixels. + * Added love.window.setPosition and love.window.getPosition, and 'x' and 'y' fields to love.window.setMode and t.window in love.conf. + * Added love.filesystem.isSymlink, love.filesystem.setSymlinksEnabled, and love.filesystem.areSymlinksEnabled. + * Added love.filesystem.getRealDirectory. + + * Deprecated SpriteBatch:bind and SpriteBatch:unbind. + * Deprecated all uses of the name 'FSAA' in favor of 'MSAA'. + * Deprecated the 'hdrcanvas' graphics feature enum in favor of getCanvasFormats. + * Deprecated the 'dxt' and 'bc5' graphics feature enums in favor of getCompressedImageFormats. + + * Fixed crashes when love objects are used in multiple threads. + * Fixed love.filesystem.setIdentity breaking in some situations when called multiple times. + * Fixed the default love.filesystem identity when in Fused mode in Windows. + * Fixed love.system.openURL sometimes blocking indefinitely on Linux. + * Fixed love.joystick.setGamepadMapping. + * Fixed the order of vertices in ChainShapes. + * Fixed love.mouse.getPosition returning outdated values if love.mouse.setPosition is used in the same frame. + * Fixed love.graphics.newFont to error when given an invalid size argument. + * Fixed the filename and backtrace given when love.graphics.print errors. + * Fixed a small memory leak if love.graphics.newCanvas errors. + * Fixed shader:getWarnings returning unnecessary information. + * Fixed some cases of noncompliant shader code not properly erroring on some nvidia drivers. + * Fixed a potential crash when Shader objects are garbage collected. + * Fixed a potential small memory leak triggered when love.graphics.newShader errors. + * Fixed love.graphics.newMesh(vertexcount, ...) causing the Mesh to do instanced rendering. + * Fixed Mesh:getVertexMap. + * Fixed Image:refresh generating mipmaps multiple times if mipmap filtering is enabled. + * Fixed Image:setMipmapFilter to not keep bad state around if it errors. + * Fixed Mesh:setDrawRange when the Mesh has a vertex map set. + * Fixed internal detection of the 'position' and 'effect' shader functions. + * Fixed Texture memory leak when Meshes are garbage collected. + * Fixed the default line join mode to be 'miter' instead of an undefined value. + * Fixed the default error handler text size when highdpi mode is enabled on a Retina monitor. + * Fixed the default error handler background color when sRGB mode is enabled for the window. + * Fixed love.window.setMode to fall back to the largest available mode if a width or height greater than the largest supported is specified and fullscreen is used. + * Fixed the state of wireframe mode when love.window.setMode is called. + * Fixed Canvas:getPixel to error if the coordinates are not within the Canvas' size. + * Fixed detection of compressed textures to work regardless of the file's extension. + + * Renamed all cases of FSAA to MSAA. The FSAA names still exist for backward-compatibility. + + * Updated the Windows executable to automatically prefer the higher performance GPU on nvidia Optimus systems. + * Updated the --console command-line argument in Windows to open the console before conf.lua is loaded. + * Updated t.console and the --console command-line argument in Windows to use the existing Console window, if love was launched from one. + * Updated the love executable to verify that the love library's version matches. + * Updated the Lua wrapper code for modules to avoid crashes when the module's instance is created, deleted, and recreated. + * Updated internal code for handling garbage collection of love objects to be more efficient. + * Updated love's initialization code to trigger a Lua error if love.conf has an error in it. + * Updated the paths returned by love.filesystem.getSaveDirectory and friends to strip double-slashes from the string. + * Updated the error message when love.filesystem.write or File:open fails because the directory doesn't exist. + * Updated the error message when love.math.setRandomseed(0) is attempted. + * Updated the error message when invalid UTF-8 strings are used in love functions that expect UTF-8. + * Updated love.physics.newPolygonShape and love.physics.newChainShape to accept a table of vertices. + * Updated love.physics.newChainShape to error if the number of arguments is invalid. + * Updated love.thread.newThread to accept a literal string of code directly. + * Updated love-created threads to use names visible in external debuggers. + * Updated SpriteBatch:unbind to use less VRAM if the SpriteBatch has the static usage hint. + * Updated love.graphics.newImage, love.image.newImageData, etc. to leave less Lua-owned memory around. + * Updated love.graphics.push to accept different stack types to push. Current types are "transform" and "all". + * Updated love shaders to accept GLSL ES precision qualifiers on variables, although they do nothing. + * Updated the error message for love.graphics.newShader to be less cryptic if an invalid filename is given. + * Updated compressed texture loading code to allow BC6 and BC7 compressed textures (if the graphics driver supports them.) + +LOVE 0.9.1 [Baby Inspector] +--------------------------- + + Released: 2014-04-01 + + * Added Source:clone. + * Added blend mode "screen". + * Added ParticleSystem:clone. + * Added ParticleSystem:moveTo, has smoother emitter movement compared to setPosition. + * Added ParticleSystem:setRelativeRotation. + * Added love.graphics.setWireframe for debugging. + * Added Mesh:setDrawRange and Mesh:getDrawRange. + * Added CircleShape:getPoint and CircleShape:setPoint. + * Added Mesh/SpriteBatch/ParticleSystem:setTexture, accepts Canvases and Images. + * Added high-dpi window support for Retina displays in OS X, via the 'highdpi' window flag. + * Added love.window.getPixelScale. + * Added love.graphics.getSystemLimit. + * Added antialiasing support to Canvases. + * Added Canvas:getFSAA. + * Added 'love_ScreenSize' built-in variable in shaders. + * Added love.getVersion. + * Added support for gamma-correct rendering. + * Added love.graphics.isSupported("srgb"). + * Added love.math.gammaToLinear and love.math.linearToGamma. + * Added RandomGenerator:getState and RandomGenerator:setState. + * Added Body:setUserData and Body:getUserData. + * Added some missing obscure key constants. + * Added optional callback function argument to love.filesystem.getDirectoryItems. + * Added love.system.openURL. + + * Deprecated Mesh/SpriteBatch/ParticleSystem:setImage. + * Deprecated love.graphics.getMaxImageSize and love.graphics.getMaxPointSize. + + * Fixed love.graphics.scale with negative values causing incorrect line widths. + * Fixed Joystick:isDown using 0-based button index arguments. + * Fixed Source:setPitch to error when infinity or NaN is given. + * Fixed love.graphics.setCanvas() to restore the proper viewport and scissor rectangles. + * Fixed TrueType font glyphs which request a monochrome bitmap pixel mode. + * Fixed love.graphics.reset causing crashes when called in between love.graphics.push/pop. + * Fixed tab characters ("\t") to display properly with love.graphics.print. + * Fixed love.graphics.isCreated to return false when love.window.setMode fails completely. + * Fixed love.window.setMode to not destroy OpenGL resources before checking whether a fullsceren size is supported. + * Fixed World:getBodyList and World:getJointList causing hard crashes. + * Fixed loading BC4 compressed textures. + * Fixed SoundData objects being initialized with garbage values. + * Fixed 8-bit SoundData samples when used in love.audio Sources. + + * Updated the error text for love.filesystem’s module searchers when require fails. + * Updated the love.filesystem module searchers to be tried after package.preload instead of before. + * Updated love.graphics.newParticleSystem, newSpriteBatch, and newMesh to accept Canvases. + * Updated Canvas drawing code, texture coordinates are no longer flipped vertically. + * Updated Canvas:renderTo to work properly if a Canvas is currently active. + * Updated ParticleSystem:setEmissionRate to accept non-integer numbers. + * Updated Source:play to return a boolean indicating success. + * Updated t.console in conf.lua to create the console before modules are loaded in Windows. + * Updated Mesh vertex maps (index buffers) to use less space in VRAM. + * Updated love.graphics.newMesh and Mesh:setVertices to default the UV parameters to 0,0. + * Updated Fixture:set/getUserData to work in Coroutines. + * Updated fullscreen-desktop and resizable window modes in OS X to use Mac OS 10.7's fullscreen Spaces. + * Updated love.filesystem's C library loader to look in paths added via love.filesystem.mount, in Fused mode. + * Updated the default love.run code to make initial love.math.random calls more random. + +LOVE 0.9.0 [Baby Inspector] +--------------------------- + + Released: 2013-12-13 + + * Added better multiplayer networking support via ENet. + * Added --fused command line argument, to simulate fusing. + * Added liblove. + * Added the ability to have exit values. + * Added exit value of 1 in case of error by default. + * Added basic support for the file:// uri scheme. + * Added love.filesystem.isFused. + * Added love.filesystem.getIdentity. + * Added love.filesystem.append. + * Added love.filesystem.getSize. + * Added love.filesystem.mount and love.filesystem.unmount. + * Added optional file search order parameter to love.filesystem.setIdentity. + * Added File:isOpen and File:getMode. + * Added Fie:setBuffer, File:getBuffer, and File:flush. + * Added textinput event for unicode text input. + * Added love.keyboard.setTextInput and love.keyboard.hasTextInput. + * Added previously internal Rasterizer and GlyphData object methods. + * Added support for UTF-8 ImageFonts. + * Added Font:getAscent/getDescent/getBaseline. + * Added Font:setFilter/getFilter. + * Added Font:hasGlyphs. + * Added angle, scale, and shear parameters to love.graphics.printf. + * Added HDR canvas support. + * Added mipmapping support (has isSupported test). + * Added vertex shader support. + * Added boolean support to Shader:send. + * Added Canvas:getPixel. + * Added blend mode "replace". + * Added line join modes. + * Added Mesh objects, allowing for arbitrary textured polygons. + * Added multiple render target support to love.graphics.setCanvas. + * Added love.graphics.setColorMask. + * Added love.graphics.origin. + * Added love.graphics.getRendererInfo. + * Added love.graphics.getMaxImageSize. + * Added SpriteBatch:getCount and SpriteBatch:getBufferSize. + * Added SpriteBatch:getColor. + * Added ParticleSystem:emit. + * Added ParticleSystem:setInsertMode and ParticleSystem:getInsertMode. + * Added many ParticleSystem getter methods. + * Added DXT compressed texture support via love.image.newCompressedData. + * Added love.image.isCompressed and Image:isCompressed. + * Added Image/Canvas/ImageData:getDimensions. + * Added anisotropic filtering support for Images, Canvases, and Fonts. + * Added Image:refresh. + * Added Image:getData. + * Added SoundData:getDuration and SoundData:getSampleCount. + * Added Source:isPlaying. + * Added Source:setRelative and Source:isRelative. + * Added Source:setCone and Source:getCone. + * Added Source:getChannels. + * Added new Channels API for love.thread. + * Added limited table support to Channel:push. + * Added Thread:getError. + * Added Thread:isRunning. + * Added threaderror event. + * Added love.math module. + * Added a platform-independent (good) random implementation to love.math. + * Added RandomGenerator objects. + * Added BezierCurve objects. + * Added love.math.triangulate and love.math.isConvex. + * Added love.math.noise. + * Added love.timer.getAverageDelta. + * Added Data:getString. + * Added Contact:getChildren. + * Added love.system module. + * Added love.system.getClipboardText and love.system.setClipboardText. + * Added love.system.getOS and love.system.getProcessorCount. + * Added love.window module. + * Added love.window.isVisible. + * Added flags to love.window.setMode. + * Added monitor choosing support to love.window.setMode. + * Added support for resizable, borderless, and non-centered windows. + * Added support for "fullscreen-desktop" mode. + * Added window resize and visible events. + * Added love.window.getDimensions. + * Added love.window.getIcon. + * Added t.window.icon to love.conf. + * Added love.mousefocus and love.window.hasMouseFocus. + * Added custom hardware cursors via love.mouse.newCursor. + * Added love.mouse.setX/setY. + * Added Joystick objects. + * Added love.joystick.getJoystick. + * Added joystick connect and disconnect events. + * Added joystickaxis and joystickhat events. + * Added unified Gamepad API for joysticks which have a similar layout to the Xbox controller. + * Added joystick vibration support, works with most common gamepads. + * OPTIONAL: Added support for Game Music Emu. + + * Fixed fused mode in OS X. + * Fixed printing to the console in Windows before love.load is called. + * Fixed the default love.run to not include the time taken by love.load in the first frame's dt. + * Fixed the error screen not always appearing until the next input event. + * Fixed love.event.clear. + * Fixed love.mouse.setPosition when called in love.load. + * Fixed scaling in several love.physics functions. + * Fixed Box2D exception in World:update. + * Fixed many uncaught Box2D / love.physics exceptions for Bodies and Joints. + * Fixed ChainShape:getPoints running out of Lua stack space and crashing. + * Fixed File:read reading past end of file. + * Fixed love.filesystem.setIdentity not removing read access from old directories. + * Fixed possible memory leak in utf-8 decoder. + * Fixed spacing for the last character in an ImageFont. + * Fixed line wrapping in love.graphics.printf. + * Fixed love.graphics.printf to error if the wrap limit is negative. + * Fixed love.graphics.print truncating strings with embedded zeros. + * Fixed crashes with font drawing on some ATI cards. + * Fixed artifacts when drawing lines at huge scale. + * Fixed Fonts and Canvases ignoring default image filter. + * Fixed scissor boxes when a canvas is set after love.graphics.setScissor is called. + * Fixed love.graphics.getLineWidth returning incorrect values. + * Fixed love.graphics.getColor on some Windows systems. + * Fixed alpha blend mode. + * Fixed multiplicative blend mode. + * Fixed love.graphics.getPointStyle. + * Fixed line numbers in shader errors. + * Fixed Shader:send with Images and Canvases failing sometimes. + * Fixed Shader:send to keep a reference to sent Images and Canvases. + * Fixed crash when binding SpriteBatches multiple times. + * Fixed SpriteBatches with more than 16,384 sprites. + * Fixed particle draw order for ParticleSystems. + * Fixed ParticleSystem:setSizes resetting the size variation. + * Fixed the graphics viewport not matching the window size when using an unsupported fullscreen mode. + * Fixed getMode and friends returning wrong values when using desktop size. + * Fixed keyrepeat settings being lost after (indirect) setMode. + * Fixed the icon being reset after setMode. + * Fixed memory leak in the mp3 decoder. + * Fixed sound issues with some versions of OpenAL soft, by enabling direct channels. + * Fixed 'random' hangs in audio. + * Fixed love.sound.newDecoder not accepting FileData. + * Fixed case (in)sensitivity of sound file extension parsing. + * Fixed looping support in tracker music formats. + * Fixed skipping/looping issues when playing streaming audio Sources. + * Fixed race condition in Source:play. + * Fixed WAVE sound playback. + + * Moved love's startup to modules/love. + * Moved window-related functions from love.graphics to love.window. + + * Renamed love's boot script to 'love.boot', which can be required. + * Renamed love.filesystem.mkdir to love.filesystem.createDirectory. + * Renamed love.filesystem.enumerate to love.filesystem.getDirectoryItems. + * Renamed World:setAllowSleeping to World:setSleepingAllowed. + * Renamed ChainShape:setPrevVertex to ChainShape:setPreviousVertex. + * Renamed Joint:enableMotor to Joint:setMotorEnabled. + * Renamed Joint:enableLimit and Joint:isLimitEnabled to Joint:setLimitsEnabled and Joint:hasLimitsEnabled. + * Renamed t.screen to t.window in love.conf. + * Renamed love.graphics.setCaption to love.window.setTitle. + * Renamed PixelEffect to Shader (but now with vertex shaders). + * Renamed love.graphics.setDefaultImageFilter to love.graphics.setDefaultFilter. + * Renamed ParticleSystem:setSprite to ParticleSystem:setImage. + * Renamed ParticleSystem:setGravity to ParticleSystem:setLinearAcceleration. + * Renamed ParticleSystem:setLifetime/setParticleLife to setEmitter/ParticleLifetime. + * Renamed ParticleSystem:count and all getNum* functions to get*Count. + * Renamed Source:setDistance to Source:setAttenuationDistances. + * Renamed SoundData:getBits and Decoder:getBits to SoundData:getBitDepth and Decoder:getBitDepth. + * Renamed love.mouse.setGrab to love.mouse.setGrabbed. + + * Removed release mode. + * Removed love.keyboard.getKeyRepeat (see love.keyboard.hasKeyRepeat). + * Removed the unicode argument from love.keypressed (see love.textinput). + * Removed love.graphics.drawTest. + * Removed love.graphics.quad/triangle. + * Removed love.graphics.setColorMode. + * Removed love.graphics.newStencil. + * Removed love.graphics.setLine/setPoint. + * Removed love.graphics.drawq (functionality is merged into love.graphics.draw). + * Removed SpriteBatch:addq/setq (functionality is merged into SpriteBatch:add/set). + * Removed Quad:flip. + * Removed ParticleSystem:isFull/isEmpty. + * Removed ParticleSystem:getX/getY. + * Removed love.graphics.checkMode. + * Removed love.joystick.open and friends. + * Removed love.joystick module functions which operated on individual joysticks (see Joystick objects). + * Removed joystick ball support. + * Removed thread names. + * Removed old thread messaging API (see Channels). + * Removed love.timer.getMicroTime. + + * Updated functions which return love objects to re-use the Lua-side object instead of always recreating it. + * Updated the windows console, it now tries to re-use an active one first. + * Updated error handling, error handlers now get resolved when the error occurs. + * Updated order of sleep/present in love.run (now draws, *then* sleeps). + * Updated love.filesystem to try to create the appdata directory if it doesn't exist yet. + * Updated the default filesystem identity to omit file extension. + * Updated love.filesystem.newFile to optionally open the file. + * Updated most love.filesystem functions to return nil, error on internal failure. + * Updated love.keyboard.setKeyRepeat to take a boolean argument instead of numbers. + * Updated love.keypressed's second argument to be a boolean indicating key repeat. + * Updated keyboard key constants for some more modern keyboard keys. + * Updated window code to use adaptive vsync when available, if vsync is enabled. + * updated love.graphics.print's x and y arguments to default to 0. + * Updated the setFilter and setWrap methods, the second argument is now optional. + * Updated Font and ParticleSystem rendering code, now more performant. + * Updated SpriteBatch code, now more performant when adding/setting and (un)binding. + * Updated Canvas code to support more systems. + * Updated Canvas:getImageData and love.graphics.newScreenshot to be more efficient. + * Updated love.graphics.newScreenshot to create a fully opaque image by default. + * Updated error messages when sending bad values to Shaders. + * Updated love.graphics.newParticleSystem to have a default buffer size of 1000. + * Updated ImageData:setPixel to accept a table and default to 255 alpha. + * Updated ImageData:mapPixel, is now more efficient and accepts optional x,y,w,h arguments. + * Updated love.image memory handling, improves errors and thread-safety. + * Updated all love object constructors to optionally accept FileData if they accept a filename. + * Updated allocation for SoundData, it's more efficient and less wasteful. + * Updated SoundData:set/getSample to error for invalid samples. + * Updated Source:set* functions to default z to 0. + * Updated Source:seek to error for negative offsets. + * Updated Thread:start to accept arguments which get passed to the thread. + * Updated love.timer.getFPS to be microsecond-accurate. + * Updated love.timer.getTime to be microsecond-accurate and monotonic. + * Updated Box2D to version 2.3.0. + +LOVE 0.8.0 [Rubber Piggy] +------------------------- + + Released: 2012-04-02 + + * Added release error screen. + * Added alpha to love.graphics.setBackgroundColor. + * Added Canvas:clear(r, g, b, a). + * Added Canvas support to love.graphics.drawq. + * Added Canvas:getWidth and Canvas:getHeight. + * Added love.graphics.arc. + * Added seek and tell to Source objects. + * Added color interpolation to ParticleSystem. + * Added automatic PO2 padding for systems not supporting the OpenGL extension. + * Added UTF-8 support for fonts. + * Added Box2D error handling for some commonly failing functions. + * Added ability for fused release games to have their write dir in appdata. + * Added shear transformation to drawing functions. + * Added origin to font printing. + * Added love.graphics.getMode. + * Added per-sprite colors on SpriteBatches. + * Added PixelEffects. + * Added love.graphics.isSupported. + * Added love.graphics.getCanvas. + * Added love.event.quit. + * Added stencil masks. + * Added alternative SpriteBatch provider, it should work everywhere now. + * Added a loader for binary modules. + * Added Thread:getKeys. + * Added option of fractions for Quads. + * Added PNG, JPEG and GIF support to ImageData:encode. + * Added 64-bit support for Mac OS X. + * Added premultiplied blending mode. + * Added functions to set/get default image filter modes. + * Added SpriteBatch:set. + * Added new events system, with support for custom events and long event names. + * Added sound attenuation by distance. + * Added SpriteBatch:getImage. + * Added combine color mode. + * Added automatic random seeding to love.run. + * Added support for the subtract BlendMode on older graphics cards. + * Added love._os field, which contains the OS the game is running on. + + * Fixed wrapping for single words. + * Fixed tracebacks not showing filenames. + * Fixed love.graphics.push/pop capable of causing overflows/underflows. + * Fixed setScissor on Canvases. + * Fixed several issues with audio, e.g. clicks and pops in mp3s. + * Fixed crashes when bodies were destroyed during collisions. + * Fixed bound SpriteBatches corrupting when drawing. + * Fixed thread-safety issues with ImageData. + * Fixed memory leaks in audio sources. + * Fixed thread's set (previously send) accidentally changing the type. + * Fixed SoundData allocating the wrong number of samples. + * Fixed SpriteBatch support on Intel cards. + * Fixed love.filesystem.lines() leaking. + * Fixed most leaking on unclosed File objects. + * Fixed crashes when operating on non-existent files. + * Fixed a bug where empty files on windows would never reach eof. + * Fixed crash when SoundData runs out of memory. + * Fixed ordering of loaders, love should have priority over lua. + * Fixed several miscellaneous memory leaks. + * Fixed a few cases where strings with \0 in them would not be stored correctly. + * Fixed love's startup time being in the first dt. + * Fixed internal string conversions, they are faster now. + * Fixed (bad) performance of ImageData:paste. + * Fixed love.graphics.toggleFullscreen not maintaining graphics state. + + * Renamed SpriteBatch's lock/unlock to bind/unbind. + * Renamed Framebuffer to Canvas. + * Renamed love.thread.send/receive to set/get. + * Renamed love.graphics.setRenderTarget to setCanvas. + + * Removed canvas auto-clearing. + * Removed EncodedImageData. + * Removed old syntax for require (with extension). + * Removed love.graphics.setFont([file], [size]). + * Removed Thread:kill. + + * Updated love.joystick to be 1-indexed. + * Updated Sources to update more cleanly and control more intuitively. + * Updated font engine. + * Updated line drawing to a custom system. + * Updated love.timer.sleep to use seconds, like the rest of love. + * Updated love.timer to be more accurate. + * Updated love.graphics.circle to have max(10, r) as default for segments. + * Updated ImageData:encode to write to files directly. + * Updated version compatibility system to actually do something. + * Updated love.run's order, events are checked just before update. + * Updated Box2D to version 2.2.1. + +LOVE 0.7.2 [Game Slave] +----------------------- + + Released: 2011-05-04 + + * Added Framebuffer:get/setWrap. + * Added love.event.clear. + * Added support for any number of arguments to love.keyboard.isDown, love.mouse.isDown and love.joystick.isDown. + * Added SpriteBatch:setImage(). + + * Fixed fused games not working. + * Fixed ParticleSystem:setSize ignoring the variation argument. + * Fixed some file-opening exceptions not being caught. + * Fixed files loaded by libmodplug being too loud. + * Fixed paths with periods in them not working. + * Fixed love.graphics.getBlendMode not detecting subtractive and multiplicative blend modes. + * Fixed crash when there was no memory available for newImageData(w, h). + + * Updated PhysicsFS version to 2.0.2 on Windows + * Updated OpenAL Soft version to 1.13 on Windows + * Updated libmodplug version to 0.8.8.1 on Windows + * Updated FreeType version to 2.4.4 on Windows + * Updated libmpg123 version to 1.13.2 on Windows + * Windows binary no longer depends on VC2005 runtime. + * Windows binary no longer depends on SSE2 support. + +LOVE 0.7.1 [Game Slave] +----------------------- + + Released: 2011-02-14 + + * Added source:isPaused() + * Added error when initial window can't be created. + * Added framebuffer filter modes. + * Added love.filesystem.getLastModified. + * Added filter modes for ImageFonts. + * Added dead key support by using "unknown" key with correct unicode value. + * Added 0 width and height in love.conf. (for current desktop resolution) + * Added alpha support when encoding TGA images. + + * Fixed a lot of bugs regarding zero characters in threads. + * Fixed handling of a directory named "love" in current directory. + * Fixed a few unhandled errors in setScissor. + * Fixed a bug where old physics callbacks were never dereferenced. + * Fixed loss of mouse visibility settings on setMode. + * Fixed creation of a framebuffer unbinding current framebuffer. + * Fixed several race conditions in love.thread. + * Fixed 'love .', so it won't use lovedir/. as save dir. + * Fixed setLineHeight. + * Fixed extended ascii and ImageFonts. + * Fixed printf's line wrapping. + * Fixed crash when playing sounds. + * Fixed playback of mp3s with arbitrary sample rates. + * Fixed handling of negative indices in love.joystick. + * Fixed toggleFullscreen. + * Fixed unexpected behaviour with hash tables to love.graphics.line. + * Fixed mouse coordinates being capped after setMode. + * Fixed setFont's error handling on a non-existant file. + * Fixed issue where Windows builds would hard crash on Lua errors + + * Removed custom sample rates for Decoders. + +LOVE 0.7.0 [Game Slave] +----------------------- + + Released: 2010-12-05 + + * Added love.thread. + * Added love.font. + * Added love.graphics.Framebuffer. + * Added Source:play, Source:pause, etc. + * Added Source:isStatic(). + * Added get/setPosition, get/setVelocity, and get/setDirection to Source. + * Added get/setGroupIndex to CircleShape and PolygonShape. + * Added Font:getWrap. + * Added identity field to love.conf. + * Added love.quit callback. + * Added love.focus callback. + * Added extra meter parameter to love.physics.newWorld. + * Added love.graphics.setIcon. + * Added way to make the window desktop resolution. + * Added subtractive and multiplicative blend modes. + * Added body:getAllowSleeping. + * Added shape:getBody. + * Added love.filesystem.FileData for public usage. + * Added base64 support for love.filesystem.FileData. + * Added table support for love.graphics.setColor and love.graphics.setBackgroundColor. + * Added love.graphics.hasFocus(). + * Added ?/init.lua to the loader. + + * Fixed the debug module not being an upvalue of the error handlers. (you can now override debug) + * Fixed some cases when love.audio.pause and friends, were acting on everything, not just the passed Source. + * Fixed setFixedRotation enabling other flags. + * Fixed a bug in the loader (for require). + * Fixed ParticleSystem::setSprite not retaining the new image. + * Fixed setMode removing images settings (wrapping, filters). + * Fixed shape:getBody, it's now exposed for LÖVE usage. + * Fixed DistanceJoint:getType() returning "circle" - it now returns "distance". + * Fixed SpriteBatches being unaffected by setColor + * Fixed the audio bug. + * Fixed invalid FSAA values crashing LÖVE. + * Fixed a bunch of compiler warnings. + * Fixed OS X not properly using UTIs for .love files. + * Fixed the modplug decoder not properly handeling files that fail to load. + * Fixed a memory leak in setFont. + * Fixed bug where errors in threads wouldn't get picked up by demand. + * Fixed part of the bug with newlines when scaling text (rotating still messes up the lines). + * Fixed the bug where newImageFont would try to created ImageData out of ImageData. + * Fixed error handler not resetting the blend mode. + + * Changed fonts, they're now po2 safe. + * Changed the traceback in the error screen. + * Changed font origin to top-left. + * Changed linux save dir location to obey to Freedesktop.org's XDG specs. (~/.local/share/love by default.) + + * Removed font functions from love.graphics. + * Removed love.physics.newWorld(w, h). Use love.physics.newWorld(x1, y1, x2, y2) instead. + +LOVE 0.6.2 [Jiggly Juice] +------------------------- + + Released: 2010-03-06 + + * Fixed a bug causing ImageFonts to cut off some pixels. + * Fixed a bug where filled rectangles were too small. + * Fixed a bug in Image:setFilter where it would switch the parameters. + * Fixed a bug in ImageRasterizer where it wasn't using the data. + * Image filter and wrap modes now use string constants as well. + * Fixed double-transform bug in SpriteBatch. + * Errors are reported on stdout again. + * Another fix for the icons on ubuntu. + +LOVE 0.6.1 [Jiggly Juice] +------------------------- + + Released: 2010-02-07 + + * Added Shape:setGroupIndex and getGroupIndex. + * Added Body:setFixedRotation and Body:getFixedRotation. + * Added Body:setInertia. + * Added CircleShape:getLocalCenter and CircleShape:getWorldCenter. + * Added icons and file associations for the debs. + * Added the demos folder to the Mac OS X DMG. + * It's now possible to run a .love from Resources in Mac OS X, thanks to Steve Johnson. + * Fixed a bug with multiple Sources on the same Music. + * Fixed a bug so the mouse doesn't get crippled when the keyboard is disabled. + * Fixed a bug where love.graphics.rectangle drew a too large rectangle. + * Fixed a bug where memory wouldn't be released correctly. + * Fixed epic physics typo (getRestituion->getRestitution). + * Fixed crash on opening non-existent image. + * The error screen redraws when an event occurs. + * The default love.run() now gracefully handles disabled modules. + * The debian packages should now successfully include icons, file associations, etc, and should give the correct architecture. + * Added support for drawing polylines to love.graphics.line - the syntax is the same as love.graphics.polygon. + * Removed Music and Sound. There are now only sources. + * Improved the stability of love.audio/love.sound. + +LOVE 0.6.0 [Jiggly Juice] +------------------------- + + Released: 2009-12-24 + + * Lost track of 0.6.0 changes a long while ago. Don't trust the list below. + + * Added love.graphics.print()/printf(). + * Added unicode-translated parameter to love.keypressed(). + * Added love.event. + * Added love.filesystem.setIdentity(). + * Added OpenAL dependency. + + * Fixed love.fileystem problems with internal \0 in strings. + * Fixed love.filesystem.mkdir/remove not working when write directory not set. + * Fixed position of Window. + + * Changed parameter order of draws(). + * Changed origin for images to top-left. + * Changed love.filesystem.open to accept mode (removed from love.filesystem.newFile). + * Changed love.filesystem.read() which now returns two parameters (data, length). + * Changed love.filesystem.write() which now takes up to four parameters (file, data, length, mode). + * Changed default color mode to "modulate". + * Changed name of love.color_normal to "replace". + * Changed name of love.blend_normal to "alpha". + * Changed the conf file format. + + * Removed Color object. + * Removed Animation. + * Removed several constants. + * Removed love.graphics.draw() for strings. + * Removed love.system. + * Removed SWIG. + * Removed boost. + * Removed SDL_mixer. + + +LOVE 0.5.0 [Salted Nuts] +------------------------ + + Released: 2009-01-02 + + * Added love.joystick. + * Added network support via LuaSocket. + * Added support for loading of appended .love-file. + + * Added love.filesystem.lines(). + * Added a loader function to enable use of normal require(). + * Added love.filesystem.load(). + * Added love.filesystem.getSaveDirectory() + * Added love.filesystem.getWorkingDirectory() + + * Added optional explicit destruction of Box2D objects. + * Added shape:testSegment(). + * Added love.graphics.screenshot() (.bmp only). + * Added default size (12) to font-related functions. + * Added love.graphics.setFont( filename, size ) + * Added love.graphics.setLineStippe and related functions. + * Added love.graphics.setPointSize and related functions. + + * Changed love.filesystem.read() to accept file name. + * Changed love.filesystem.write() to accept file name. + * Changed love.graphics.triangle() to accept CCW and CW ordering. + + * Fixed love.graphics.read adding bogus characters at the end of string. + * Fixed epic swigfusion bug. + * Fixed love.graphics.getFont so it returns nil if no font is present. + * Fixed bug where love.graphics.getBlendMode() always returns blend_normal. + * Fixed bug which caused error screen to be scissored (when enabled). + * Fixed Body:setAngle to accept degrees like everything else. + + * Cleaned up love::File and love_physfs. + * Cleaned up love::Reference so it stores its reference in _G. + +LOVE 0.4.0 [Taco Beam] +---------------------- + + Released: 2008-08-29 + + * Added love.physics. (YES!) + * Added love.audio.setMode(). + * Added love.audio.setChannels(). + * Added love.graphics.polygon(). + * Added love.graphics.setScissor() and love.graphics.getScissor() to handle scissoring the graphical area. + * Fixed missing constants related to image optimization. + * Fixed memory leak related to love::File (thanks amnesiasoft!). + + +LOVE 0.3.2 [Lemony Fresh] +------------------------- + + Released: 2008-07-04 + + * Added love.graphics.rectangle() + * Added love.graphics.setLineWidth() + * Added love.graphics.setLineStyle() + * Added love.graphics.getLineWidth() + * Added love.graphics.getLineStyle() + * Added love.mouse.getPosition() + * Added love.audio_loop + * Added love.timer.getTime() + * Changed love.graphics.quad() to accept CCW and CW ordering. + * Fixed default color mode bug. + * Fixed line width being applied unnecessarily. + * Fixed line width bug related to fullscreen toggle. + * Fixed music not looping. + +LOVE 0.3.1 [Space Meat] +----------------------- + + Released: 2008-06-21 + + * Fixed segfault related to graphics. + * Fixed wait-forever bug related to audio. + * Fixed error reporting not working across modules. + * Fixed bug where games with a trailing "/" would not start. + * Fixed bug which caused love.timer.sleep to delay for (way) too long. + +LOVE 0.3.0 [Mutant Vermin] +-------------------------- + + Released: 2008-06-17 + + * Added ParticleSystem. + * Added visual error reporting. + * Added love.system for game control needs. + * Added input grabbing. + * Added functions in love.graphics for display management. + * Added love.graphics.point(). + * Added functions in love.graphics for getting current color, font, etc. + * Added love.filesystem.enumerate() for getting folder contents. + * Added functions for setting the window caption. + * Added version checking. An error occurs if the game is incompatible. + * Fixed print() :) + * Removed all keyboard shortcuts. + * Save folders are now created only if required. + * On Windows, the new save location is %APPDATA%\LOVE\game + +LOVE 0.2.1 [Impending Doom] +--------------------------- + + Released: 2008-03-29 + + * Added many functions in love.filesystem. + * Added a dedicated save-folder for each game. + * Added timer.sleep. + * Added line heights to font objects. + * Added love.graphics.getWidth/getHeight. + * Added scaling and rotation for text. + * Added variable spacing to ImageFont. + * Added support for variable line quality when drawing primitives. + * Added several functions for drawing sections of images. (love.graphics.draws) + * Added image optimization function and padding function. + * Added love.graphics.getWidth/Height. + + * Split devices up into actual SWIG-modules. This means that: + - Functions are used like this: love.graphics.draw, not love.graphics:draw + - love.objects is no more. Objects are created by an appropriate device. + * How you draw primitives has been altered. + * draw(string, x, y, wrap, align) has become drawf(string, x, y, wrap, align) + + * Changed getFps to getFPS. + * Escape is no more ... enter: Alt+F4. + * love.filesystem.include has been renamed to love.filesystem.require. + * ImageFonts now consider the spacing as well as the glyph size. + * Fixed a massive ImageFont bug which resulted in float-positioning failure. + * Fixed a bug when loading fonts where the specified size doesn't represent the true size of the font. + + * Updated DevIL to version 1.6.8-rc2 (Windows) + * Updated FreeType to freetype-2.3.5-1 (Windows) + * Updated Lua to 5.1.3 (Windows) + * Updated SDL to 1.2.13 (Windows) + * Removed boost::filesystem. + +LOVE 0.2.0 [Mini-Moose] +----------------------- + + Released: 2008-02-06 + + * Added ImageFont + * Added Animation + * Added text formatting functions + * Added setCenter for Image and Animation. + * Added methods for rendering of scaled/rotated sprites. + * Added the drawing of basic shapes. + * Added default font and embedded resources. + * Added Ctrl+R for reload. + * Added blending and color modes. + * Fixed memory usage of Graphics. + * Fixed a bug where the set text color would change the color of any images rendered. + * Fixed CWD bug. + * Fixed titlebar. Game title is now displayed. + + +LOVE 0.1.1 [Santa-Power] +------------------------ + + Initial release! + Released: 2008-01-13 + + * Image loading and rendering. + * Sound loading and playing. + * Font loading and rendering. + * Lua-scriptable games. + * Config files. + * Stuff is loadable from archive files. + * Keyboard, mouse, display, timer, etc. (Basic devices). diff --git a/engine/game.ico b/engine/game.ico new file mode 100644 index 0000000..ecc5c0d Binary files /dev/null and b/engine/game.ico differ diff --git a/engine/https.dll b/engine/https.dll new file mode 100644 index 0000000..a407bee Binary files /dev/null and b/engine/https.dll differ diff --git a/engine/license.txt b/engine/license.txt new file mode 100644 index 0000000..f4e6163 --- /dev/null +++ b/engine/license.txt @@ -0,0 +1,1355 @@ +Licensing information +===================== + +This distribution contains code from the following projects (full license text below): + + - LOVE + Website: https://love2d.org/ + License: zlib + Copyright (c) 2006-2024 LOVE Development Team + + - ENet + Website: http://enet.bespin.org/index.html + License: MIT/Expat + Copyright (c) 2002-2016 Lee Salzman + + - FreeType + Website: https://freetype.org/ + License: FreeType License + Copyright (c) 2006-2017 David Turner, Robert Wilhelm, and Werner Lemberg. + + - GLAD + Website: http://glad.dav1d.de/ + License: MIT/Expat + Copyright (c) 2013 David Herberth, modified by Sasha Szpakowski + + - glslang + Website: https://github.com/KhronosGroup/glslang + License: 3-Clause BSD + Copyright (C) 2002-2005 3Dlabs Inc. Ltd. + Copyright (C) 2013-2016 LunarG, Inc. + + - Kepler Project's lua-compat-5.3 + Website: https://github.com/keplerproject/lua-compat-5.3 + License: MIT/Expat + Copyright (c) 2015 Kepler Project. + + - lua-enet + Website: http://leafo.net/lua-enet/ + License: MIT/Expat + Copyright (C) 2011 by Leaf Corcoran + + - LuaJIT + Website: http://luajit.org/ + License: MIT/Expat + LuaJIT is Copyright (c) 2005-2016 Mike Pall + + - Lua's UTF-8 module + Website: https://www.lua.org/ + License: MIT/Expat + Copyright (C) 1994-2015 Lua.org, PUC-Rio, 2015 LOVE Development Team. + + - LuaSocket + Website: http://w3.impa.br/~diego/software/luasocket/home.html + License: MIT/Expat + Copyright (C) 2004-2013 Diego Nehab + + - LZ4 + Website: https://lz4.github.io/lz4/ + License: 2-Clause BSD + Copyright (C) 2011-2015, Yann Collet. + You can contact the author at : + - LZ4 source repository : https://github.com/Cyan4973/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c + + - LodePNG + Website: https://lodev.org/lodepng/ + Source download: https://github.com/lvandeve/lodepng + License: zlib + Copyright (c) 2005-2020 Lode Vandevenne + + - TinyEXR + Website: https://github.com/syoyo/tinyexr + License: 3-Clause BSD + Copyright (c) 2014 - 2016, Syoyo Fujita + + - UTF8-CPP + Website: https://github.com/nemtrif/utfcpp + License: Unknown, MIT/Expat-like (listed as UTF8-CPP) + Copyright 2006 Nemanja Trifunovic + + - xxHash + Website: https://cyan4973.github.io/xxHash/ + License: 2-Clause BSD + Copyright (C) 2012-2016, Yann Collet. + You can contact the author at : + - xxHash source repository : https://github.com/Cyan4973/xxHash + + - dr_flac + Website: https://github.com/mackron/dr_libs + Source download: https://github.com/mackron/dr_libs/blob/c5e5355/dr_flac.h + License: MIT/Expat + Copyright 2018 David Reid + + - stb_image + Website: https://github.com/nothings/stb + Source download: https://github.com/nothings/stb/blob/e140649ccf40818781b7e408f6228a486f6d254b/stb_image.h + License: MIT/Expat + Copyright (c) 2017 Sean Barrett + + - libmpg123 + Website: http://www.mpg123.de/ + Source download: http://sourceforge.net/projects/mpg123/files/latest/download + License: LGPL 2.1 + Copyright (c) 1995-2013 by Michael Hipp and others, free software under the terms of the LGPL v2.1 + Detailed information from the debian project: + Copyright 1995-2016 by the mpg123 project + Copyright 2009-2011 by Malcolm Boczek + Copyright 2008 Christian Weisgerber + Copyright 2006-2007 by Zuxy Meng + Copyright 2000-2002 David Olofson + Copyright 1998 Fabrice Bellard + Copyright 1997 Mikko Tommila + + - OpenAL Soft + Website: https://openal-soft.org/ + Source download: https://openal-soft.org/#download + License: Mixed, licensing information obtained from the debian project + - Alc/backends/opensl.c + License: Apache 2.0 + Copyright 2011 The Android Open Source Project + - examples/alhrtf.c examples/allatency.c examples/alloopback.c examples/alreverb.c examples/alstream.c examples/altonegen.c examples/common/alhelpers.c examples/common/sdl_sound.c utils/openal-info.c + License: MIT/Expat + Copyright © 2010, 2015 Chris Robinson + - examples/alffplay.c + License: unclear, presumed LGPL 2.1 or higher + Copyright © 2003 Fabrice Bellard + Copyright © Martin Bohme + - Alc/bs2b.c OpenAL32/Include/bs2b.h + License: MIT/Expat + Copyright 2005 by Boris Mikhaylov + - cmake/FindALSA.cmake cmake/FindFFmpeg.cmake cmake/FindJACK.cmake cmake/FindSDL2.cmake + License: 3-Clause BSD + Copyright © 2006 Matthias Kretz + Copyright © 2008 Alexander Neundorf + Copyright © 2003-2011 Kitware, Inc. + Copyright © 2009-2011 Philip Lowman + Copyright © 2011 Michael Jansen + Copyright © 2012 Benjamin Eikel + - utils/makehrtf.c (not included in distribution) + License: GPL 2 or higher (2 listed below) + Copyright 2011-2014 Christopher Fitzgerald + - Everything else: + License: LGPL 2.0 or higher (2.1 listed below) + Copyright © 1999-2014 the OpenAL team + Copyright © 2008-2015 Christopher Fitzgerald + Copyright © 2009-2015 Chris Robinson + Copyright © 2013 Anis A. Hireche + Copyright © 2013 Nasca Octavian Paul + Copyright © 2013 Mike Gorchak + Copyright © 2014 Timothy Arceri + +License text +============ + +zlib license + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. + +MIT/Expat + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +FreeType License + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + Introduction + ============ + + The FreeType Project is distributed in several archive packages + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + + Legal Terms + =========== + + 0. Definitions + -------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + + 1. No Warranty + -------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + + 2. Redistribution + ----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + + 3. Advertising + -------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + + 4. Contacts + ----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + http://www.freetype.org + +3-Clause BSD + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + Neither the name of 3Dlabs Inc. Ltd. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES + LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +2-Clause BSD + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, + DATA, OR PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +UTF8-CPP + Permission is hereby granted, free of charge, to any person or organization + obtaining a copy of the software and accompanying documentation covered by + this license (the "Software") to use, reproduce, display, distribute, + execute, and transmit the Software, and to prepare derivative works of the + Software, and to permit third-parties to whom the Software is furnished to + do so, all subject to the following: + + The copyright notices in the Software and this entire statement, including + the above license grant, this restriction and the following disclaimer, + must be included in all copies of the Software, in whole or in part, and + all derivative works of the Software, unless such copies or derivative + works are solely in the form of machine-executable object code generated by + a source language processor. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +LGPL 2.1 + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + Licenses are intended to guarantee your freedom to share and change + free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some + specially designated software packages--typically libraries--of the + Free Software Foundation and other authors who decide to use it. You + can use it too, but we suggest you first think carefully about whether + this license or the ordinary General Public License is the better + strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, + not price. Our General Public Licenses are designed to make sure that + you have the freedom to distribute copies of free software (and charge + for this service if you wish) that you receive source code or can get + it if you want it that you can change the software and use pieces of + it in new free programs and that you are informed that you can do + these things. + + To protect your rights, we need to make restrictions that forbid + distributors to deny you these rights or to ask you to surrender these + rights. These restrictions translate to certain responsibilities for + you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis + or for a fee, you must give the recipients all the rights that we gave + you. You must make sure that they, too, receive or can get the source + code. If you link other code with the library, you must provide + complete object files to the recipients, so that they can relink them + with the library after making changes to the library and recompiling + it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the + library, and (2) we offer you this license, which gives you legal + permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that + there is no warranty for the free library. Also, if the library is + modified by someone else and passed on, the recipients should know + that what they have is not the original version, so that the original + author's reputation will not be affected by problems that might be + introduced by others. + + Finally, software patents pose a constant threat to the existence of + any free program. We wish to make sure that a company cannot + effectively restrict the users of a free program by obtaining a + restrictive license from a patent holder. Therefore, we insist that + any patent license obtained for a version of the library must be + consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the + ordinary GNU General Public License. This license, the GNU Lesser + General Public License, applies to certain designated libraries, and + is quite different from the ordinary General Public License. We use + this license for certain libraries in order to permit linking those + libraries into non-free programs. + + When a program is linked with a library, whether statically or using + a shared library, the combination of the two is legally speaking a + combined work, a derivative of the original library. The ordinary + General Public License therefore permits such linking only if the + entire combination fits its criteria of freedom. The Lesser General + Public License permits more lax criteria for linking other code with + the library. + + We call this license the "Lesser" General Public License because it + does Less to protect the user's freedom than the ordinary General + Public License. It also provides other free software developers Less + of an advantage over competing non-free programs. These disadvantages + are the reason we use the ordinary General Public License for many + libraries. However, the Lesser license provides advantages in certain + special circumstances. + + For example, on rare occasions, there may be a special need to + encourage the widest possible use of a certain library, so that it becomes + a de-facto standard. To achieve this, non-free programs must be + allowed to use the library. A more frequent case is that a free + library does the same job as widely used non-free libraries. In this + case, there is little to gain by limiting the free library to free + software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free + programs enables a greater number of people to use a large body of + free software. For example, permission to use the GNU C Library in + non-free programs enables many more people to use the whole GNU + operating system, as well as its variant, the GNU/Linux operating + system. + + Although the Lesser General Public License is Less protective of the + users' freedom, it does ensure that the user of a program that is + linked with the Library has the freedom and the wherewithal to run + that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and + modification follow. Pay close attention to the difference between a + "work based on the library" and a "work that uses the library". The + former contains code derived from the library, whereas the latter must + be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other + program which contains a notice placed by the copyright holder or + other authorized party saying it may be distributed under the terms of + this Lesser General Public License (also called "this License"). + Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data + prepared so as to be conveniently linked with application programs + (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work + which has been distributed under these terms. A "work based on the + Library" means either the Library or any derivative work under + copyright law: that is to say, a work containing the Library or a + portion of it, either verbatim or with modifications and/or translated + straightforwardly into another language. (Hereinafter, translation is + included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for + making modifications to it. For a library, complete source code means + all the source code for all modules it contains, plus any associated + interface definition files, plus the scripts used to control compilation + and installation of the library. + + Activities other than copying, distribution and modification are not + covered by this License they are outside its scope. The act of + running a program using the Library is not restricted, and output from + such a program is covered only if its contents constitute a work based + on the Library (independent of the use of the Library in a tool for + writing it). Whether that is true depends on what the Library does + and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's + complete source code as you receive it, in any medium, provided that + you conspicuously and appropriately publish on each copy an + appropriate copyright notice and disclaimer of warranty keep intact + all the notices that refer to this License and to the absence of any + warranty and distribute a copy of this License along with the + Library. + + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange for a + fee. + + 2. You may modify your copy or copies of the Library or any portion + of it, thus forming a work based on the Library, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Library, + and can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based + on the Library, the distribution of the whole must be on the terms of + this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote + it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Library. + + In addition, mere aggregation of another work not based on the Library + with the Library (or with a work based on the Library) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public + License instead of this License to a given copy of the Library. To do + this, you must alter all the notices that refer to this License, so + that they refer to the ordinary GNU General Public License, version 2, + instead of to this License. (If a newer version than version 2 of the + ordinary GNU General Public License has appeared, then you can specify + that version instead if you wish.) Do not make any other change in + these notices. + + Once this change is made in a given copy, it is irreversible for + that copy, so the ordinary GNU General Public License applies to all + subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of + the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or + derivative of it, under Section 2) in object code or executable form + under the terms of Sections 1 and 2 above provided that you accompany + it with the complete corresponding machine-readable source code, which + must be distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy + from a designated place, then offering equivalent access to copy the + source code from the same place satisfies the requirement to + distribute the source code, even though third parties are not + compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the + Library, but is designed to work with the Library by being compiled or + linked with it, is called a "work that uses the Library". Such a + work, in isolation, is not a derivative work of the Library, and + therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library + creates an executable that is a derivative of the Library (because it + contains portions of the Library), rather than a "work that uses the + library". The executable is therefore covered by this License. + Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file + that is part of the Library, the object code for the work may be a + derivative work of the Library even though the source code is not. + Whether this is true is especially significant if the work can be + linked without the Library, or if the work is itself a library. The + threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data + structure layouts and accessors, and small macros and small inline + functions (ten lines or less in length), then the use of the object + file is unrestricted, regardless of whether it is legally a derivative + work. (Executables containing this object code plus portions of the + Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may + distribute the object code for the work under the terms of Section 6. + Any executables containing that work also fall under Section 6, + whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or + link a "work that uses the Library" with the Library to produce a + work containing portions of the Library, and distribute that work + under terms of your choice, provided that the terms permit + modification of the work for the customer's own use and reverse + engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the + Library is used in it and that the Library and its use are covered by + this License. You must supply a copy of this License. If the work + during execution displays copyright notices, you must include the + copyright notice for the Library among them, as well as a reference + directing the user to the copy of this License. Also, you must do one + of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above) and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the + Library" must include any data and utility programs needed for + reproducing the executable from it. However, as a special exception, + the materials to be distributed need not include anything that is + normally distributed (in either source or binary form) with the major + components (compiler, kernel, and so on) of the operating system on + which the executable runs, unless that component itself accompanies + the executable. + + It may happen that this requirement contradicts the license + restrictions of other proprietary libraries that do not normally + accompany the operating system. Such a contradiction means you cannot + use both them and the Library together in an executable that you + distribute. + + 7. You may place library facilities that are a work based on the + Library side-by-side in a single library together with other library + facilities not covered by this License, and distribute such a combined + library, provided that the separate distribution of the work based on + the Library and of the other library facilities is otherwise + permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute + the Library except as expressly provided under this License. Any + attempt otherwise to copy, modify, sublicense, link with, or + distribute the Library is void, and will automatically terminate your + rights under this License. However, parties who have received copies, + or rights, from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Library or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Library (or any work based on the + Library), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the + Library), the recipient automatically receives a license from the + original licensor to copy, distribute, link with or modify the Library + subject to these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties with + this License. + + 11. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Library at all. For example, if a patent + license would not permit royalty-free redistribution of the Library by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Library. + + If any portion of this section is held invalid or unenforceable under any + particular circumstance, the balance of the section is intended to apply, + and the section as a whole is intended to apply in other circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims this section has the sole purpose of protecting the + integrity of the free software distribution system which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot + impose that choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Library under this License may add + an explicit geographical distribution limitation excluding those countries, + so that distribution is permitted only in or among countries not thus + excluded. In such case, this License incorporates the limitation as if + written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new + versions of the Lesser General Public License from time to time. + Such new versions will be similar in spirit to the present version, + but may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the Library + specifies a version number of this License which applies to it and + "any later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Library does not specify a + license version number, you may choose any version ever published by + the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free + programs whose distribution conditions are incompatible with these, + write to the author to ask for permission. For software which is + copyrighted by the Free Software Foundation, write to the Free + Software Foundation we sometimes make exceptions for this. Our + decision will be guided by the two goals of preserving the free status + of all derivatives of our free software and of promoting the sharing + and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR + OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE + LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME + THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY + AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU + FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE + LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING + RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A + FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF + SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest + possible use to the public, we recommend making it free software that + everyone can redistribute and change. You can do so by permitting + redistribution under these terms (or, alternatively, under the terms of the + ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is + safest to attach them to the start of each source file to most effectively + convey the exclusion of warranty and each file should have at least the + "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Also add information on how to contact you by electronic and paper mail. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the library, if + necessary. Here is a sample alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + + That's all there is to it! + +GPL 2 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + License is intended to guarantee your freedom to share and change free + software--to make sure the software is free for all its users. This + General Public License applies to most of the Free Software + Foundation's software and to any other program whose authors commit to + using it. (Some other Free Software Foundation software is covered by + the GNU Lesser General Public License instead.) You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + this service if you wish), that you receive source code or can get it + if you want it, that you can change the software or use pieces of it + in new free programs and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid + anyone to deny you these rights or to ask you to surrender the rights. + These restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether + gratis or for a fee, you must give the recipients all the rights that + you have. You must make sure that they, too, receive or can get the + source code. And you must show them these terms so they know their + rights. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software + patents. We wish to avoid the danger that redistributors of a free + program will individually obtain patent licenses, in effect making the + program proprietary. To prevent this, we have made it clear that any + patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains + a notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", below, + refers to any such program or work, and a "work based on the Program" + means either the Program or any derivative work under copyright law: + that is to say, a work containing the Program or a portion of it, + either verbatim or with modifications and/or translated into another + language. (Hereinafter, translation is included without limitation in + the term "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License they are outside its scope. The act of + running the Program is not restricted, and the output from the Program + is covered only if its contents constitute a work based on the + Program (independent of having been made by running the Program). + Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty keep intact all the + notices that refer to this License and to the absence of any warranty + and give any other recipients of the Program a copy of this License + along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, + and can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based + on the Program, the distribution of the whole must be on the terms of + this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source + code means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to + control compilation and installation of the executable. However, as a + special exception, the source code distributed need not include + anything that is normally distributed (in either source or binary + form) with the major components (compiler, kernel, and so on) of the + operating system on which the executable runs, unless that component + itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this License. + However, parties who have received copies, or rights, from you under + this License will not have their licenses terminated so long as such + parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties to + this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Program at all. For example, if a patent + license would not permit royalty-free redistribution of the Program by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims this section has the sole purpose of protecting the + integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot + impose that choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License + may add an explicit geographical distribution limitation excluding + those countries, so that distribution is permitted only in or among + countries not thus excluded. In such case, this License incorporates + the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions + of the General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + + Each version is given a distinguishing version number. If the Program + specifies a version number of this License which applies to it and "any + later version", you have the option of following the terms and conditions + either of that version or of any later version published by the Free + Software Foundation. If the Program does not specify a version number of + this License, you may choose any version ever published by the Free Software + Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the author + to ask for permission. For software which is copyrighted by the Free + Software Foundation, write to the Free Software Foundation we sometimes + make exceptions for this. Our decision will be guided by the two goals + of preserving the free status of all derivatives of our free software and + of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, + REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING + OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED + TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY + YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + convey the exclusion of warranty and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions type `show c' for details. + + The hypothetical commands `show w' and `show c' should show the appropriate + parts of the General Public License. Of course, the commands you use may + be called something other than `show w' and `show c' they could even be + mouse-clicks or menu items--whatever suits your program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here is a sample alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + + This General Public License does not permit incorporating your program into + proprietary programs. If your program is a subroutine library, you may + consider it more useful to permit linking proprietary applications with the + library. If this is what you want to do, use the GNU Lesser General + Public License instead of this License. + +Apache 2.0 + Apache License + + Version 2.0, January 2004 + + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License and + You must cause any modified files to carry prominent notices stating that You changed the files and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works within the Source form or documentation, if provided along with the Derivative Works or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work + + To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License") + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/engine/love.dll b/engine/love.dll new file mode 100644 index 0000000..2f5e67a Binary files /dev/null and b/engine/love.dll differ diff --git a/engine/love.exe b/engine/love.exe new file mode 100644 index 0000000..447bc55 Binary files /dev/null and b/engine/love.exe differ diff --git a/engine/love.ico b/engine/love.ico new file mode 100644 index 0000000..b703c98 Binary files /dev/null and b/engine/love.ico differ diff --git a/engine/lovec.exe b/engine/lovec.exe new file mode 100644 index 0000000..cf7faac Binary files /dev/null and b/engine/lovec.exe differ diff --git a/engine/lua51.dll b/engine/lua51.dll new file mode 100644 index 0000000..bc0c9c6 Binary files /dev/null and b/engine/lua51.dll differ diff --git a/engine/luasteam.dll b/engine/luasteam.dll new file mode 100644 index 0000000..3dc9e9d Binary files /dev/null and b/engine/luasteam.dll differ diff --git a/engine/mpg123.dll b/engine/mpg123.dll new file mode 100644 index 0000000..f6f1842 Binary files /dev/null and b/engine/mpg123.dll differ diff --git a/engine/msvcp120.dll b/engine/msvcp120.dll new file mode 100644 index 0000000..4ea1efa Binary files /dev/null and b/engine/msvcp120.dll differ diff --git a/engine/msvcr120.dll b/engine/msvcr120.dll new file mode 100644 index 0000000..d711c92 Binary files /dev/null and b/engine/msvcr120.dll differ diff --git a/engine/readme.txt b/engine/readme.txt new file mode 100644 index 0000000..c791066 --- /dev/null +++ b/engine/readme.txt @@ -0,0 +1,111 @@ +LÖVE is an *awesome* framework you can use to make 2D games in Lua. It's free, open-source, and works on Windows, macOS, Linux, Android, and iOS. + +[![Build Status: Windows](https://ci.appveyor.com/api/projects/status/chc0hdr08wv1d5c7?svg=true)](https://ci.appveyor.com/project/slime73/love) +[![Build Status: Github CI](https://github.com/love2d/love/workflows/continuous-integration/badge.svg)](https://github.com/love2d/love/actions?query=workflow%3Acontinuous-integration) + +Documentation +------------- + +We use our [wiki][wiki] for documentation. +If you need further help, feel free to ask on our [forums][forums], our [Discord server][discord], or our [subreddit][subreddit]. + +Repository +---------- + +We use the 'main' branch for patch development of the current major release, and therefore it should not be considered stable. +There may also be a branch for the next major version in development, which is named after that version. + +We tag all our releases (since we started using mercurial and git), and have binary downloads available for them. + +Experimental changes are developed in a separate [love-experiments][love-experiments] repository. + +Builds +------ + +Files for releases are in the [releases][releases] section on GitHub. [The site][site] has links to files and additional platform content for the latest release. + +There are also unstable/nightly builds: + +- Builds for some platforms are automatically created after each commit and are available through GitHub's CI interfaces. +- For ubuntu linux they are in [ppa:bartbes/love-unstable][unstableppa] +- For arch linux there's [love-git][aur] in the AUR. + +Contributing +------------ + +The best places to contribute are through the issue tracker and the official Discord server or IRC channel. + +For code contributions, pull requests and patches are welcome. Be sure to read the [source code style guide][codestyle]. +Changes and new features typically get discussed in the issue tracker or on Discord or the forums before a pull request is made. + +Compilation +----------- + +### Windows +Follow the instructions at the [megasource][megasource] repository page. + +### *nix +Run `platform/unix/automagic` from the repository root, then run ./configure and make. + + $ platform/unix/automagic + $ ./configure + $ make + +When using a source release, automagic has already been run, and the first step can be skipped. + +### macOS +Download or clone [this repository][dependencies-apple] and copy, move, or symlink the `macOS/Frameworks` subfolder into love's `platform/xcode/macosx` folder. + +Then use the Xcode project found at `platform/xcode/love.xcodeproj` to build the `love-macosx` target. + +### iOS +Building for iOS requires macOS and Xcode. + +#### LÖVE 11.4 and newer +Download the `love-apple-dependencies` zip file corresponding to the LÖVE version being used from the [Releases page][dependencies-ios], +unzip it, and place the `iOS/libraries` subfolder into love's `platform/xcode/ios` folder. + +Or, download or clone [this repository][dependencies-apple] and copy, move, or symlink the `iOS/libraries` subfolder into love's `platform/xcode/ios` folder. + +Then use the Xcode project found at `platform/xcode/love.xcodeproj` to build the `love-ios` target. + +See `readme-iOS.rtf` for more information. + +#### LÖVE 11.3 and older +Download the `ios-libraries` zip file corresponding to the LÖVE version being used from the [Releases page][dependencies-ios], +unzip it, and place the `include` and `libraries` subfolders into love's `platform/xcode/ios` folder. + +Then use the Xcode project found at `platform/xcode/love.xcodeproj` to build the `love-ios` target. + +See `readme-iOS.rtf` for more information. + +### Android +Visit the [Android build repository][android-repository] for build instructions. + +Dependencies +------------ + +- SDL2 +- OpenGL 2.1+ / OpenGL ES 2+ +- OpenAL +- Lua / LuaJIT / LLVM-lua +- FreeType +- ModPlug +- mpg123 +- Vorbisfile +- Theora + +[site]: https://love2d.org +[wiki]: https://love2d.org/wiki +[forums]: https://love2d.org/forums +[discord]: https://discord.gg/rhUets9 +[subreddit]: https://www.reddit.com/r/love2d +[dependencies-apple]: https://github.com/love2d/love-apple-dependencies +[dependencies-ios]: https://github.com/love2d/love/releases +[megasource]: https://github.com/love2d/megasource +[unstableppa]: https://launchpad.net/~bartbes/+archive/love-unstable +[aur]: https://aur.archlinux.org/packages/love-git +[love-experiments]: https://github.com/slime73/love-experiments +[codestyle]: https://love2d.org/wiki/Code_Style +[android-repository]: https://github.com/love2d/love-android +[releases]: https://github.com/love2d/love/releases diff --git a/engine/steam_api64.dll b/engine/steam_api64.dll new file mode 100644 index 0000000..45a49e9 Binary files /dev/null and b/engine/steam_api64.dll differ diff --git a/engine/steam_appid.txt b/engine/steam_appid.txt new file mode 100644 index 0000000..09facb1 --- /dev/null +++ b/engine/steam_appid.txt @@ -0,0 +1 @@ +2379780 \ No newline at end of file diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..f71c3e5 --- /dev/null +++ b/run.bat @@ -0,0 +1 @@ +start engine/love.exe ./src \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..f52ef5e --- /dev/null +++ b/run.sh @@ -0,0 +1 @@ +wine ./engine/love.exe ./src \ No newline at end of file diff --git a/src/back.lua b/src/back.lua new file mode 100644 index 0000000..a7635f3 --- /dev/null +++ b/src/back.lua @@ -0,0 +1,288 @@ +--Class +Back = Object:extend() + +--Class Methods +function Back:init(selected_back) + if not selected_back then selected_back = G.P_CENTERS.b_red end + self.name = selected_back.name or 'Red Deck' + + self.effect = { + center = selected_back, + text_UI = '', + config = copy_table(selected_back.config) + } + self.loc_name = localize{type = 'name_text', set = 'Back', key = self.effect.center.key} + + local pos = (self.effect.center.unlocked and self.effect.center.pos) or {x = 4, y = 0} + self.pos = self.pos or {} + self.pos.x = pos.x + self.pos.y = pos.y +end + +function Back:get_name() + if self.effect.center.unlocked then return self.loc_name else return localize('k_locked') end +end + +function Back:generate_UI(other, ui_scale, min_dims, challenge) + min_dims = min_dims or 0.7 + ui_scale = ui_scale or 0.9 + local back_config = other or self.effect.center + local name_to_check = other and other.name or self.name + local effect_config = other and other.config or self.effect.config + challenge = G.CHALLENGES[get_challenge_int_from_id(challenge or '') or ''] or {name = 'ERROR'} + + local loc_args, loc_nodes = nil, {} + + if not back_config.unlocked then + if not back_config.unlock_condition then + localize{type = 'descriptions', key = 'demo_locked', set = "Other", nodes = loc_nodes, vars = loc_args} + elseif back_config.unlock_condition.type == 'win_deck' then + local other_name = localize('k_unknown') + if G.P_CENTERS[back_config.unlock_condition.deck].unlocked then + other_name = localize{type = 'name_text', set = 'Back', key = back_config.unlock_condition.deck} + end + loc_args = {other_name} + localize{type = 'descriptions', key = 'deck_locked_win', set = "Other", nodes = loc_nodes, vars = loc_args} + elseif back_config.unlock_condition.type == 'discover_amount' then + loc_args = {tostring(back_config.unlock_condition.amount)} + localize{type = 'descriptions', key = 'deck_locked_discover', set = "Other", nodes = loc_nodes, vars = loc_args} + elseif back_config.unlock_condition.type == 'win_stake' then + local other_name = localize{type = 'name_text', set = 'Stake', key = G.P_CENTER_POOLS.Stake[back_config.unlock_condition.stake].key} + loc_args = {other_name, colours = {get_stake_col(back_config.unlock_condition.stake)}} + localize{type = 'descriptions', key = 'deck_locked_stake', set = "Other", nodes = loc_nodes, vars = loc_args} + end + else + if name_to_check == 'Blue Deck' then loc_args = {effect_config.hands} + elseif name_to_check == 'Red Deck' then loc_args = {effect_config.discards} + elseif name_to_check == 'Yellow Deck' then loc_args = {effect_config.dollars} + elseif name_to_check == 'Green Deck' then loc_args = {effect_config.extra_hand_bonus, effect_config.extra_discard_bonus} + elseif name_to_check == 'Black Deck' then loc_args = {effect_config.joker_slot, -effect_config.hands} + elseif name_to_check == 'Magic Deck' then loc_args = {localize{type = 'name_text', key = 'v_crystal_ball', set = 'Voucher'}, localize{type = 'name_text', key = 'c_fool', set = 'Tarot'}} + elseif name_to_check == 'Nebula Deck' then loc_args = {localize{type = 'name_text', key = 'v_telescope', set = 'Voucher'}, -1} + elseif name_to_check == 'Ghost Deck' then + elseif name_to_check == 'Abandoned Deck' then + elseif name_to_check == 'Checkered Deck' then + elseif name_to_check == 'Zodiac Deck' then loc_args = {localize{type = 'name_text', key = 'v_tarot_merchant', set = 'Voucher'}, + localize{type = 'name_text', key = 'v_planet_merchant', set = 'Voucher'}, + localize{type = 'name_text', key = 'v_overstock_norm', set = 'Voucher'}} + elseif name_to_check == 'Painted Deck' then loc_args = {effect_config.hand_size,effect_config.joker_slot} + elseif name_to_check == 'Anaglyph Deck' then loc_args = {localize{type = 'name_text', key = 'tag_double', set = 'Tag'}} + elseif name_to_check == 'Plasma Deck' then loc_args = {effect_config.ante_scaling} + elseif name_to_check == 'Erratic Deck' then + end + localize{type = 'descriptions', key = back_config.key, set = 'Back', nodes = loc_nodes, vars = loc_args} + end + + return + {n=G.UIT.ROOT, config={align = "cm", minw = min_dims*5, minh = min_dims*2.5, id = self.name, colour = G.C.CLEAR}, nodes={ + name_to_check == 'Challenge Deck' and UIBox_button({button = 'deck_view_challenge', label = {localize(challenge.id, 'challenge_names')}, minw = 2.2, minh = 1, scale = 0.6, id = challenge}) + or desc_from_rows(loc_nodes, true, min_dims*5) + }} +end + +function Back:change_to(new_back) + if not new_back then new_back = G.P_CENTERS.b_red end + self.name = new_back.name or 'Red Deck' + self.effect = { + center = new_back, + text_UI = '', + config = copy_table(new_back.config) + } + self.loc_name = localize{type = 'name_text', set = 'Back', key = self.effect.center.key} + local pos = self.effect.center.unlocked and copy_table(new_back.pos) or {x = 4, y = 0} + self.pos.x = pos.x + self.pos.y = pos.y +end + +function Back:save() + local backTable = { + name = self.name, + pos = self.pos, + effect = self.effect, + key = self.effect.center.key or 'b_red' + } + + return backTable +end + +function Back:trigger_effect(args) + if not args then return end + + if self.name == 'Anaglyph Deck' and args.context == 'eval' and G.GAME.last_blind and G.GAME.last_blind.boss then + G.E_MANAGER:add_event(Event({ + func = (function() + add_tag(Tag('tag_double')) + play_sound('generic1', 0.9 + math.random()*0.1, 0.8) + play_sound('holo1', 1.2 + math.random()*0.1, 0.4) + return true + end) + })) + end + if self.name == 'Plasma Deck' and args.context == 'blind_amount' then + return + end + + if self.name == 'Plasma Deck' and args.context == 'final_scoring_step' then + local tot = args.chips + args.mult + args.chips = math.floor(tot/2) + args.mult = math.floor(tot/2) + update_hand_text({delay = 0}, {mult = args.mult, chips = args.chips}) + + G.E_MANAGER:add_event(Event({ + func = (function() + local text = localize('k_balanced') + play_sound('gong', 0.94, 0.3) + play_sound('gong', 0.94*1.5, 0.2) + play_sound('tarot1', 1.5) + ease_colour(G.C.UI_CHIPS, {0.8, 0.45, 0.85, 1}) + ease_colour(G.C.UI_MULT, {0.8, 0.45, 0.85, 1}) + attention_text({ + scale = 1.4, text = text, hold = 2, align = 'cm', offset = {x = 0,y = -2.7},major = G.play + }) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + blocking = false, + delay = 4.3, + func = (function() + ease_colour(G.C.UI_CHIPS, G.C.BLUE, 2) + ease_colour(G.C.UI_MULT, G.C.RED, 2) + return true + end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + blocking = false, + no_delete = true, + delay = 6.3, + func = (function() + G.C.UI_CHIPS[1], G.C.UI_CHIPS[2], G.C.UI_CHIPS[3], G.C.UI_CHIPS[4] = G.C.BLUE[1], G.C.BLUE[2], G.C.BLUE[3], G.C.BLUE[4] + G.C.UI_MULT[1], G.C.UI_MULT[2], G.C.UI_MULT[3], G.C.UI_MULT[4] = G.C.RED[1], G.C.RED[2], G.C.RED[3], G.C.RED[4] + return true + end) + })) + return true + end) + })) + + delay(0.6) + return args.chips, args.mult + end +end + +function Back:apply_to_run() + + if self.effect.config.voucher then + G.GAME.used_vouchers[self.effect.config.voucher] = true + G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 + Card.apply_to_run(nil, G.P_CENTERS[self.effect.config.voucher]) + end + if self.effect.config.hands then + G.GAME.starting_params.hands = G.GAME.starting_params.hands + self.effect.config.hands + end + if self.effect.config.consumables then + delay(0.4) + G.E_MANAGER:add_event(Event({ + func = function() + for k, v in ipairs(self.effect.config.consumables) do + local card = create_card('Tarot', G.consumeables, nil, nil, nil, nil, v, 'deck') + card:add_to_deck() + G.consumeables:emplace(card) + end + return true + end + })) + end + + + if self.effect.config.dollars then + G.GAME.starting_params.dollars = G.GAME.starting_params.dollars + self.effect.config.dollars + end + if self.effect.config.remove_faces then + G.GAME.starting_params.no_faces = true + end + + if self.effect.config.spectral_rate then + G.GAME.spectral_rate = self.effect.config.spectral_rate + end + if self.effect.config.discards then + G.GAME.starting_params.discards = G.GAME.starting_params.discards + self.effect.config.discards + end + if self.effect.config.reroll_discount then + G.GAME.starting_params.reroll_cost = G.GAME.starting_params.reroll_cost - self.effect.config.reroll_discount + end + + + if self.effect.config.edition then + G.E_MANAGER:add_event(Event({ + func = function() + local i = 0 + while i < self.effect.config.edition_count do + local card = pseudorandom_element(G.playing_cards, pseudoseed('edition_deck')) + if not card.edition then + i = i + 1 + card:set_edition({[self.effect.config.edition] = true}, nil, true) + end + end + return true + end + })) + end + if self.effect.config.vouchers then + for k, v in pairs(self.effect.config.vouchers) do + G.GAME.used_vouchers[v ] = true + G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 + Card.apply_to_run(nil, G.P_CENTERS[v]) + end + end + if self.name == 'Checkered Deck' then + G.E_MANAGER:add_event(Event({ + func = function() + for k, v in pairs(G.playing_cards) do + if v.base.suit == 'Clubs' then + v:change_suit('Spades') + end + if v.base.suit == 'Diamonds' then + v:change_suit('Hearts') + end + end + return true + end + })) + end + if self.effect.config.randomize_rank_suit then + G.GAME.starting_params.erratic_suits_and_ranks = true + end + if self.effect.config.joker_slot then + G.GAME.starting_params.joker_slots = G.GAME.starting_params.joker_slots + self.effect.config.joker_slot + end + if self.effect.config.hand_size then + G.GAME.starting_params.hand_size = G.GAME.starting_params.hand_size + self.effect.config.hand_size + end + if self.effect.config.ante_scaling then + G.GAME.starting_params.ante_scaling = self.effect.config.ante_scaling + end + if self.effect.config.consumable_slot then + G.GAME.starting_params.consumable_slots = G.GAME.starting_params.consumable_slots + self.effect.config.consumable_slot + end + if self.effect.config.no_interest then + G.GAME.modifiers.no_interest = true + end + if self.effect.config.extra_hand_bonus then + G.GAME.modifiers.money_per_hand = self.effect.config.extra_hand_bonus + end + if self.effect.config.extra_discard_bonus then + G.GAME.modifiers.money_per_discard = self.effect.config.extra_discard_bonus + end +end + +function Back:load(backTable) + self.name = backTable.name + self.pos = backTable.pos + self.effect = backTable.effect + self.effect.center = G.P_CENTERS[backTable.key] or G.P_CENTERS.b_red + + + self.loc_name = localize{type = 'name_text', set = 'Back', key = self.effect.center.key} +end diff --git a/src/blind.lua b/src/blind.lua new file mode 100644 index 0000000..f08544c --- /dev/null +++ b/src/blind.lua @@ -0,0 +1,751 @@ +--class +Blind = Moveable:extend() + +--class methods +function Blind:init(X, Y, W, H) + Moveable.init(self,X, Y, W, H) + + self.children = {} + self.config = {} + self.tilt_var = {mx = 0, my = 0, amt = 0} + self.ambient_tilt = 0.3 + self.chips = 0 + self.zoom = true + self.states.collide.can = true + self.colour = copy_table(G.C.BLACK) + self.dark_colour = darken(self.colour, 0.2) + self.children.animatedSprite = AnimatedSprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ANIMATION_ATLAS['blind_chips'], G.P_BLINDS.bl_small.pos) + self.children.animatedSprite.states = self.states + self.children.animatedSprite.states.visible = false + self.children.animatedSprite.states.drag.can = true + self.states.collide.can = true + self.states.drag.can = true + self.loc_debuff_lines = {'',''} + + self.shadow_height = 0 + + if getmetatable(self) == Blind then + table.insert(G.I.CARD, self) + end +end + +function Blind:change_colour(blind_col) + blind_col = blind_col or get_blind_main_colour(self.config.blind.key or '') + local dark_col = mix_colours(blind_col, G.C.BLACK, 0.4) + ease_colour(G.C.DYN_UI.MAIN, blind_col) + ease_colour(G.C.DYN_UI.DARK, dark_col) + + if not self.boss and self.name then + blind_col = darken(G.C.BLACK, 0.05) + dark_col = lighten(G.C.BLACK, 0.07) + else + dark_col = mix_colours(blind_col, G.C.BLACK, 0.2) + end + ease_colour(G.C.DYN_UI.BOSS_MAIN, blind_col) + ease_colour(G.C.DYN_UI.BOSS_DARK, dark_col) +end + +function Blind:set_text() + if self.config.blind then + if self.disabled then + self.loc_name = self.name == '' and self.name or localize{type ='name_text', key = self.config.blind.key, set = 'Blind'} + self.loc_debuff_text = '' + self.loc_debuff_lines[1] = '' + self.loc_debuff_lines[2] = '' + else + local loc_vars = nil + if self.name == 'The Ox' then + loc_vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')} + end + local loc_target = localize{type = 'raw_descriptions', key = self.config.blind.key, set = 'Blind', vars = loc_vars or self.config.blind.vars} + if loc_target then + self.loc_name = self.name == '' and self.name or localize{type ='name_text', key = self.config.blind.key, set = 'Blind'} + self.loc_debuff_text = '' + for k, v in ipairs(loc_target) do + self.loc_debuff_text = self.loc_debuff_text..v..(k <= #loc_target and ' ' or '') + end + self.loc_debuff_lines[1] = loc_target[1] or '' + self.loc_debuff_lines[2] = loc_target[2] or '' + else + self.loc_name = ''; self.loc_debuff_text = '' + self.loc_debuff_lines[1] = '' + self.loc_debuff_lines[2] = '' + end + end + end +end + +function Blind:set_blind(blind, reset, silent) + if not reset then + self.config.blind = blind or {} + self.name = blind and blind.name or '' + self.dollars = blind and blind.dollars or 0 + self.sound_pings = self.dollars + 2 + if G.GAME.modifiers.no_blind_reward and G.GAME.modifiers.no_blind_reward[self:get_type()] then self.dollars = 0 end + self.debuff = blind and blind.debuff or {} + self.pos = blind and blind.pos + self.mult = blind and blind.mult or 0 + self.disabled = false + self.discards_sub = nil + self.hands_sub = nil + self.boss = blind and not not blind.boss + self.blind_set = false + self.triggered = nil + self.prepped = true + self:set_text() + + G.GAME.last_blind = G.GAME.last_blind or {} + G.GAME.last_blind.boss = self.boss + G.GAME.last_blind.name = self.name + + if blind and blind.name then + self:change_colour() + else + self:change_colour(G.C.BLACK) + end + + self.chips = get_blind_amount(G.GAME.round_resets.ante)*self.mult*G.GAME.starting_params.ante_scaling + self.chip_text = number_format(self.chips) + + if not blind then self.chips = 0 end + + G.GAME.current_round.dollars_to_be_earned = self.dollars > 0 and (string.rep(localize('$'), self.dollars)..'') or ('') + G.HUD_blind.alignment.offset.y = -10 + G.HUD_blind:recalculate(false) + + if blind and blind.name and blind.name ~= '' then + self:alert_debuff(true) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.05, + blockable = false, + func = (function() + G.HUD_blind:get_UIE_by_ID("HUD_blind_name").states.visible = false + G.HUD_blind:get_UIE_by_ID("dollars_to_be_earned").parent.parent.states.visible = false + G.HUD_blind.alignment.offset.y = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.15, + blockable = false, + func = (function() + G.HUD_blind:get_UIE_by_ID("HUD_blind_name").states.visible = true + G.HUD_blind:get_UIE_by_ID("dollars_to_be_earned").parent.parent.states.visible = true + G.HUD_blind:get_UIE_by_ID("dollars_to_be_earned").config.object:pop_in(0) + G.HUD_blind:get_UIE_by_ID("HUD_blind_name").config.object:pop_in(0) + G.HUD_blind:get_UIE_by_ID("HUD_blind_count"):juice_up() + self.children.animatedSprite:set_sprite_pos(self.config.blind.pos) + self.blind_set = true + G.ROOM.jiggle = G.ROOM.jiggle + 3 + if not reset and not silent then + self:juice_up() + if blind then play_sound('chips1', math.random()*0.1 + 0.55, 0.42);play_sound('gold_seal', math.random()*0.1 + 1.85, 0.26)--play_sound('cancel') + end + end + return true + end) + })) + return true + end) + })) + end + + + self.config.h_popup_config ={align="tm", offset = {x=0,y=-0.1},parent = self} + end + + if self.name == 'The Eye' and not reset then + self.hands = { + ["Flush Five"] = false, + ["Flush House"] = false, + ["Five of a Kind"] = false, + ["Straight Flush"] = false, + ["Four of a Kind"] = false, + ["Full House"] = false, + ["Flush"] = false, + ["Straight"] = false, + ["Three of a Kind"] = false, + ["Two Pair"] = false, + ["Pair"] = false, + ["High Card"] = false, + } + end + if self.name == 'The Mouth' and not reset then + self.only_hand = false + end + if self.name == 'The Fish' and not reset then + self.prepped = nil + end + if self.name == 'The Water' and not reset then + self.discards_sub = G.GAME.current_round.discards_left + ease_discard(-self.discards_sub) + end + if self.name == 'The Needle' and not reset then + self.hands_sub = G.GAME.round_resets.hands - 1 + ease_hands_played(-self.hands_sub) + end + if self.name == 'The Manacle' and not reset then + G.hand:change_size(-1) + end + if self.name == 'Amber Acorn' and not reset and #G.jokers.cards > 0 then + G.jokers:unhighlight_all() + for k, v in ipairs(G.jokers.cards) do + v:flip() + end + if #G.jokers.cards > 1 then + G.E_MANAGER:add_event(Event({ trigger = 'after', delay = 0.2, func = function() + G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 0.85);return true end })) + delay(0.15) + G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 1.15);return true end })) + delay(0.15) + G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 1);return true end })) + delay(0.5) + return true end })) + end + end + + --add new debuffs + for _, v in ipairs(G.playing_cards) do + self:debuff_card(v) + end + for _, v in ipairs(G.jokers.cards) do + if not reset then self:debuff_card(v, true) end + end + + G.ARGS.spin.real = (G.SETTINGS.reduced_motion and 0 or 1)*(self.config.blind.boss and (self.config.blind.boss.showdown and 0.5 or 0.25) or 0) +end + +function Blind:alert_debuff(first) + if self.loc_debuff_text and self.loc_debuff_text ~= '' then + self.block_play = true + G.E_MANAGER:add_event(Event({ + blockable = false, + blocking = false, + func = (function() + if self.disabled then self.block_play = nil; return true end + if G.STATE == G.STATES.SELECTING_HAND then + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = G.SETTINGS.GAMESPEED*0.05, + blockable = false, + func = (function() + play_sound('whoosh1', 0.55, 0.62) + for i = 1, 4 do + local wait_time = (0.1*(i-1)) + G.E_MANAGER:add_event(Event({ blockable = false, trigger = 'after', delay = G.SETTINGS.GAMESPEED*wait_time, + func = function() + if i == 1 then self:juice_up() end + play_sound('cancel', 0.7 + 0.05*i, 0.7) + return true end })) + end + local hold_time = G.SETTINGS.GAMESPEED*(#self.loc_debuff_text*0.035 + 1.3) + local disp_text = self:get_loc_debuff_text() + attention_text({ + scale = 0.7, text = disp_text, maxw = 12, hold = hold_time, align = 'cm', offset = {x = 0,y = -1},major = G.play + }) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1, + blocking = false, + blockable = false, + func = (function() + self.block_play = nil + if G.buttons then + local _buttons = G.buttons:get_UIE_by_ID('play_button') + _buttons.disable_button = nil + end + return true + end) + })) + return true + end) + })) + return true + end + end) + })) + end +end + +function Blind:get_loc_debuff_text() + local disp_text = (self.config.blind.name == 'The Wheel' and G.GAME.probabilities.normal or '')..self.loc_debuff_text + if (self.config.blind.name == 'The Mouth') and self.only_hand then disp_text = disp_text..' ['..localize(self.only_hand, 'poker_hands')..']' end + return disp_text +end + +function Blind:defeat(silent) + local dissolve_time = 1.3 + local extra_time = 0 + self.dissolve = 0 + self.dissolve_colours = {G.C.BLACK, G.C.RED} + self:juice_up() + self.children.particles = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.01*dissolve_time, + scale = 0.1, + speed = 1.5, + lifespan = 0.7*dissolve_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + + local blind_name_dynatext = G.HUD_blind:get_UIE_by_ID('HUD_blind_name').config.object + blind_name_dynatext:pop_out(2) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.5*dissolve_time, + func = (function() self.children.particles.max = 0 return true end) + })) + if not silent then + for i = 1, math.min(self.sound_pings or 3, 7) do + extra_time = extra_time + (0.4+0.15*i)*dissolve_time + G.E_MANAGER:add_event(Event({ blockable = false, trigger = 'after', delay = (0.15 - 0.01*(self.sound_pings or 3))*i*dissolve_time, + func = function() + play_sound('cancel', 0.8 - 0.05*i, 1.7) + if i == math.min((self.sound_pings or 3)+1, 6) then play_sound('whoosh2', 0.7, 0.42) end + return true end })) + end + end + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 1, + delay = 0.7*dissolve_time, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.8*dissolve_time, + func = (function() + G.HUD_blind.alignment.offset.y = -10 + return true + end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.95*dissolve_time, + func = (function() + self.dissolve = nil + self:set_blind(nil, nil, true) return true end) + })) + for k, v in ipairs(G.jokers.cards) do + if v.facing == 'back' then v:flip() end + end + if self.name == 'The Manacle' and not self.disabled then + G.hand:change_size(1) + end +end + +function Blind:get_type() + if self.name == "Small Blind" then + return 'Small' + elseif self.name == "Big Blind" then + return 'Big' + elseif self.name and self.name ~= '' then + return 'Boss' + end +end + +function Blind:disable() + self.disabled = true + for k, v in ipairs(G.jokers.cards) do + if v.facing == 'back' then v:flip() end + end + if self.name == 'The Water' then + ease_discard(self.discards_sub) + end + if self.name == 'The Wheel' or self.name == 'The House' or self.name == 'The Mark' or self.name == 'The Fish' then + for i = 1, #G.hand.cards do + if G.hand.cards[i].facing == 'back' then + G.hand.cards[i]:flip() + end + end + for k, v in pairs(G.playing_cards) do + v.ability.wheel_flipped = nil + end + end + if self.name == 'The Needle' then + ease_hands_played(self.hands_sub) + end + if self.name == 'The Wall' then + self.chips = self.chips/2 + self.chip_text = number_format(self.chips) + end + if self.name == 'Cerulean Bell' then + for k, v in ipairs(G.playing_cards) do + v.ability.forced_selection = nil + end + end + if self.name == 'The Manacle' then + G.hand:change_size(1) + + G.FUNCS.draw_from_deck_to_hand(1) + end + if self.name == 'The Serpent' then + end + if self.name == 'Violet Vessel' then + self.chips = self.chips/3 + self.chip_text = number_format(self.chips) + end + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if self.boss and G.GAME.chips - G.GAME.blind.chips >= 0 then + G.STATE = G.STATES.NEW_ROUND + G.STATE_COMPLETE = false + end + return true + end + })) + for _, v in ipairs(G.playing_cards) do + self:debuff_card(v) + end + for _, v in ipairs(G.jokers.cards) do + self:debuff_card(v) + end + self:set_text() + self:wiggle() +end + +function Blind:wiggle() + self.children.animatedSprite:juice_up(0.3) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) +end + +function Blind:juice_up(_a, _b) + self.children.animatedSprite:juice_up(_a or 0.2, _b or 0.2) +end + +function Blind:hover() + if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then + if not self.hovering and self.states.visible and self.children.animatedSprite.states.visible then + self.hovering = true + self.hover_tilt = 2 + self.children.animatedSprite:juice_up(0.05, 0.02) + play_sound('chips1', math.random()*0.1 + 0.55, 0.12) + Node.hover(self) + end + end +end + +function Blind:stop_hover() + self.hovering = false + self.hover_tilt = 0 + Node.stop_hover(self) +end + +function Blind:draw() + if not self.states.visible then return end + self.tilt_var = self.tilt_var or {} + self.tilt_var.mx, self.tilt_var.my =G.CONTROLLER.cursor_position.x,G.CONTROLLER.cursor_position.y + + self.children.animatedSprite.role.draw_major = self + self.children.animatedSprite:draw_shader('dissolve', 0.1) + self.children.animatedSprite:draw_shader('dissolve') + + for k, v in pairs(self.children) do + if k ~= 'animatedSprite' then + v.VT.scale = self.VT.scale + v:draw() + end + end + add_to_drawhash(self) +end + +function Blind:press_play() + if self.disabled then return end + if self.name == "The Hook" then + G.E_MANAGER:add_event(Event({ func = function() + local any_selected = nil + local _cards = {} + for k, v in ipairs(G.hand.cards) do + _cards[#_cards+1] = v + end + for i = 1, 2 do + if G.hand.cards[i] then + local selected_card, card_key = pseudorandom_element(_cards, pseudoseed('hook')) + G.hand:add_to_highlighted(selected_card, true) + table.remove(_cards, card_key) + any_selected = true + play_sound('card1', 1) + end + end + if any_selected then G.FUNCS.discard_cards_from_highlighted(nil, true) end + return true end })) + self.triggered = true + delay(0.7) + return true + end + if self.name == 'Crimson Heart' then + if G.jokers.cards[1] then + self.triggered = true + self.prepped = true + end + end + if self.name == 'The Fish' then + self.prepped = true + end + if self.name == "The Tooth" then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() + for i = 1, #G.play.cards do + G.E_MANAGER:add_event(Event({func = function() G.play.cards[i]:juice_up(); return true end })) + ease_dollars(-1) + delay(0.23) + end + return true end })) + self.triggered = true + return true + end +end + +function Blind:modify_hand(cards, poker_hands, text, mult, hand_chips) + if self.disabled then return mult, hand_chips, false end + if self.name == "The Flint" then + self.triggered = true + return math.max(math.floor(mult*0.5 + 0.5), 1), math.max(math.floor(hand_chips*0.5 + 0.5), 0), true + end + return mult, hand_chips, false +end + +function Blind:debuff_hand(cards, hand, handname, check) + if self.disabled then return end + if self.debuff then + self.triggered = false + if self.debuff.hand and next(hand[self.debuff.hand]) then + self.triggered = true + return true + end + if self.debuff.h_size_ge and #cards < self.debuff.h_size_ge then + self.triggered = true + return true + end + if self.debuff.h_size_le and #cards > self.debuff.h_size_le then + self.triggered = true + return true + end + if self.name == "The Eye" then + if self.hands[handname] then + self.triggered = true + return true + end + if not check then self.hands[handname] = true end + end + if self.name == "The Mouth" then + if self.only_hand and self.only_hand ~= handname then + self.triggered = true + return true + end + if not check then self.only_hand = handname end + end + end + if self.name == 'The Arm' then + self.triggered = false + if G.GAME.hands[handname].level > 1 then + self.triggered = true + if not check then + level_up_hand(self.children.animatedSprite, handname, nil, -1) + self:wiggle() + end + end + end + if self.name == 'The Ox' then + self.triggered = false + if handname == G.GAME.current_round.most_played_poker_hand then + self.triggered = true + if not check then + ease_dollars(-G.GAME.dollars, true) + self:wiggle() + end + end + end +end + +function Blind:drawn_to_hand() + if not self.disabled then + if self.name == 'Cerulean Bell' then + local any_forced = nil + for k, v in ipairs(G.hand.cards) do + if v.ability.forced_selection then + any_forced = true + end + end + if not any_forced then + G.hand:unhighlight_all() + local forced_card = pseudorandom_element(G.hand.cards, pseudoseed('cerulean_bell')) + forced_card.ability.forced_selection = true + G.hand:add_to_highlighted(forced_card) + end + end + if self.name == 'Crimson Heart' and self.prepped and G.jokers.cards[1] then + local jokers = {} + for i = 1, #G.jokers.cards do + if not G.jokers.cards[i].debuff or #G.jokers.cards < 2 then jokers[#jokers+1] =G.jokers.cards[i] end + G.jokers.cards[i]:set_debuff(false) + end + local _card = pseudorandom_element(jokers, pseudoseed('crimson_heart')) + if _card then + _card:set_debuff(true) + _card:juice_up() + self:wiggle() + end + end + end + self.prepped = nil +end + +function Blind:stay_flipped(area, card) + if not self.disabled then + if area == G.hand then + if self.name == 'The Wheel' and pseudorandom(pseudoseed('wheel')) < G.GAME.probabilities.normal/7 then + return true + end + if self.name == 'The House' and G.GAME.current_round.hands_played == 0 and G.GAME.current_round.discards_used == 0 then + return true + end + if self.name == 'The Mark' and card:is_face(true) then + return true + end + if self.name == 'The Fish' and self.prepped then + return true + end + end + end +end + +function Blind:debuff_card(card, from_blind) + if self.debuff and not self.disabled and card.area ~= G.jokers then + if self.debuff.suit and card:is_suit(self.debuff.suit, true) then + card:set_debuff(true) + return + end + if self.debuff.is_face =='face' and card:is_face(true) then + card:set_debuff(true) + return + end + if self.name == 'The Pillar' and card.ability.played_this_ante then + card:set_debuff(true) + return + end + if self.debuff.value and self.debuff.value == card.base.value then + card:set_debuff(true) + return + end + if self.debuff.nominal and self.debuff.nominal == card.base.nominal then + card:set_debuff(true) + return + end + end + if self.name == 'Crimson Heart' and not self.disabled and card.area == G.jokers then + return + end + if self.name == 'Verdant Leaf' and not self.disabled and card.area ~= G.jokers then card:set_debuff(true); return end + card:set_debuff(false) +end + +function Blind:move(dt) + Moveable.move(self, dt) + self:align() +end + +function Blind:change_dim(w, h) + self.T.w = w or self.T.w + self.T.h = h or self.T.h + self.children.animatedSprite.T.w = w or self.T.w + self.children.animatedSprite.T.h = h or self.T.h + self.children.animatedSprite:rescale() +end + +function Blind:align() + for k, v in pairs(self.children) do + if k == 'animatedSprite' then + if not v.states.drag.is then + v.T.r = 0.02*math.sin(2*G.TIMERS.REAL+self.T.x) + v.T.y = self.T.y + 0.03*math.sin(0.666*G.TIMERS.REAL+self.T.x) + self.shadow_height = 0.1 - (0.04 + 0.03*math.sin(0.666*G.TIMERS.REAL+self.T.x)) + v.T.x = self.T.x + 0.03*math.sin(0.436*G.TIMERS.REAL+self.T.x) + end + else + v.T.x = self.T.x + v.T.y = self.T.y + v.T.r = self.T.r + end + end +end + +function Blind:save() + local blindTable = { + name = self.name, + dollars = self.dollars, + debuff = self.debuff, + pos = self.pos, + mult = self.mult, + disabled = self.disabled, + discards_sub = self.discards_sub, + hands_sub = self.hands_sub, + boss = self.boss, + config_blind = '', + chips = self.chips, + chip_text =self.chip_text, + hands = self.hands, + only_hand = self.only_hand, + triggered = self.triggered + } + + for k, v in pairs(G.P_BLINDS) do + if v and v.name and v.name == blindTable.name then + blindTable.config_blind = k + end + end + + return blindTable +end + +function Blind:load(blindTable) + self.config.blind = G.P_BLINDS[blindTable.config_blind] or {} + + self.name = blindTable.name + self.dollars = blindTable.dollars + self.debuff = blindTable.debuff + self.pos = blindTable.pos + self.mult = blindTable.mult + self.disabled = blindTable.disabled + self.discards_sub = blindTable.discards_sub + self.hands_sub = blindTable.hands_sub + self.boss = blindTable.boss + self.chips = blindTable.chips + self.chip_text = blindTable.chip_text + self.hands = blindTable.hands + self.only_hand = blindTable.only_hand + self.triggered = blindTable.triggered + + G.ARGS.spin.real = (G.SETTINGS.reduced_motion and 0 or 1)*(self.config.blind.boss and (self.config.blind.boss.showdown and 1 or 0.3) or 0) + + if G.P_BLINDS[blindTable.config_blind] then + self.blind_set = true + self.children.animatedSprite.states.visible = true + self.children.animatedSprite:set_sprite_pos(self.config.blind.pos) + self.children.animatedSprite:juice_up(0.3) + self:align() + self.children.animatedSprite:hard_set_VT() + else + self.children.animatedSprite.states.visible = false + end + + self.children.animatedSprite.states = self.states + self:change_colour() + if self.dollars > 0 then + G.GAME.current_round.dollars_to_be_earned = string.rep(localize('$'), self.dollars)..'' + G.HUD_blind:get_UIE_by_ID("dollars_to_be_earned").config.object:pop_in(0) + G.HUD_blind.alignment.offset.y = 0 + end + self:set_text() +end diff --git a/src/card.lua b/src/card.lua new file mode 100644 index 0000000..2c95344 --- /dev/null +++ b/src/card.lua @@ -0,0 +1,4771 @@ +--class +Card = Moveable:extend() + +--class methods +function Card:init(X, Y, W, H, card, center, params) + self.params = (type(params) == 'table') and params or {} + + Moveable.init(self,X, Y, W, H) + + self.CT = self.VT + self.config = { + card = card or {}, + center = center + } + self.tilt_var = {mx = 0, my = 0, dx = 0, dy = 0, amt = 0} + self.ambient_tilt = 0.2 + + self.states.collide.can = true + self.states.hover.can = true + self.states.drag.can = true + self.states.click.can = true + + self.playing_card = self.params.playing_card + G.sort_id = (G.sort_id or 0) + 1 + self.sort_id = G.sort_id + + if self.params.viewed_back then self.back = 'viewed_back' + else self.back = 'selected_back' end + self.bypass_discovery_center = self.params.bypass_discovery_center + self.bypass_discovery_ui = self.params.bypass_discovery_ui + self.bypass_lock = self.params.bypass_lock + self.no_ui = self.config.card and self.config.card.no_ui + self.children = {} + self.base_cost = 0 + self.extra_cost = 0 + self.cost = 0 + self.sell_cost = 0 + self.sell_cost_label = 0 + self.children.shadow = Moveable(0, 0, 0, 0) + self.unique_val = 1-self.ID/1603301 + self.edition = nil + self.zoom = true + self:set_ability(center, true) + self:set_base(card, true) + + self.discard_pos = { + r = 3.6*(math.random()-0.5), + x = math.random(), + y = math.random() + } + + self.facing = 'front' + self.sprite_facing = 'front' + self.flipping = nil + self.area = nil + self.highlighted = false + self.click_timeout = 0.3 + self.T.scale = 0.95 + self.debuff = false + + self.rank = nil + self.added_to_deck = nil + + if self.children.front then self.children.front.VT.w = 0 end + self.children.back.VT.w = 0 + self.children.center.VT.w = 0 + + if self.children.front then self.children.front.parent = self; self.children.front.layered_parallax = nil end + self.children.back.parent = self; self.children.back.layered_parallax = nil + self.children.center.parent = self; self.children.center.layered_parallax = nil + + self:set_cost() + + if getmetatable(self) == Card then + table.insert(G.I.CARD, self) + end +end + +function Card:update_alert() + if (self.ability.set == 'Joker' or self.ability.set == 'Voucher' or self.ability.consumeable or self.ability.set == 'Edition' or self.ability.set == 'Booster') then + if self.area and self.area.config.collection and self.config.center then + if self.config.center.alerted and self.children.alert then + self.children.alert:remove() + self.children.alert = nil + elseif not self.config.center.alerted and not self.children.alert and self.config.center.discovered then + self.children.alert = UIBox{ + definition = create_UIBox_card_alert(), + config = {align=(self.ability.set == 'Voucher' and (self.config.center.order%2)==1) and "tli" or "tri", + offset = {x = (self.ability.set == 'Voucher' and (self.config.center.order%2)==1) and 0.1 or -0.1, y = 0.1}, + parent = self} + } + end + end + end +end + +function Card:set_base(card, initial) + card = card or {} + + self.config.card = card + for k, v in pairs(G.P_CARDS) do + if card == v then self.config.card_key = k end + end + + if next(card) then + self:set_sprites(nil, card) + end + + local suit_base_nominal_original = nil + if self.base and self.base.suit_nominal_original then suit_base_nominal_original = self.base.suit_nominal_original end + self.base = { + name = self.config.card.name, + suit = self.config.card.suit, + value = self.config.card.value, + nominal = 0, + suit_nominal = 0, + face_nominal = 0, + colour = G.C.SUITS[self.config.card.suit], + times_played = 0 + } + + if self.base.value == '2' then self.base.nominal = 2; self.base.id = 2 + elseif self.base.value == '3' then self.base.nominal = 3; self.base.id = 3 + elseif self.base.value == '4' then self.base.nominal = 4; self.base.id = 4 + elseif self.base.value == '5' then self.base.nominal = 5; self.base.id = 5 + elseif self.base.value == '6' then self.base.nominal = 6; self.base.id = 6 + elseif self.base.value == '7' then self.base.nominal = 7; self.base.id = 7 + elseif self.base.value == '8' then self.base.nominal = 8; self.base.id = 8 + elseif self.base.value == '9' then self.base.nominal = 9; self.base.id = 9 + elseif self.base.value == '10' then self.base.nominal = 10; self.base.id = 10 + elseif self.base.value == 'Jack' then self.base.nominal = 10; self.base.face_nominal = 0.1; self.base.id = 11 + elseif self.base.value == 'Queen' then self.base.nominal = 10; self.base.face_nominal = 0.2; self.base.id = 12 + elseif self.base.value == 'King' then self.base.nominal = 10; self.base.face_nominal = 0.3; self.base.id = 13 + elseif self.base.value == 'Ace' then self.base.nominal = 11; self.base.face_nominal = 0.4; self.base.id = 14 end + + if initial then self.base.original_value = self.base.value end + + if self.base.suit == 'Diamonds' then self.base.suit_nominal = 0.01; self.base.suit_nominal_original = suit_base_nominal_original or 0.001 + elseif self.base.suit == 'Clubs' then self.base.suit_nominal = 0.02; self.base.suit_nominal_original = suit_base_nominal_original or 0.002 + elseif self.base.suit == 'Hearts' then self.base.suit_nominal = 0.03; self.base.suit_nominal_original = suit_base_nominal_original or 0.003 + elseif self.base.suit == 'Spades' then self.base.suit_nominal = 0.04; self.base.suit_nominal_original = suit_base_nominal_original or 0.004 end + + if not initial then G.GAME.blind:debuff_card(self) end + if self.playing_card and not initial then check_for_unlock({type = 'modify_deck'}) end +end + +function Card:set_sprites(_center, _front) + if _front then + local _atlas, _pos = get_front_spriteinfo(_front) + if self.children.front then + self.children.front.atlas = _atlas + self.children.front:set_sprite_pos(_pos) + else + self.children.front = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, _atlas, _pos) + self.children.front.states.hover = self.states.hover + self.children.front.states.click = self.states.click + self.children.front.states.drag = self.states.drag + self.children.front.states.collide.can = false + self.children.front:set_role({major = self, role_type = 'Glued', draw_major = self}) + end + end + if _center then + if _center.set then + if self.children.center then + self.children.center.atlas = G.ASSET_ATLAS[(_center.atlas or (_center.set == 'Joker' or _center.consumeable or _center.set == 'Voucher') and _center.set) or 'centers'] + self.children.center:set_sprite_pos(_center.pos) + else + if _center.set == 'Joker' and not _center.unlocked and not self.params.bypass_discovery_center then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["Joker"], G.j_locked.pos) + elseif self.config.center.set == 'Voucher' and not self.config.center.unlocked and not self.params.bypass_discovery_center then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["Voucher"], G.v_locked.pos) + elseif self.config.center.consumeable and self.config.center.demo then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["Tarot"], G.c_locked.pos) + elseif not self.params.bypass_discovery_center and (_center.set == 'Edition' or _center.set == 'Joker' or _center.consumeable or _center.set == 'Voucher' or _center.set == 'Booster') and not _center.discovered then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS[_center.atlas or _center.set], + (_center.set == 'Joker' and G.j_undiscovered.pos) or + (_center.set == 'Edition' and G.j_undiscovered.pos) or + (_center.set == 'Tarot' and G.t_undiscovered.pos) or + (_center.set == 'Planet' and G.p_undiscovered.pos) or + (_center.set == 'Spectral' and G.s_undiscovered.pos) or + (_center.set == 'Voucher' and G.v_undiscovered.pos) or + (_center.set == 'Booster' and G.booster_undiscovered.pos)) + elseif _center.set == 'Joker' or _center.consumeable or _center.set == 'Voucher' then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS[_center.set], self.config.center.pos) + else + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS[_center.atlas or 'centers'], _center.pos) + end + self.children.center.states.hover = self.states.hover + self.children.center.states.click = self.states.click + self.children.center.states.drag = self.states.drag + self.children.center.states.collide.can = false + self.children.center:set_role({major = self, role_type = 'Glued', draw_major = self}) + end + if _center.name == 'Half Joker' and (_center.discovered or self.bypass_discovery_center) then + self.children.center.scale.y = self.children.center.scale.y/1.7 + end + if _center.name == 'Photograph' and (_center.discovered or self.bypass_discovery_center) then + self.children.center.scale.y = self.children.center.scale.y/1.2 + end + if _center.name == 'Square Joker' and (_center.discovered or self.bypass_discovery_center) then + self.children.center.scale.y = self.children.center.scale.x + end + end + + if _center.soul_pos then + self.children.floating_sprite = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS['Joker'], self.config.center.soul_pos) + self.children.floating_sprite.role.draw_major = self + self.children.floating_sprite.states.hover.can = false + self.children.floating_sprite.states.click.can = false + end + + if not self.children.back then + self.children.back = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["centers"], self.params.bypass_back or (self.playing_card and G.GAME[self.back].pos or G.P_CENTERS['b_red'].pos)) + self.children.back.states.hover = self.states.hover + self.children.back.states.click = self.states.click + self.children.back.states.drag = self.states.drag + self.children.back.states.collide.can = false + self.children.back:set_role({major = self, role_type = 'Glued', draw_major = self}) + end + end +end + +function Card:set_ability(center, initial, delay_sprites) + local X, Y, W, H = self.T.x, self.T.y, self.T.w, self.T.h + + local old_center = self.config.center + self.config.center = center + self.sticker_run = nil + for k, v in pairs(G.P_CENTERS) do + if center == v then self.config.center_key = k end + end + + if self.params.discover and not center.discovered then + unlock_card(center) + discover_card(center) + end + + if center.name == "Half Joker" and (center.discovered or self.bypass_discovery_center) then + H = H/1.7 + self.T.h = H + end + + if center.name == "Photograph" and (center.discovered or self.bypass_discovery_center) then + H = H/1.2 + self.T.h = H + end + + if center.name == "Square Joker" and (center.discovered or self.bypass_discovery_center) then + H = W + self.T.h = H + end + + if center.name == "Wee Joker" and (center.discovered or self.bypass_discovery_center) then + H = H*0.7 + W = W*0.7 + self.T.h = H + self.T.w = W + end + + if delay_sprites then + G.E_MANAGER:add_event(Event({ + func = function() + if not self.REMOVED then + self:set_sprites(center) + end + return true + end + })) + else + self:set_sprites(center) + end + + if self.ability and old_center and old_center.config.bonus then + self.ability.bonus = self.ability.bonus - old_center.config.bonus + end + + self.ability = { + name = center.name, + effect = center.effect, + set = center.set, + mult = center.config.mult or 0, + h_mult = center.config.h_mult or 0, + h_x_mult = center.config.h_x_mult or 0, + h_dollars = center.config.h_dollars or 0, + p_dollars = center.config.p_dollars or 0, + t_mult = center.config.t_mult or 0, + t_chips = center.config.t_chips or 0, + x_mult = center.config.Xmult or 1, + h_size = center.config.h_size or 0, + d_size = center.config.d_size or 0, + extra = copy_table(center.config.extra) or nil, + extra_value = 0, + type = center.config.type or '', + order = center.order or nil, + forced_selection = self.ability and self.ability.forced_selection or nil, + perma_bonus = self.ability and self.ability.perma_bonus or 0, + } + + self.ability.bonus = (self.ability.bonus or 0) + (center.config.bonus or 0) + + if center.consumeable then + self.ability.consumeable = center.config + end + + if self.ability.name == 'Gold Card' and self.seal == 'Gold' and self.playing_card then + check_for_unlock({type = 'double_gold'}) + end + if self.ability.name == "Invisible Joker" then + self.ability.invis_rounds = 0 + end + if self.ability.name == 'To Do List' then + local _poker_hands = {} + for k, v in pairs(G.GAME.hands) do + if v.visible then _poker_hands[#_poker_hands+1] = k end + end + local old_hand = self.ability.to_do_poker_hand + self.ability.to_do_poker_hand = nil + + while not self.ability.to_do_poker_hand do + self.ability.to_do_poker_hand = pseudorandom_element(_poker_hands, pseudoseed((self.area and self.area.config.type == 'title') and 'false_to_do' or 'to_do')) + if self.ability.to_do_poker_hand == old_hand then self.ability.to_do_poker_hand = nil end + end + end + if self.ability.name == 'Caino' then + self.ability.caino_xmult = 1 + end + if self.ability.name == 'Yorick' then + self.ability.yorick_discards = self.ability.extra.discards + end + if self.ability.name == 'Loyalty Card' then + self.ability.burnt_hand = 0 + self.ability.loyalty_remaining = self.ability.extra.every + end + + self.base_cost = center.cost or 1 + + self.ability.hands_played_at_create = G.GAME and G.GAME.hands_played or 0 + + self.label = center.label or self.config.card.label or self.ability.set + if self.ability.set == 'Joker' then self.label = self.ability.name end + if self.ability.set == 'Edition' then self.label = self.ability.name end + if self.ability.consumeable then self.label = self.ability.name end + if self.ability.set == 'Voucher' then self.label = self.ability.name end + if self.ability.set == 'Booster' then + self.label = self.ability.name + self.mouse_damping = 1.5 + end + + if not G.OVERLAY_MENU then + for k, v in pairs(G.P_CENTERS) do + if v.name == self.ability.name then + G.GAME.used_jokers[k] = true + end + end + end + + if G.jokers and self.area == G.jokers then + check_for_unlock({type = 'modify_jokers'}) + end + + if G.consumeables and self.area == G.consumeables then + check_for_unlock({type = 'modify_jokers'}) + end + + if not initial then G.GAME.blind:debuff_card(self) end + if self.playing_card and not initial then check_for_unlock({type = 'modify_deck'}) end +end + +function Card:set_cost() + self.extra_cost = 0 + G.GAME.inflation + if self.edition then + self.extra_cost = self.extra_cost + (self.edition.holo and 3 or 0) + (self.edition.foil and 2 or 0) + + (self.edition.polychrome and 5 or 0) + (self.edition.negative and 5 or 0) + end + self.cost = math.max(1, math.floor((self.base_cost + self.extra_cost + 0.5)*(100-G.GAME.discount_percent)/100)) + if self.ability.set == 'Booster' and G.GAME.modifiers.booster_ante_scaling then self.cost = self.cost + G.GAME.round_resets.ante - 1 end + if self.ability.set == 'Booster' and (not G.SETTINGS.tutorial_complete) and G.SETTINGS.tutorial_progress and (not G.SETTINGS.tutorial_progress.completed_parts['shop_1']) then + self.cost = self.cost + 3 + end + if (self.ability.set == 'Planet' or (self.ability.set == 'Booster' and self.ability.name:find('Celestial'))) and #find_joker('Astronomer') > 0 then self.cost = 0 end + if self.ability.rental then self.cost = 1 end + self.sell_cost = math.max(1, math.floor(self.cost/2)) + (self.ability.extra_value or 0) + if self.area and self.ability.couponed and (self.area == G.shop_jokers or self.area == G.shop_booster) then self.cost = 0 end + self.sell_cost_label = self.facing == 'back' and '?' or self.sell_cost +end + +function Card:set_edition(edition, immediate, silent) + self.edition = nil + if not edition then return end + if edition.holo then + if not self.edition then self.edition = {} end + self.edition.mult = G.P_CENTERS.e_holo.config.extra + self.edition.holo = true + self.edition.type = 'holo' + elseif edition.foil then + if not self.edition then self.edition = {} end + self.edition.chips = G.P_CENTERS.e_foil.config.extra + self.edition.foil = true + self.edition.type = 'foil' + elseif edition.polychrome then + if not self.edition then self.edition = {} end + self.edition.x_mult = G.P_CENTERS.e_polychrome.config.extra + self.edition.polychrome = true + self.edition.type = 'polychrome' + elseif edition.negative then + if not self.edition then + self.edition = {} + if self.added_to_deck then --Need to override if adding negative to an existing joker + if self.ability.consumeable then + G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1 + else + G.jokers.config.card_limit = G.jokers.config.card_limit + 1 + end + end + end + self.edition.negative = true + self.edition.type = 'negative' + end + + if self.area and self.area == G.jokers then + if self.edition then + if not G.P_CENTERS['e_'..(self.edition.type)].discovered then + discover_card(G.P_CENTERS['e_'..(self.edition.type)]) + end + else + if not G.P_CENTERS['e_base'].discovered then + discover_card(G.P_CENTERS['e_base']) + end + end + end + + if self.edition and not silent then + G.CONTROLLER.locks.edition = true + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = not immediate and 0.2 or 0, + blockable = not immediate, + func = function() + self:juice_up(1, 0.5) + if self.edition.foil then play_sound('foil1', 1.2, 0.4) end + if self.edition.holo then play_sound('holo1', 1.2*1.58, 0.4) end + if self.edition.polychrome then play_sound('polychrome1', 1.2, 0.7) end + if self.edition.negative then play_sound('negative', 1.5, 0.4) end + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + G.CONTROLLER.locks.edition = false + return true + end + })) + end + + if G.jokers and self.area == G.jokers then + check_for_unlock({type = 'modify_jokers'}) + end + + self:set_cost() +end + +function Card:set_seal(_seal, silent, immediate) + self.seal = nil + if _seal then + self.seal = _seal + if not silent then + G.CONTROLLER.locks.seal = true + if immediate then + self:juice_up(0.3, 0.3) + play_sound('gold_seal', 1.2, 0.4) + G.CONTROLLER.locks.seal = false + else + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = function() + self:juice_up(0.3, 0.3) + play_sound('gold_seal', 1.2, 0.4) + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.15, + func = function() + G.CONTROLLER.locks.seal = false + return true + end + })) + end + end + end + if self.ability.name == 'Gold Card' and self.seal == 'Gold' and self.playing_card then + check_for_unlock({type = 'double_gold'}) + end + self:set_cost() +end + +function Card:get_seal(bypass_debuff) + if self.debuff and not bypass_debuff then return end + return self.seal +end + +function Card:set_eternal(_eternal) + self.ability.eternal = nil + if self.config.center.eternal_compat and not self.ability.perishable then + self.ability.eternal = _eternal + end +end + +function Card:set_perishable(_perishable) + self.ability.perishable = nil + if self.config.center.perishable_compat and not self.ability.eternal then + self.ability.perishable = true + self.ability.perish_tally = G.GAME.perishable_rounds + end +end + +function Card:set_rental(_rental) + self.ability.rental = _rental + self:set_cost() +end + +function Card:set_debuff(should_debuff) + if self.ability.perishable and self.ability.perish_tally <= 0 then + if not self.debuff then + self.debuff = true + if self.area == G.jokers then self:remove_from_deck(true) end + end + return + end + if should_debuff ~= self.debuff then + if self.area == G.jokers then if should_debuff then self:remove_from_deck(true) else self:add_to_deck(true) end end + self.debuff = should_debuff + end +end + +function Card:remove_UI() + self.ability_UIBox_table = nil + self.config.h_popup = nil + self.config.h_popup_config = nil + self.no_ui = true +end + +function Card:change_suit(new_suit) + local new_code = (new_suit == 'Diamonds' and 'D_') or + (new_suit == 'Spades' and 'S_') or + (new_suit == 'Clubs' and 'C_') or + (new_suit == 'Hearts' and 'H_') + local new_val = (self.base.value == 'Ace' and 'A') or + (self.base.value == 'King' and 'K') or + (self.base.value == 'Queen' and 'Q') or + (self.base.value == 'Jack' and 'J') or + (self.base.value == '10' and 'T') or + (self.base.value) + local new_card = G.P_CARDS[new_code..new_val] + + self:set_base(new_card) + G.GAME.blind:debuff_card(self) +end + +function Card:add_to_deck(from_debuff) + if not self.config.center.discovered then + discover_card(self.config.center) + end + if not self.added_to_deck then + self.added_to_deck = true + if self.ability.set == 'Enhanced' or self.ability.set == 'Default' then + if self.ability.name == 'Gold Card' and self.seal == 'Gold' and self.playing_card then + check_for_unlock({type = 'double_gold'}) + end + return + end + + if self.edition then + if not G.P_CENTERS['e_'..(self.edition.type)].discovered then + discover_card(G.P_CENTERS['e_'..(self.edition.type)]) + end + else + if not G.P_CENTERS['e_base'].discovered then + discover_card(G.P_CENTERS['e_base']) + end + end + if self.ability.h_size ~= 0 then + G.hand:change_size(self.ability.h_size) + end + if self.ability.d_size > 0 then + G.GAME.round_resets.discards = G.GAME.round_resets.discards + self.ability.d_size + ease_discard(self.ability.d_size) + end + if self.ability.name == 'Credit Card' then + G.GAME.bankrupt_at = G.GAME.bankrupt_at - self.ability.extra + end + if self.ability.name == 'Chicot' and G.GAME.blind and G.GAME.blind.boss and not G.GAME.blind.disabled then + G.GAME.blind:disable() + play_sound('timpani') + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('ph_boss_disabled')}) + end + if self.ability.name == 'Chaos the Clown' then + G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls + 1 + calculate_reroll_cost(true) + end + if self.ability.name == 'Turtle Bean' then + G.hand:change_size(self.ability.extra.h_size) + end + if self.ability.name == 'Oops! All 6s' then + for k, v in pairs(G.GAME.probabilities) do + G.GAME.probabilities[k] = v*2 + end + end + if self.ability.name == 'To the Moon' then + G.GAME.interest_amount = G.GAME.interest_amount + self.ability.extra + end + if self.ability.name == 'Astronomer' then + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + if self.ability.name == 'Troubadour' then + G.hand:change_size(self.ability.extra.h_size) + G.GAME.round_resets.hands = G.GAME.round_resets.hands + self.ability.extra.h_plays + end + if self.ability.name == 'Stuntman' then + G.hand:change_size(-self.ability.extra.h_size) + end + if self.edition and self.edition.negative then + if from_debuff then + self.ability.queue_negative_removal = nil + else + if self.ability.consumeable then + G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1 + else + G.jokers.config.card_limit = G.jokers.config.card_limit + 1 + end + end + end + if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end + end +end + +function Card:remove_from_deck(from_debuff) + if self.added_to_deck then + self.added_to_deck = false + if self.ability.h_size ~= 0 then + G.hand:change_size(-self.ability.h_size) + end + if self.ability.d_size > 0 then + G.GAME.round_resets.discards = G.GAME.round_resets.discards - self.ability.d_size + ease_discard(-self.ability.d_size) + end + if self.ability.name == 'Credit Card' then + G.GAME.bankrupt_at = G.GAME.bankrupt_at + self.ability.extra + end + if self.ability.name == 'Chaos the Clown' then + G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls - 1 + calculate_reroll_cost(true) + end + if self.ability.name == 'Turtle Bean' then + G.hand:change_size(-self.ability.extra.h_size) + end + if self.ability.name == 'Oops! All 6s' then + for k, v in pairs(G.GAME.probabilities) do + G.GAME.probabilities[k] = v/2 + end + end + if self.ability.name == 'To the Moon' then + G.GAME.interest_amount = G.GAME.interest_amount - self.ability.extra + end + if self.ability.name == 'Astronomer' then + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + if self.ability.name == 'Troubadour' then + G.hand:change_size(-self.ability.extra.h_size) + G.GAME.round_resets.hands = G.GAME.round_resets.hands - self.ability.extra.h_plays + end + if self.ability.name == 'Stuntman' then + G.hand:change_size(self.ability.extra.h_size) + end + if self.edition and self.edition.negative and G.jokers then + if from_debuff then + self.ability.queue_negative_removal = true + else + if self.ability.consumeable then + G.consumeables.config.card_limit = G.consumeables.config.card_limit - 1 + else + G.jokers.config.card_limit = G.jokers.config.card_limit - 1 + end + end + end + if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end + end +end + +function Card:generate_UIBox_unlock_table(hidden) + local loc_vars = {no_name = true, not_hidden = not hidden} + + return generate_card_ui(self.config.center, nil, loc_vars, 'Locked') +end + +function Card:generate_UIBox_ability_table() + local card_type, hide_desc = self.ability.set or "None", nil + local loc_vars = nil + local main_start, main_end = nil,nil + local no_badge = nil + + if not self.bypass_lock and self.config.center.unlocked ~= false and + (self.ability.set == 'Joker' or self.ability.set == 'Edition' or self.ability.consumeable or self.ability.set == 'Voucher' or self.ability.set == 'Booster') and + not self.config.center.discovered and + ((self.area ~= G.jokers and self.area ~= G.consumeables and self.area) or not self.area) then + card_type = 'Undiscovered' + end + if self.config.center.unlocked == false and not self.bypass_lock then --For everyting that is locked + card_type = "Locked" + if self.area and self.area == G.shop_demo then loc_vars = {}; no_badge = true end + elseif card_type == 'Undiscovered' and not self.bypass_discovery_ui then -- Any Joker or tarot/planet/voucher that is not yet discovered + hide_desc = true + elseif self.debuff then + loc_vars = { debuffed = true, playing_card = not not self.base.colour, value = self.base.value, suit = self.base.suit, colour = self.base.colour } + elseif card_type == 'Default' or card_type == 'Enhanced' then + loc_vars = { playing_card = not not self.base.colour, value = self.base.value, suit = self.base.suit, colour = self.base.colour, + nominal_chips = self.base.nominal > 0 and self.base.nominal or nil, + bonus_chips = (self.ability.bonus + (self.ability.perma_bonus or 0)) > 0 and (self.ability.bonus + (self.ability.perma_bonus or 0)) or nil, + } + elseif self.ability.set == 'Joker' then -- all remaining jokers + if self.ability.name == 'Joker' then loc_vars = {self.ability.mult} + elseif self.ability.name == 'Jolly Joker' or self.ability.name == 'Zany Joker' or + self.ability.name == 'Mad Joker' or self.ability.name == 'Crazy Joker' or + self.ability.name == 'Droll Joker' then + loc_vars = {self.ability.t_mult, localize(self.ability.type, 'poker_hands')} + elseif self.ability.name == 'Sly Joker' or self.ability.name == 'Wily Joker' or + self.ability.name == 'Clever Joker' or self.ability.name == 'Devious Joker' or + self.ability.name == 'Crafty Joker' then + loc_vars = {self.ability.t_chips, localize(self.ability.type, 'poker_hands')} + elseif self.ability.name == 'Half Joker' then loc_vars = {self.ability.extra.mult, self.ability.extra.size} + elseif self.ability.name == 'Fortune Teller' then loc_vars = {self.ability.extra, (G.GAME.consumeable_usage_total and G.GAME.consumeable_usage_total.tarot or 0)} + elseif self.ability.name == 'Steel Joker' then loc_vars = {self.ability.extra, 1 + self.ability.extra*(self.ability.steel_tally or 0)} + elseif self.ability.name == 'Chaos the Clown' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Space Joker' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra} + elseif self.ability.name == 'Stone Joker' then loc_vars = {self.ability.extra, self.ability.extra*(self.ability.stone_tally or 0)} + elseif self.ability.name == 'Drunkard' then loc_vars = {self.ability.d_size} + elseif self.ability.name == 'Green Joker' then loc_vars = {self.ability.extra.hand_add, self.ability.extra.discard_sub, self.ability.mult} + elseif self.ability.name == 'Credit Card' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Greedy Joker' or self.ability.name == 'Lusty Joker' or + self.ability.name == 'Wrathful Joker' or self.ability.name == 'Gluttonous Joker' then loc_vars = {self.ability.extra.s_mult, localize(self.ability.extra.suit, 'suits_singular')} + elseif self.ability.name == 'Blue Joker' then loc_vars = {self.ability.extra, self.ability.extra*((G.deck and G.deck.cards) and #G.deck.cards or 52)} + elseif self.ability.name == 'Sixth Sense' then loc_vars = {} + elseif self.ability.name == 'Mime' then + elseif self.ability.name == 'Hack' then loc_vars = {self.ability.extra+1} + elseif self.ability.name == 'Pareidolia' then + elseif self.ability.name == 'Faceless Joker' then loc_vars = {self.ability.extra.dollars, self.ability.extra.faces} + elseif self.ability.name == 'Oops! All 6s' then + elseif self.ability.name == 'Juggler' then loc_vars = {self.ability.h_size} + elseif self.ability.name == 'Golden Joker' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Joker Stencil' then loc_vars = {self.ability.x_mult} + elseif self.ability.name == 'Four Fingers' then + elseif self.ability.name == 'Ceremonial Dagger' then loc_vars = {self.ability.mult} + elseif self.ability.name == 'Banner' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Misprint' then + local r_mults = {} + for i = self.ability.extra.min, self.ability.extra.max do + r_mults[#r_mults+1] = tostring(i) + end + local loc_mult = ' '..(localize('k_mult'))..' ' + main_start = { + {n=G.UIT.T, config={text = ' +',colour = G.C.MULT, scale = 0.32}}, + {n=G.UIT.O, config={object = DynaText({string = r_mults, colours = {G.C.RED},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.5, scale = 0.32, min_cycle_time = 0})}}, + {n=G.UIT.O, config={object = DynaText({string = { + {string = 'rand()', colour = G.C.JOKER_GREY},{string = "#@"..(G.deck and G.deck.cards[1] and G.deck.cards[#G.deck.cards].base.id or 11)..(G.deck and G.deck.cards[1] and G.deck.cards[#G.deck.cards].base.suit:sub(1,1) or 'D'), colour = G.C.RED}, + loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult}, + colours = {G.C.UI.TEXT_DARK},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.2011, scale = 0.32, min_cycle_time = 0})}}, + } + elseif self.ability.name == 'Mystic Summit' then loc_vars = {self.ability.extra.mult, self.ability.extra.d_remaining} + elseif self.ability.name == 'Marble Joker' then + elseif self.ability.name == 'Loyalty Card' then loc_vars = {self.ability.extra.Xmult, self.ability.extra.every + 1, localize{type = 'variable', key = (self.ability.loyalty_remaining == 0 and 'loyalty_active' or 'loyalty_inactive'), vars = {self.ability.loyalty_remaining}}} + elseif self.ability.name == '8 Ball' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1),self.ability.extra} + elseif self.ability.name == 'Dusk' then loc_vars = {self.ability.extra+1} + elseif self.ability.name == 'Raised Fist' then + elseif self.ability.name == 'Fibonacci' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Scary Face' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Abstract Joker' then loc_vars = {self.ability.extra, (G.jokers and G.jokers.cards and #G.jokers.cards or 0)*self.ability.extra} + elseif self.ability.name == 'Delayed Gratification' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Gros Michel' then loc_vars = {self.ability.extra.mult, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds} + elseif self.ability.name == 'Even Steven' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Odd Todd' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Scholar' then loc_vars = {self.ability.extra.mult, self.ability.extra.chips} + elseif self.ability.name == 'Business Card' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra} + elseif self.ability.name == 'Supernova' then + elseif self.ability.name == 'Spare Trousers' then loc_vars = {self.ability.extra, localize('Two Pair', 'poker_hands'), self.ability.mult} + elseif self.ability.name == 'Superposition' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Ride the Bus' then loc_vars = {self.ability.extra, self.ability.mult} + elseif self.ability.name == 'Egg' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Burglar' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Blackboard' then loc_vars = {self.ability.extra, localize('Spades', 'suits_plural'), localize('Clubs', 'suits_plural')} + elseif self.ability.name == 'Runner' then loc_vars = {self.ability.extra.chips, self.ability.extra.chip_mod} + elseif self.ability.name == 'Ice Cream' then loc_vars = {self.ability.extra.chips, self.ability.extra.chip_mod} + elseif self.ability.name == 'DNA' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Splash' then + elseif self.ability.name == 'Constellation' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Hiker' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'To Do List' then loc_vars = {self.ability.extra.dollars, localize(self.ability.to_do_poker_hand, 'poker_hands')} + elseif self.ability.name == 'Smeared Joker' then + elseif self.ability.name == 'Blueprint' then + self.ability.blueprint_compat_ui = self.ability.blueprint_compat_ui or ''; self.ability.blueprint_compat_check = nil + main_end = (self.area and self.area == G.jokers) and { + {n=G.UIT.C, config={align = "bm", minh = 0.4}, nodes={ + {n=G.UIT.C, config={ref_table = self, align = "m", colour = G.C.JOKER_GREY, r = 0.05, padding = 0.06, func = 'blueprint_compat'}, nodes={ + {n=G.UIT.T, config={ref_table = self.ability, ref_value = 'blueprint_compat_ui',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.8}}, + }} + }} + } or nil + elseif self.ability.name == 'Cartomancer' then + elseif self.ability.name == 'Astronomer' then loc_vars = {self.ability.extra} + + elseif self.ability.name == 'Golden Ticket' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Mr. Bones' then + elseif self.ability.name == 'Acrobat' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Sock and Buskin' then loc_vars = {self.ability.extra+1} + elseif self.ability.name == 'Swashbuckler' then loc_vars = {self.ability.mult} + elseif self.ability.name == 'Troubadour' then loc_vars = {self.ability.extra.h_size, -self.ability.extra.h_plays} + elseif self.ability.name == 'Certificate' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Throwback' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Hanging Chad' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Rough Gem' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Bloodstone' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds, self.ability.extra.Xmult} + elseif self.ability.name == 'Arrowhead' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Onyx Agate' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Glass Joker' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Showman' then + elseif self.ability.name == 'Flower Pot' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Wee Joker' then loc_vars = {self.ability.extra.chips, self.ability.extra.chip_mod} + elseif self.ability.name == 'Merry Andy' then loc_vars = {self.ability.d_size, self.ability.h_size} + elseif self.ability.name == 'The Idol' then loc_vars = {self.ability.extra, localize(G.GAME.current_round.idol_card.rank, 'ranks'), localize(G.GAME.current_round.idol_card.suit, 'suits_plural'), colours = {G.C.SUITS[G.GAME.current_round.idol_card.suit]}} + elseif self.ability.name == 'Seeing Double' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Matador' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Hit the Road' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'The Duo' or self.ability.name == 'The Trio' + or self.ability.name == 'The Family' or self.ability.name == 'The Order' or self.ability.name == 'The Tribe' then loc_vars = {self.ability.x_mult, localize(self.ability.type, 'poker_hands')} + + elseif self.ability.name == 'Cavendish' then loc_vars = {self.ability.extra.Xmult, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds} + elseif self.ability.name == 'Card Sharp' then loc_vars = {self.ability.extra.Xmult} + elseif self.ability.name == 'Red Card' then loc_vars = {self.ability.extra, self.ability.mult} + elseif self.ability.name == 'Madness' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Square Joker' then loc_vars = {self.ability.extra.chips, self.ability.extra.chip_mod} + elseif self.ability.name == 'Seance' then loc_vars = {localize(self.ability.extra.poker_hand, 'poker_hands')} + elseif self.ability.name == 'Riff-raff' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Vampire' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Shortcut' then + elseif self.ability.name == 'Hologram' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Vagabond' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Baron' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Cloud 9' then loc_vars = {self.ability.extra, self.ability.extra*(self.ability.nine_tally or 0)} + elseif self.ability.name == 'Rocket' then loc_vars = {self.ability.extra.dollars, self.ability.extra.increase} + elseif self.ability.name == 'Obelisk' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Midas Mask' then + elseif self.ability.name == 'Luchador' then + local has_message= (G.GAME and self.area and (self.area == G.jokers)) + if has_message then + local disableable = G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind:get_type() == 'Boss')) + main_end = { + {n=G.UIT.C, config={align = "bm", minh = 0.4}, nodes={ + {n=G.UIT.C, config={ref_table = self, align = "m", colour = disableable and G.C.GREEN or G.C.RED, r = 0.05, padding = 0.06}, nodes={ + {n=G.UIT.T, config={text = ' '..localize(disableable and 'k_active' or 'ph_no_boss_active')..' ',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.9}}, + }} + }} + } + end + elseif self.ability.name == 'Photograph' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Gift Card' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Turtle Bean' then loc_vars = {self.ability.extra.h_size, self.ability.extra.h_mod} + elseif self.ability.name == 'Erosion' then loc_vars = {self.ability.extra, math.max(0,self.ability.extra*(G.playing_cards and (G.GAME.starting_deck_size - #G.playing_cards) or 0)), G.GAME.starting_deck_size} + elseif self.ability.name == 'Reserved Parking' then loc_vars = {self.ability.extra.dollars, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds} + elseif self.ability.name == 'Mail-In Rebate' then loc_vars = {self.ability.extra, localize(G.GAME.current_round.mail_card.rank, 'ranks')} + elseif self.ability.name == 'To the Moon' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Hallucination' then loc_vars = {G.GAME.probabilities.normal, self.ability.extra} + elseif self.ability.name == 'Lucky Cat' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Baseball Card' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Bull' then loc_vars = {self.ability.extra, self.ability.extra*math.max(0,G.GAME.dollars) or 0} + elseif self.ability.name == 'Diet Cola' then loc_vars = {localize{type = 'name_text', set = 'Tag', key = 'tag_double', nodes = {}}} + elseif self.ability.name == 'Trading Card' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Flash Card' then loc_vars = {self.ability.extra, self.ability.mult} + elseif self.ability.name == 'Popcorn' then loc_vars = {self.ability.mult, self.ability.extra} + elseif self.ability.name == 'Ramen' then loc_vars = {self.ability.x_mult, self.ability.extra} + elseif self.ability.name == 'Ancient Joker' then loc_vars = {self.ability.extra, localize(G.GAME.current_round.ancient_card.suit, 'suits_singular'), colours = {G.C.SUITS[G.GAME.current_round.ancient_card.suit]}} + elseif self.ability.name == 'Walkie Talkie' then loc_vars = {self.ability.extra.chips, self.ability.extra.mult} + elseif self.ability.name == 'Seltzer' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Castle' then loc_vars = {self.ability.extra.chip_mod, localize(G.GAME.current_round.castle_card.suit, 'suits_singular'), self.ability.extra.chips, colours = {G.C.SUITS[G.GAME.current_round.castle_card.suit]}} + elseif self.ability.name == 'Smiley Face' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Campfire' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Stuntman' then loc_vars = {self.ability.extra.chip_mod, self.ability.extra.h_size} + elseif self.ability.name == 'Invisible Joker' then loc_vars = {self.ability.extra, self.ability.invis_rounds} + elseif self.ability.name == 'Brainstorm' then + self.ability.blueprint_compat_ui = self.ability.blueprint_compat_ui or ''; self.ability.blueprint_compat_check = nil + main_end = (self.area and self.area == G.jokers) and { + {n=G.UIT.C, config={align = "bm", minh = 0.4}, nodes={ + {n=G.UIT.C, config={ref_table = self, align = "m", colour = G.C.JOKER_GREY, r = 0.05, padding = 0.06, func = 'blueprint_compat'}, nodes={ + {n=G.UIT.T, config={ref_table = self.ability, ref_value = 'blueprint_compat_ui',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.8}}, + }} + }} + } or nil + elseif self.ability.name == 'Satellite' then + local planets_used = 0 + for k, v in pairs(G.GAME.consumeable_usage) do if v.set == 'Planet' then planets_used = planets_used + 1 end end + loc_vars = {self.ability.extra, planets_used*self.ability.extra} + elseif self.ability.name == 'Shoot the Moon' then loc_vars = {self.ability.extra} + elseif self.ability.name == "Driver's License" then loc_vars = {self.ability.extra, self.ability.driver_tally or '0'} + elseif self.ability.name == 'Burnt Joker' then + elseif self.ability.name == 'Bootstraps' then loc_vars = {self.ability.extra.mult, self.ability.extra.dollars, self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars)} + elseif self.ability.name == 'Caino' then loc_vars = {self.ability.extra, self.ability.caino_xmult} + elseif self.ability.name == 'Triboulet' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Yorick' then loc_vars = {self.ability.extra.xmult, self.ability.extra.discards, self.ability.yorick_discards, self.ability.x_mult} + elseif self.ability.name == 'Chicot' then + elseif self.ability.name == 'Perkeo' then loc_vars = {self.ability.extra} + end + end + local badges = {} + if (card_type ~= 'Locked' and card_type ~= 'Undiscovered' and card_type ~= 'Default') or self.debuff then + badges.card_type = card_type + end + if self.ability.set == 'Joker' and self.bypass_discovery_ui and (not no_badge) then + badges.force_rarity = true + end + if self.edition then + if self.edition.type == 'negative' and self.ability.consumeable then + badges[#badges + 1] = 'negative_consumable' + else + badges[#badges + 1] = (self.edition.type == 'holo' and 'holographic' or self.edition.type) + end + end + if self.seal then badges[#badges + 1] = string.lower(self.seal)..'_seal' end + if self.ability.eternal then badges[#badges + 1] = 'eternal' end + if self.ability.perishable then + loc_vars = loc_vars or {}; loc_vars.perish_tally=self.ability.perish_tally + badges[#badges + 1] = 'perishable' + end + if self.ability.rental then badges[#badges + 1] = 'rental' end + if self.pinned then badges[#badges + 1] = 'pinned_left' end + if self.sticker or ((self.sticker_run and self.sticker_run~='NONE') and G.SETTINGS.run_stake_stickers) then loc_vars = loc_vars or {}; loc_vars.sticker=(self.sticker or self.sticker_run) end + + return generate_card_ui(self.config.center, nil, loc_vars, card_type, badges, hide_desc, main_start, main_end) +end + +function Card:get_nominal(mod) + local mult = 1 + if mod == 'suit' then mult = 1000 end + if self.ability.effect == 'Stone Card' then mult = -1000 end + return self.base.nominal + self.base.suit_nominal*mult + (self.base.suit_nominal_original or 0)*0.0001*mult + self.base.face_nominal + 0.000001*self.unique_val +end + +function Card:get_id() + if self.ability.effect == 'Stone Card' and not self.vampired then + return -math.random(100, 1000000) + end + return self.base.id +end + +function Card:is_face(from_boss) + if self.debuff and not from_boss then return end + local id = self:get_id() + if id == 11 or id == 12 or id == 13 or next(find_joker("Pareidolia")) then + return true + end +end + +function Card:get_original_rank() + return self.base.original_value +end + +function Card:get_chip_bonus() + if self.debuff then return 0 end + if self.ability.effect == 'Stone Card' then + return self.ability.bonus + (self.ability.perma_bonus or 0) + end + return self.base.nominal + self.ability.bonus + (self.ability.perma_bonus or 0) +end + +function Card:get_chip_mult() + if self.debuff then return 0 end + if self.ability.set == 'Joker' then return 0 end + if self.ability.effect == "Lucky Card" then + if pseudorandom('lucky_mult') < G.GAME.probabilities.normal/5 then + self.lucky_trigger = true + return self.ability.mult + else + return 0 + end + else + return self.ability.mult + end +end + +function Card:get_chip_x_mult(context) + if self.debuff then return 0 end + if self.ability.set == 'Joker' then return 0 end + if self.ability.x_mult <= 1 then return 0 end + return self.ability.x_mult +end + +function Card:get_chip_h_mult() + if self.debuff then return 0 end + return self.ability.h_mult +end + +function Card:get_chip_h_x_mult() + if self.debuff then return 0 end + return self.ability.h_x_mult +end + +function Card:get_edition() + if self.debuff then return end + if self.edition then + local ret = {card = self} + if self.edition.x_mult then + ret.x_mult_mod = self.edition.x_mult + end + if self.edition.mult then + ret.mult_mod = self.edition.mult + end + if self.edition.chips then + ret.chip_mod = self.edition.chips + end + return ret + end +end + +function Card:get_end_of_round_effect(context) + if self.debuff then return {} end + local ret = {} + if self.ability.h_dollars > 0 then + ret.h_dollars = self.ability.h_dollars + ret.card = self + end + if self.seal == 'Blue' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + local card_type = 'Planet' + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + if G.GAME.last_hand_played then + local _planet = 0 + for k, v in pairs(G.P_CENTER_POOLS.Planet) do + if v.config.hand_type == G.GAME.last_hand_played then + _planet = v.key + end + end + local card = create_card(card_type,G.consumeables, nil, nil, nil, nil, _planet, 'blusl') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + end + return true + end)})) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_planet'), colour = G.C.SECONDARY_SET.Planet}) + ret.effect = true + end + return ret +end + + +function Card:get_p_dollars() + if self.debuff then return 0 end + local ret = 0 + if self.seal == 'Gold' then + ret = ret + 3 + end + if self.ability.p_dollars > 0 then + if self.ability.effect == "Lucky Card" then + if pseudorandom('lucky_money') < G.GAME.probabilities.normal/15 then + self.lucky_trigger = true + ret = ret + self.ability.p_dollars + end + else + ret = ret + self.ability.p_dollars + end + end + if ret > 0 then + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + ret + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + end + return ret +end + +function Card:use_consumeable(area, copier) + stop_use() + if not copier then set_consumeable_usage(self) end + if self.debuff then return nil end + local used_tarot = copier or self + + if self.ability.consumeable.max_highlighted then + update_hand_text({immediate = true, nopulse = true, delay = 0}, {mult = 0, chips = 0, level = '', handname = ''}) + end + + if self.ability.consumeable.mod_conv or self.ability.consumeable.suit_conv then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + for i=1, #G.hand.highlighted do + local percent = 1.15 - (i-0.999)/(#G.hand.highlighted-0.998)*0.3 + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function() G.hand.highlighted[i]:flip();play_sound('card1', percent);G.hand.highlighted[i]:juice_up(0.3, 0.3);return true end })) + end + delay(0.2) + if self.ability.name == 'Death' then + local rightmost = G.hand.highlighted[1] + for i=1, #G.hand.highlighted do if G.hand.highlighted[i].T.x > rightmost.T.x then rightmost = G.hand.highlighted[i] end end + for i=1, #G.hand.highlighted do + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() + if G.hand.highlighted[i] ~= rightmost then + copy_card(rightmost, G.hand.highlighted[i]) + end + return true end })) + end + elseif self.ability.name == 'Strength' then + for i=1, #G.hand.highlighted do + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() + local card = G.hand.highlighted[i] + local suit_prefix = string.sub(card.base.suit, 1, 1)..'_' + local rank_suffix = card.base.id == 14 and 2 or math.min(card.base.id+1, 14) + if rank_suffix < 10 then rank_suffix = tostring(rank_suffix) + elseif rank_suffix == 10 then rank_suffix = 'T' + elseif rank_suffix == 11 then rank_suffix = 'J' + elseif rank_suffix == 12 then rank_suffix = 'Q' + elseif rank_suffix == 13 then rank_suffix = 'K' + elseif rank_suffix == 14 then rank_suffix = 'A' + end + card:set_base(G.P_CARDS[suit_prefix..rank_suffix]) + return true end })) + end + elseif self.ability.consumeable.suit_conv then + for i=1, #G.hand.highlighted do + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() G.hand.highlighted[i]:change_suit(self.ability.consumeable.suit_conv);return true end })) + end + else + for i=1, #G.hand.highlighted do + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() G.hand.highlighted[i]:set_ability(G.P_CENTERS[self.ability.consumeable.mod_conv]);return true end })) + end + end + for i=1, #G.hand.highlighted do + local percent = 0.85 + (i-0.999)/(#G.hand.highlighted-0.998)*0.3 + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function() G.hand.highlighted[i]:flip();play_sound('tarot2', percent, 0.6);G.hand.highlighted[i]:juice_up(0.3, 0.3);return true end })) + end + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2,func = function() G.hand:unhighlight_all(); return true end })) + delay(0.5) + end + if self.ability.name == 'Black Hole' then + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, {handname=localize('k_all_hands'),chips = '...', mult = '...', level=''}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() + play_sound('tarot1') + self:juice_up(0.8, 0.5) + G.TAROT_INTERRUPT_PULSE = true + return true end })) + update_hand_text({delay = 0}, {mult = '+', StatusText = true}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.9, func = function() + play_sound('tarot1') + self:juice_up(0.8, 0.5) + return true end })) + update_hand_text({delay = 0}, {chips = '+', StatusText = true}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.9, func = function() + play_sound('tarot1') + self:juice_up(0.8, 0.5) + G.TAROT_INTERRUPT_PULSE = nil + return true end })) + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.9, delay = 0}, {level='+1'}) + delay(1.3) + for k, v in pairs(G.GAME.hands) do + level_up_hand(self, k, true) + end + update_hand_text({sound = 'button', volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = '', level = ''}) + end + if self.ability.name == 'Talisman' or self.ability.name == 'Deja Vu' or self.ability.name == 'Trance' or self.ability.name == 'Medium' then + local conv_card = G.hand.highlighted[1] + G.E_MANAGER:add_event(Event({func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() + conv_card:set_seal(self.ability.extra, nil, true) + return true end })) + + delay(0.5) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2,func = function() G.hand:unhighlight_all(); return true end })) + end + if self.ability.name == 'Aura' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + local over = false + local edition = poll_edition('aura', nil, true, true) + local aura_card = G.hand.highlighted[1] + aura_card:set_edition(edition, true) + used_tarot:juice_up(0.3, 0.5) + return true end })) + end + if self.ability.name == 'Cryptid' then + G.E_MANAGER:add_event(Event({ + func = function() + local _first_dissolve = nil + local new_cards = {} + for i = 1, self.ability.extra do + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local _card = copy_card(G.hand.highlighted[1], nil, nil, G.playing_card) + _card:add_to_deck() + G.deck.config.card_limit = G.deck.config.card_limit + 1 + table.insert(G.playing_cards, _card) + G.hand:emplace(_card) + _card:start_materialize(nil, _first_dissolve) + _first_dissolve = true + new_cards[#new_cards+1] = _card + end + playing_card_joker_effects(new_cards) + return true + end + })) + end + if self.ability.name == 'Sigil' or self.ability.name == 'Ouija' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + for i=1, #G.hand.cards do + local percent = 1.15 - (i-0.999)/(#G.hand.cards-0.998)*0.3 + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function() G.hand.cards[i]:flip();play_sound('card1', percent);G.hand.cards[i]:juice_up(0.3, 0.3);return true end })) + end + delay(0.2) + if self.ability.name == 'Sigil' then + local _suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('sigil')) + for i=1, #G.hand.cards do + G.E_MANAGER:add_event(Event({func = function() + local card = G.hand.cards[i] + local suit_prefix = _suit..'_' + local rank_suffix = card.base.id < 10 and tostring(card.base.id) or + card.base.id == 10 and 'T' or card.base.id == 11 and 'J' or + card.base.id == 12 and 'Q' or card.base.id == 13 and 'K' or + card.base.id == 14 and 'A' + card:set_base(G.P_CARDS[suit_prefix..rank_suffix]) + return true end })) + end + end + if self.ability.name == 'Ouija' then + local _rank = pseudorandom_element({'2','3','4','5','6','7','8','9','T','J','Q','K','A'}, pseudoseed('ouija')) + for i=1, #G.hand.cards do + G.E_MANAGER:add_event(Event({func = function() + local card = G.hand.cards[i] + local suit_prefix = string.sub(card.base.suit, 1, 1)..'_' + local rank_suffix =_rank + card:set_base(G.P_CARDS[suit_prefix..rank_suffix]) + return true end })) + end + G.hand:change_size(-1) + end + for i=1, #G.hand.cards do + local percent = 0.85 + (i-0.999)/(#G.hand.cards-0.998)*0.3 + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function() G.hand.cards[i]:flip();play_sound('tarot2', percent, 0.6);G.hand.cards[i]:juice_up(0.3, 0.3);return true end })) + end + delay(0.5) + end + if self.ability.consumeable.hand_type then + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, {handname=localize(self.ability.consumeable.hand_type, 'poker_hands'),chips = G.GAME.hands[self.ability.consumeable.hand_type].chips, mult = G.GAME.hands[self.ability.consumeable.hand_type].mult, level=G.GAME.hands[self.ability.consumeable.hand_type].level}) + level_up_hand(used_tarot, self.ability.consumeable.hand_type) + update_hand_text({sound = 'button', volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = '', level = ''}) + end + if self.ability.consumeable.remove_card then + local destroyed_cards = {} + if self.ability.name == 'The Hanged Man' then + for i=#G.hand.highlighted, 1, -1 do + destroyed_cards[#destroyed_cards+1] = G.hand.highlighted[i] + end + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.2, + func = function() + for i=#G.hand.highlighted, 1, -1 do + local card = G.hand.highlighted[i] + if card.ability.name == 'Glass Card' then + card:shatter() + else + card:start_dissolve(nil, i == #G.hand.highlighted) + end + end + return true end })) + elseif self.ability.name == 'Familiar' or self.ability.name == 'Grim' or self.ability.name == 'Incantation' then + destroyed_cards[#destroyed_cards+1] = pseudorandom_element(G.hand.cards, pseudoseed('random_destroy')) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + for i=#destroyed_cards, 1, -1 do + local card = destroyed_cards[i] + if card.ability.name == 'Glass Card' then + card:shatter() + else + card:start_dissolve(nil, i ~= #destroyed_cards) + end + end + return true end })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.7, + func = function() + local cards = {} + for i=1, self.ability.extra do + cards[i] = true + local _suit, _rank = nil, nil + if self.ability.name == 'Familiar' then + _rank = pseudorandom_element({'J', 'Q', 'K'}, pseudoseed('familiar_create')) + _suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('familiar_create')) + elseif self.ability.name == 'Grim' then + _rank = 'A' + _suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('grim_create')) + elseif self.ability.name == 'Incantation' then + _rank = pseudorandom_element({'2', '3', '4', '5', '6', '7', '8', '9', 'T'}, pseudoseed('incantation_create')) + _suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('incantation_create')) + end + _suit = _suit or 'S'; _rank = _rank or 'A' + local cen_pool = {} + for k, v in pairs(G.P_CENTER_POOLS["Enhanced"]) do + if v.key ~= 'm_stone' then + cen_pool[#cen_pool+1] = v + end + end + create_playing_card({front = G.P_CARDS[_suit..'_'.._rank], center = pseudorandom_element(cen_pool, pseudoseed('spe_card'))}, G.hand, nil, i ~= 1, {G.C.SECONDARY_SET.Spectral}) + end + playing_card_joker_effects(cards) + return true end })) + elseif self.ability.name == 'Immolate' then + local temp_hand = {} + for k, v in ipairs(G.hand.cards) do temp_hand[#temp_hand+1] = v end + table.sort(temp_hand, function (a, b) return not a.playing_card or not b.playing_card or a.playing_card < b.playing_card end) + pseudoshuffle(temp_hand, pseudoseed('immolate')) + + for i = 1, self.ability.extra.destroy do destroyed_cards[#destroyed_cards+1] = temp_hand[i] end + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + for i=#destroyed_cards, 1, -1 do + local card = destroyed_cards[i] + if card.ability.name == 'Glass Card' then + card:shatter() + else + card:start_dissolve(nil, i == #destroyed_cards) + end + end + return true end })) + delay(0.5) + ease_dollars(self.ability.extra.dollars) + end + delay(0.3) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({remove_playing_cards = true, removed = destroyed_cards}) + end + end + if self.ability.name == 'The Fool' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + if G.consumeables.config.card_limit > #G.consumeables.cards then + play_sound('timpani') + local card = create_card('Tarot_Planet', G.consumeables, nil, nil, nil, nil, G.GAME.last_tarot_planet, 'fool') + card:add_to_deck() + G.consumeables:emplace(card) + used_tarot:juice_up(0.3, 0.5) + end + return true end })) + delay(0.6) + end + if self.ability.name == 'The Hermit' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('timpani') + used_tarot:juice_up(0.3, 0.5) + ease_dollars(math.max(0,math.min(G.GAME.dollars, self.ability.extra)), true) + return true end })) + delay(0.6) + end + if self.ability.name == 'Temperance' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('timpani') + used_tarot:juice_up(0.3, 0.5) + ease_dollars(self.ability.money, true) + return true end })) + delay(0.6) + end + if self.ability.name == 'The Emperor' or self.ability.name == 'The High Priestess' then + for i = 1, math.min((self.ability.consumeable.tarots or self.ability.consumeable.planets), G.consumeables.config.card_limit - #G.consumeables.cards) do + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + if G.consumeables.config.card_limit > #G.consumeables.cards then + play_sound('timpani') + local card = create_card((self.ability.name == 'The Emperor' and 'Tarot') or (self.ability.name == 'The High Priestess' and 'Planet'), G.consumeables, nil, nil, nil, nil, nil, (self.ability.name == 'The Emperor' and 'emp') or (self.ability.name == 'The High Priestess' and 'pri')) + card:add_to_deck() + G.consumeables:emplace(card) + used_tarot:juice_up(0.3, 0.5) + end + return true end })) + end + delay(0.6) + end + if self.ability.name == 'Judgement' or self.ability.name == 'The Soul' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('timpani') + local card = create_card('Joker', G.jokers, self.ability.name == 'The Soul', nil, nil, nil, nil, self.ability.name == 'Judgement' and 'jud' or 'sou') + card:add_to_deck() + G.jokers:emplace(card) + if self.ability.name == 'The Soul' then check_for_unlock{type = 'spawn_legendary'} end + used_tarot:juice_up(0.3, 0.5) + return true end })) + delay(0.6) + end + if self.ability.name == 'Ankh' then + --Need to check for edgecases - if there are max Jokers and all are eternal OR there is a max of 1 joker this isn't possible already + --If there are max Jokers and exactly 1 is not eternal, that joker cannot be the one selected + --otherwise, the selected joker can be totally random and all other non-eternal jokers can be removed + local deletable_jokers = {} + for k, v in pairs(G.jokers.cards) do + if not v.ability.eternal then deletable_jokers[#deletable_jokers + 1] = v end + end + local chosen_joker = pseudorandom_element(G.jokers.cards, pseudoseed('ankh_choice')) + local _first_dissolve = nil + G.E_MANAGER:add_event(Event({trigger = 'before', delay = 0.75, func = function() + for k, v in pairs(deletable_jokers) do + if v ~= chosen_joker then + v:start_dissolve(nil, _first_dissolve) + _first_dissolve = true + end + end + return true end })) + G.E_MANAGER:add_event(Event({trigger = 'before', delay = 0.4, func = function() + local card = copy_card(chosen_joker, nil, nil, nil, chosen_joker.edition and chosen_joker.edition.negative) + card:start_materialize() + card:add_to_deck() + if card.edition and card.edition.negative then + card:set_edition(nil, true) + end + G.jokers:emplace(card) + return true end })) + end + if self.ability.name == 'Wraith' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('timpani') + local card = create_card('Joker', G.jokers, nil, 0.99, nil, nil, nil, 'wra') + card:add_to_deck() + G.jokers:emplace(card) + used_tarot:juice_up(0.3, 0.5) + if G.GAME.dollars ~= 0 then + ease_dollars(-G.GAME.dollars, true) + end + return true end })) + delay(0.6) + end + if self.ability.name == 'The Wheel of Fortune' or self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' then + local temp_pool = (self.ability.name == 'The Wheel of Fortune' and self.eligible_strength_jokers) or + ((self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex') and self.eligible_editionless_jokers) or {} + if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' or pseudorandom('wheel_of_fortune') < G.GAME.probabilities.normal/self.ability.extra then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + local over = false + local eligible_card = pseudorandom_element(temp_pool, pseudoseed( + (self.ability.name == 'The Wheel of Fortune' and 'wheel_of_fortune') or + (self.ability.name == 'Ectoplasm' and 'ectoplasm') or + (self.ability.name == 'Hex' and 'hex') + )) + local edition = nil + if self.ability.name == 'Ectoplasm' then + edition = {negative = true} + elseif self.ability.name == 'Hex' then + edition = {polychrome = true} + elseif self.ability.name == 'The Wheel of Fortune' then + edition = poll_edition('wheel_of_fortune', nil, true, true) + end + eligible_card:set_edition(edition, true) + if self.ability.name == 'The Wheel of Fortune' or self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' then check_for_unlock({type = 'have_edition'}) end + if self.ability.name == 'Hex' then + local _first_dissolve = nil + for k, v in pairs(G.jokers.cards) do + if v ~= eligible_card and (not v.ability.eternal) then v:start_dissolve(nil, _first_dissolve);_first_dissolve = true end + end + end + if self.ability.name == 'Ectoplasm' then + G.GAME.ecto_minus = G.GAME.ecto_minus or 1 + G.hand:change_size(-G.GAME.ecto_minus) + G.GAME.ecto_minus = G.GAME.ecto_minus + 1 + end + used_tarot:juice_up(0.3, 0.5) + return true end })) + else + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + attention_text({ + text = localize('k_nope_ex'), + scale = 1.3, + hold = 1.4, + major = used_tarot, + backdrop_colour = G.C.SECONDARY_SET.Tarot, + align = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and 'tm' or 'cm', + offset = {x = 0, y = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and -0.2 or 0}, + silent = true + }) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + used_tarot:juice_up(0.3, 0.5) + return true end })) + end + delay(0.6) + end +end + +function Card:can_use_consumeable(any_state, skip_check) + if not skip_check and ((G.play and #G.play.cards > 0) or + (G.CONTROLLER.locked) or + (G.GAME.STOP_USE and G.GAME.STOP_USE > 0)) + then return false end + if G.STATE ~= G.STATES.HAND_PLAYED and G.STATE ~= G.STATES.DRAW_TO_HAND and G.STATE ~= G.STATES.PLAY_TAROT or any_state then + + if self.ability.name == 'The Hermit' or self.ability.consumeable.hand_type or self.ability.name == 'Temperance' or self.ability.name == 'Black Hole' then + return true + end + if self.ability.name == 'The Wheel of Fortune' then + if next(self.eligible_strength_jokers) then return true end + end + if self.ability.name == 'Ankh' then + --if there is at least one joker + for k, v in pairs(G.jokers.cards) do + if v.ability.set == 'Joker' and G.jokers.config.card_limit > 1 then + return true + end + end + end + if self.ability.name == 'Aura' then + if G.hand and (#G.hand.highlighted == 1) and G.hand.highlighted[1] and (not G.hand.highlighted[1].edition) then return true end + end + if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' then + if next(self.eligible_editionless_jokers) then return true end + end + if self.ability.name == 'The Emperor' or self.ability.name == 'The High Priestess' then + if #G.consumeables.cards < G.consumeables.config.card_limit or self.area == G.consumeables then return true end + end + if self.ability.name == 'The Fool' then + if (#G.consumeables.cards < G.consumeables.config.card_limit or self.area == G.consumeables) + and G.GAME.last_tarot_planet and G.GAME.last_tarot_planet ~= 'c_fool' then return true end + end + if self.ability.name == 'Judgement' or self.ability.name == 'The Soul' or self.ability.name == 'Wraith' then + if #G.jokers.cards < G.jokers.config.card_limit or self.area == G.jokers then + return true + else + return false + end + end + if G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK then + if self.ability.consumeable.max_highlighted then + if self.ability.consumeable.mod_num >= #G.hand.highlighted and #G.hand.highlighted >= (self.ability.consumeable.min_highlighted or 1) then + return true + end + end + if (self.ability.name == 'Familiar' or self.ability.name == 'Grim' or + self.ability.name == 'Incantation' or self.ability.name == 'Immolate' or + self.ability.name == 'Sigil' or self.ability.name == 'Ouija') + and #G.hand.cards > 1 then + return true + end + end + end + return false +end + +function Card:check_use() + if self.ability.name == 'Ankh' then + if #G.jokers.cards >= G.jokers.config.card_limit then + alert_no_space(self, G.jokers) + return true + end + end +end + +function Card:sell_card() + G.CONTROLLER.locks.selling_card = true + stop_use() + local area = self.area + G.CONTROLLER:save_cardarea_focus(area == G.jokers and 'jokers' or 'consumeables') + + if self.children.use_button then self.children.use_button:remove(); self.children.use_button = nil end + if self.children.sell_button then self.children.sell_button:remove(); self.children.sell_button = nil end + + self:calculate_joker{selling_self = true} + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2,func = function() + play_sound('coin2') + self:juice_up(0.3, 0.4) + return true + end})) + delay(0.2) + G.E_MANAGER:add_event(Event({trigger = 'immediate',func = function() + ease_dollars(self.sell_cost) + self:start_dissolve({G.C.GOLD}) + delay(0.3) + + inc_career_stat('c_cards_sold', 1) + if self.ability.set == 'Joker' then + inc_career_stat('c_jokers_sold', 1) + end + if self.ability.set == 'Joker' and G.GAME.blind and G.GAME.blind.name == 'Verdant Leaf' then + G.E_MANAGER:add_event(Event({trigger = 'immediate',func = function() + G.GAME.blind:disable() + return true + end})) + end + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.3, blocking = false, + func = function() + G.E_MANAGER:add_event(Event({trigger = 'immediate', + func = function() + G.E_MANAGER:add_event(Event({trigger = 'immediate', + func = function() + G.CONTROLLER.locks.selling_card = nil + G.CONTROLLER:recall_cardarea_focus(area == G.jokers and 'jokers' or 'consumeables') + return true + end})) + return true + end})) + return true + end})) + return true + end})) +end + +function Card:can_sell_card(context) + if (G.play and #G.play.cards > 0) or + (G.CONTROLLER.locked) or + (G.GAME.STOP_USE and G.GAME.STOP_USE > 0) --or + --G.STATE == G.STATES.BLIND_SELECT + then return false end + if (G.SETTINGS.tutorial_complete or G.GAME.pseudorandom.seed ~= 'TUTORIAL' or G.GAME.round_resets.ante > 1) and + self.area and + self.area.config.type == 'joker' and + not self.ability.eternal then + return true + end + return false +end + +function Card:calculate_dollar_bonus() + if self.debuff then return end + if self.ability.set == "Joker" then + if self.ability.name == 'Golden Joker' then + return self.ability.extra + end + if self.ability.name == 'Cloud 9' and self.ability.nine_tally and self.ability.nine_tally > 0 then + return self.ability.extra*(self.ability.nine_tally) + end + if self.ability.name == 'Rocket' then + return self.ability.extra.dollars + end + if self.ability.name == 'Satellite' then + local planets_used = 0 + for k, v in pairs(G.GAME.consumeable_usage) do + if v.set == 'Planet' then planets_used = planets_used + 1 end + end + if planets_used == 0 then return end + return self.ability.extra*planets_used + end + if self.ability.name == 'Delayed Gratification' and G.GAME.current_round.discards_used == 0 and G.GAME.current_round.discards_left > 0 then + return G.GAME.current_round.discards_left*self.ability.extra + end + end +end + +function Card:open() + if self.ability.set == "Booster" then + stop_use() + G.STATE_COMPLETE = false + self.opening = true + + if not self.config.center.discovered then + discover_card(self.config.center) + end + self.states.hover.can = false + + if self.ability.name:find('Arcana') then + G.STATE = G.STATES.TAROT_PACK + G.GAME.pack_size = self.ability.extra + elseif self.ability.name:find('Celestial') then + G.STATE = G.STATES.PLANET_PACK + G.GAME.pack_size = self.ability.extra + elseif self.ability.name:find('Spectral') then + G.STATE = G.STATES.SPECTRAL_PACK + G.GAME.pack_size = self.ability.extra + elseif self.ability.name:find('Standard') then + G.STATE = G.STATES.STANDARD_PACK + G.GAME.pack_size = self.ability.extra + elseif self.ability.name:find('Buffoon') then + G.STATE = G.STATES.BUFFOON_PACK + G.GAME.pack_size = self.ability.extra + end + + G.GAME.pack_choices = self.config.center.config.choose or 1 + + if self.cost > 0 then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() + inc_career_stat('c_shop_dollars_spent', self.cost) + self:juice_up() + return true end })) + ease_dollars(-self.cost) + else + delay(0.2) + end + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + self:explode() + local pack_cards = {} + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 1.3*math.sqrt(G.SETTINGS.GAMESPEED), blockable = false, blocking = false, func = function() + local _size = self.ability.extra + + for i = 1, _size do + local card = nil + if self.ability.name:find('Arcana') then + if G.GAME.used_vouchers.v_omen_globe and pseudorandom('omen_globe') > 0.8 then + card = create_card("Spectral", G.pack_cards, nil, nil, true, true, nil, 'ar2') + else + card = create_card("Tarot", G.pack_cards, nil, nil, true, true, nil, 'ar1') + end + elseif self.ability.name:find('Celestial') then + if G.GAME.used_vouchers.v_telescope and i == 1 then + local _planet, _hand, _tally = nil, nil, 0 + for k, v in ipairs(G.handlist) do + if G.GAME.hands[v].visible and G.GAME.hands[v].played > _tally then + _hand = v + _tally = G.GAME.hands[v].played + end + end + if _hand then + for k, v in pairs(G.P_CENTER_POOLS.Planet) do + if v.config.hand_type == _hand then + _planet = v.key + end + end + end + card = create_card("Planet", G.pack_cards, nil, nil, true, true, _planet, 'pl1') + else + card = create_card("Planet", G.pack_cards, nil, nil, true, true, nil, 'pl1') + end + elseif self.ability.name:find('Spectral') then + card = create_card("Spectral", G.pack_cards, nil, nil, true, true, nil, 'spe') + elseif self.ability.name:find('Standard') then + card = create_card((pseudorandom(pseudoseed('stdset'..G.GAME.round_resets.ante)) > 0.6) and "Enhanced" or "Base", G.pack_cards, nil, nil, nil, true, nil, 'sta') + local edition_rate = 2 + local edition = poll_edition('standard_edition'..G.GAME.round_resets.ante, edition_rate, true) + card:set_edition(edition) + local seal_rate = 10 + local seal_poll = pseudorandom(pseudoseed('stdseal'..G.GAME.round_resets.ante)) + if seal_poll > 1 - 0.02*seal_rate then + local seal_type = pseudorandom(pseudoseed('stdsealtype'..G.GAME.round_resets.ante)) + if seal_type > 0.75 then card:set_seal('Red') + elseif seal_type > 0.5 then card:set_seal('Blue') + elseif seal_type > 0.25 then card:set_seal('Gold') + else card:set_seal('Purple') + end + end + elseif self.ability.name:find('Buffoon') then + card = create_card("Joker", G.pack_cards, nil, nil, true, true, nil, 'buf') + + end + card.T.x = self.T.x + card.T.y = self.T.y + card:start_materialize({G.C.WHITE, G.C.WHITE}, nil, 1.5*G.SETTINGS.GAMESPEED) + pack_cards[i] = card + end + return true + end})) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 1.3*math.sqrt(G.SETTINGS.GAMESPEED), blockable = false, blocking = false, func = function() + if G.pack_cards then + if G.pack_cards and G.pack_cards.VT.y < G.ROOM.T.h then + for k, v in ipairs(pack_cards) do + G.pack_cards:emplace(v) + end + return true + end + end + end})) + + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({open_booster = true, card = self}) + end + + if G.GAME.modifiers.inflation then + G.GAME.inflation = G.GAME.inflation + 1 + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + + return true end })) + end +end + +function Card:redeem() + if self.ability.set == "Voucher" then + stop_use() + if not self.config.center.discovered then + discover_card(self.config.center) + end + if self.shop_voucher then G.GAME.current_round.voucher = nil end + + self.states.hover.can = false + G.GAME.used_vouchers[self.config.center_key] = true + local top_dynatext = nil + local bot_dynatext = nil + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + top_dynatext = DynaText({string = localize{type = 'name_text', set = self.config.center.set, key = self.config.center.key}, colours = {G.C.WHITE}, rotate = 1,shadow = true, bump = true,float=true, scale = 0.9, pop_in = 0.6/G.SPEEDFACTOR, pop_in_rate = 1.5*G.SPEEDFACTOR}) + bot_dynatext = DynaText({string = localize('k_redeemed_ex'), colours = {G.C.WHITE}, rotate = 2,shadow = true, bump = true,float=true, scale = 0.9, pop_in = 1.4/G.SPEEDFACTOR, pop_in_rate = 1.5*G.SPEEDFACTOR, pitch_shift = 0.25}) + self:juice_up(0.3, 0.5) + play_sound('card1') + play_sound('coin1') + self.children.top_disp = UIBox{ + definition = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.O, config={object = top_dynatext}} + }}, + config = {align="tm", offset = {x=0,y=0},parent = self} + } + self.children.bot_disp = UIBox{ + definition = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.O, config={object = bot_dynatext}} + }}, + config = {align="bm", offset = {x=0,y=0},parent = self} + } + return true end })) + ease_dollars(-self.cost) + inc_career_stat('c_shop_dollars_spent', self.cost) + inc_career_stat('c_vouchers_bought', 1) + set_voucher_usage(self) + check_for_unlock({type = 'run_redeem'}) + G.GAME.current_round.voucher = nil + + self:apply_to_run() + + delay(0.6) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({buying_card = true, card = self}) + end + if G.GAME.modifiers.inflation then + G.GAME.inflation = G.GAME.inflation + 1 + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 2.6, func = function() + top_dynatext:pop_out(4) + bot_dynatext:pop_out(4) + return true end })) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.5, func = function() + self.children.top_disp:remove() + self.children.top_disp = nil + self.children.bot_disp:remove() + self.children.bot_disp = nil + return true end })) + end +end + +function Card:apply_to_run(center) + local center_table = { + name = center and center.name or self and self.ability.name, + extra = center and center.config.extra or self and self.ability.extra + } + if center_table.name == 'Overstock' or center_table.name == 'Overstock Plus' then + G.E_MANAGER:add_event(Event({func = function() + change_shop_size(1) + return true end })) + end + if center_table.name == 'Tarot Merchant' or center_table.name == 'Tarot Tycoon' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.tarot_rate = 4*center_table.extra + return true end })) + end + if center_table.name == 'Planet Merchant' or center_table.name == 'Planet Tycoon' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.planet_rate = 4*center_table.extra + return true end })) + end + if center_table.name == 'Hone' or center_table.name == 'Glow Up' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.edition_rate = center_table.extra + return true end })) + end + if center_table.name == 'Magic Trick' or center_table.name == 'Illusion' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.playing_card_rate = center_table.extra + return true end })) + end + if center_table.name == 'Telescope' or center_table.name == 'Observatory' then + end + if center_table.name == 'Crystal Ball' then + G.E_MANAGER:add_event(Event({func = function() + G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1 + return true end })) + end + if center_table.name == 'Clearance Sale' or center_table.name == 'Liquidation' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.discount_percent = center_table.extra + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + if center_table.name == 'Reroll Surplus' or center_table.name == 'Reroll Glut' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.round_resets.reroll_cost = G.GAME.round_resets.reroll_cost - self.ability.extra + G.GAME.current_round.reroll_cost = math.max(0, G.GAME.current_round.reroll_cost - self.ability.extra) + return true end })) + end + if center_table.name == 'Seed Money' or center_table.name == 'Money Tree' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.interest_cap = center_table.extra + return true end })) + end + if center_table.name == 'Grabber' or center_table.name == 'Nacho Tong' then + G.GAME.round_resets.hands = G.GAME.round_resets.hands + center_table.extra + ease_hands_played(center_table.extra) + end + if center_table.name == 'Paint Brush' or center_table.name == 'Palette' then + G.hand:change_size(1) + end + if center_table.name == 'Wasteful' or center_table.name == 'Recyclomancy' then + G.GAME.round_resets.discards = G.GAME.round_resets.discards + center_table.extra + ease_discard(center_table.extra) + end + if center_table.name == 'Blank' then + check_for_unlock({type = 'blank_redeems'}) + end + if center_table.name == 'Antimatter' then + G.E_MANAGER:add_event(Event({func = function() + if G.jokers then + G.jokers.config.card_limit = G.jokers.config.card_limit + 1 + end + return true end })) + end + if center_table.name == 'Hieroglyph' or center_table.name == 'Petroglyph' then + ease_ante(-center_table.extra) + G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante + G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante-center_table.extra + + if center_table.name == 'Hieroglyph' then + G.GAME.round_resets.hands = G.GAME.round_resets.hands - center_table.extra + ease_hands_played(-center_table.extra) + end + if center_table.name == 'Petroglyph' then + G.GAME.round_resets.discards = G.GAME.round_resets.discards - center_table.extra + ease_discard(-center_table.extra) + end + end +end + +function Card:explode(dissolve_colours, explode_time_fac) + local explode_time = 1.3*(explode_time_fac or 1)*(math.sqrt(G.SETTINGS.GAMESPEED)) + self.dissolve = 0 + self.dissolve_colours = dissolve_colours + or {G.C.WHITE} + + local start_time = G.TIMERS.TOTAL + local percent = 0 + play_sound('explosion_buildup1') + self.juice = { + scale = 0, + r = 0, + handled_elsewhere = true, + start_time = start_time, + end_time = start_time + explode_time + } + + local childParts1 = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.01*explode_time, + scale = 0.2, + speed = 2, + lifespan = 0.2*explode_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + local childParts2 = nil + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + if self.juice then + percent = (G.TIMERS.TOTAL - start_time)/explode_time + self.juice.r = 0.05*(math.sin(5*G.TIMERS.TOTAL) + math.cos(0.33 + 41.15332*G.TIMERS.TOTAL) + math.cos(67.12*G.TIMERS.TOTAL))*percent + self.juice.scale = percent*0.15 + end + if G.TIMERS.TOTAL - start_time > 1.5*explode_time then return true end + end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 0.3, + delay = 0.9*explode_time, + func = (function(t) return t end) + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.9*explode_time, + func = (function() + childParts2 = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + pulse_max = 30, + timer = 0.003, + scale = 0.6, + speed = 15, + lifespan = 0.5, + attach = self, + colours = self.dissolve_colours, + }) + childParts2:set_role({r_bond = 'Weak'}) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 1, + delay = 0.1*explode_time, + func = (function(t) return t end) + })) + self:juice_up() + G.VIBRATION = G.VIBRATION + 1 + play_sound('explosion_release1') + childParts1:fade(0.3*explode_time) return true end) + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.4*explode_time, + func = (function() + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + blocking = false, + ref_value = 'scale', + ref_table = childParts2, + ease_to = 0, + delay = 0.1*explode_time + })) + return true end) + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.5*explode_time, + func = (function() self:remove() return true end) + })) +end + +function Card:shatter() + local dissolve_time = 0.7 + self.shattered = true + self.dissolve = 0 + self.dissolve_colours = {{1,1,1,0.8}} + self:juice_up() + local childParts = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.007*dissolve_time, + scale = 0.3, + speed = 4, + lifespan = 0.5*dissolve_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.5*dissolve_time, + func = (function() childParts:fade(0.15*dissolve_time) return true end) + })) + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + play_sound('glass'..math.random(1, 6), math.random()*0.2 + 0.9,0.5) + play_sound('generic1', math.random()*0.2 + 0.9,0.5) + return true end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 1, + delay = 0.5*dissolve_time, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.55*dissolve_time, + func = (function() self:remove() return true end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.51*dissolve_time, + })) +end + +function Card:start_dissolve(dissolve_colours, silent, dissolve_time_fac, no_juice) + local dissolve_time = 0.7*(dissolve_time_fac or 1) + self.dissolve = 0 + self.dissolve_colours = dissolve_colours + or {G.C.BLACK, G.C.ORANGE, G.C.RED, G.C.GOLD, G.C.JOKER_GREY} + if not no_juice then self:juice_up() end + local childParts = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.01*dissolve_time, + scale = 0.1, + speed = 2, + lifespan = 0.7*dissolve_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.7*dissolve_time, + func = (function() childParts:fade(0.3*dissolve_time) return true end) + })) + if not silent then + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + play_sound('whoosh2', math.random()*0.2 + 0.9,0.5) + play_sound('crumple'..math.random(1, 5), math.random()*0.2 + 0.9,0.5) + return true end) + })) + end + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 1, + delay = 1*dissolve_time, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.05*dissolve_time, + func = (function() self:remove() return true end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.051*dissolve_time, + })) +end + +function Card:start_materialize(dissolve_colours, silent, timefac) + local dissolve_time = 0.6*(timefac or 1) + self.states.visible = true + self.states.hover.can = false + self.dissolve = 1 + self.dissolve_colours = dissolve_colours or + (self.ability.set == 'Joker' and {G.C.RARITY[self.config.center.rarity]}) or + (self.ability.set == 'Planet' and {G.C.SECONDARY_SET.Planet}) or + (self.ability.set == 'Tarot' and {G.C.SECONDARY_SET.Tarot}) or + (self.ability.set == 'Spectral' and {G.C.SECONDARY_SET.Spectral}) or + (self.ability.set == 'Booster' and {G.C.BOOSTER}) or + (self.ability.set == 'Voucher' and {G.C.SECONDARY_SET.Voucher, G.C.CLEAR}) or + {G.C.GREEN} + self:juice_up() + self.children.particles = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.025*dissolve_time, + scale = 0.25, + speed = 3, + lifespan = 0.7*dissolve_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + if not silent then + if not G.last_materialized or G.last_materialized +0.01 < G.TIMERS.REAL or G.last_materialized > G.TIMERS.REAL then + G.last_materialized = G.TIMERS.REAL + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + play_sound('whoosh1', math.random()*0.1 + 0.6,0.3) + play_sound('crumple'..math.random(1,5), math.random()*0.2 + 1.2,0.8) + return true end) + })) + end + end + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.5*dissolve_time, + func = (function() if self.children.particles then self.children.particles.max = 0 end return true end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 0, + delay = 1*dissolve_time, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.05*dissolve_time, + func = (function() self.states.hover.can = true; if self.children.particles then self.children.particles:remove(); self.children.particles = nil end return true end) + })) +end + +function Card:calculate_seal(context) + if self.debuff then return nil end + if context.repetition then + if self.seal == 'Red' then + return { + message = localize('k_again_ex'), + repetitions = 1, + card = self + } + end + end + if context.discard then + if self.seal == 'Purple' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, '8ba') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE}) + end + end +end + +function Card:calculate_rental() + if self.ability.rental then + ease_dollars(-G.GAME.rental_rate) + card_eval_status_text(self, 'dollars', -G.GAME.rental_rate) + end +end + +function Card:calculate_perishable() + if self.ability.perishable and self.ability.perish_tally > 0 then + if self.ability.perish_tally == 1 then + self.ability.perish_tally = 0 + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_disabled_ex'),colour = G.C.FILTER, delay = 0.45}) + self:set_debuff() + else + self.ability.perish_tally = self.ability.perish_tally - 1 + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_remaining',vars={self.ability.perish_tally}},colour = G.C.FILTER, delay = 0.45}) + end + end +end + +function Card:calculate_joker(context) + if self.debuff then return nil end + if self.ability.set == "Planet" and not self.debuff then + if context.joker_main then + if G.GAME.used_vouchers.v_observatory and self.ability.consumeable.hand_type == context.scoring_name then + return { + message = localize{type = 'variable', key = 'a_xmult', vars = {G.P_CENTERS.v_observatory.config.extra}}, + Xmult_mod = G.P_CENTERS.v_observatory.config.extra + } + end + end + end + if self.ability.set == "Joker" and not self.debuff then + if self.ability.name == "Blueprint" then + local other_joker = nil + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] == self then other_joker = G.jokers.cards[i+1] end + end + if other_joker and other_joker ~= self then + context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 + context.blueprint_card = context.blueprint_card or self + if context.blueprint > #G.jokers.cards + 1 then return end + local other_joker_ret = other_joker:calculate_joker(context) + if other_joker_ret then + other_joker_ret.card = context.blueprint_card or self + other_joker_ret.colour = G.C.BLUE + return other_joker_ret + end + end + end + if self.ability.name == "Brainstorm" then + local other_joker = G.jokers.cards[1] + if other_joker and other_joker ~= self then + context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 + context.blueprint_card = context.blueprint_card or self + if context.blueprint > #G.jokers.cards + 1 then return end + local other_joker_ret = other_joker:calculate_joker(context) + if other_joker_ret then + other_joker_ret.card = context.blueprint_card or self + other_joker_ret.colour = G.C.RED + return other_joker_ret + end + end + end + if context.open_booster then + if self.ability.name == 'Hallucination' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + if pseudorandom('halu'..G.GAME.round_resets.ante) < G.GAME.probabilities.normal/self.ability.extra then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, 'hal') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE}) + end + end + elseif context.buying_card then + + elseif context.selling_self then + if self.ability.name == 'Luchador' then + if G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind:get_type() == 'Boss')) then + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('ph_boss_disabled')}) + G.GAME.blind:disable() + end + end + if self.ability.name == 'Diet Cola' then + G.E_MANAGER:add_event(Event({ + func = (function() + add_tag(Tag('tag_double')) + play_sound('generic1', 0.9 + math.random()*0.1, 0.8) + play_sound('holo1', 1.2 + math.random()*0.1, 0.4) + return true + end) + })) + end + if self.ability.name == 'Invisible Joker' and (self.ability.invis_rounds >= self.ability.extra) and not context.blueprint then + local eval = function(card) return (card.ability.loyalty_remaining == 0) and not G.RESET_JIGGLES end + juice_card_until(self, eval, true) + local jokers = {} + for i=1, #G.jokers.cards do + if G.jokers.cards[i] ~= self then + jokers[#jokers+1] = G.jokers.cards[i] + end + end + if #jokers > 0 then + if #G.jokers.cards <= G.jokers.config.card_limit then + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_duplicated_ex')}) + local chosen_joker = pseudorandom_element(jokers, pseudoseed('invisible')) + local card = copy_card(chosen_joker, nil, nil, nil, chosen_joker.edition and chosen_joker.edition.negative) + if card.ability.invis_rounds then card.ability.invis_rounds = 0 end + card:add_to_deck() + G.jokers:emplace(card) + else + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_no_room_ex')}) + end + else + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_no_other_jokers')}) + end + end + elseif context.selling_card then + if self.ability.name == 'Campfire' and not context.blueprint then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_upgrade_ex')}); return true + end})) + end + return + elseif context.reroll_shop then + if self.ability.name == 'Flash Card' and not context.blueprint then + self.ability.mult = self.ability.mult + self.ability.extra + G.E_MANAGER:add_event(Event({ + func = (function() + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_mult', vars = {self.ability.mult}}, colour = G.C.MULT}) + return true + end)})) + end + elseif context.ending_shop then + if self.ability.name == 'Perkeo' then + if G.consumeables.cards[1] then + G.E_MANAGER:add_event(Event({ + func = function() + local card = copy_card(pseudorandom_element(G.consumeables.cards, pseudoseed('perkeo')), nil) + card:set_edition({negative = true}, true) + card:add_to_deck() + G.consumeables:emplace(card) + return true + end})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_duplicated_ex')}) + end + return + end + return + elseif context.skip_blind then + if self.ability.name == 'Throwback' and not context.blueprint then + G.E_MANAGER:add_event(Event({ + func = function() + card_eval_status_text(self, 'extra', nil, nil, nil, { + message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult}}, + colour = G.C.RED, + card = self + }) + return true + end})) + end + return + elseif context.skipping_booster then + if self.ability.name == 'Red Card' and not context.blueprint then + self.ability.mult = self.ability.mult + self.ability.extra + G.E_MANAGER:add_event(Event({ + func = function() + card_eval_status_text(self, 'extra', nil, nil, nil, { + message = localize{type = 'variable', key = 'a_mult', vars = {self.ability.extra}}, + colour = G.C.RED, + delay = 0.45, + card = self + }) + return true + end})) + end + return + elseif context.playing_card_added and not self.getting_sliced then + if self.ability.name == 'Hologram' and (not context.blueprint) + and context.cards and context.cards[1] then + self.ability.x_mult = self.ability.x_mult + #context.cards*self.ability.extra + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult}}}) + end + elseif context.first_hand_drawn then + if self.ability.name == 'Certificate' then + G.E_MANAGER:add_event(Event({ + func = function() + local _card = create_playing_card({ + front = pseudorandom_element(G.P_CARDS, pseudoseed('cert_fr')), + center = G.P_CENTERS.c_base}, G.hand, nil, nil, {G.C.SECONDARY_SET.Enhanced}) + local seal_type = pseudorandom(pseudoseed('certsl')) + if seal_type > 0.75 then _card:set_seal('Red', true) + elseif seal_type > 0.5 then _card:set_seal('Blue', true) + elseif seal_type > 0.25 then _card:set_seal('Gold', true) + else _card:set_seal('Purple', true) + end + G.GAME.blind:debuff_card(_card) + G.hand:sort() + if context.blueprint_card then context.blueprint_card:juice_up() else self:juice_up() end + return true + end})) + + playing_card_joker_effects({true}) + end + if self.ability.name == 'DNA' and not context.blueprint then + local eval = function() return G.GAME.current_round.hands_played == 0 end + juice_card_until(self, eval, true) + end + if self.ability.name == 'Trading Card' and not context.blueprint then + local eval = function() return G.GAME.current_round.discards_used == 0 and not G.RESET_JIGGLES end + juice_card_until(self, eval, true) + end + elseif context.setting_blind and not self.getting_sliced then + if self.ability.name == 'Chicot' and not context.blueprint + and context.blind.boss and not self.getting_sliced then + G.E_MANAGER:add_event(Event({func = function() + G.E_MANAGER:add_event(Event({func = function() + G.GAME.blind:disable() + play_sound('timpani') + delay(0.4) + return true end })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('ph_boss_disabled')}) + return true end })) + end + if self.ability.name == 'Madness' and not context.blueprint and not context.blind.boss then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + local destructable_jokers = {} + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] ~= self and not G.jokers.cards[i].ability.eternal and not G.jokers.cards[i].getting_sliced then destructable_jokers[#destructable_jokers+1] = G.jokers.cards[i] end + end + local joker_to_destroy = #destructable_jokers > 0 and pseudorandom_element(destructable_jokers, pseudoseed('madness')) or nil + + if joker_to_destroy and not (context.blueprint_card or self).getting_sliced then + joker_to_destroy.getting_sliced = true + G.E_MANAGER:add_event(Event({func = function() + (context.blueprint_card or self):juice_up(0.8, 0.8) + joker_to_destroy:start_dissolve({G.C.RED}, nil, 1.6) + return true end })) + end + if not (context.blueprint_card or self).getting_sliced then + card_eval_status_text((context.blueprint_card or self), 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult}}}) + end + end + if self.ability.name == 'Burglar' and not (context.blueprint_card or self).getting_sliced then + G.E_MANAGER:add_event(Event({func = function() + ease_discard(-G.GAME.current_round.discards_left, nil, true) + ease_hands_played(self.ability.extra) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_hands', vars = {self.ability.extra}}}) + return true end })) + end + if self.ability.name == 'Riff-raff' and not (context.blueprint_card or self).getting_sliced and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then + local jokers_to_create = math.min(2, G.jokers.config.card_limit - (#G.jokers.cards + G.GAME.joker_buffer)) + G.GAME.joker_buffer = G.GAME.joker_buffer + jokers_to_create + G.E_MANAGER:add_event(Event({ + func = function() + for i = 1, jokers_to_create do + local card = create_card('Joker', G.jokers, nil, 0, nil, nil, nil, 'rif') + card:add_to_deck() + G.jokers:emplace(card) + card:start_materialize() + G.GAME.joker_buffer = 0 + end + return true + end})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_plus_joker'), colour = G.C.BLUE}) + end + if self.ability.name == 'Cartomancer' and not (context.blueprint_card or self).getting_sliced and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + func = (function() + G.E_MANAGER:add_event(Event({ + func = function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, 'car') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE}) + return true + end)})) + end + if self.ability.name == 'Ceremonial Dagger' and not context.blueprint then + local my_pos = nil + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] == self then my_pos = i; break end + end + if my_pos and G.jokers.cards[my_pos+1] and not self.getting_sliced and not G.jokers.cards[my_pos+1].ability.eternal and not G.jokers.cards[my_pos+1].getting_sliced then + local sliced_card = G.jokers.cards[my_pos+1] + sliced_card.getting_sliced = true + G.GAME.joker_buffer = G.GAME.joker_buffer - 1 + G.E_MANAGER:add_event(Event({func = function() + G.GAME.joker_buffer = 0 + self.ability.mult = self.ability.mult + sliced_card.sell_cost*2 + self:juice_up(0.8, 0.8) + sliced_card:start_dissolve({HEX("57ecab")}, nil, 1.6) + play_sound('slice1', 0.96+math.random()*0.08) + return true end })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_mult', vars = {self.ability.mult+2*sliced_card.sell_cost}}, colour = G.C.RED, no_juice = true}) + end + end + if self.ability.name == 'Marble Joker' and not (context.blueprint_card or self).getting_sliced then + G.E_MANAGER:add_event(Event({ + func = function() + local front = pseudorandom_element(G.P_CARDS, pseudoseed('marb_fr')) + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local card = Card(G.play.T.x + G.play.T.w/2, G.play.T.y, G.CARD_W, G.CARD_H, front, G.P_CENTERS.m_stone, {playing_card = G.playing_card}) + card:start_materialize({G.C.SECONDARY_SET.Enhanced}) + G.play:emplace(card) + table.insert(G.playing_cards, card) + return true + end})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_plus_stone'), colour = G.C.SECONDARY_SET.Enhanced}) + + G.E_MANAGER:add_event(Event({ + func = function() + G.deck.config.card_limit = G.deck.config.card_limit + 1 + return true + end})) + draw_card(G.play,G.deck, 90,'up', nil) + + playing_card_joker_effects({true}) + end + return + elseif context.destroying_card and not context.blueprint then + if self.ability.name == 'Sixth Sense' and #context.full_hand == 1 and context.full_hand[1]:get_id() == 6 and G.GAME.current_round.hands_played == 0 then + if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Spectral',G.consumeables, nil, nil, nil, nil, nil, 'sixth') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_plus_spectral'), colour = G.C.SECONDARY_SET.Spectral}) + end + return true + end + return nil + elseif context.cards_destroyed then + if self.ability.name == 'Caino' and not context.blueprint then + local faces = 0 + for k, v in ipairs(context.glass_shattered) do + if v:is_face() then + faces = faces + 1 + end + end + if faces > 0 then + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + self.ability.caino_xmult = self.ability.caino_xmult + faces*self.ability.extra + return true + end + })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.caino_xmult + faces*self.ability.extra}}}) + return true + end + })) + end + + return + end + if self.ability.name == 'Glass Joker' and not context.blueprint then + local glasses = 0 + for k, v in ipairs(context.glass_shattered) do + if v.shattered then + glasses = glasses + 1 + end + end + if glasses > 0 then + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + self.ability.x_mult = self.ability.x_mult + self.ability.extra*glasses + return true + end + })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult + self.ability.extra*glasses}}}) + return true + end + })) + end + + return + end + + elseif context.remove_playing_cards then + if self.ability.name == 'Caino' and not context.blueprint then + local face_cards = 0 + for k, val in ipairs(context.removed) do + if val:is_face() then face_cards = face_cards + 1 end + end + if face_cards > 0 then + self.ability.caino_xmult = self.ability.caino_xmult + face_cards*self.ability.extra + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.caino_xmult}}}); return true + end})) + end + return + end + + if self.ability.name == 'Glass Joker' and not context.blueprint then + local glass_cards = 0 + for k, val in ipairs(context.removed) do + if val.shattered then glass_cards = glass_cards + 1 end + end + if glass_cards > 0 then + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + self.ability.x_mult = self.ability.x_mult + self.ability.extra*glass_cards + return true + end + })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult + self.ability.extra*glass_cards}}}) + return true + end + })) + end + return + end + elseif context.using_consumeable then + if self.ability.name == 'Glass Joker' and not context.blueprint and context.consumeable.ability.name == 'The Hanged Man' then + local shattered_glass = 0 + for k, val in ipairs(G.hand.highlighted) do + if val.ability.name == 'Glass Card' then shattered_glass = shattered_glass + 1 end + end + if shattered_glass > 0 then + self.ability.x_mult = self.ability.x_mult + self.ability.extra*shattered_glass + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}}); return true + end})) + end + return + end + if self.ability.name == 'Fortune Teller' and not context.blueprint and (context.consumeable.ability.set == "Tarot") then + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_mult',vars={G.GAME.consumeable_usage_total.tarot}}}); return true + end})) + end + if self.ability.name == 'Constellation' and not context.blueprint and context.consumeable.ability.set == 'Planet' then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}}); return true + end})) + return + end + return + elseif context.debuffed_hand then + if self.ability.name == 'Matador' then + if G.GAME.blind.triggered then + ease_dollars(self.ability.extra) + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + message = localize('$')..self.ability.extra, + dollars = self.ability.extra, + colour = G.C.MONEY + } + end + end + elseif context.pre_discard then + if self.ability.name == 'Burnt Joker' and G.GAME.current_round.discards_used <= 0 and not context.hook then + local text,disp_text = G.FUNCS.get_poker_hand_info(G.hand.highlighted) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_upgrade_ex')}) + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, {handname=localize(text, 'poker_hands'),chips = G.GAME.hands[text].chips, mult = G.GAME.hands[text].mult, level=G.GAME.hands[text].level}) + level_up_hand(context.blueprint_card or self, text, nil, 1) + update_hand_text({sound = 'button', volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = '', level = ''}) + end + elseif context.discard then + if self.ability.name == 'Ramen' and not context.blueprint then + if self.ability.x_mult - self.ability.extra <= 1 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_eaten_ex'), + colour = G.C.FILTER + } + else + self.ability.x_mult = self.ability.x_mult - self.ability.extra + return { + delay = 0.2, + message = localize{type='variable',key='a_xmult_minus',vars={self.ability.extra}}, + colour = G.C.RED + } + end + end + if self.ability.name == 'Yorick' and not context.blueprint then + if self.ability.yorick_discards <= 1 then + self.ability.yorick_discards = self.ability.extra.discards + self.ability.x_mult = self.ability.x_mult + self.ability.extra.xmult + return { + delay = 0.2, + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + colour = G.C.RED + } + else + self.ability.yorick_discards = self.ability.yorick_discards - 1 + end + return + end + if self.ability.name == 'Trading Card' and not context.blueprint and + G.GAME.current_round.discards_used <= 0 and #context.full_hand == 1 then + ease_dollars(self.ability.extra) + return { + message = localize('$')..self.ability.extra, + colour = G.C.MONEY, + delay = 0.45, + remove = true, + card = self + } + end + + if self.ability.name == 'Castle' and + not context.other_card.debuff and + context.other_card:is_suit(G.GAME.current_round.castle_card.suit) and not context.blueprint then + self.ability.extra.chips = self.ability.extra.chips + self.ability.extra.chip_mod + + return { + message = localize('k_upgrade_ex'), + card = self, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Mail-In Rebate' and + not context.other_card.debuff and + context.other_card:get_id() == G.GAME.current_round.mail_card.id then + ease_dollars(self.ability.extra) + return { + message = localize('$')..self.ability.extra, + colour = G.C.MONEY, + card = self + } + end + if self.ability.name == 'Hit the Road' and + not context.other_card.debuff and + context.other_card:get_id() == 11 and not context.blueprint then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + colour = G.C.RED, + delay = 0.45, + card = self + } + end + if self.ability.name == 'Green Joker' and not context.blueprint and context.other_card == context.full_hand[#context.full_hand] then + local prev_mult = self.ability.mult + self.ability.mult = math.max(0, self.ability.mult - self.ability.extra.discard_sub) + if self.ability.mult ~= prev_mult then + return { + message = localize{type='variable',key='a_mult_minus',vars={self.ability.extra.discard_sub}}, + colour = G.C.RED, + card = self + } + end + end + + if self.ability.name == 'Faceless Joker' and context.other_card == context.full_hand[#context.full_hand] then + local face_cards = 0 + for k, v in ipairs(context.full_hand) do + if v:is_face() then face_cards = face_cards + 1 end + end + if face_cards >= self.ability.extra.faces then + G.E_MANAGER:add_event(Event({ + func = function() + ease_dollars(self.ability.extra.dollars) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('$')..self.ability.extra.dollars,colour = G.C.MONEY, delay = 0.45}) + return true + end})) + return + end + end + return + elseif context.end_of_round then + if context.individual then + + elseif context.repetition then + if context.cardarea == G.hand then + if self.ability.name == 'Mime' and + (next(context.card_effects[1]) or #context.card_effects > 1) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + end + elseif not context.blueprint then + if self.ability.name == 'Campfire' and G.GAME.blind.boss and self.ability.x_mult > 1 then + self.ability.x_mult = 1 + return { + message = localize('k_reset'), + colour = G.C.RED + } + end + if self.ability.name == 'Rocket' and G.GAME.blind.boss then + self.ability.extra.dollars = self.ability.extra.dollars + self.ability.extra.increase + return { + message = localize('k_upgrade_ex'), + colour = G.C.MONEY + } + end + if self.ability.name == 'Turtle Bean' and not context.blueprint then + if self.ability.extra.h_size - self.ability.extra.h_mod <= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_eaten_ex'), + colour = G.C.FILTER + } + else + self.ability.extra.h_size = self.ability.extra.h_size - self.ability.extra.h_mod + G.hand:change_size(- self.ability.extra.h_mod) + return { + message = localize{type='variable',key='a_handsize_minus',vars={self.ability.extra.h_mod}}, + colour = G.C.FILTER + } + end + end + if self.ability.name == 'Invisible Joker' and not context.blueprint then + self.ability.invis_rounds = self.ability.invis_rounds + 1 + if self.ability.invis_rounds == self.ability.extra then + local eval = function(card) return not card.REMOVED end + juice_card_until(self, eval, true) + end + return { + message = (self.ability.invis_rounds < self.ability.extra) and (self.ability.invis_rounds..'/'..self.ability.extra) or localize('k_active_ex'), + colour = G.C.FILTER + } + end + if self.ability.name == 'Popcorn' and not context.blueprint then + if self.ability.mult - self.ability.extra <= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_eaten_ex'), + colour = G.C.RED + } + else + self.ability.mult = self.ability.mult - self.ability.extra + return { + message = localize{type='variable',key='a_mult_minus',vars={self.ability.extra}}, + colour = G.C.MULT + } + end + end + if self.ability.name == 'To Do List' and not context.blueprint then + local _poker_hands = {} + for k, v in pairs(G.GAME.hands) do + if v.visible and k ~= self.ability.to_do_poker_hand then _poker_hands[#_poker_hands+1] = k end + end + self.ability.to_do_poker_hand = pseudorandom_element(_poker_hands, pseudoseed('to_do')) + return { + message = localize('k_reset') + } + end + if self.ability.name == 'Egg' then + self.ability.extra_value = self.ability.extra_value + self.ability.extra + self:set_cost() + return { + message = localize('k_val_up'), + colour = G.C.MONEY + } + end + if self.ability.name == 'Gift Card' then + for k, v in ipairs(G.jokers.cards) do + if v.set_cost then + v.ability.extra_value = (v.ability.extra_value or 0) + self.ability.extra + v:set_cost() + end + end + for k, v in ipairs(G.consumeables.cards) do + if v.set_cost then + v.ability.extra_value = (v.ability.extra_value or 0) + self.ability.extra + v:set_cost() + end + end + return { + message = localize('k_val_up'), + colour = G.C.MONEY + } + end + if self.ability.name == 'Hit the Road' and self.ability.x_mult > 1 then + self.ability.x_mult = 1 + return { + message = localize('k_reset'), + colour = G.C.RED + } + end + + if self.ability.name == 'Gros Michel' or self.ability.name == 'Cavendish' then + if pseudorandom(self.ability.name == 'Cavendish' and 'cavendish' or 'gros_michel') < G.GAME.probabilities.normal/self.ability.extra.odds then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + if self.ability.name == 'Gros Michel' then G.GAME.pool_flags.gros_michel_extinct = true end + return { + message = localize('k_extinct_ex') + } + else + return { + message = localize('k_safe_ex') + } + end + end + if self.ability.name == 'Mr. Bones' and context.game_over and + G.GAME.chips/G.GAME.blind.chips >= 0.25 then + G.E_MANAGER:add_event(Event({ + func = function() + G.hand_text_area.blind_chips:juice_up() + G.hand_text_area.game_chips:juice_up() + play_sound('tarot1') + self:start_dissolve() + return true + end + })) + return { + message = localize('k_saved_ex'), + saved = true, + colour = G.C.RED + } + end + end + elseif context.individual then + if context.cardarea == G.play then + if self.ability.name == 'Hiker' then + context.other_card.ability.perma_bonus = context.other_card.ability.perma_bonus or 0 + context.other_card.ability.perma_bonus = context.other_card.ability.perma_bonus + self.ability.extra + return { + extra = {message = localize('k_upgrade_ex'), colour = G.C.CHIPS}, + colour = G.C.CHIPS, + card = self + } + end + if self.ability.name == 'Lucky Cat' and context.other_card.lucky_trigger and not context.blueprint then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + return { + extra = {focus = self, message = localize('k_upgrade_ex'), colour = G.C.MULT}, + card = self + } + end + if self.ability.name == 'Wee Joker' and + context.other_card:get_id() == 2 and not context.blueprint then + self.ability.extra.chips = self.ability.extra.chips + self.ability.extra.chip_mod + + return { + extra = {focus = self, message = localize('k_upgrade_ex')}, + card = self, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Photograph' then + local first_face = nil + for i = 1, #context.scoring_hand do + if context.scoring_hand[i]:is_face() then first_face = context.scoring_hand[i]; break end + end + if context.other_card == first_face then + return { + x_mult = self.ability.extra, + colour = G.C.RED, + card = self + } + end + end + if self.ability.name == '8 Ball' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + if (context.other_card:get_id() == 8) and (pseudorandom('8ball') < G.GAME.probabilities.normal/self.ability.extra) then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + return { + extra = {focus = self, message = localize('k_plus_tarot'), func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, '8ba') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + end}, + colour = G.C.SECONDARY_SET.Tarot, + card = self + } + end + end + if self.ability.name == 'The Idol' and + context.other_card:get_id() == G.GAME.current_round.idol_card.id and + context.other_card:is_suit(G.GAME.current_round.idol_card.suit) then + return { + x_mult = self.ability.extra, + colour = G.C.RED, + card = self + } + end + if self.ability.name == 'Scary Face' and ( + context.other_card:is_face()) then + return { + chips = self.ability.extra, + card = self + } + end + if self.ability.name == 'Smiley Face' and ( + context.other_card:is_face()) then + return { + mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Golden Ticket' and + context.other_card.ability.name == 'Gold Card' then + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + dollars = self.ability.extra, + card = self + } + end + if self.ability.name == 'Scholar' and + context.other_card:get_id() == 14 then + return { + chips = self.ability.extra.chips, + mult = self.ability.extra.mult, + card = self + } + end + if self.ability.name == 'Walkie Talkie' and + (context.other_card:get_id() == 10 or context.other_card:get_id() == 4) then + return { + chips = self.ability.extra.chips, + mult = self.ability.extra.mult, + card = self + } + end + if self.ability.name == 'Business Card' and + context.other_card:is_face() and + pseudorandom('business') < G.GAME.probabilities.normal/self.ability.extra then + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + 2 + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + dollars = 2, + card = self + } + end + if self.ability.name == 'Fibonacci' and ( + context.other_card:get_id() == 2 or + context.other_card:get_id() == 3 or + context.other_card:get_id() == 5 or + context.other_card:get_id() == 8 or + context.other_card:get_id() == 14) then + return { + mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Even Steven' and + context.other_card:get_id() <= 10 and + context.other_card:get_id() >= 0 and + context.other_card:get_id()%2 == 0 + then + return { + mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Odd Todd' and + ((context.other_card:get_id() <= 10 and + context.other_card:get_id() >= 0 and + context.other_card:get_id()%2 == 1) or + (context.other_card:get_id() == 14)) + then + return { + chips = self.ability.extra, + card = self + } + end + if self.ability.effect == 'Suit Mult' and + context.other_card:is_suit(self.ability.extra.suit) then + return { + mult = self.ability.extra.s_mult, + card = self + } + end + if self.ability.name == 'Rough Gem' and + context.other_card:is_suit("Diamonds") then + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + dollars = self.ability.extra, + card = self + } + end + if self.ability.name == 'Onyx Agate' and + context.other_card:is_suit("Clubs") then + return { + mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Arrowhead' and + context.other_card:is_suit("Spades") then + return { + chips = self.ability.extra, + card = self + } + end + if self.ability.name == 'Bloodstone' and + context.other_card:is_suit("Hearts") and + pseudorandom('bloodstone') < G.GAME.probabilities.normal/self.ability.extra.odds then + return { + x_mult = self.ability.extra.Xmult, + card = self + } + end + if self.ability.name == 'Ancient Joker' and + context.other_card:is_suit(G.GAME.current_round.ancient_card.suit) then + return { + x_mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Triboulet' and + (context.other_card:get_id() == 12 or context.other_card:get_id() == 13) then + return { + x_mult = self.ability.extra, + colour = G.C.RED, + card = self + } + end + end + if context.cardarea == G.hand then + if self.ability.name == 'Shoot the Moon' and + context.other_card:get_id() == 12 then + if context.other_card.debuff then + return { + message = localize('k_debuffed'), + colour = G.C.RED, + card = self, + } + else + return { + h_mult = 13, + card = self + } + end + end + if self.ability.name == 'Baron' and + context.other_card:get_id() == 13 then + if context.other_card.debuff then + return { + message = localize('k_debuffed'), + colour = G.C.RED, + card = self, + } + else + return { + x_mult = self.ability.extra, + card = self + } + end + end + if self.ability.name == 'Reserved Parking' and + context.other_card:is_face() and + pseudorandom('parking') < G.GAME.probabilities.normal/self.ability.extra.odds then + if context.other_card.debuff then + return { + message = localize('k_debuffed'), + colour = G.C.RED, + card = self, + } + else + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra.dollars + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + dollars = self.ability.extra.dollars, + card = self + } + end + end + if self.ability.name == 'Raised Fist' then + local temp_Mult, temp_ID = 15, 15 + local raised_card = nil + for i=1, #G.hand.cards do + if temp_ID >= G.hand.cards[i].base.id and G.hand.cards[i].ability.effect ~= 'Stone Card' then temp_Mult = G.hand.cards[i].base.nominal; temp_ID = G.hand.cards[i].base.id; raised_card = G.hand.cards[i] end + end + if raised_card == context.other_card then + if context.other_card.debuff then + return { + message = localize('k_debuffed'), + colour = G.C.RED, + card = self, + } + else + return { + h_mult = 2*temp_Mult, + card = self, + } + end + end + end + end + elseif context.repetition then + if context.cardarea == G.play then + if self.ability.name == 'Sock and Buskin' and ( + context.other_card:is_face()) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + if self.ability.name == 'Hanging Chad' and ( + context.other_card == context.scoring_hand[1]) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + if self.ability.name == 'Dusk' and G.GAME.current_round.hands_left == 0 then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + if self.ability.name == 'Seltzer' then + return { + message = localize('k_again_ex'), + repetitions = 1, + card = self + } + end + if self.ability.name == 'Hack' and ( + context.other_card:get_id() == 2 or + context.other_card:get_id() == 3 or + context.other_card:get_id() == 4 or + context.other_card:get_id() == 5) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + end + if context.cardarea == G.hand then + if self.ability.name == 'Mime' and + (next(context.card_effects[1]) or #context.card_effects > 1) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + end + elseif context.other_joker then + if self.ability.name == 'Baseball Card' and context.other_joker.config.center.rarity == 2 and self ~= context.other_joker then + G.E_MANAGER:add_event(Event({ + func = function() + context.other_joker:juice_up(0.5, 0.5) + return true + end + })) + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + else + if context.cardarea == G.jokers then + if context.before then + if self.ability.name == 'Spare Trousers' and (next(context.poker_hands['Two Pair']) or next(context.poker_hands['Full House'])) and not context.blueprint then + self.ability.mult = self.ability.mult + self.ability.extra + return { + message = localize('k_upgrade_ex'), + colour = G.C.RED, + card = self + } + end + if self.ability.name == 'Space Joker' and pseudorandom('space') < G.GAME.probabilities.normal/self.ability.extra then + return { + card = self, + level_up = true, + message = localize('k_level_up_ex') + } + end + if self.ability.name == 'Square Joker' and #context.full_hand == 4 and not context.blueprint then + self.ability.extra.chips = self.ability.extra.chips + self.ability.extra.chip_mod + return { + message = localize('k_upgrade_ex'), + colour = G.C.CHIPS, + card = self + } + end + if self.ability.name == 'Runner' and next(context.poker_hands['Straight']) and not context.blueprint then + self.ability.extra.chips = self.ability.extra.chips + self.ability.extra.chip_mod + return { + message = localize('k_upgrade_ex'), + colour = G.C.CHIPS, + card = self + } + end + if self.ability.name == 'Midas Mask' and not context.blueprint then + local faces = {} + for k, v in ipairs(context.scoring_hand) do + if v:is_face() then + faces[#faces+1] = v + v:set_ability(G.P_CENTERS.m_gold, nil, true) + G.E_MANAGER:add_event(Event({ + func = function() + v:juice_up() + return true + end + })) + end + end + if #faces > 0 then + return { + message = localize('k_gold'), + colour = G.C.MONEY, + card = self + } + end + end + if self.ability.name == 'Vampire' and not context.blueprint then + local enhanced = {} + for k, v in ipairs(context.scoring_hand) do + if v.config.center ~= G.P_CENTERS.c_base and not v.debuff and not v.vampired then + enhanced[#enhanced+1] = v + v.vampired = true + v:set_ability(G.P_CENTERS.c_base, nil, true) + G.E_MANAGER:add_event(Event({ + func = function() + v:juice_up() + v.vampired = nil + return true + end + })) + end + end + + if #enhanced > 0 then + self.ability.x_mult = self.ability.x_mult + self.ability.extra*#enhanced + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + colour = G.C.MULT, + card = self + } + end + end + if self.ability.name == 'To Do List' and context.scoring_name == self.ability.to_do_poker_hand then + ease_dollars(self.ability.extra.dollars) + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra.dollars + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + message = localize('$')..self.ability.extra.dollars, + dollars = self.ability.extra.dollars, + colour = G.C.MONEY + } + end + if self.ability.name == 'DNA' and G.GAME.current_round.hands_played == 0 then + if #context.full_hand == 1 then + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local _card = copy_card(context.full_hand[1], nil, nil, G.playing_card) + _card:add_to_deck() + G.deck.config.card_limit = G.deck.config.card_limit + 1 + table.insert(G.playing_cards, _card) + G.hand:emplace(_card) + _card.states.visible = nil + + G.E_MANAGER:add_event(Event({ + func = function() + _card:start_materialize() + return true + end + })) + return { + message = localize('k_copied_ex'), + colour = G.C.CHIPS, + card = self, + playing_cards_created = {true} + } + end + end + if self.ability.name == 'Ride the Bus' and not context.blueprint then + local faces = false + for i = 1, #context.scoring_hand do + if context.scoring_hand[i]:is_face() then faces = true end + end + if faces then + local last_mult = self.ability.mult + self.ability.mult = 0 + if last_mult > 0 then + return { + card = self, + message = localize('k_reset') + } + end + else + self.ability.mult = self.ability.mult + self.ability.extra + end + end + if self.ability.name == 'Obelisk' and not context.blueprint then + local reset = true + local play_more_than = (G.GAME.hands[context.scoring_name].played or 0) + for k, v in pairs(G.GAME.hands) do + if k ~= context.scoring_name and v.played >= play_more_than and v.visible then + reset = false + end + end + if reset then + if self.ability.x_mult > 1 then + self.ability.x_mult = 1 + return { + card = self, + message = localize('k_reset') + } + end + else + self.ability.x_mult = self.ability.x_mult + self.ability.extra + end + end + if self.ability.name == 'Green Joker' and not context.blueprint then + self.ability.mult = self.ability.mult + self.ability.extra.hand_add + return { + card = self, + message = localize{type='variable',key='a_mult',vars={self.ability.extra.hand_add}} + } + end + elseif context.after then + if self.ability.name == 'Ice Cream' and not context.blueprint then + if self.ability.extra.chips - self.ability.extra.chip_mod <= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_melted_ex'), + colour = G.C.CHIPS + } + else + self.ability.extra.chips = self.ability.extra.chips - self.ability.extra.chip_mod + return { + message = localize{type='variable',key='a_chips_minus',vars={self.ability.extra.chip_mod}}, + colour = G.C.CHIPS + } + end + end + if self.ability.name == 'Seltzer' and not context.blueprint then + if self.ability.extra - 1 <= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_drank_ex'), + colour = G.C.FILTER + } + else + self.ability.extra = self.ability.extra - 1 + return { + message = self.ability.extra..'', + colour = G.C.FILTER + } + end + end + else + if self.ability.name == 'Loyalty Card' then + self.ability.loyalty_remaining = (self.ability.extra.every-1-(G.GAME.hands_played - self.ability.hands_played_at_create))%(self.ability.extra.every+1) + if context.blueprint then + if self.ability.loyalty_remaining == self.ability.extra.every then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}}, + Xmult_mod = self.ability.extra.Xmult + } + end + else + if self.ability.loyalty_remaining == 0 then + local eval = function(card) return (card.ability.loyalty_remaining == 0) end + juice_card_until(self, eval, true) + elseif self.ability.loyalty_remaining == self.ability.extra.every then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}}, + Xmult_mod = self.ability.extra.Xmult + } + end + end + end + if self.ability.name ~= 'Seeing Double' and self.ability.x_mult > 1 and (self.ability.type == '' or next(context.poker_hands[self.ability.type])) then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + colour = G.C.RED, + Xmult_mod = self.ability.x_mult + } + end + if self.ability.t_mult > 0 and next(context.poker_hands[self.ability.type]) then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.t_mult}}, + mult_mod = self.ability.t_mult + } + end + if self.ability.t_chips > 0 and next(context.poker_hands[self.ability.type]) then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.t_chips}}, + chip_mod = self.ability.t_chips + } + end + if self.ability.name == 'Half Joker' and #context.full_hand <= self.ability.extra.size then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult}}, + mult_mod = self.ability.extra.mult + } + end + if self.ability.name == 'Abstract Joker' then + local x = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.set == 'Joker' then x = x + 1 end + end + return { + message = localize{type='variable',key='a_mult',vars={x*self.ability.extra}}, + mult_mod = x*self.ability.extra + } + end + if self.ability.name == 'Acrobat' and G.GAME.current_round.hands_left == 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + if self.ability.name == 'Mystic Summit' and G.GAME.current_round.discards_left == self.ability.extra.d_remaining then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult}}, + mult_mod = self.ability.extra.mult + } + end + if self.ability.name == 'Misprint' then + local temp_Mult = pseudorandom('misprint', self.ability.extra.min, self.ability.extra.max) + return { + message = localize{type='variable',key='a_mult',vars={temp_Mult}}, + mult_mod = temp_Mult + } + end + if self.ability.name == 'Banner' and G.GAME.current_round.discards_left > 0 then + return { + message = localize{type='variable',key='a_chips',vars={G.GAME.current_round.discards_left*self.ability.extra}}, + chip_mod = G.GAME.current_round.discards_left*self.ability.extra + } + end + if self.ability.name == 'Stuntman' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chip_mod}}, + chip_mod = self.ability.extra.chip_mod, + } + end + if self.ability.name == 'Matador' then + if G.GAME.blind.triggered then + ease_dollars(self.ability.extra) + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + message = localize('$')..self.ability.extra, + dollars = self.ability.extra, + colour = G.C.MONEY + } + end + end + if self.ability.name == 'Supernova' then + return { + message = localize{type='variable',key='a_mult',vars={G.GAME.hands[context.scoring_name].played}}, + mult_mod = G.GAME.hands[context.scoring_name].played + } + end + if self.ability.name == 'Ceremonial Dagger' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Vagabond' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + if G.GAME.dollars <= self.ability.extra then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, 'vag') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + return { + message = localize('k_plus_tarot'), + card = self + } + end + end + if self.ability.name == 'Superposition' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + local aces = 0 + for i = 1, #context.scoring_hand do + if context.scoring_hand[i]:get_id() == 14 then aces = aces + 1 end + end + if aces >= 1 and next(context.poker_hands["Straight"]) then + local card_type = 'Tarot' + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card(card_type,G.consumeables, nil, nil, nil, nil, nil, 'sup') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + return { + message = localize('k_plus_tarot'), + colour = G.C.SECONDARY_SET.Tarot, + card = self + } + end + end + if self.ability.name == 'Seance' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + if next(context.poker_hands[self.ability.extra.poker_hand]) then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Spectral',G.consumeables, nil, nil, nil, nil, nil, 'sea') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + return { + message = localize('k_plus_spectral'), + colour = G.C.SECONDARY_SET.Spectral, + card = self + } + end + end + if self.ability.name == 'Flower Pot' then + local suits = { + ['Hearts'] = 0, + ['Diamonds'] = 0, + ['Spades'] = 0, + ['Clubs'] = 0 + } + for i = 1, #context.scoring_hand do + if context.scoring_hand[i].ability.name ~= 'Wild Card' then + if context.scoring_hand[i]:is_suit('Hearts', true) and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 + elseif context.scoring_hand[i]:is_suit('Diamonds', true) and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 + elseif context.scoring_hand[i]:is_suit('Spades', true) and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 + elseif context.scoring_hand[i]:is_suit('Clubs', true) and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 end + end + end + for i = 1, #context.scoring_hand do + if context.scoring_hand[i].ability.name == 'Wild Card' then + if context.scoring_hand[i]:is_suit('Hearts') and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 + elseif context.scoring_hand[i]:is_suit('Diamonds') and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 + elseif context.scoring_hand[i]:is_suit('Spades') and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 + elseif context.scoring_hand[i]:is_suit('Clubs') and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 end + end + end + if suits["Hearts"] > 0 and + suits["Diamonds"] > 0 and + suits["Spades"] > 0 and + suits["Clubs"] > 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + end + if self.ability.name == 'Seeing Double' then + local suits = { + ['Hearts'] = 0, + ['Diamonds'] = 0, + ['Spades'] = 0, + ['Clubs'] = 0 + } + for i = 1, #context.scoring_hand do + if context.scoring_hand[i].ability.name ~= 'Wild Card' then + if context.scoring_hand[i]:is_suit('Hearts') then suits["Hearts"] = suits["Hearts"] + 1 end + if context.scoring_hand[i]:is_suit('Diamonds') then suits["Diamonds"] = suits["Diamonds"] + 1 end + if context.scoring_hand[i]:is_suit('Spades') then suits["Spades"] = suits["Spades"] + 1 end + if context.scoring_hand[i]:is_suit('Clubs') then suits["Clubs"] = suits["Clubs"] + 1 end + end + end + for i = 1, #context.scoring_hand do + if context.scoring_hand[i].ability.name == 'Wild Card' then + if context.scoring_hand[i]:is_suit('Clubs') and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 + elseif context.scoring_hand[i]:is_suit('Diamonds') and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 + elseif context.scoring_hand[i]:is_suit('Spades') and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 + elseif context.scoring_hand[i]:is_suit('Hearts') and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 end + end + end + if (suits["Hearts"] > 0 or + suits["Diamonds"] > 0 or + suits["Spades"] > 0) and + suits["Clubs"] > 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + end + if self.ability.name == 'Wee Joker' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Castle' and (self.ability.extra.chips > 0) then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Blue Joker' and #G.deck.cards > 0 then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra*#G.deck.cards}}, + chip_mod = self.ability.extra*#G.deck.cards, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Erosion' and (G.GAME.starting_deck_size - #G.playing_cards) > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra*(G.GAME.starting_deck_size - #G.playing_cards)}}, + mult_mod = self.ability.extra*(G.GAME.starting_deck_size - #G.playing_cards), + colour = G.C.MULT + } + end + if self.ability.name == 'Square Joker' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Runner' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Ice Cream' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Stone Joker' and self.ability.stone_tally > 0 then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra*self.ability.stone_tally}}, + chip_mod = self.ability.extra*self.ability.stone_tally, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Steel Joker' and self.ability.steel_tally > 0 then + return { + message = localize{type='variable',key='a_xmult',vars={1 + self.ability.extra*self.ability.steel_tally}}, + Xmult_mod = 1 + self.ability.extra*self.ability.steel_tally, + colour = G.C.MULT + } + end + if self.ability.name == 'Bull' and (G.GAME.dollars + (G.GAME.dollar_buffer or 0)) > 0 then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra*math.max(0,(G.GAME.dollars + (G.GAME.dollar_buffer or 0))) }}, + chip_mod = self.ability.extra*math.max(0,(G.GAME.dollars + (G.GAME.dollar_buffer or 0))), + colour = G.C.CHIPS + } + end + if self.ability.name == "Driver's License" then + if (self.ability.driver_tally or 0) >= 16 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + end + if self.ability.name == "Blackboard" then + local black_suits, all_cards = 0, 0 + for k, v in ipairs(G.hand.cards) do + all_cards = all_cards + 1 + if v:is_suit('Clubs', nil, true) or v:is_suit('Spades', nil, true) then + black_suits = black_suits + 1 + end + end + if black_suits == all_cards then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + end + if self.ability.name == "Joker Stencil" then + if (G.jokers.config.card_limit - #G.jokers.cards) > 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + Xmult_mod = self.ability.x_mult + } + end + end + if self.ability.name == 'Swashbuckler' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Joker' then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Spare Trousers' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Ride the Bus' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Flash Card' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Popcorn' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Green Joker' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Fortune Teller' and G.GAME.consumeable_usage_total and G.GAME.consumeable_usage_total.tarot > 0 then + return { + message = localize{type='variable',key='a_mult',vars={G.GAME.consumeable_usage_total.tarot}}, + mult_mod = G.GAME.consumeable_usage_total.tarot + } + end + if self.ability.name == 'Gros Michel' then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult}}, + mult_mod = self.ability.extra.mult, + } + end + if self.ability.name == 'Cavendish' then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}}, + Xmult_mod = self.ability.extra.Xmult, + } + end + if self.ability.name == 'Red Card' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Card Sharp' and G.GAME.hands[context.scoring_name] and G.GAME.hands[context.scoring_name].played_this_round > 1 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}}, + Xmult_mod = self.ability.extra.Xmult, + } + end + if self.ability.name == 'Bootstraps' and math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars) >= 1 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars)}}, + mult_mod = self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars) + } + end + if self.ability.name == 'Caino' and self.ability.caino_xmult > 1 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.caino_xmult}}, + Xmult_mod = self.ability.caino_xmult + } + end + end + end + end + end + end + +function Card:is_suit(suit, bypass_debuff, flush_calc) + if flush_calc then + if self.ability.effect == 'Stone Card' then + return false + end + if self.ability.name == "Wild Card" and not self.debuff then + return true + end + if next(find_joker('Smeared Joker')) and (self.base.suit == 'Hearts' or self.base.suit == 'Diamonds') == (suit == 'Hearts' or suit == 'Diamonds') then + return true + end + return self.base.suit == suit + else + if self.debuff and not bypass_debuff then return end + if self.ability.effect == 'Stone Card' then + return false + end + if self.ability.name == "Wild Card" then + return true + end + if next(find_joker('Smeared Joker')) and (self.base.suit == 'Hearts' or self.base.suit == 'Diamonds') == (suit == 'Hearts' or suit == 'Diamonds') then + return true + end + return self.base.suit == suit + end +end + +function Card:set_card_area(area) + self.area = area + self.parent = area + self.layered_parallax = area.layered_parallax +end + +function Card:remove_from_area() + self.area = nil + self.parent = nil + self.layered_parallax = {x = 0, y = 0} +end + +function Card:align() + if self.children.floating_sprite then + self.children.floating_sprite.T.y = self.T.y + self.children.floating_sprite.T.x = self.T.x + self.children.floating_sprite.T.r = self.T.r + end + + if self.children.focused_ui then self.children.focused_ui:set_alignment() end +end + +function Card:flip() + if self.facing == 'front' then + self.flipping = 'f2b' + self.facing='back' + self.pinch.x = true + elseif self.facing == 'back' then + self.ability.wheel_flipped = nil + self.flipping = 'b2f' + self.facing='front' + self.pinch.x = true + end +end + +function Card:update(dt) + if self.flipping == 'f2b' then + if self.sprite_facing == 'front' or true then + if self.VT.w <= 0 then + self.sprite_facing = 'back' + self.pinch.x =false + end + end + end + if self.flipping == 'b2f' then + if self.sprite_facing == 'back' or true then + if self.VT.w <= 0 then + self.sprite_facing = 'front' + self.pinch.x =false + end + end + end + + if not self.states.focus.is and self.children.focused_ui then + self.children.focused_ui:remove() + self.children.focused_ui = nil + end + + self:update_alert() + if self.ability.set == 'Joker' and not self.sticker_run then + self.sticker_run = get_joker_win_sticker(self.config.center) or 'NONE' + end + + if self.ability.consumeable and self.ability.consumeable.max_highlighted then + self.ability.consumeable.mod_num = math.min(5, self.ability.consumeable.max_highlighted) + end + if G.STAGE == G.STAGES.RUN then + if self.ability and self.ability.perma_debuff then self.debuff = true end + + if self.area and ((self.area == G.jokers) or (self.area == G.consumeables)) then + self.bypass_lock = true + self.bypass_discovery_center = true + self.bypass_discovery_ui = true + end + self.sell_cost_label = self.facing == 'back' and '?' or self.sell_cost + + if self.ability.name == 'Temperance' then + self.ability.money = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.set == 'Joker' then + self.ability.money = self.ability.money + G.jokers.cards[i].sell_cost + end + end + self.ability.money = math.min(self.ability.money, self.ability.extra) + end + if self.ability.name == 'Throwback' then + self.ability.x_mult = 1 + G.GAME.skips*self.ability.extra + end + if self.ability.name == "Driver's License" then + self.ability.driver_tally = 0 + for k, v in pairs(G.playing_cards) do + if v.config.center ~= G.P_CENTERS.c_base then self.ability.driver_tally = self.ability.driver_tally+1 end + end + end + if self.ability.name == "Steel Joker" then + self.ability.steel_tally = 0 + for k, v in pairs(G.playing_cards) do + if v.config.center == G.P_CENTERS.m_steel then self.ability.steel_tally = self.ability.steel_tally+1 end + end + end + if self.ability.name == "Cloud 9" then + self.ability.nine_tally = 0 + for k, v in pairs(G.playing_cards) do + if v:get_id() == 9 then self.ability.nine_tally = self.ability.nine_tally+1 end + end + end + if self.ability.name == "Stone Joker" then + self.ability.stone_tally = 0 + for k, v in pairs(G.playing_cards) do + if v.config.center == G.P_CENTERS.m_stone then self.ability.stone_tally = self.ability.stone_tally+1 end + end + end + if self.ability.name == "Joker Stencil" then + self.ability.x_mult = (G.jokers.config.card_limit - #G.jokers.cards) + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.name == 'Joker Stencil' then self.ability.x_mult = self.ability.x_mult + 1 end + end + end + if self.ability.name == 'The Wheel of Fortune' then + self.eligible_strength_jokers = EMPTY(self.eligible_strength_jokers) + for k, v in pairs(G.jokers.cards) do + if v.ability.set == 'Joker' and (not v.edition) then + table.insert(self.eligible_strength_jokers, v) + end + end + end + if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' then + self.eligible_editionless_jokers = EMPTY(self.eligible_editionless_jokers) + for k, v in pairs(G.jokers.cards) do + if v.ability.set == 'Joker' and (not v.edition) then + table.insert(self.eligible_editionless_jokers, v) + end + end + end + if self.ability.name == 'Blueprint' or self.ability.name == 'Brainstorm' then + local other_joker = nil + if self.ability.name == 'Brainstorm' then + other_joker = G.jokers.cards[1] + elseif self.ability.name == 'Blueprint' then + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] == self then other_joker = G.jokers.cards[i+1] end + end + end + if other_joker and other_joker ~= self and other_joker.config.center.blueprint_compat then + self.ability.blueprint_compat = 'compatible' + else + self.ability.blueprint_compat = 'incompatible' + end + end + if self.ability.name == 'Swashbuckler' then + local sell_cost = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] ~= self and (G.jokers.cards[i].area and G.jokers.cards[i].area == G.jokers) then + sell_cost = sell_cost + G.jokers.cards[i].sell_cost + end + end + self.ability.mult = sell_cost + end + else + if self.ability.name == 'Temperance' then + self.ability.money = 0 + end + end +end + +function Card:hard_set_T(X, Y, W, H) + local x = (X or self.T.x) + local y = (Y or self.T.y) + local w = (W or self.T.w) + local h = (H or self.T.h) + Moveable.hard_set_T(self,x, y, w, h) + if self.children.front then self.children.front:hard_set_T(x, y, w, h) end + self.children.back:hard_set_T(x, y, w, h) + self.children.center:hard_set_T(x, y, w, h) +end + +function Card:move(dt) + Moveable.move(self, dt) + --self:align() + if self.children.h_popup then + self.children.h_popup:set_alignment(self:align_h_popup()) + end +end + +function Card:align_h_popup() + local focused_ui = self.children.focused_ui and true or false + local popup_direction = (self.children.buy_button or (self.area and self.area.config.view_deck) or (self.area and self.area.config.type == 'shop')) and 'cl' or + (self.T.y < G.CARD_H*0.8) and 'bm' or + 'tm' + return { + major = self.children.focused_ui or self, + parent = self, + xy_bond = 'Strong', + r_bond = 'Weak', + wh_bond = 'Weak', + offset = { + x = popup_direction ~= 'cl' and 0 or + focused_ui and -0.05 or + (self.ability.consumeable and 0.0) or + (self.ability.set == 'Voucher' and 0.0) or + -0.05, + y = focused_ui and ( + popup_direction == 'tm' and (self.area and self.area == G.hand and -0.08 or-0.15) or + popup_direction == 'bm' and 0.12 or + 0 + ) or + popup_direction == 'tm' and -0.13 or + popup_direction == 'bm' and 0.1 or + 0 + }, + type = popup_direction, + --lr_clamp = true + } +end + +function Card:hover() + self:juice_up(0.05, 0.03) + play_sound('paper1', math.random()*0.2 + 0.9, 0.35) + + --if this is the focused card + if self.states.focus.is and not self.children.focused_ui then + self.children.focused_ui = G.UIDEF.card_focus_ui(self) + end + + if self.facing == 'front' and (not self.states.drag.is or G.CONTROLLER.HID.touch) and not self.no_ui and not G.debug_tooltip_toggle then + if self.children.alert and not self.config.center.alerted then + self.config.center.alerted = true + G:save_progress() + end + + self.ability_UIBox_table = self:generate_UIBox_ability_table() + self.config.h_popup = G.UIDEF.card_h_popup(self) + self.config.h_popup_config = self:align_h_popup() + + Node.hover(self) + end +end + +function Card:stop_hover() + Node.stop_hover(self) +end + +function Card:juice_up(scale, rot_amount) + --G.VIBRATION = G.VIBRATION + 0.4 + local rot_amt = rot_amount and 0.4*(math.random()>0.5 and 1 or -1)*rot_amount or (math.random()>0.5 and 1 or -1)*0.16 + scale = scale and scale*0.4 or 0.11 + Moveable.juice_up(self, scale, rot_amt) +end + +function Card:draw(layer) + layer = layer or 'both' + + self.hover_tilt = 1 + + if not self.states.visible then return end + + if (layer == 'shadow' or layer == 'both') then + self.ARGS.send_to_shader = self.ARGS.send_to_shader or {} + self.ARGS.send_to_shader[1] = math.min(self.VT.r*3, 1) + G.TIMERS.REAL/(28) + (self.juice and self.juice.r*20 or 0) + self.tilt_var.amt + self.ARGS.send_to_shader[2] = G.TIMERS.REAL + + for k, v in pairs(self.children) do + v.VT.scale = self.VT.scale + end + end + + G.shared_shadow = self.sprite_facing == 'front' and self.children.center or self.children.back + + --Draw the shadow + if not self.no_shadow and G.SETTINGS.GRAPHICS.shadows == 'On' and((layer == 'shadow' or layer == 'both') and (self.ability.effect ~= 'Glass Card' and not self.greyed) and ((self.area and self.area ~= G.discard and self.area.config.type ~= 'deck') or not self.area or self.states.drag.is)) then + self.shadow_height = 0*(0.08 + 0.4*math.sqrt(self.velocity.x^2)) + ((((self.highlighted and self.area == G.play) or self.states.drag.is) and 0.35) or (self.area and self.area.config.type == 'title_2') and 0.04 or 0.1) + G.shared_shadow:draw_shader('dissolve', self.shadow_height) + end + + if (layer == 'card' or layer == 'both') and self.area ~= G.hand then + if self.children.focused_ui then self.children.focused_ui:draw() end + end + + if (layer == 'card' or layer == 'both') then + -- for all hover/tilting: + self.tilt_var = self.tilt_var or {mx = 0, my = 0, dx = self.tilt_var.dx or 0, dy = self.tilt_var.dy or 0, amt = 0} + local tilt_factor = 0.3 + if self.states.focus.is then + self.tilt_var.mx, self.tilt_var.my = G.CONTROLLER.cursor_position.x + self.tilt_var.dx*self.T.w*G.TILESCALE*G.TILESIZE, G.CONTROLLER.cursor_position.y + self.tilt_var.dy*self.T.h*G.TILESCALE*G.TILESIZE + self.tilt_var.amt = math.abs(self.hover_offset.y + self.hover_offset.x - 1 + self.tilt_var.dx + self.tilt_var.dy - 1)*tilt_factor + elseif self.states.hover.is then + self.tilt_var.mx, self.tilt_var.my = G.CONTROLLER.cursor_position.x, G.CONTROLLER.cursor_position.y + self.tilt_var.amt = math.abs(self.hover_offset.y + self.hover_offset.x - 1)*tilt_factor + elseif self.ambient_tilt then + local tilt_angle = G.TIMERS.REAL*(1.56 + (self.ID/1.14212)%1) + self.ID/1.35122 + self.tilt_var.mx = ((0.5 + 0.5*self.ambient_tilt*math.cos(tilt_angle))*self.VT.w+self.VT.x+G.ROOM.T.x)*G.TILESIZE*G.TILESCALE + self.tilt_var.my = ((0.5 + 0.5*self.ambient_tilt*math.sin(tilt_angle))*self.VT.h+self.VT.y+G.ROOM.T.y)*G.TILESIZE*G.TILESCALE + self.tilt_var.amt = self.ambient_tilt*(0.5+math.cos(tilt_angle))*tilt_factor + end + --Any particles + if self.children.particles then self.children.particles:draw() end + + --Draw any tags/buttons + if self.children.price then self.children.price:draw() end + if self.children.buy_button then + if self.highlighted then + self.children.buy_button.states.visible = true + self.children.buy_button:draw() + if self.children.buy_and_use_button then + self.children.buy_and_use_button:draw() + end + else + self.children.buy_button.states.visible = false + end + end + if self.children.use_button and self.highlighted then self.children.use_button:draw() end + + if self.vortex then + if self.facing == 'back' then + self.children.back:draw_shader('vortex') + else + self.children.center:draw_shader('vortex') + if self.children.front then + self.children.front:draw_shader('vortex') + end + end + + love.graphics.setShader() + elseif self.sprite_facing == 'front' then + --Draw the main part of the card + if (self.edition and self.edition.negative) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then + self.children.center:draw_shader('negative', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('negative', nil, self.ARGS.send_to_shader) + end + elseif not self.greyed then + self.children.center:draw_shader('dissolve') + --If the card has a front, draw that next + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('dissolve') + end + end + + --If the card is not yet discovered + if not self.config.center.discovered and (self.ability.consumeable or self.config.center.unlocked) and not self.config.center.demo and not self.bypass_discovery_center then + local shared_sprite = (self.ability.set == 'Edition' or self.ability.set == 'Joker') and G.shared_undiscovered_joker or G.shared_undiscovered_tarot + local scale_mod = -0.05 + 0.05*math.sin(1.8*G.TIMERS.REAL) + local rotate_mod = 0.03*math.sin(1.219*G.TIMERS.REAL) + + shared_sprite.role.draw_major = self + shared_sprite:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) + end + + if self.ability.name == 'Invisible Joker' and (self.config.center.discovered or self.bypass_discovery_center) then + self.children.center:draw_shader('voucher', nil, self.ARGS.send_to_shader) + end + + --If the card has any edition/seal, add that here + if self.edition or self.seal or self.ability.eternal or self.ability.rental or self.ability.perishable or self.sticker or ((self.sticker_run and self.sticker_run ~= 'NONE') and G.SETTINGS.run_stake_stickers) or (self.ability.set == 'Spectral') or self.debuff or self.greyed or (self.ability.name == 'The Soul') or (self.ability.set == 'Voucher') or (self.ability.set == 'Booster') or self.config.center.soul_pos or self.config.center.demo then + + if (self.ability.set == 'Voucher' or self.config.center.demo) and (self.ability.name ~= 'Antimatter' or not (self.config.center.discovered or self.bypass_discovery_center)) then + self.children.center:draw_shader('voucher', nil, self.ARGS.send_to_shader) + end + if self.ability.set == 'Booster' or self.ability.set == 'Spectral' then + self.children.center:draw_shader('booster', nil, self.ARGS.send_to_shader) + end + if self.edition and self.edition.holo then + self.children.center:draw_shader('holo', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('holo', nil, self.ARGS.send_to_shader) + end + end + if self.edition and self.edition.foil then + self.children.center:draw_shader('foil', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('foil', nil, self.ARGS.send_to_shader) + end + end + if self.edition and self.edition.polychrome then + self.children.center:draw_shader('polychrome', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('polychrome', nil, self.ARGS.send_to_shader) + end + end + if (self.edition and self.edition.negative) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then + self.children.center:draw_shader('negative_shine', nil, self.ARGS.send_to_shader) + end + if self.seal then + G.shared_seals[self.seal].role.draw_major = self + G.shared_seals[self.seal]:draw_shader('dissolve', nil, nil, nil, self.children.center) + if self.seal == 'Gold' then G.shared_seals[self.seal]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) end + end + if self.ability.eternal then + G.shared_sticker_eternal.role.draw_major = self + G.shared_sticker_eternal:draw_shader('dissolve', nil, nil, nil, self.children.center) + G.shared_sticker_eternal:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) + end + if self.ability.perishable then + G.shared_sticker_perishable.role.draw_major = self + G.shared_sticker_perishable:draw_shader('dissolve', nil, nil, nil, self.children.center) + G.shared_sticker_perishable:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) + end + if self.ability.rental then + G.shared_sticker_rental.role.draw_major = self + G.shared_sticker_rental:draw_shader('dissolve', nil, nil, nil, self.children.center) + G.shared_sticker_rental:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) + end + if self.sticker and G.shared_stickers[self.sticker] then + G.shared_stickers[self.sticker].role.draw_major = self + G.shared_stickers[self.sticker]:draw_shader('dissolve', nil, nil, nil, self.children.center) + G.shared_stickers[self.sticker]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) + elseif (self.sticker_run and G.shared_stickers[self.sticker_run]) and G.SETTINGS.run_stake_stickers then + G.shared_stickers[self.sticker_run].role.draw_major = self + G.shared_stickers[self.sticker_run]:draw_shader('dissolve', nil, nil, nil, self.children.center) + G.shared_stickers[self.sticker_run]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) + end + + if self.ability.name == 'The Soul' and (self.config.center.discovered or self.bypass_discovery_center) then + local scale_mod = 0.05 + 0.05*math.sin(1.8*G.TIMERS.REAL) + 0.07*math.sin((G.TIMERS.REAL - math.floor(G.TIMERS.REAL))*math.pi*14)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^3 + local rotate_mod = 0.1*math.sin(1.219*G.TIMERS.REAL) + 0.07*math.sin((G.TIMERS.REAL)*math.pi*5)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^2 + + G.shared_soul.role.draw_major = self + G.shared_soul:draw_shader('dissolve',0, nil, nil, self.children.center,scale_mod, rotate_mod,nil, 0.1 + 0.03*math.sin(1.8*G.TIMERS.REAL),nil, 0.6) + G.shared_soul:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) + end + + if self.config.center.soul_pos and (self.config.center.discovered or self.bypass_discovery_center) then + local scale_mod = 0.07 + 0.02*math.sin(1.8*G.TIMERS.REAL) + 0.00*math.sin((G.TIMERS.REAL - math.floor(G.TIMERS.REAL))*math.pi*14)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^3 + local rotate_mod = 0.05*math.sin(1.219*G.TIMERS.REAL) + 0.00*math.sin((G.TIMERS.REAL)*math.pi*5)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^2 + + if self.ability.name == 'Hologram' then + self.hover_tilt = self.hover_tilt*1.5 + self.children.floating_sprite:draw_shader('hologram', nil, self.ARGS.send_to_shader, nil, self.children.center, 2*scale_mod, 2*rotate_mod) + self.hover_tilt = self.hover_tilt/1.5 + else + self.children.floating_sprite:draw_shader('dissolve',0, nil, nil, self.children.center,scale_mod, rotate_mod,nil, 0.1 + 0.03*math.sin(1.8*G.TIMERS.REAL),nil, 0.6) + self.children.floating_sprite:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) + end + + end + if self.debuff then + self.children.center:draw_shader('debuff', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('debuff', nil, self.ARGS.send_to_shader) + end + end + if self.greyed then + self.children.center:draw_shader('played', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('played', nil, self.ARGS.send_to_shader) + end + end + end + elseif self.sprite_facing == 'back' then + local overlay = G.C.WHITE + if self.area and self.area.config.type == 'deck' and self.rank > 3 then + self.back_overlay = self.back_overlay or {} + self.back_overlay[1] = 0.5 + ((#self.area.cards - self.rank)%7)/50 + self.back_overlay[2] = 0.5 + ((#self.area.cards - self.rank)%7)/50 + self.back_overlay[3] = 0.5 + ((#self.area.cards - self.rank)%7)/50 + self.back_overlay[4] = 1 + overlay = self.back_overlay + end + + if self.area and self.area.config.type == 'deck' then + self.children.back:draw(overlay) + else + self.children.back:draw_shader('dissolve') + end + + if self.sticker and G.shared_stickers[self.sticker] then + G.shared_stickers[self.sticker].role.draw_major = self + G.shared_stickers[self.sticker]:draw_shader('dissolve', nil, nil, true, self.children.center) + if self.sticker == 'Gold' then G.shared_stickers[self.sticker]:draw_shader('voucher', nil, self.ARGS.send_to_shader, true, self.children.center) end + end + end + + for k, v in pairs(self.children) do + if k ~= 'focused_ui' and k ~= "front" and k ~= "back" and k ~= "soul_parts" and k ~= "center" and k ~= 'floating_sprite' and k~= "shadow" and k~= "use_button" and k ~= 'buy_button' and k ~= 'buy_and_use_button' and k~= "debuff" and k ~= 'price' and k~= 'particles' and k ~= 'h_popup' then v:draw() end + end + + if (layer == 'card' or layer == 'both') and self.area == G.hand then + if self.children.focused_ui then self.children.focused_ui:draw() end + end + + add_to_drawhash(self) + self:draw_boundingrect() + end +end + +function Card:release(dragged) + if dragged:is(Card) and self.area then + self.area:release(dragged) + end +end + +function Card:highlight(is_higlighted) + self.highlighted = is_higlighted + if self.ability.consumeable or self.ability.set == 'Joker' or (self.area and self.area == G.pack_cards) then + if self.highlighted and self.area and self.area.config.type ~= 'shop' then + local x_off = (self.ability.consumeable and -0.1 or 0) + self.children.use_button = UIBox{ + definition = G.UIDEF.use_and_sell_buttons(self), + config = {align= + ((self.area == G.jokers) or (self.area == G.consumeables)) and "cr" or + "bmi" + , offset = + ((self.area == G.jokers) or (self.area == G.consumeables)) and {x=x_off - 0.4,y=0} or + {x=0,y=0.65}, + parent =self} + } + elseif self.children.use_button then + self.children.use_button:remove() + self.children.use_button = nil + end + end + if self.ability.consumeable or self.ability.set == 'Joker' then + if not self.highlighted and self.area and self.area.config.type == 'joker' and + (#G.jokers.cards >= G.jokers.config.card_limit or (self.edition and self.edition.negative)) then + if G.shop_jokers then G.shop_jokers:unhighlight_all() end + end + end +end + +function Card:click() + if self.area and self.area:can_highlight(self) then + if (self.area == G.hand) and (G.STATE == G.STATES.HAND_PLAYED) then return end + if self.highlighted ~= true then + self.area:add_to_highlighted(self) + else + self.area:remove_from_highlighted(self) + play_sound('cardSlide2', nil, 0.3) + end + end + if self.area and self.area == G.deck and self.area.cards[1] == self then + G.FUNCS.deck_info() + end +end + +function Card:save() + cardTable = { + sort_id = self.sort_id, + save_fields = { + center = self.config.center_key, + card = self.config.card_key, + }, + params = self.params, + no_ui = self.no_ui, + base_cost = self.base_cost, + extra_cost = self.extra_cost, + cost = self.cost, + sell_cost = self.sell_cost, + facing = self.facing, + sprite_facing = self.facing, + flipping = nil, + highlighted = self.highligted, + debuff = self.debuff, + rank = self.rank, + added_to_deck = self.added_to_deck, + label = self.label, + playing_card = self.playing_card, + base = self.base, + ability = self.ability, + pinned = self.pinned, + edition = self.edition, + seal = self.seal, + bypass_discovery_center = self.bypass_discovery_center, + bypass_discovery_ui = self.bypass_discovery_ui, + bypass_lock = self.bypass_lock, + } + return cardTable +end + +function Card:load(cardTable, other_card) + local scale = 1 + self.config = {} + self.config.center_key = cardTable.save_fields.center + self.config.center = G.P_CENTERS[self.config.center_key] + self.params = cardTable.params + self.sticker_run = nil + + local H = G.CARD_H + local W = G.CARD_W + if self.config.center.name == "Half Joker" then + self.T.h = H*scale/1.7*scale + self.T.w = W*scale + elseif self.config.center.name == "Wee Joker" then + self.T.h = H*scale*0.7*scale + self.T.w = W*scale*0.7*scale + elseif self.config.center.name == "Photograph" then + self.T.h = H*scale/1.2*scale + self.T.w = W*scale + elseif self.config.center.name == "Square Joker" then + H = W + self.T.h = H*scale + self.T.w = W*scale + elseif self.config.center.set == 'Booster' then + self.T.h = H*1.27 + self.T.w = W*1.27 + else + self.T.h = H*scale + self.T.w = W*scale + end + self.VT.h = self.T.H + self.VT.w = self.T.w + + self.config.card_key = cardTable.save_fields.card + self.config.card = G.P_CARDS[self.config.card_key] + + self.no_ui = cardTable.no_ui + self.base_cost = cardTable.base_cost + self.extra_cost = cardTable.extra_cost + self.cost = cardTable.cost + self.sell_cost = cardTable.sell_cost + self.facing = cardTable.facing + self.sprite_facing = cardTable.sprite_facing + self.flipping = cardTable.flipping + self.highlighted = cardTable.highlighted + self.debuff = cardTable.debuff + self.rank = cardTable.rank + self.added_to_deck = cardTable.added_to_deck + self.label = cardTable.label + self.playing_card = cardTable.playing_card + self.base = cardTable.base + self.sort_id = cardTable.sort_id + self.bypass_discovery_center = cardTable.bypass_discovery_center + self.bypass_discovery_ui = cardTable.bypass_discovery_ui + self.bypass_lock = cardTable.bypass_lock + + self.ability = cardTable.ability + self.pinned = cardTable.pinned + self.edition = cardTable.edition + self.seal = cardTable.seal + + remove_all(self.children) + self.children = {} + self.children.shadow = Moveable(0, 0, 0, 0) + + self:set_sprites(self.config.center, self.config.card) +end + +function Card:remove() + self.removed = true + + if self.area then self.area:remove_card(self) end + + self:remove_from_deck() + if self.ability.queue_negative_removal then + if self.ability.consumeable then + G.consumeables.config.card_limit = G.consumeables.config.card_limit - 1 + else + G.jokers.config.card_limit = G.jokers.config.card_limit - 1 + end + end + + if not G.OVERLAY_MENU then + for k, v in pairs(G.P_CENTERS) do + if v.name == self.ability.name then + if not next(find_joker(self.ability.name, true)) then + G.GAME.used_jokers[k] = nil + end + end + end + end + + if G.playing_cards then + for k, v in ipairs(G.playing_cards) do + if v == self then + table.remove(G.playing_cards, k) + break + end + end + for k, v in ipairs(G.playing_cards) do + v.playing_card = k + end + end + + remove_all(self.children) + + for k, v in pairs(G.I.CARD) do + if v == self then + table.remove(G.I.CARD, k) + end + end + Moveable.remove(self) +end diff --git a/src/card_character.lua b/src/card_character.lua new file mode 100644 index 0000000..6404668 --- /dev/null +++ b/src/card_character.lua @@ -0,0 +1,164 @@ +--class +Card_Character = Moveable:extend() + +--class methods +function Card_Character:init(args) + Moveable.init(self,args.x or 1, args.y or 1, args.w or G.CARD_W*1.1, args.h or G.CARD_H*1.1) + + self.states.collide.can = false + + self.children = {} + self.config = {args = args} + self.children.card = Card(self.T.x, self.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, args.center or G.P_CENTERS.j_joker, {bypass_discovery_center = true}) + self.children.card.states.visible = false + self.children.card:start_materialize({G.C.BLUE, G.C.WHITE, G.C.RED}) + self.children.card:set_alignment{ + major = self, type = 'cm', offset = {x=0, y=0} + } + self.children.card.jimbo = self + self.children.card.states.collide.can = true + self.children.card.states.focus.can = false + self.children.card.states.hover.can = true + self.children.card.states.drag.can = false + self.children.card.hover = Node.hover + + self.children.particles = Particles(0, 0, 0,0, { + timer = 0.03, + scale = 0.3, + speed = 1.2, + lifespan = 2, + attach = self, + colours = {G.C.RED, G.C.BLUE, G.C.ORANGE}, + fill = true + }) + self.children.particles.static_rotation = true + self.children.particles:set_role{ + role_type = 'Minor', + xy_bond = 'Weak', + r_bond = 'Strong', + major = self, + } + + if getmetatable(self) == Card_Character then + table.insert(G.I.CARD, self) + end +end + +function Card_Character:move(dt) + Moveable.move(self, dt) +end + +function Card_Character:hard_set_VT() + self:align_to_major() + Moveable.hard_set_VT(self) + self:align() + self.children.card:hard_set_VT() +end + +function Card_Character:align() + if self.children.card then + self.children.card.T.x = self.T.x + (self.T.w - self.children.card.T.w)/2 + self.children.card.T.y = self.T.y + (self.T.h - self.children.card.T.h)/2 + end +end + +function Card_Character:add_button(button, func, colour, update_func, snap_to, yoff) + if self.children.button then self.children.button:remove() end + self.config.button_align = {align="bm", offset = {x=0,y=yoff or 0.3},major = self, parent = self} + self.children.button = UIBox{ + definition = create_UIBox_character_button({button = button, func = func, colour = colour, update_func = update_func, maxw = 3}), + config = self.config.button_align + } + if snap_to then G.CONTROLLER:snap_to{node = self.children.button} end +end + +function Card_Character:add_speech_bubble(text_key, align, loc_vars) + if self.children.speech_bubble then self.children.speech_bubble:remove() end + self.config.speech_bubble_align = {align=align or 'bm', offset = {x=0,y=0},parent = self} + self.children.speech_bubble = + UIBox{ + definition = G.UIDEF.speech_bubble(text_key, loc_vars), + config = self.config.speech_bubble_align + } + self.children.speech_bubble:set_role{ + role_type = 'Minor', + xy_bond = 'Weak', + r_bond = 'Strong', + major = self, + } + self.children.speech_bubble.states.visible = false +end + +function Card_Character:remove_button() + if self.children.button then self.children.button:remove(); self.children.button = nil end +end + +function Card_Character:remove_speech_bubble() + if self.children.speech_bubble then self.children.speech_bubble:remove(); self.children.speech_bubble = nil end +end + +function Card_Character:say_stuff(n, not_first) + self.talking = true + if not not_first then + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + if self.children.speech_bubble then self.children.speech_bubble.states.visible = true end + self:say_stuff(n, true) + return true + end + })) + else + if n <= 0 then self.talking = false; return end + local new_said = math.random(1, 11) + while new_said == self.last_said do + new_said = math.random(1, 11) + end + self.last_said = new_said + play_sound('voice'..math.random(1, 11), G.SPEEDFACTOR*(math.random()*0.2+1), 0.5) + self.children.card:juice_up() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, blocking = false, + delay = 0.13, + func = function() + self:say_stuff(n-1, true) + return true + end + }), 'tutorial') + end +end + +function Card_Character:draw(dt) + if self.highlight then + self.children.highlight:draw() + self.highlight:draw() + if self.highlight.draw_children then self.highlight:draw_children() end + end + if self.children.particles then + self.children.particles:draw() + end + if self.children.speech_bubble then + self.children.speech_bubble:draw() + end + if self.children.button and not self.talking then + self.children.button:draw() + end + if self.children.card then + self.children.card:draw() + end + add_to_drawhash(self) + self:draw_boundingrect() +end + +function Card_Character:remove() + G.jimboed = nil + remove_all(self.children) + for k, v in pairs(G.I.CARD) do + if v == self then + table.remove(G.I.CARD, k) + end + end + Moveable.remove(self) +end diff --git a/src/cardarea.lua b/src/cardarea.lua new file mode 100644 index 0000000..6507fe0 --- /dev/null +++ b/src/cardarea.lua @@ -0,0 +1,668 @@ +--Class +CardArea = Moveable:extend() + +--Class Methods +function CardArea:init(X, Y, W, H, config) + Moveable.init(self, X, Y, W, H) + + self.states.drag.can = false + self.states.hover.can = false + self.states.click.can = false + + + self.config = config or {} + self.card_w = config.card_w or G.CARD_W + self.cards = {} + self.children = {} + self.highlighted = {} + self.config.highlighted_limit = config.highlight_limit or 5 + self.config.card_limit = config.card_limit or 52 + self.config.temp_limit = self.config.card_limit + self.config.card_count = 0 + self.config.type = config.type or 'deck' + self.config.sort = config.sort or 'desc' + self.config.lr_padding = config.lr_padding or 0.1 + self.shuffle_amt = 0 + + if getmetatable(self) == CardArea then + table.insert(G.I.CARDAREA, self) + end +end + +function CardArea:emplace(card, location, stay_flipped) + if location == 'front' or self.config.type == 'deck' then + table.insert(self.cards, 1, card) + else + self.cards[#self.cards+1] = card + end + if card.facing == 'back' and self.config.type ~= 'discard' and self.config.type ~= 'deck' and not stay_flipped then + card:flip() + end + if self == G.hand and stay_flipped then + card.ability.wheel_flipped = true + end + + if #self.cards > self.config.card_limit then + if self == G.deck then + self.config.card_limit = #self.cards + end + end + + card:set_card_area(self) + self:set_ranks() + self:align_cards() + + if self == G.jokers then + local joker_tally = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.set == 'Joker' then joker_tally = joker_tally + 1 end + end + if joker_tally > G.GAME.max_jokers then G.GAME.max_jokers = joker_tally end + check_for_unlock({type = 'modify_jokers'}) + end + if self == G.deck then check_for_unlock({type = 'modify_deck', deck = self}) end +end + +function CardArea:remove_card(card, discarded_only) + if not self.cards then return end + local _cards = discarded_only and {} or self.cards + if discarded_only then + for k, v in ipairs(self.cards) do + if v.ability and v.ability.discarded then + _cards[#_cards+1] = v + end + end + end + if self.config.type == 'discard' or self.config.type == 'deck' then + card = card or _cards[#_cards] + else + card = card or _cards[1] + end + for i = #self.cards,1,-1 do + if self.cards[i] == card then + card:remove_from_area() + table.remove(self.cards, i) + self:remove_from_highlighted(card, true) + break + end + end + self:set_ranks() + if self == G.deck then check_for_unlock({type = 'modify_deck', deck = self}) end + return card +end + +function CardArea:change_size(delta) + if delta ~= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + self.config.real_card_limit = (self.config.real_card_limit or self.config.card_limit) + delta + self.config.card_limit = math.max(0, self.config.real_card_limit) + if delta > 0 and self.config.real_card_limit > 1 and self == G.hand and self.cards[1] and (G.STATE == G.STATES.DRAW_TO_HAND or G.STATE == G.STATES.SELECTING_HAND) then + local card_count = math.abs(delta) + for i=1, card_count do + draw_card(G.deck,G.hand, i*100/card_count,nil, nil , nil, 0.07) + G.E_MANAGER:add_event(Event({func = function() self:sort() return true end})) + end + end + if self == G.hand then check_for_unlock({type = 'min_hand_size'}) end + return true + end})) + end +end + +function CardArea:can_highlight(card) + if G.CONTROLLER.HID.controller then + if self.config.type == 'hand' + then + return true + end + else + if self.config.type == 'hand' or + self.config.type == 'joker' or + self.config.type == 'consumeable' or + (self.config.type == 'shop' and self.config.highlighted_limit > 0) + then + return true + end + end + return false +end + +function CardArea:add_to_highlighted(card, silent) + --if self.config.highlighted_limit <= #self.highlighted then return end + if self.config.type == 'shop' then + if self.highlighted[1] then + self:remove_from_highlighted(self.highlighted[1]) + end + --if not G.FUNCS.check_for_buy_space(card) then return false end + self.highlighted[#self.highlighted+1] = card + card:highlight(true) + if not silent then play_sound('cardSlide1') end + elseif self.config.type == 'joker' or self.config.type == 'consumeable' then + if #self.highlighted >= self.config.highlighted_limit then + self:remove_from_highlighted(self.highlighted[1]) + end + self.highlighted[#self.highlighted+1] = card + card:highlight(true) + if not silent then play_sound('cardSlide1') end + else + if #self.highlighted >= self.config.highlighted_limit then + card:highlight(false) + else + self.highlighted[#self.highlighted+1] = card + card:highlight(true) + if not silent then play_sound('cardSlide1') end + end + if self == G.hand and G.STATE == G.STATES.SELECTING_HAND then + self:parse_highlighted() + end + end +end + +function CardArea:parse_highlighted() + G.boss_throw_hand = nil + local text,disp_text,poker_hands = G.FUNCS.get_poker_hand_info(self.highlighted) + if text == 'NULL' then + update_hand_text({immediate = true, nopulse = true, delay = 0}, {mult = 0, chips = 0, level = '', handname = ''}) + else + if G.GAME.blind and G.GAME.blind:debuff_hand(self.highlighted, poker_hands, text, true) then + G.boss_throw_hand = true + else + + end + local backwards = nil + for k, v in pairs(self.highlighted) do + if v.facing == 'back' then + backwards = true + end + end + if backwards then + update_hand_text({immediate = true, nopulse = nil, delay = 0}, {handname='????', level='?', mult = '?', chips = '?'}) + else + update_hand_text({immediate = true, nopulse = nil, delay = 0}, {handname=disp_text, level=G.GAME.hands[text].level, mult = G.GAME.hands[text].mult, chips = G.GAME.hands[text].chips}) + end + end +end + +function CardArea:remove_from_highlighted(card, force) + if (not force) and card and card.ability.forced_selection and self == G.hand then return end + for i = #self.highlighted,1,-1 do + if self.highlighted[i] == card then + table.remove(self.highlighted, i) + break + end + end + card:highlight(false) + if self == G.hand and G.STATE == G.STATES.SELECTING_HAND then + self:parse_highlighted() + end +end + +function CardArea:unhighlight_all() + for i = #self.highlighted,1,-1 do + if self.highlighted[i].ability.forced_selection and self == G.hand then + else + self.highlighted[i]:highlight(false) + table.remove(self.highlighted, i) + end + end + if self == G.hand and G.STATE == G.STATES.SELECTING_HAND then + self:parse_highlighted() + end +end + +function CardArea:set_ranks() + for k, card in ipairs(self.cards) do + card.rank = k + card.states.collide.can = true + if k > 1 and self.config.type == 'deck' then + card.states.drag.can = false + card.states.collide.can = false + elseif self.config.type == 'play' or self.config.type == 'shop' or self.config.type == 'consumeable' then + card.states.drag.can = false + else + card.states.drag.can = true + end + end +end + +function CardArea:move(dt) + --Set sliding up/down for the hand area + if self == G.hand then + local desired_y = G.TILE_H - G.hand.T.h - 1.9*((not G.deck_preview and (G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.DRAW_TO_HAND)) and 1 or 0) + G.hand.T.y = 15*G.real_dt*desired_y + (1-15*G.real_dt)*G.hand.T.y + if math.abs(desired_y - G.hand.T.y) < 0.01 then G.hand.T.y = desired_y end + if G.STATE == G.STATES.TUTORIAL then + G.play.T.y = G.hand.T.y - (3 + 0.6) + end + end + Moveable.move(self, dt) + self:align_cards() +end + +function CardArea:update(dt) + if self == G.hand then + if G.GAME.modifiers.minus_hand_size_per_X_dollar then + self.config.last_poll_size = self.config.last_poll_size or 0 + if math.floor(G.GAME.dollars/G.GAME.modifiers.minus_hand_size_per_X_dollar) ~= self.config.last_poll_size then + self:change_size(self.config.last_poll_size - math.floor(G.GAME.dollars/G.GAME.modifiers.minus_hand_size_per_X_dollar)) + self.config.last_poll_size = math.floor(G.GAME.dollars/G.GAME.modifiers.minus_hand_size_per_X_dollar) + end + end + for k, v in pairs(self.cards) do + if v.ability.forced_selection and not self.highlighted[1] then + self:add_to_highlighted(v) + end + end + end + if self == G.deck then + self.states.collide.can = true + self.states.hover.can = true + self.states.click.can = true + end + --Check and see if controller is being used + if G.CONTROLLER.HID.controller and self ~= G.hand then self:unhighlight_all() end + if self == G.deck and self.config.card_limit > #G.playing_cards then self.config.card_limit = #G.playing_cards end + self.config.temp_limit = math.max(#self.cards, self.config.card_limit) + self.config.card_count = #self.cards +end + +function CardArea:draw() + if not self.states.visible then return end + if G.VIEWING_DECK and (self==G.deck or self==G.hand or self==G.play) then return end + + local state = G.TAROT_INTERRUPT or G.STATE + + self.ARGS.invisible_area_types = self.ARGS.invisible_area_types or {discard=1, voucher=1, play=1, consumeable=1, title = 1, title_2 = 1} + if self.ARGS.invisible_area_types[self.config.type] or + (self.config.type == 'hand' and ({[G.STATES.SHOP]=1, [G.STATES.TAROT_PACK]=1, [G.STATES.SPECTRAL_PACK]=1, [G.STATES.STANDARD_PACK]=1,[G.STATES.BUFFOON_PACK]=1,[G.STATES.PLANET_PACK]=1, [G.STATES.ROUND_EVAL]=1, [G.STATES.BLIND_SELECT]=1})[state]) or + (self.config.type == 'deck' and self ~= G.deck) or + (self.config.type == 'shop' and self ~= G.shop_vouchers) then + else + if not self.children.area_uibox then + local card_count = self ~= G.shop_vouchers and {n=G.UIT.R, config={align = self == G.jokers and 'cl' or self == G.hand and 'cm' or 'cr', padding = 0.03, no_fill = true}, nodes={ + {n=G.UIT.B, config={w = 0.1,h=0.1}}, + {n=G.UIT.T, config={ref_table = self.config, ref_value = 'card_count', scale = 0.3, colour = G.C.WHITE}}, + {n=G.UIT.T, config={text = '/', scale = 0.3, colour = G.C.WHITE}}, + {n=G.UIT.T, config={ref_table = self.config, ref_value = 'card_limit', scale = 0.3, colour = G.C.WHITE}}, + {n=G.UIT.B, config={w = 0.1,h=0.1}} + }} or nil + + self.children.area_uibox = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={minw = self.T.w,minh = self.T.h,align = "cm", padding = 0.1, mid = true, r = 0.1, colour = self ~= G.shop_vouchers and {0,0,0,0.1} or nil, ref_table = self}, nodes={ + self == G.shop_vouchers and + {n=G.UIT.C, config={align = "cm", paddin = 0.1, func = 'shop_voucher_empty', visible = false}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'DEFEAT', scale = 0.6, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'BOSS BLIND', scale = 0.4, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'TO RESTOCK', scale = 0.4, colour = G.C.WHITE}} + }}, + }} or nil, + }}, + card_count + }}, + config = { align = 'cm', offset = {x=0,y=0}, major = self, parent = self} + } + end + self.children.area_uibox:draw() + end + + self:draw_boundingrect() + add_to_drawhash(self) + + self.ARGS.draw_layers = self.ARGS.draw_layers or self.config.draw_layers or {'shadow', 'card'} + for k, v in ipairs(self.ARGS.draw_layers) do + if self.config.type == 'deck' then + for i = #self.cards, 1, -1 do + if self.cards[i] ~= G.CONTROLLER.focused.target then + if i == 1 or i%(self.config.thin_draw or 9) == 0 or i == #self.cards or math.abs(self.cards[i].VT.x - self.T.x) > 1 or math.abs(self.cards[i].VT.y - self.T.y) > 1 then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + end + + if self.config.type == 'joker' or self.config.type == 'consumeable' or self.config.type == 'shop' or self.config.type == 'title_2' then + for i = 1, #self.cards do + if self.cards[i] ~= G.CONTROLLER.focused.target then + if not self.cards[i].highlighted then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + for i = 1, #self.cards do + if self.cards[i] ~= G.CONTROLLER.focused.target then + if self.cards[i].highlighted then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + end + + if self.config.type == 'discard' then + for i = 1, #self.cards do + if self.cards[i] ~= G.CONTROLLER.focused.target then + if math.abs(self.cards[i].VT.x - self.T.x) > 1 then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + end + + if self.config.type == 'hand' or self.config.type == 'play' or self.config.type == 'title' or self.config.type == 'voucher' then + for i = 1, #self.cards do + if self.cards[i] ~= G.CONTROLLER.focused.target or self == G.hand then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + end + + if self == G.deck then + if G.CONTROLLER.HID.controller and G.STATE == G.STATES.SELECTING_HAND and not self.children.peek_deck then + self.children.peek_deck = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', padding = 0.1, r =0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", r =0.1, colour = adjust_alpha(G.C.L_BLACK, 0.5),func = 'set_button_pip', focus_args = {button = 'triggerleft', orientation = 'bm', scale = 0.6, type = 'none'}}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'PEEK', scale = 0.48, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'DECK', scale = 0.38, colour = G.C.WHITE, shadow = true}} + }}, + }}, + }}, + config = { align = 'cl', offset = {x=-0.5,y=0.1}, major = self, parent = self} + } + self.children.peek_deck.states.collide.can = false + elseif (not G.CONTROLLER.HID.controller or G.STATE ~= G.STATES.SELECTING_HAND) and self.children.peek_deck then + self.children.peek_deck:remove() + self.children.peek_deck = nil + end + if not self.children.view_deck then + self.children.view_deck = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', padding = 0.1, r =0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, r =0.1, colour = adjust_alpha(G.C.BLACK, 0.5),func = 'set_button_pip', focus_args = {button = 'triggerright', orientation = 'bm', scale = 0.6}, button = 'deck_info'}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 2}, nodes={ + {n=G.UIT.T, config={text = localize('k_view'), scale = 0.48, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", maxw = 2}, nodes={ + {n=G.UIT.T, config={text = localize('k_deck'), scale = 0.38, colour = G.C.WHITE, shadow = true}} + }}, + }}, + }}, + config = { align = 'cm', offset = {x=0,y=0}, major = self.cards[1] or self, parent = self} + } + self.children.view_deck.states.collide.can = false + end + if G.deck_preview or self.states.collide.is or (G.buttons and G.buttons.states.collide.is and G.CONTROLLER.HID.controller) then self.children.view_deck:draw() end + if self.children.peek_deck then self.children.peek_deck:draw() end + end +end + +function CardArea:align_cards() + if (self == G.hand or self == G.deck or self == G.discard or self == G.play) and G.view_deck and G.view_deck[1] and G.view_deck[1].cards then return end + if self.config.type == 'deck' then + local deck_height = (self.config.deck_height or 0.15)/52 + for k, card in ipairs(self.cards) do + if card.facing == 'front' then card:flip() end + + if not card.states.drag.is then + card.T.x = self.T.x + 0.5*(self.T.w - card.T.w) + self.shadow_parrallax.x*deck_height*(#self.cards/(self == G.deck and 1 or 2) - k) + 0.9*self.shuffle_amt*(1 - k*0.01)*(k%2 == 1 and 1 or -0) + card.T.y = self.T.y + 0.5*(self.T.h - card.T.h) + self.shadow_parrallax.y*deck_height*(#self.cards/(self == G.deck and 1 or 2) - k) + card.T.r = 0 + 0.3*self.shuffle_amt*(1 + k*0.05)*(k%2 == 1 and 1 or -0) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + end + if self.config.type == 'discard' then + for k, card in ipairs(self.cards) do + if card.facing == 'front' then card:flip() end + + if not card.states.drag.is then + card.T.x = self.T.x + (self.T.w - card.T.w)*card.discard_pos.x + card.T.y = self.T.y + (self.T.h - card.T.h)* card.discard_pos.y + card.T.r = card.discard_pos.r + end + end + end + if self.config.type == 'hand' and (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK) then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.4*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*0.02*math.sin(2*G.TIMERS.REAL+card.T.x) + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = G.hand.T.y - 1.8*card.T.h - highlight_height + (G.SETTINGS.reduced_motion and 0 or 1)*0.1*math.sin(0.666*G.TIMERS.REAL+card.T.x) + math.abs(1.3*(-#self.cards/2 + k-0.5)/(#self.cards))^2-0.3 + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + if self.config.type == 'hand' and not (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK) then + + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*0.02*math.sin(2*G.TIMERS.REAL+card.T.x) + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (G.SETTINGS.reduced_motion and 0 or 1)*0.03*math.sin(0.666*G.TIMERS.REAL+card.T.x) + math.abs(0.5*(-#self.cards/2 + k-0.5)/(#self.cards))-0.2 + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + if self.config.type == 'title' or (self.config.type == 'voucher' and #self.cards == 1) then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*0.02*math.sin(2*G.TIMERS.REAL+card.T.x) + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (G.SETTINGS.reduced_motion and 0 or 1)*0.03*math.sin(0.666*G.TIMERS.REAL+card.T.x) + math.abs(0.5*(-#self.cards/2 + k-0.5)/(#self.cards))-(#self.cards>1 and 0.2 or 0) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + if self.config.type == 'voucher' and #self.cards > 1 then + local self_w = math.max(self.T.w, 3.2) + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*0.02*math.sin(2*G.TIMERS.REAL+card.T.x+card.T.y) + (k%2 == 0 and 1 or -1)*0.08 + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self_w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + (k%2 == 1 and 1 or -1)*0.27 + (self.T.w-self_w)/2 + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (G.SETTINGS.reduced_motion and 0 or 1)*0.03*math.sin(0.666*G.TIMERS.REAL+card.T.x) + math.abs(0.5*(-#self.cards/2 + k-0.5)/(#self.cards))-(#self.cards>1 and 0.2 or 0) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.ability.order < b.ability.order end) + end + if self.config.type == 'play' or self.config.type == 'shop' then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0 + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + (self.config.card_limit == 1 and 0.5*(self.T.w - card.T.w) or 0) + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + if self.config.type == 'joker' or self.config.type == 'title_2' then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.1*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*0.02*math.sin(2*G.TIMERS.REAL+card.T.x) + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + if #self.cards > 2 or (#self.cards > 1 and self == G.consumeables) or (#self.cards > 1 and self.config.spread) then + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/(#self.cards-1)) + 0.5*(self.card_w - card.T.w) + elseif #self.cards > 1 and self ~= G.consumeables then + card.T.x = self.T.x + (self.T.w-self.card_w)*((k - 0.5)/(#self.cards)) + 0.5*(self.card_w - card.T.w) + else + card.T.x = self.T.x + self.T.w/2 - self.card_w/2 + 0.5*(self.card_w - card.T.w) + end + local highlight_height = G.HIGHLIGHT_H/2 + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height+ (G.SETTINGS.reduced_motion and 0 or 1)*0.03*math.sin(0.666*G.TIMERS.REAL+card.T.x) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end) + end + if self.config.type == 'consumeable'then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + if #self.cards > 1 then + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/(#self.cards-1)) + 0.5*(self.card_w - card.T.w) + else + card.T.x = self.T.x + self.T.w/2 - self.card_w/2 + 0.5*(self.card_w - card.T.w) + end + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (not card.highlighted and (G.SETTINGS.reduced_motion and 0 or 1)*0.05*math.sin(2*1.666*G.TIMERS.REAL+card.T.x) or 0) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + for k, card in ipairs(self.cards) do + card.rank = k + end + if self.children.view_deck then + self.children.view_deck:set_role{major = self.cards[1] or self} + end +end + +function CardArea:hard_set_T(X, Y, W, H) + local x = (X or self.T.x) + local y = (Y or self.T.y) + local w = (W or self.T.w) + local h = (H or self.T.h) + Moveable.hard_set_T(self,x, y, w, h) + self:calculate_parrallax() + self:align_cards() + self:hard_set_cards() +end + +function CardArea:hard_set_cards() + for k, card in pairs(self.cards) do + card:hard_set_T() + card:calculate_parrallax() + end +end + +function CardArea:shuffle(_seed) + pseudoshuffle(self.cards, pseudoseed(_seed or 'shuffle')) + self:set_ranks() +end + +function CardArea:sort(method) + self.config.sort = method or self.config.sort + if self.config.sort == 'desc' then + table.sort(self.cards, function (a, b) return a:get_nominal() > b:get_nominal() end ) + elseif self.config.sort == 'asc' then + table.sort(self.cards, function (a, b) return a:get_nominal() < b:get_nominal() end ) + elseif self.config.sort == 'suit desc' then + table.sort(self.cards, function (a, b) return a:get_nominal('suit') > b:get_nominal('suit') end ) + elseif self.config.sort == 'suit asc' then + table.sort(self.cards, function (a, b) return a:get_nominal('suit') < b:get_nominal('suit') end ) + elseif self.config.sort == 'order' then + table.sort(self.cards, function (a, b) return (a.config.card.order or a.config.center.order) < (b.config.card.order or b.config.center.order) end ) + end +end + +function CardArea:draw_card_from(area, stay_flipped, discarded_only) + if area:is(CardArea) then + if #self.cards < self.config.card_limit or self == G.deck or self == G.hand then + local card = area:remove_card(nil, discarded_only) + if card then + if area == G.discard then + card.T.r = 0 + end + local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(self, card) + if (self == G.hand) and G.GAME.modifiers.flipped_cards then + if pseudorandom(pseudoseed('flipped_card')) < 1/G.GAME.modifiers.flipped_cards then + stay_flipped = true + end + end + self:emplace(card, nil, stay_flipped) + return true + end + end + end +end + +function CardArea:click() + if self == G.deck then + G.FUNCS.deck_info() + end +end + +function CardArea:save() + if not self.cards then return end + local cardAreaTable = { + cards = {}, + config = self.config, + } + for i = 1, #self.cards do + cardAreaTable.cards[#cardAreaTable.cards + 1] = self.cards[i]:save() + end + + return cardAreaTable +end + +function CardArea:load(cardAreaTable) + + if self.cards then remove_all(self.cards) end + self.cards = {} + if self.children then remove_all(self.children) end + self.children = {} + + self.config = cardAreaTable.config + + for i = 1, #cardAreaTable.cards do + loading = true + local card = Card(0, 0, G.CARD_W, G.CARD_H, G.P_CENTERS.j_joker, G.P_CENTERS.c_base) + loading = nil + card:load(cardAreaTable.cards[i]) + self.cards[#self.cards + 1] = card + if card.highlighted then + self.highlighted[#self.highlighted + 1] = card + end + card:set_card_area(self) + end + self:set_ranks() + self:align_cards() + self:hard_set_cards() +end + +function CardArea:remove() + if self.cards then remove_all(self.cards) end + self.cards = nil + if self.children then remove_all(self.children) end + self.children = nil + for k, v in pairs(G.I.CARDAREA) do + if v == self then + table.remove(G.I.CARDAREA, k) + end + end + Moveable.remove(self) +end diff --git a/src/challenges.lua b/src/challenges.lua new file mode 100644 index 0000000..09a86f3 --- /dev/null +++ b/src/challenges.lua @@ -0,0 +1,738 @@ +G.CHALLENGES = { + --[[{ + name = 'TEST', + id = 'c_test_1', + rules = { + custom = { + --{id = 'no_reward'}, + {id = 'no_reward_specific', value = 'Big'}, + {id = 'no_extra_hand_money'}, + {id = 'no_interest'}, + {id = 'daily'}, + {id = 'set_seed', value = 'SEEDEEDS'}, + }, + modifiers = { + {id = 'dollars', value = 100}, + {id = 'discards', value = 1}, + {id = 'hands', value = 6}, + {id = 'reroll_cost', value = 10}, + {id = 'joker_slots', value = 8}, + {id = 'consumable_slots', value = 3}, + {id = 'hand_size', value = 5}, + } + }, + jokers = { + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg', edition = 'foil', eternal = true} + }, + consumeables = { + {id = 'c_sigil'} + }, + vouchers = { + {id = 'v_hieroglyph'}, + }, + deck = { + --enhancement = 'm_glass', + --edition = 'foil', + --gold_seal = true, + --yes_ranks = {['3'] = true,T = true}, + --no_ranks = {['4'] = true}, + --yes_suits = {S=true}, + --no_suits = {D=true}, + cards = {{s='D',r='2',e='m_glass',},{s='D',r='3',e='m_glass',},{s='D',r='4',e='m_glass',},{s='D',r='5',e='m_glass',},{s='D',r='6',e='m_glass',},{s='D',r='7',e='m_glass',},{s='D',r='8',e='m_glass',},{s='D',r='9',e='m_glass',},{s='D',r='T',e='m_glass',},{s='D',r='J',e='m_glass',},{s='D',r='Q',e='m_glass',},{s='D',r='K',e='m_glass',},{s='D',r='A',e='m_glass',},{s='C',r='2',e='m_glass',},{s='C',r='3',e='m_glass',},{s='C',r='4',e='m_glass',},{s='C',r='5',e='m_glass',},{s='C',r='6',e='m_glass',},{s='C',r='7',e='m_glass',},{s='C',r='8',e='m_glass',},{s='C',r='9',e='m_glass',},{s='C',r='T',e='m_glass',},{s='C',r='J',e='m_glass',},{s='C',r='Q',e='m_glass',},{s='C',r='K',e='m_glass',},{s='C',r='A',e='m_glass',},{s='H',r='2',e='m_glass',},{s='H',r='3',e='m_glass',},{s='H',r='4',e='m_glass',},{s='H',r='5',e='m_glass',},{s='H',r='6',e='m_glass',},{s='H',r='7',e='m_glass',},{s='H',r='8',e='m_glass',},{s='H',r='9',e='m_glass',},{s='H',r='T',e='m_glass',},{s='H',r='J',e='m_glass',},{s='H',r='Q',e='m_glass',},{s='H',r='K',e='m_glass',},{s='H',r='A',e='m_glass',},{s='S',r='2',e='m_glass',},{s='S',r='3',e='m_glass',},{s='S',r='4',e='m_glass',},{s='S',r='5',e='m_glass',},{s='S',r='6',e='m_glass',},{s='S',r='7',e='m_glass',},{s='S',r='8',e='m_glass',},{s='S',r='9',e='m_glass',},{s='S',r='T',e='m_glass',},{s='S',r='J',e='m_glass',},{s='S',r='Q',e='m_glass',},{s='S',r='K',e='m_glass',},{s='S',r='A',e='m_glass',},}, + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'j_joker'}, + {id = 'j_egg'}, + }, + banned_tags = { + {id = 'tag_garbage'}, + {id = 'tag_handy'}, + }, + banned_other = { + {id = 'bl_wall', type = 'blind'} + } + } + },]]-- + { + name = 'The Omelette', + id = 'c_omelette_1', + rules = { + custom = { + {id = 'no_reward'}, + {id = 'no_extra_hand_money'}, + {id = 'no_interest'} + }, + modifiers = { + } + }, + jokers = { + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'v_seed_money'}, + {id = 'v_money_tree'}, + {id = 'j_to_the_moon'}, + {id = 'j_rocket'}, + {id = 'j_golden'}, + {id = 'j_satellite'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "15 Minute City", + id = 'c_city_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_ride_the_bus', eternal = true}, + {id = 'j_shortcut', eternal = true}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + cards = {{s='D',r='4',},{s='D',r='5',},{s='D',r='6',},{s='D',r='7',},{s='D',r='8',},{s='D',r='9',},{s='D',r='T',},{s='D',r='J',},{s='D',r='Q',},{s='D',r='K',},{s='D',r='J',},{s='D',r='Q',},{s='D',r='K',},{s='C',r='4',},{s='C',r='5',},{s='C',r='6',},{s='C',r='7',},{s='C',r='8',},{s='C',r='9',},{s='C',r='T',},{s='C',r='J',},{s='C',r='Q',},{s='C',r='K',},{s='C',r='J',},{s='C',r='Q',},{s='C',r='K',},{s='H',r='4',},{s='H',r='5',},{s='H',r='6',},{s='H',r='7',},{s='H',r='8',},{s='H',r='9',},{s='H',r='T',},{s='H',r='J',},{s='H',r='Q',},{s='H',r='K',},{s='H',r='J',},{s='H',r='Q',},{s='H',r='K',},{s='S',r='4',},{s='S',r='5',},{s='S',r='6',},{s='S',r='7',},{s='S',r='8',},{s='S',r='9',},{s='S',r='T',},{s='S',r='J',},{s='S',r='Q',},{s='S',r='K',},{s='S',r='J',},{s='S',r='Q',},{s='S',r='K',}}, + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Rich get Richer", + id = 'c_rich_1', + rules = { + custom = { + {id = 'chips_dollar_cap'}, + }, + modifiers = { + {id = 'dollars', value = 100}, + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + {id = 'v_seed_money'}, + {id = 'v_money_tree'}, + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "On a Knife's Edge", + id = 'c_knife_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_ceremonial', eternal = true, pinned = true}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "X-ray Vision", + id = 'c_xray_1', + rules = { + custom = { + {id = 'flipped_cards', value = 4}, + }, + modifiers = { + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Mad World", + id = 'c_mad_world_1', + rules = { + custom = { + {id = 'no_extra_hand_money'}, + {id = 'no_interest'}, + }, + modifiers = { + } + }, + jokers = { + {id = 'j_pareidolia', edition = 'negative', eternal = true}, + {id = 'j_business', eternal = true}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + cards = {{s='D',r='2',},{s='D',r='3',},{s='D',r='4',},{s='D',r='5',},{s='D',r='6',},{s='D',r='7',},{s='D',r='8',},{s='D',r='9',},{s='C',r='2',},{s='C',r='3',},{s='C',r='4',},{s='C',r='5',},{s='C',r='6',},{s='C',r='7',},{s='C',r='8',},{s='C',r='9',},{s='H',r='2',},{s='H',r='3',},{s='H',r='4',},{s='H',r='5',},{s='H',r='6',},{s='H',r='7',},{s='H',r='8',},{s='H',r='9',},{s='S',r='2',},{s='S',r='3',},{s='S',r='4',},{s='S',r='5',},{s='S',r='6',},{s='S',r='7',},{s='S',r='8',},{s='S',r='9',}}, + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + {id = 'bl_plant', type = 'blind'}, + } + } + }, + { + name = "Luxury Tax", + id = 'c_luxury_1', + rules = { + custom = { + {id = 'minus_hand_size_per_X_dollar', value = 5}, + }, + modifiers = { + {id = 'hand_size', value = 10}, + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Non-Perishable", + id = 'c_non_perishable_1', + rules = { + custom = { + {id = 'all_eternal'}, + }, + modifiers = { + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'j_gros_michel'}, + {id = 'j_ice_cream'}, + {id = 'j_cavendish'}, + {id = 'j_turtle_bean'}, + {id = 'j_ramen'}, + {id = 'j_diet_cola'}, + {id = 'j_selzer'}, + {id = 'j_popcorn'}, + {id = 'j_mr_bones'}, + {id = 'j_invisible'}, + {id = 'j_luchador'}, + }, + banned_tags = { + }, + banned_other = { + {id = 'bl_final_leaf', type = 'blind'}, + } + } + }, + { + name = "Medusa", + id = 'c_medusa_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_marble', eternal = true}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck', + cards = {{s='D',r='2',},{s='D',r='3',},{s='D',r='4',},{s='D',r='5',},{s='D',r='6',},{s='D',r='7',},{s='D',r='8',},{s='D',r='9',},{s='D',r='T',},{s='D',r='J',e='m_stone',},{s='D',r='Q',e='m_stone',},{s='D',r='K',e='m_stone',},{s='D',r='A',},{s='C',r='2',},{s='C',r='3',},{s='C',r='4',},{s='C',r='5',},{s='C',r='6',},{s='C',r='7',},{s='C',r='8',},{s='C',r='9',},{s='C',r='T',},{s='C',r='J',e='m_stone',},{s='C',r='Q',e='m_stone',},{s='C',r='K',e='m_stone',},{s='C',r='A',},{s='H',r='2',},{s='H',r='3',},{s='H',r='4',},{s='H',r='5',},{s='H',r='6',},{s='H',r='7',},{s='H',r='8',},{s='H',r='9',},{s='H',r='T',},{s='H',r='J',e='m_stone',},{s='H',r='Q',e='m_stone',},{s='H',r='K',e='m_stone',},{s='H',r='A',},{s='S',r='2',},{s='S',r='3',},{s='S',r='4',},{s='S',r='5',},{s='S',r='6',},{s='S',r='7',},{s='S',r='8',},{s='S',r='9',},{s='S',r='T',},{s='S',r='J',e='m_stone',},{s='S',r='Q',e='m_stone',},{s='S',r='K',e='m_stone',},{s='S',r='A',}, } + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Double or Nothing", + id = 'c_double_nothing_1', + rules = { + custom = { + {id = 'debuff_played_cards'}, + }, + modifiers = { + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck', + cards = {{s='D',r='2',g='Red',},{s='D',r='3',g='Red',},{s='D',r='4',g='Red',},{s='D',r='5',g='Red',},{s='D',r='6',g='Red',},{s='D',r='7',g='Red',},{s='D',r='8',g='Red',},{s='D',r='9',g='Red',},{s='D',r='T',g='Red',},{s='D',r='J',g='Red',},{s='D',r='Q',g='Red',},{s='D',r='K',g='Red',},{s='D',r='A',g='Red',},{s='C',r='2',g='Red',},{s='C',r='3',g='Red',},{s='C',r='4',g='Red',},{s='C',r='5',g='Red',},{s='C',r='6',g='Red',},{s='C',r='7',g='Red',},{s='C',r='8',g='Red',},{s='C',r='9',g='Red',},{s='C',r='T',g='Red',},{s='C',r='J',g='Red',},{s='C',r='Q',g='Red',},{s='C',r='K',g='Red',},{s='C',r='A',g='Red',},{s='H',r='2',g='Red',},{s='H',r='3',g='Red',},{s='H',r='4',g='Red',},{s='H',r='5',g='Red',},{s='H',r='6',g='Red',},{s='H',r='7',g='Red',},{s='H',r='8',g='Red',},{s='H',r='9',g='Red',},{s='H',r='T',g='Red',},{s='H',r='J',g='Red',},{s='H',r='Q',g='Red',},{s='H',r='K',g='Red',},{s='H',r='A',g='Red',},{s='S',r='2',g='Red',},{s='S',r='3',g='Red',},{s='S',r='4',g='Red',},{s='S',r='5',g='Red',},{s='S',r='6',g='Red',},{s='S',r='7',g='Red',},{s='S',r='8',g='Red',},{s='S',r='9',g='Red',},{s='S',r='T',g='Red',},{s='S',r='J',g='Red',},{s='S',r='Q',g='Red',},{s='S',r='K',g='Red',},{s='S',r='A',g='Red',},} + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Typecast", + id = 'c_typecast_1', + rules = { + custom = { + {id = 'set_eternal_ante', value = 4}, + {id = 'set_joker_slots_ante', value = 4}, + }, + modifiers = { + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + {id = 'bl_final_leaf', type = 'blind'}, + } + } + }, + { + name = "Inflation", + id = 'c_inflation_1', + rules = { + custom = { + {id = 'inflation'}, + }, + modifiers = { + } + }, + jokers = { + {id = 'j_credit_card'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'v_clearance_sale'}, + {id = 'v_liquidation'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Bram Poker", + id = 'c_bram_poker_1', + rules = { + custom = { + {id = 'no_shop_jokers'}, + }, + modifiers = { + } + }, + jokers = { + {id = 'j_vampire', eternal = true}, + }, + consumeables = { + {id = 'c_empress'}, + {id = 'c_emperor'}, + }, + vouchers = { + {id = 'v_magic_trick'}, + {id = 'v_illusion'}, + }, + deck = { + type = 'Challenge Deck', + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Fragile", + id = 'c_fragile_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_oops', eternal = true, edition = 'negative'}, + {id = 'j_oops', eternal = true, edition = 'negative'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + cards = {{s='D',r='2',e='m_glass',},{s='D',r='3',e='m_glass',},{s='D',r='4',e='m_glass',},{s='D',r='5',e='m_glass',},{s='D',r='6',e='m_glass',},{s='D',r='7',e='m_glass',},{s='D',r='8',e='m_glass',},{s='D',r='9',e='m_glass',},{s='D',r='T',e='m_glass',},{s='D',r='J',e='m_glass',},{s='D',r='Q',e='m_glass',},{s='D',r='K',e='m_glass',},{s='D',r='A',e='m_glass',},{s='C',r='2',e='m_glass',},{s='C',r='3',e='m_glass',},{s='C',r='4',e='m_glass',},{s='C',r='5',e='m_glass',},{s='C',r='6',e='m_glass',},{s='C',r='7',e='m_glass',},{s='C',r='8',e='m_glass',},{s='C',r='9',e='m_glass',},{s='C',r='T',e='m_glass',},{s='C',r='J',e='m_glass',},{s='C',r='Q',e='m_glass',},{s='C',r='K',e='m_glass',},{s='C',r='A',e='m_glass',},{s='H',r='2',e='m_glass',},{s='H',r='3',e='m_glass',},{s='H',r='4',e='m_glass',},{s='H',r='5',e='m_glass',},{s='H',r='6',e='m_glass',},{s='H',r='7',e='m_glass',},{s='H',r='8',e='m_glass',},{s='H',r='9',e='m_glass',},{s='H',r='T',e='m_glass',},{s='H',r='J',e='m_glass',},{s='H',r='Q',e='m_glass',},{s='H',r='K',e='m_glass',},{s='H',r='A',e='m_glass',},{s='S',r='2',e='m_glass',},{s='S',r='3',e='m_glass',},{s='S',r='4',e='m_glass',},{s='S',r='5',e='m_glass',},{s='S',r='6',e='m_glass',},{s='S',r='7',e='m_glass',},{s='S',r='8',e='m_glass',},{s='S',r='9',e='m_glass',},{s='S',r='T',e='m_glass',},{s='S',r='J',e='m_glass',},{s='S',r='Q',e='m_glass',},{s='S',r='K',e='m_glass',},{s='S',r='A',e='m_glass',},}, + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'c_magician'}, + {id = 'c_empress'}, + {id = 'c_heirophant'}, + {id = 'c_chariot'}, + {id = 'c_devil'}, + {id = 'c_tower'}, + {id = 'c_lovers'}, + {id = 'c_incantation'}, + {id = 'c_grim'}, + {id = 'c_familiar'}, + {id = 'p_standard_normal_1', ids = { + 'p_standard_normal_1','p_standard_normal_2','p_standard_normal_3','p_standard_normal_4','p_standard_jumbo_1','p_standard_jumbo_2','p_standard_mega_1','p_standard_mega_2', + }}, + {id = 'j_marble'}, + {id = 'j_vampire'}, + {id = 'j_midas_mask'}, + {id = 'j_certificate'}, + {id = 'v_magic_trick'}, + {id = 'v_illusion'}, + }, + banned_tags = { + {id = 'tag_standard'}, + }, + banned_other = { + } + } + }, + { + name = "Monolith", + id = 'c_monolith_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_obelisk', eternal = true}, + {id = 'j_marble', eternal = true, edition = 'negative'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Blast Off", + id = 'c_blast_off_1', + rules = { + custom = { + }, + modifiers = { + {id = 'hands', value = 2}, + {id = 'discards', value = 2}, + {id = 'joker_slots', value = 4}, + } + }, + jokers = { + {id = 'j_constellation', eternal = true}, + {id = 'j_rocket', eternal = true}, + }, + consumeables = { + }, + vouchers = { + {id = 'v_planet_merchant'}, + {id = 'v_planet_tycoon'}, + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'v_grabber'}, + {id = 'v_nacho_tong'}, + {id = 'j_burglar'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Five-Card Draw", + id = 'c_five_card_1', + rules = { + custom = { + }, + modifiers = { + {id = 'hand_size', value = 5}, + {id = 'joker_slots', value = 7}, + {id = 'discards', value = 6}, + } + }, + jokers = { + {id = 'j_card_sharp'}, + {id = 'j_joker'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'j_juggler'}, + {id = 'j_troubadour'}, + {id = 'j_turtle_bean'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Golden Needle", + id = 'c_golden_needle_1', + rules = { + custom = { + {id = 'discard_cost', value = 1}, + }, + modifiers = { + {id = 'hands', value = 1}, + {id = 'discards', value = 6}, + {id = 'dollars', value = 10}, + } + }, + jokers = { + {id = 'j_credit_card'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'v_grabber'}, + {id = 'v_nacho_tong'}, + {id = 'j_burglar'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Cruelty", + id = 'c_cruelty_1', + rules = { + custom = { + {id = 'no_reward_specific', value = 'Small'}, + {id = 'no_reward_specific', value = 'Big'}, + }, + modifiers = { + {id = 'joker_slots', value = 3}, + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Jokerless", + id = 'c_jokerless_1', + rules = { + custom = { + {id = 'no_shop_jokers'}, + }, + modifiers = { + {id = 'joker_slots', value = 0}, + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'c_judgement'}, + {id = 'c_wraith'}, + {id = 'c_soul'}, + {id = 'v_antimatter'}, + {id = 'p_buffoon_normal_1', ids = { + 'p_buffoon_normal_1','p_buffoon_normal_2','p_buffoon_jumbo_1','p_buffoon_mega_1', + }}, + }, + banned_tags = { + {id = 'tag_rare'}, + {id = 'tag_uncommon'}, + {id = 'tag_holo'}, + {id = 'tag_polychrome'}, + {id = 'tag_negative'}, + {id = 'tag_foil'}, + {id = 'tag_buffoon'}, + {id = 'tag_top_up'}, + + }, + banned_other = { + {id = 'bl_final_acorn', type = 'blind'}, + {id = 'bl_final_heart', type = 'blind'}, + {id = 'bl_final_leaf', type = 'blind'} + } + } + }, +} diff --git a/src/conf.lua b/src/conf.lua new file mode 100644 index 0000000..82a48f1 --- /dev/null +++ b/src/conf.lua @@ -0,0 +1,11 @@ +_RELEASE_MODE = true +_DEMO = false + +function love.conf(t) + t.console = not _RELEASE_MODE + t.title = 'Balatro' + t.window.width = 0 + t.window.height = 0 + t.window.minwidth = 100 + t.window.minheight = 100 +end diff --git a/src/engine/animatedsprite.lua b/src/engine/animatedsprite.lua new file mode 100644 index 0000000..6eeb28a --- /dev/null +++ b/src/engine/animatedsprite.lua @@ -0,0 +1,107 @@ +--Class +AnimatedSprite = Sprite:extend() + +--Class Methods +function AnimatedSprite:init(X, Y, W, H, new_sprite_atlas, sprite_pos) + Sprite.init(self,X, Y, W, H, new_sprite_atlas, sprite_pos) + self.offset = {x = 0, y = 0} + + table.insert(G.ANIMATIONS, self) + if getmetatable(self) == AnimatedSprite then + table.insert(G.I.SPRITE, self) + end +end + +function AnimatedSprite:rescale() + self.scale_mag = math.min(self.scale.x/self.T.w,self.scale.y/self.T.h) +end + +function AnimatedSprite:reset() + self.atlas = G.ANIMATION_ATLAS[self.atlas.name] + self:set_sprite_pos({x = self.animation.x, y = self.animation.y}) +end + +function AnimatedSprite:set_sprite_pos(sprite_pos) + self.animation = { + x= sprite_pos and sprite_pos.x or 0, + y=sprite_pos and sprite_pos.y or 0, + frames=self.atlas.frames,current=0, + w=self.scale.x, h=self.scale.y} + + self.frame_offset = 0 + + self.current_animation = { + current = 0, + frames = self.animation.frames, + w = self.animation.w, + h = self.animation.h} + + self.image_dims = self.image_dims or {} + self.image_dims[1], self.image_dims[2] = self.atlas.image:getDimensions() + + self.sprite = love.graphics.newQuad( + 0, + self.animation.h*self.animation.y, + self.animation.w, + self.animation.h, + self.image_dims[1], self.image_dims[2]) + self.offset_seconds = G.TIMERS.REAL +end + +function AnimatedSprite:get_pos_pixel() + self.RETS.get_pos_pixel = self.RETS.get_pos_pixel or {} + self.RETS.get_pos_pixel[1] = self.current_animation.current + self.RETS.get_pos_pixel[2] = self.animation.y + self.RETS.get_pos_pixel[3] = self.animation.w + self.RETS.get_pos_pixel[4] = self.animation.h + return self.RETS.get_pos_pixel +end + +function AnimatedSprite:draw_self() + if not self.states.visible then return end + + prep_draw(self, 1) + love.graphics.scale(1/self.scale_mag) + love.graphics.setColor(G.C.WHITE) + love.graphics.draw( + self.atlas.image, + self.sprite, + 0 ,0, + 0, + self.VT.w/(self.T.w), + self.VT.h/(self.T.h) + ) + love.graphics.pop() +end + +function AnimatedSprite:animate() + local new_frame = math.floor(G.ANIMATION_FPS*(G.TIMERS.REAL - self.offset_seconds))%self.current_animation.frames + if new_frame ~= self.current_animation.current then + self.current_animation.current = new_frame + self.frame_offset = math.floor(self.animation.w*(self.current_animation.current)) + self.sprite:setViewport( + self.frame_offset, + self.animation.h*self.animation.y, + self.animation.w, + self.animation.h) + end + if self.float then + self.T.r = 0.02*math.sin(2*G.TIMERS.REAL+self.T.x) + self.offset.y = -(1+0.3*math.sin(0.666*G.TIMERS.REAL+self.T.y))*self.shadow_parrallax.y + self.offset.x = -(0.7+0.2*math.sin(0.666*G.TIMERS.REAL+self.T.x))*self.shadow_parrallax.x + end +end + +function AnimatedSprite:remove() + for _, v in pairs(G.ANIMATIONS) do + if v == self then + table.remove(G.ANIMATIONS, k) + end + end + for _, v in pairs(G.I.SPRITE) do + if v == self then + table.remove(G.I.SPRITE, k) + end + end + Sprite.remove(self) +end diff --git a/src/engine/controller.lua b/src/engine/controller.lua new file mode 100644 index 0000000..2b4cbcb --- /dev/null +++ b/src/engine/controller.lua @@ -0,0 +1,1382 @@ +---@class Controller +Controller = Object:extend() + +--The controller contains all engine logic for how human input interacts with any game objects. +function Controller:init() + +--Each of these are calculated per frame to pass along to the corresponding nodes for input handling +self.clicked = {target = nil, handled = true, prev_target = nil} --The node that was clicked this frame +self.focused = {target = nil, handled = true, prev_target = nil } --The node that is being focused on this frame, only applies when using controller +self.dragging = {target = nil, handled = true, prev_target = nil} --The node being dragged this frame +self.hovering = {target = nil, handled = true, prev_target = nil} --The node being hovered this frame +self.released_on = {target = nil, handled = true, prev_target = nil} --The node that the cursor 'Released' on, like letting go of LMB + +self.collision_list = {} --A list of all node that the cursor currently collides with + +--Input values to be determined by this controller - the actual game objects should not have to see any of this +self.cursor_down = {T = {x=0, y=0}, target = nil, time = 0, handled = true} +self.cursor_up = {T = {x=0, y=0}, target = nil, time = 0.1, handled = true} +self.cursor_hover = {T = {x=0, y=0}, target = nil, time = 0, handled = true} +self.cursor_collider = nil --The node that collides with the cursor this frame +self.cursor_position = {x=0,y=0} --NOT IN GAME UNITS + +--For key presses, hold times, and if they are released directly from LOVE +self.pressed_keys = {} +self.held_keys = {} +self.held_key_times = {} +self.released_keys = {} + +--For button presses, hold times, and if they are released directly from LOVE +self.pressed_buttons = {} +self.held_buttons = {} +self.held_button_times = {} +self.released_buttons = {} + +--For all controller interrupts +self.interrupt = { + focus = false, +} + +--For all controller locks +self.locks = {} +self.locked = nil + +--Buttons pressed and released during axis updates +self.axis_buttons = { + l_stick = {current = '', previous = ''}, + r_stick = {current = '', previous = ''}, + l_trig = {current = '', previous = ''}, + r_trig = {current = '', previous = ''} +} + +--The speed that the controller thumbstick moves the cursor +self.axis_cursor_speed = 20 + +--A registry of buttons, each a valid button input name corresponding to a node (likely a button). This is modified with the registry functions +self.button_registry = {} + +--A node representing where the cursor should 'snap' to. When this is set, then next frame should have the cursor to that position or on that node. Use :snap_to +self.snap_cursor_to = nil + +--A stack of cursor positions, this stack changes depending on the depth of menus on screen so the game can remember where you last had your cursor +--This needs to keep track of both positions and nodes if possible, as well as the depth +self.cursor_context = { + layer = 1, + stack = {} +} + +self.cardarea_context = {} + +--Human Interface device flags, these are set per frame to ensure that correct controller updates are taking place +self.HID = { + last_type = '', + dpad = false, + pointer = true, + touch = false, + controller = false, + mouse = true, + axis_cursor = false, +} + +--The gamepad most recently used, if any +self.GAMEPAD = {object = nil, mapping = nil, name = nil} +self.GAMEPAD_CONSOLE = '' --Valid button icons for Xbox, Playstation and Nintendo controllers + +--If we need an emulated gamepad for keyboard controls +self.keyboard_controller = { + getGamepadMappingString = function() return 'balatro_kbm' end, + getGamepadAxis = function() return 0 end +} + +self.is_cursor_down = false +end + +--Sets the gamepad to be the updated gamepad, searches for the console type and sets the art button pips accordingly +--Some code here is from github.com/idbrii/love-gamepadguesser (MIT License) +function Controller:set_gamepad(_gamepad) + if self.GAMEPAD.object ~= _gamepad then + self.GAMEPAD.object = _gamepad + self.GAMEPAD.mapping = _gamepad:getGamepadMappingString() or '' + self.GAMEPAD.name = self.GAMEPAD.mapping:match("^%x*,(.-),") or '' + self.GAMEPAD.temp_console = self:get_console_from_gamepad(self.GAMEPAD.name) + if self.GAMEPAD_CONSOLE ~= self.GAMEPAD.temp_console then + self.GAMEPAD_CONSOLE = self.GAMEPAD.temp_console + for k, v in pairs(G.I.SPRITE) do + if v.atlas == G.ASSET_ATLAS["gamepad_ui"] then + v.sprite_pos.y = G.CONTROLLER.GAMEPAD_CONSOLE == 'Nintendo' and 2 or G.CONTROLLER.GAMEPAD_CONSOLE == 'Playstation' and (G.F_PS4_PLAYSTATION_GLYPHS and 3 or 1) or 0 + v:set_sprite_pos(v.sprite_pos) + end + end + end + self.GAMEPAD.temp_console = nil + end +end + +--Some code here is from github.com/idbrii/love-gamepadguesser (MIT License) +function Controller:get_console_from_gamepad(_gamepad) + G.ARGS.gamepad_patterns = G.ARGS.gamepad_patterns or + { + Playstation = {"%f[%w]PS%d%f[%D]", "Sony%f[%W]", "Play[Ss]tation"}, + Nintendo = {"Wii%f[%L]", "%f[%u]S?NES%f[%U]", "%f[%l]s?nes%f[%L]", "%f[%u]Switch%f[%L]", "Joy[- ]Cons?%f[%L]",}, + --Keyboard = {'balatro_kbm'} + } + + for k, v in pairs(G.ARGS.gamepad_patterns) do + for kk, vv in ipairs(v) do + if _gamepad:match(vv) then + return k + end + end + end + return 'Xbox' +end + +--The universal controller for what type of HID Device the player is using to interact with the game. The Game should be able to handle switching +--to any viable HID at any time +function Controller:set_HID_flags(HID_type, button) + --we need to determine it the axis input will be handled like a button or pointer + --if button and self.HID.controller and not string.find(button, 'dp') then return end + if HID_type == 'axis' then + self.HID.controller = true + self.HID.last_type = 'axis' + elseif HID_type and HID_type ~= self.HID.last_type then + self.HID.dpad = HID_type == 'button' + self.HID.pointer = HID_type == 'mouse' or HID_type == 'axis_cursor' or HID_type == 'touch' + self.HID.controller = HID_type == 'button' or HID_type == 'axis_cursor' + self.HID.mouse = HID_type == 'mouse' + self.HID.touch = HID_type == 'touch' + self.HID.axis_cursor = HID_type == 'axis_cursor' + self.HID.last_type = HID_type + + if self.HID.mouse then + love.mouse.setVisible(true) + else + love.mouse.setVisible(false) + end + end + if not self.HID.controller then + self.GAMEPAD_CONSOLE = '' + self.GAMEPAD.object = nil + self.GAMEPAD.mapping = nil + self.GAMEPAD.name = nil + end +end + +--Sets the current position of the cursor +function Controller:set_cursor_position() + --If using a mouse for the cursor + if self.HID.mouse or self.HID.touch then + self.interrupt.focus = false + --Never focus if using the mouse + if self.focused.target then + self.focused.target.states.focus.is = false + self.focused.target= nil + end + + --Set the position of the cursor to the love position of the mouse, derive cursor transform from that + self.cursor_position.x, self.cursor_position.y = love.mouse.getPosition() + G.CURSOR.T.x = self.cursor_position.x/(G.TILESCALE*G.TILESIZE) + G.CURSOR.T.y = self.cursor_position.y/(G.TILESCALE*G.TILESIZE) + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + end +end + +--Called every game logic update frame +function Controller:update(dt) + + --parse all locks and set + self.locked = false + if G.screenwipe then self.locks.wipe = true else self.locks.wipe = false end + + for k, v in pairs(self.locks) do + if v then self.locked = true end + end + + if self.locks.frame_set then + self.locks.frame_set = nil + self.overlay_timer = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + timer = 'UPTIME', + blocking = false, + blockable = false, + no_delete = true, + func = (function() + self.locks.frame = nil + return true + end) + })) + end + + self.overlay_timer = self.overlay_timer or 0 + if G.OVERLAY_MENU then + self.overlay_timer = self.overlay_timer + dt + else + self.overlay_timer = 0 + end + + if self.overlay_timer > 1.5 then self.locks.frame = nil end + + --Remove anything from the registry that is no longer in game + self:cull_registry() + + --Calculate the axis update and set the HID flags if there is any axis input + self:set_HID_flags(self:update_axis(dt)) + + --Set the cursor to be visible only if we are using a mouse or an axis to control the cursor position + if self.HID.pointer and not (self.HID.mouse or self.HID.touch) and not self.interrupt.focus then + G.CURSOR.states.visible = true + else + G.CURSOR.states.visible = false + end + + --For mouse input, reset any controller things and set the cursor to be where the mouse is + self:set_cursor_position() + + --Handle all the button updates and key updates, call the required functions + if not G.screenwipe then + --Key press and release handling + for k, v in pairs(self.pressed_keys) do + if v then self:key_press_update(k, dt) end + end + for k, v in pairs(self.held_keys) do + if v then self:key_hold_update(k, dt) end + end + for k, v in pairs(self.released_keys) do + if v then self:key_release_update(k, dt) end + end + + --Button press and release handling + for k, v in pairs(self.pressed_buttons) do + if v then self:button_press_update(k, dt) end + end + for k, v in pairs(self.held_buttons) do + if v then self:button_hold_update(k, dt) end + end + for k, v in pairs(self.released_buttons) do + if v then self:button_release_update(k, dt) end + end + end + + self.frame_buttonpress = false + + --reset press and release lists + self.pressed_keys = EMPTY(self.pressed_keys) + self.released_keys = EMPTY(self.released_keys) + self.pressed_buttons= EMPTY(self.pressed_buttons) + self.released_buttons = EMPTY(self.released_buttons) + + + --If using controller, update context and snap tos + if self.HID.controller then + --If there is a node/position to snap to from the cursor context layer + if self.cursor_context.stack[self.cursor_context.layer] then + local _context = self.cursor_context.stack[self.cursor_context.layer] + self:snap_to{node = (_context.node and not _context.node.REMOVED and _context.node), T = _context.cursor_pos} + self.interrupt.stack = _context.interrupt + self.cursor_context.stack[self.cursor_context.layer] = nil + end + --If there is a card the was being dragged but no longer is, snap to it + if self.dragging.prev_target and not self.dragging.target and getmetatable(self.dragging.prev_target) == Card and not self.dragging.prev_target.REMOVED then + --Overly complicated coyote time focus, so the user can quickly select cards without things going wonky + if not self.COYOTE_FOCUS then + self:snap_to{node = self.dragging.prev_target} + else + self.COYOTE_FOCUS = nil + end + end + --If the cursor should snap to a location + if self.snap_cursor_to then + self.interrupt.focus = self.interrupt.stack + self.interrupt.stack = false + if self.snap_cursor_to.type == 'node' and not self.snap_cursor_to.node.REMOVED then + self.focused.prev_target = self.focused.target + self.focused.target = self.snap_cursor_to.node + self:update_cursor() + elseif self.snap_cursor_to.type == 'transform' then + self:update_cursor(self.snap_cursor_to.T) + end + if self.focused.prev_target ~= self.focused.target and self.focused.prev_target then self.focused.prev_target.states.focus.is = false end + self.snap_cursor_to = nil + end + end + + --Reset all collision states, get every node that collides with the cursor, then update the focus and hover targets + self:get_cursor_collision(G.CURSOR.T) + self:update_focus() + self:set_cursor_hover() + if self.L_cursor_queue then + self:L_cursor_press(self.L_cursor_queue.x, self.L_cursor_queue.y) + self.L_cursor_queue = nil + end + + self.dragging.prev_target = self.dragging.target + self.released_on.prev_target = self.released_on.target + self.clicked.prev_target = self.clicked.target + self.hovering.prev_target = self.hovering.target + + --Cursor is currently down + if not self.cursor_down.handled then + if self.cursor_down.target.states.drag.can then + self.cursor_down.target.states.drag.is = true + self.cursor_down.target:set_offset(self.cursor_down.T, 'Click') + self.dragging.target = self.cursor_down.target + self.dragging.handled = false + end + self.cursor_down.handled = true + end + + if not self.cursor_up.handled then + --First, stop dragging + if self.dragging.target then + self.dragging.target:stop_drag() + self.dragging.target.states.drag.is = false + self.dragging.target = nil + end + --Now, handle the Cursor release + --Was the Cursor release in the same location as the Cursor press and within Cursor timeout? + if self.cursor_down.target then + if (not self.cursor_down.target.click_timeout or self.cursor_down.target.click_timeout*G.SPEEDFACTOR > self.cursor_up.time - self.cursor_down.time) then + if Vector_Dist(self.cursor_down.T, self.cursor_up.T) < G.MIN_CLICK_DIST then + if self.cursor_down.target.states.click.can then + self.clicked.target = self.cursor_down.target + self.clicked.handled = false + end + --if not, was the Cursor dragging some other thing? + elseif self.dragging.prev_target and self.cursor_up.target and self.cursor_up.target.states.release_on.can then + self.released_on.target = self.cursor_up.target + self.released_on.handled = false + end + end + end + self.cursor_up.handled = true + end + + --Cursor is currently hovering over something + if self.cursor_hover.target and self.cursor_hover.target.states.hover.can and (not self.HID.touch or self.is_cursor_down) then + self.hovering.target = self.cursor_hover.target + if self.hovering.prev_target and self.hovering.prev_target ~= self.hovering.target then self.hovering.prev_target.states.hover.is = false end + self.hovering.target.states.hover.is = true + self.hovering.target:set_offset(self.cursor_hover.T, 'Hover') + elseif (self.cursor_hover.target == nil or (self.HID.touch and not self.is_cursor_down)) and self.hovering.target then + self.hovering.target.states.hover.is = false + self.hovering.target = nil + end + + -------------------------------------------------------------------- + -- Sending all input updates to the game objects + -------------------------------------------------------------------- + --The clicked object + if not self.clicked.handled then + self.clicked.target:click() + self.clicked.handled = true + end + + --Process registry clicks + self:process_registry() + + --The object being dragged + if self.dragging.target then + self.dragging.target:drag() + end + + --The object released on + if not self.released_on.handled and self.dragging.prev_target then + if self.dragging.prev_target == self.hovering.target then self.hovering.target:stop_hover();self.hovering.target = nil end + self.released_on.target:release(self.dragging.prev_target) + self.released_on.handled = true + end + + --The object being hovered over + if self.hovering.target then + self.hovering.target:set_offset(self.cursor_hover.T, 'Hover') + if self.hovering.prev_target ~= self.hovering.target then + if self.hovering.target ~= self.dragging.target and not self.HID.touch then + self.hovering.target:hover() + elseif self.HID.touch then + local _ID = self.hovering.target.ID + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + blocking = false, + delay = G.MIN_HOVER_TIME, + func = function() + if self.hovering.target and _ID == self.hovering.target.ID then + self.hovering.target:hover() + end + return true + end + })) + if self.hovering.prev_target then + self.hovering.prev_target:stop_hover() + end + end + if self.hovering.prev_target then + self.hovering.prev_target:stop_hover() + end + end + elseif self.hovering.prev_target then + self.hovering.prev_target:stop_hover() + end + if self.hovering.target and self.hovering.target == self.dragging.target and not self.HID.touch then + self.hovering.target:stop_hover() + end +end + +--Brute force remove all registries that no longer have valid nodes +function Controller:cull_registry() + for k, registry in pairs(self.button_registry) do + for i=#registry, 1, -1 do + if registry[i].node.REMOVED then + table.remove(registry, i) + end + end + end +end + +--Adds a node to the controller registry. Supply the button that will be pressed in order to click this node +-- +---@param node Node The node that will be clicked when the registry is pressed +---@param registry string The button to register, must be a valid gamepad input +function Controller:add_to_registry(node, registry) + --If the button doesn't have a registry list yet, add it + self.button_registry[registry] = self.button_registry[registry] or {} + + --There really should only ever be one entry per registered button, but that is hard sometimes with all the stuff on screen. + --If that does happen, the most recently registered one will be used and the old one will be kept in case we remove the new button and want to keep the old binding + table.insert(self.button_registry[registry], 1, {node = node, menu = (not not G.OVERLAY_MENU) or (not not G.SETTINGS.paused)}) +end + +--Process any click function of any nodes that have been clicked in the button registry +function Controller:process_registry() + for _, registry in pairs(self.button_registry) do + for i=1, #registry do + if registry[i].click and registry[i].node.click then + if registry[i].menu == not not G.OVERLAY_MENU and + registry[i].node.T.x > -2 and registry[i].node.T.x < G.ROOM.T.w + 2 and + registry[i].node.T.y > -2 and registry[i].node.T.y < G.ROOM.T.h + 2 then + registry[i].node:click() + end + registry[i].click = nil + end + end + end +end + +--Add or remove layers from the context for the cursor. This allows the cursor to 'snap' back to the previous layer when the current layer is removed\ +--in such cases where a menu on screen is removed or nested menus are being navigated +-- +---@param delta number The direction to modify the cursor context, 1 to add a layer, -1 to remove a layer, -1000 to remove all layers except for the base +function Controller:mod_cursor_context_layer(delta) + --Add a layer to the context, reference the node but if that node has been removed also save the cursor position too + if delta == 1 then + local prev_cursor_context = {node = self.focused.target, cursor_pos = {x = G.CURSOR.T.x, y = G.CURSOR.T.y}, interrupt = self.interrupt.focus} + self.cursor_context.stack[self.cursor_context.layer] = prev_cursor_context + self.cursor_context.layer = self.cursor_context.layer + 1 + + --remove the top layer from the stack + elseif delta == -1 then + self.cursor_context.stack[self.cursor_context.layer] = nil + self.cursor_context.layer = self.cursor_context.layer - 1 + + --remove all but the base layer from the stack + elseif delta == -1000 then + self.cursor_context.layer = 1 + self.cursor_context.stack = {self.cursor_context.stack[1]} + + --remove all layers + elseif delta == -2000 then + self.cursor_context.layer = 1 + self.cursor_context.stack = {} + end + + --Navigate focus, will default to the top layer on the stack + self:navigate_focus() +end + +--Snap the cursor to a particular node or transform +function Controller:snap_to(args) + self.snap_cursor_to = {node = args.node, T = args.T, type = args.node and 'node' or 'transform'} +end + +--saves the focus context to be loaded in the future, for example if the shop is rerolled while a card is highlighted +function Controller:save_cardarea_focus(_cardarea) + if G[_cardarea] then + if self.focused.target and self.focused.target.area and self.focused.target.area == G[_cardarea] then + self.cardarea_context[_cardarea] = self.focused.target.rank + return true + else + self.cardarea_context[_cardarea] = nil + end + end +end + +--recalls the focus context for a particular cardarea +function Controller:recall_cardarea_focus(_cardarea) + local ca_string = nil + if type(_cardarea) == 'string' then ca_string = _cardarea; _cardarea = G[_cardarea] end + + if _cardarea and (not self.focused.target or + self.interrupt.focus or + (not self.interrupt.focus and self.focused.target.area and self.focused.target.area == _cardarea)) then + if ca_string and self.cardarea_context[ca_string] then + for i = self.cardarea_context[ca_string], 1, -1 do + if _cardarea.cards[i] then + self:snap_to({node = _cardarea.cards[i]}) + self.interrupt.focus = false + break + end + end + elseif _cardarea.cards and _cardarea.cards[1] then + self:snap_to({node = _cardarea.cards[1]}) + self.interrupt.focus = false + end + end + if ca_string then self.cardarea_context[ca_string] = nil end +end + +--Updated the location of the cursor, either with a specific T or if there is a Node target +function Controller:update_cursor(hard_set_T) + if hard_set_T then + G.CURSOR.T.x = hard_set_T.x + G.CURSOR.T.y = hard_set_T.y + self.cursor_position.x = G.CURSOR.T.x*(G.TILESCALE*G.TILESIZE) + self.cursor_position.y = G.CURSOR.T.y*(G.TILESCALE*G.TILESIZE) + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + return + end + if self.focused.target then + self.cursor_position.x, self.cursor_position.y = self.focused.target:put_focused_cursor() + G.CURSOR.T.x = self.cursor_position.x/(G.TILESCALE*G.TILESIZE) + G.CURSOR.T.y = self.cursor_position.y/(G.TILESCALE*G.TILESIZE) + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + end +end + +--Helper function to set the button presses/releases for the values determined in update_axis() +function Controller:handle_axis_buttons() + for _, v in pairs(G.CONTROLLER.axis_buttons) do + --Button is no longer being pressed + if v.previous ~= '' and (v.current == '' or v.previous ~= v.current) then + G.CONTROLLER:button_release(v.previous) + end + --New button is being pressed + if v.current ~= '' and v.previous ~= v.current then + G.CONTROLLER:button_press(v.current) + end + end +end + +--Handles all axis input for left stick, right stick and triggers. Treats them as buttons or cursors depending on context +function Controller:update_axis(dt) + --Keep track of if there is any cursor movement from the axis changes + local axis_interpretation = nil + + --Advance all the axis buttons to determine if there were any changes + self.axis_buttons.l_stick.previous = self.axis_buttons.l_stick.current; self.axis_buttons.l_stick.current = '' + self.axis_buttons.r_stick.previous = self.axis_buttons.r_stick.current; self.axis_buttons.r_stick.current = '' + self.axis_buttons.l_trig.previous = self.axis_buttons.l_trig.current; self.axis_buttons.l_trig.current = '' + self.axis_buttons.r_trig.previous = self.axis_buttons.r_trig.current; self.axis_buttons.r_trig.current = '' + + if self.HID.controller then + --------------------------------------------------------------- + -- Left Thumbstick + --------------------------------------------------------------- + local l_stick_x = self.GAMEPAD.object:getGamepadAxis('leftx') + local l_stick_y = self.GAMEPAD.object:getGamepadAxis('lefty') + --If there is something being dragged, we want to treat the left stick as a cursor input + if self.dragging.target and math.abs(l_stick_x) + math.abs(l_stick_y) > 0.1 then + axis_interpretation = 'axis_cursor' --There is some cursor movement + + --deadzone of 10% for each axis of l_stick + if math.abs(l_stick_x) < 0.1 then l_stick_x = 0 end + if math.abs(l_stick_y) < 0.1 then l_stick_y = 0 end + l_stick_x = l_stick_x + (l_stick_x>0 and -0.1 or 0) + (l_stick_x<0 and 0.1 or 0) + l_stick_y = l_stick_y + (l_stick_y>0 and -0.1 or 0) + (l_stick_y<0 and 0.1 or 0) + + --Modify the cursor position according to the l_stick axis values + G.CURSOR.T.x = G.CURSOR.T.x + dt*l_stick_x*self.axis_cursor_speed + G.CURSOR.T.y = G.CURSOR.T.y + dt*l_stick_y*self.axis_cursor_speed + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + + self.cursor_position.x = G.CURSOR.T.x*(G.TILESCALE*G.TILESIZE) + self.cursor_position.y = G.CURSOR.T.y*(G.TILESCALE*G.TILESIZE) + + --If nothing is being dragged, we want to treat the left stick as a dpad input + else + self.axis_buttons.l_stick.current = self.axis_buttons.l_stick.previous + if math.abs(l_stick_x) + math.abs(l_stick_y) > 0.5 then + axis_interpretation = 'button' --left stick is no longer a cursor, can be set below from the right stick though + + self.axis_buttons.l_stick.current = math.abs(l_stick_x) > math.abs(l_stick_y) and + (l_stick_x > 0 and 'dpright' or 'dpleft') or + (l_stick_y > 0 and 'dpdown' or 'dpup') + elseif math.abs(l_stick_x) + math.abs(l_stick_y) < 0.3 then + self.axis_buttons.l_stick.current = '' + end + end + + --------------------------------------------------------------- + -- Right Thumbstick + --------------------------------------------------------------- + local r_stick_x = self.GAMEPAD.object:getGamepadAxis('rightx') + local r_stick_y = self.GAMEPAD.object:getGamepadAxis('righty') + G.DEADZONE = 0.2 + local mag = math.sqrt(math.abs(r_stick_x)^2 + math.abs(r_stick_y)^2) + if mag > G.DEADZONE then + axis_interpretation = 'axis_cursor' --There is some cursor movement + + --deadzone of 20% for each axis of l_stick + if math.abs(r_stick_x) < G.DEADZONE then r_stick_x = 0 end + if math.abs(r_stick_y) < G.DEADZONE then r_stick_y = 0 end + r_stick_x = r_stick_x + (r_stick_x>0 and -G.DEADZONE or 0) + (r_stick_x<0 and G.DEADZONE or 0) + r_stick_y = r_stick_y + (r_stick_y>0 and -G.DEADZONE or 0) + (r_stick_y<0 and G.DEADZONE or 0) + + --Modify the cursor position according to the l_stick axis values + G.CURSOR.T.x = G.CURSOR.T.x + dt*r_stick_x*self.axis_cursor_speed + G.CURSOR.T.y = G.CURSOR.T.y + dt*r_stick_y*self.axis_cursor_speed + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + + self.cursor_position.x = G.CURSOR.T.x*(G.TILESCALE*G.TILESIZE) + self.cursor_position.y = G.CURSOR.T.y*(G.TILESCALE*G.TILESIZE) + end + + --------------------------------------------------------------- + -- Triggers + --------------------------------------------------------------- + --Triggers are just buttons + local l_trig = self.GAMEPAD.object:getGamepadAxis('triggerleft') + local r_trig = self.GAMEPAD.object:getGamepadAxis('triggerright') + + --Set the current to be the same as previous, only set to '' if the trigger value is low enough + self.axis_buttons.l_trig.current = self.axis_buttons.l_trig.previous + self.axis_buttons.r_trig.current = self.axis_buttons.r_trig.previous + + --Make a tilting effect when you press the triggers while hovering over a node that has tilt_var + if self.focused.target and self.focused.target.tilt_var then + --self.focused.target.tilt_var.dx = 0.1*(r_trig - l_trig) + 0.9*self.focused.target.tilt_var.dx + end + + if l_trig > 0.5 then + self.axis_buttons.l_trig.current = 'triggerleft' + elseif l_trig < 0.3 then + self.axis_buttons.l_trig.current = '' + end + if r_trig > 0.5 then + self.axis_buttons.r_trig.current = 'triggerright' + elseif r_trig < 0.3 then + self.axis_buttons.r_trig.current = '' + end + + --return 'button' if trigger is being used and axis is not + if self.axis_buttons.r_trig.current ~= '' or self.axis_buttons.l_trig.current ~= '' then + axis_interpretation = axis_interpretation or 'button' + end + + self:handle_axis_buttons() + end + + if axis_interpretation then self.interrupt.focus = false end + + return axis_interpretation +end + +function Controller:button_press_update(button, dt) + if self.locks.frame then return end + self.held_button_times[button] = 0 + self.interrupt.focus = false + + if not self:capture_focused_input(button, 'press', dt) then + if button == "dpup" then + self:navigate_focus('U') + end + if button == "dpdown" then + self:navigate_focus('D') + end + if button == "dpleft" then + self:navigate_focus('L') + end + if button == "dpright" then + self:navigate_focus('R') + end + end + + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + self.frame_buttonpress = true + + if self.button_registry[button] and self.button_registry[button][1] and not self.button_registry[button][1].node.under_overlay then + self.button_registry[button][1].click = true + else + if button == 'start' then + if G.STATE == G.STATES.SPLASH then + G:delete_run() + G:main_menu() + end + end + if button == "a" then + if self.focused.target and + self.focused.target.config.focus_args and + self.focused.target.config.focus_args.type == 'slider' and + (not G.CONTROLLER.HID.mouse and not G.CONTROLLER.HID.axis_cursor) then + else + self:L_cursor_press() + end + end + if button == 'b' then + if G.hand and self.focused.target and + self.focused.target.area == G.hand then + self:queue_R_cursor_press() + else + self.interrupt.focus = true + end + end + end +end + +function Controller:button_hold_update(button, dt) + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + self.frame_buttonpress = true + if self.held_button_times[button] then + self.held_button_times[button] = self.held_button_times[button] + dt + self:capture_focused_input(button, 'hold', dt) + end + if (button == 'dpleft' or button == 'dpright' or button == 'dpup' or button == 'dpdown') and not self.no_holdcap then + self.repress_timer = self.repress_timer or 0.3 + if self.held_button_times[button] and (self.held_button_times[button] > self.repress_timer) then + self.repress_timer = 0.1 + self.held_button_times[button] = 0 + self:button_press_update(button, dt) + end + end +end + +function Controller:button_release_update(button, dt) + if not self.held_button_times[button] then return end + self.repress_timer = 0.3 + self.held_button_times[button] = nil + if button == 'a' then + self:L_cursor_release() + end +end + +function Controller:key_press_update(key, dt) + if self.locks.frame then return end + if string.sub(key, 1, 2) == 'kp' then key = string.sub(key, 3) end + if key == 'enter' then key = 'return' end + + if self.text_input_hook then + if key == "escape" then + self.text_input_hook = nil + elseif key == "capslock" then + self.capslock = not self.capslock + else + G.FUNCS.text_input_key{ + e=self.text_input_hook, + key = key, + caps = self.held_keys["lshift"] or self.held_keys["rshift"] + } + end + return + end + + if key == "escape" then + if G.STATE == G.STATES.SPLASH then + G:delete_run() + G:main_menu() + else + if not G.OVERLAY_MENU then + G.FUNCS:options() + elseif not G.OVERLAY_MENU.config.no_esc then + G.FUNCS:exit_overlay_menu() + end + end + end + + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + self.frame_buttonpress = true + self.held_key_times[key] = 0 + + + if not _RELEASE_MODE then + if key == 'tab' and not G.debug_tools then + G.debug_tools = UIBox{ + definition = create_UIBox_debug_tools(), + config = {align='cr', offset = {x=G.ROOM.T.x + 11,y=0},major = G.ROOM_ATTACH, bond = 'Weak'} + } + G.E_MANAGER:add_event(Event({ + blockable = false, + func = function() + G.debug_tools.alignment.offset.x = -4 + return true + end + })) + end + if self.hovering.target and self.hovering.target:is(Card) then + local _card = self.hovering.target + if G.OVERLAY_MENU then + if key == "1" then + unlock_card(_card.config.center) + _card:set_sprites(_card.config.center) + end + if key == "2" then + unlock_card(_card.config.center) + discover_card(_card.config.center) + _card:set_sprites(_card.config.center) + end + if key == "3" then + if _card.ability.set == 'Joker' and G.jokers and #G.jokers.cards < G.jokers.config.card_limit then + add_joker(_card.config.center.key) + _card:set_sprites(_card.config.center) + end + if _card.ability.consumeable and G.consumeables and #G.consumeables.cards < G.consumeables.config.card_limit then + add_joker(_card.config.center.key) + _card:set_sprites(_card.config.center) + end + end + end + if key == 'q' then + if (_card.ability.set == 'Joker' or _card.playing_card or _card.area) then + local _edition = { + foil = not _card.edition, + holo = _card.edition and _card.edition.foil, + polychrome = _card.edition and _card.edition.holo, + negative = _card.edition and _card.edition.polychrome, + } + _card:set_edition(_edition, true, true) + end + end + end + if key == 'h' then + G.debug_UI_toggle = not G.debug_UI_toggle + end + if key == 'b' then + G:delete_run() + G:start_run({}) + end + if key == 'l' then + G:delete_run() + G.SAVED_GAME = get_compressed(G.SETTINGS.profile..'/'..'save.jkr') + if G.SAVED_GAME ~= nil then G.SAVED_GAME = STR_UNPACK(G.SAVED_GAME) end + G:start_run({savetext = G.SAVED_GAME}) + end + if key == 'j' then + G.debug_splash_size_toggle = not G.debug_splash_size_toggle + G:delete_run() + G:main_menu('splash') + end + if key == '8' then + love.mouse.setVisible( not love.mouse.isVisible() ) + end + if key == '9' then + G.debug_tooltip_toggle = not G.debug_tooltip_toggle + end + if key == "space" then + live_test() + end + if key == 'v' then + if not G.prof then G.prof = require "engine/profile"; G.prof.start() + else G.prof:stop(); + print(G.prof.report()); G.prof = nil end + end + if key == "p" then + G.SETTINGS.perf_mode = not G.SETTINGS.perf_mode + end + end +end + +function Controller:key_hold_update(key, dt) + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + --self.frame_buttonpress = true + if self.held_key_times[key] then + if key == "r" and not G.SETTINGS.paused then + if self.held_key_times[key] > 0.7 then + if not G.GAME.won and not G.GAME.seeded and not G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt = 0 + end + G:save_settings() + self.held_key_times[key] = nil + G.SETTINGS.current_setup = 'New Run' + G.GAME.viewed_back = nil + G.run_setup_seed = G.GAME.seeded + G.challenge_tab = G.GAME and G.GAME.challenge and G.GAME.challenge_tab or nil + G.forced_seed, G.setup_seed = nil, nil + if G.GAME.seeded then G.forced_seed = G.GAME.pseudorandom.seed end + G.forced_stake = G.GAME.stake + if G.STAGE == G.STAGES.RUN then G.FUNCS.start_setup_run() end + G.forced_stake = nil + G.challenge_tab = nil + G.forced_seed = nil + else + self.held_key_times[key] = self.held_key_times[key] + dt + end + end + end +end + +function Controller:key_release_update(key, dt) + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + self.frame_buttonpress = true + if key == "a" and self.held_keys["g"] and not _RELEASE_MODE then + G.DEBUG = not(G.DEBUG) + end + if key == 'tab' and G.debug_tools then + G.debug_tools:remove() + G.debug_tools = nil + end +end + +function Controller:key_press(key) + self.pressed_keys[key] = true + self.held_keys[key] = true +end + +function Controller:key_release(key) + self.held_keys[key] = nil + self.released_keys[key] = true +end + +function Controller:button_press(button) + self.pressed_buttons[button] = true + self.held_buttons[button] = true +end + +function Controller:button_release(button) + self.held_buttons[button] = nil + self.released_buttons[button] = true +end + +function Controller:get_cursor_collision(cursor_trans) + self.collision_list = EMPTY(self.collision_list) + self.nodes_at_cursor = EMPTY(self.nodes_at_cursor) + + if self.COYOTE_FOCUS then return end + if self.dragging.target then + self.dragging.target.states.collide.is = true + self.nodes_at_cursor[#self.nodes_at_cursor+1] = self.dragging.target + self.collision_list[#self.collision_list+1] = self.dragging.target + end + + if not G.DRAW_HASH[1] or + cursor_trans.x-G.ROOM.T.x < -G.DRAW_HASH_BUFF or cursor_trans.x-G.ROOM.T.x > G.TILE_W + G.DRAW_HASH_BUFF or + cursor_trans.y-G.ROOM.T.y < -G.DRAW_HASH_BUFF or cursor_trans.y-G.ROOM.T.y > G.TILE_H + G.DRAW_HASH_BUFF then + return + end + + local DRAW_HASH_SQUARE = G.DRAW_HASH + for i = #DRAW_HASH_SQUARE, 1, -1 do + local v = DRAW_HASH_SQUARE[i] + if v:collides_with_point(cursor_trans) and not v.REMOVED then + self.nodes_at_cursor[#self.nodes_at_cursor+1] = v + if v.states.collide.can then + v.states.collide.is = true + self.collision_list[#self.collision_list+1] = v + end + end + end +end + +function Controller:set_cursor_hover() + self.cursor_hover.T = self.cursor_hover.T or {} + self.cursor_hover.T.x, self.cursor_hover.T.y =G.CURSOR.T.x, G.CURSOR.T.y + self.cursor_hover.time = G.TIMERS.TOTAL + + self.cursor_hover.prev_target = self.cursor_hover.target + self.cursor_hover.target = nil + + if self.interrupt.focus or ((self.locked) and (not G.SETTINGS.paused or G.screenwipe)) or self.locks.frame or self.COYOTE_FOCUS then self.cursor_hover.target = G.ROOM; return end + + if self.HID.controller and self.focused.target and self.focused.target.states.hover.can then + if (self.HID.dpad or self.HID.axis_cursor) and self.focused.target.states.collide.is then + self.cursor_hover.target = self.focused.target + else + for _, v in ipairs(self.collision_list) do + if v.states.hover.can then + self.cursor_hover.target = v + break + end + end + end + else + for _, v in ipairs(self.collision_list) do + if v.states.hover.can and (not v.states.drag.is or self.HID.touch) then + self.cursor_hover.target = v + break + end + end + end + + if not self.cursor_hover.target or (self.dragging.target and not self.HID.touch) then self.cursor_hover.target = G.ROOM end + if self.cursor_hover.target ~= self.cursor_hover.prev_target then self.cursor_hover.handled = false end +end + +function Controller:queue_L_cursor_press(x, y) + if self.locks.frame then return end + if G.STATE == G.STATES.SPLASH then + self:key_press('escape') + end + self.L_cursor_queue = {x = x, y = y} +end + +function Controller:queue_R_cursor_press(x, y) + if self.locks.frame then return end + if not G.SETTINGS.paused and G.hand and G.hand.highlighted[1] then + if (G.play and #G.play.cards > 0) or + (self.locked) or + (self.locks.frame) or + (G.GAME.STOP_USE and G.GAME.STOP_USE > 0) then return end + G.hand:unhighlight_all() + end +end + +function Controller:L_cursor_press(x, y) + x = x or self.cursor_position.x + y = y or self.cursor_position.y + + if ((self.locked) and (not G.SETTINGS.paused or G.screenwipe)) or (self.locks.frame) then return end + + self.cursor_down.T = {x = x/(G.TILESCALE*G.TILESIZE), y = y/(G.TILESCALE*G.TILESIZE)} + self.cursor_down.time = G.TIMERS.TOTAL + self.cursor_down.handled = false + self.cursor_down.target = nil + self.is_cursor_down = true + + local press_node = (self.HID.touch and self.cursor_hover.target) or self.hovering.target or self.focused.target + + if press_node then + self.cursor_down.target = press_node.states.click.can and press_node or press_node:can_drag() or nil + end + + if self.cursor_down.target == nil then + self.cursor_down.target = G.ROOM + end +end + +function Controller:L_cursor_release(x, y) + x = x or self.cursor_position.x + y = y or self.cursor_position.y + + if ((self.locked) and (not G.SETTINGS.paused or G.screenwipe)) or (self.locks.frame) then return end + + self.cursor_up.T = {x = x/(G.TILESCALE*G.TILESIZE), y = y/(G.TILESCALE*G.TILESIZE)} + self.cursor_up.time = G.TIMERS.TOTAL + self.cursor_up.handled = false + self.cursor_up.target = nil + self.is_cursor_down = false + + self.cursor_up.target = self.hovering.target or self.focused.target + + if self.cursor_up.target == nil then + self.cursor_up.target = G.ROOM + end +end + +function Controller:is_node_focusable(node) + local ret_val = false + if node.T.y > G.ROOM.T.h + 3 then return false end + if not node.REMOVED and not node.under_overlay and (node.states.hover.can and not self.dragging.target or self.dragging.target == node) and + (not not node.created_on_pause) == (not not G.SETTINGS.paused) and + (node.states.visible) and (not node.UIBox or node.UIBox.states.visible) then + if self.screen_keyboard then + if node.UIBox and node.UIBox == self.screen_keyboard and node.config.button then + ret_val = true + end + else + if node:is(Card) and (node.facing == 'front' or node.area == G.hand or node.area == G.jokers or (node == G.deck)) and + node.states.hover.can and not node.jimbo then + ret_val = true + end + if node.config and node.config.force_focus then ret_val = true end + if node.config and node.config.button then ret_val = true end + if node.config and node.config.focus_args then + if node.config.focus_args.type == 'none' or node.config.focus_args.funnel_from then + ret_val = false + else + ret_val = true + end + end + end + end + return ret_val +end + +--essentially works like 'hovering' with any nodes that are focusable, but +--the nodes can also be navigated to via controller key inputs. If no direction is supplied, +--this function focuses on any nodes that collide with this cursor. If a direction is +--supplied, focuses on the nearest node in that direction. +function Controller:update_focus(dir) + self.focused.prev_target = self.focused.target + + --Only needed when using a controller, hovering covers all KBM scenarios + if not self.HID.controller or self.interrupt.focus or (self.locked) and (not G.SETTINGS.paused or G.screenwipe) then + if self.focused.target then self.focused.target.states.focus.is = false end + self.focused.target = nil + return + end + + G.ARGS.focus_list = EMPTY(G.ARGS.focus_list) + G.ARGS.focusables = EMPTY(G.ARGS.focusables) + + ------------------------------------------------- + -- Find the focusable starting point + ------------------------------------------------- + --First, is there currently a focusable target that is still valid? + if self.focused.target then + self.focused.target.states.focus.is = false + + --If that node is no longer focusable or if the cursor no longer collides with the node, remove the target + if not self:is_node_focusable(self.focused.target) or not self.focused.target:collides_with_point(G.CURSOR.T) or self.HID.axis_cursor then + self.focused.target = nil + end + end + + --Now we check for 3 criteria: + --1: is there a current focused target and no dpad direction? if so, we simply add the currsnt focused target to the focusable list and set the state to true + --2: if not, and there is no dpad direction, iterate through the node list that the cursor intersects and check if any are focusable, only add the first one + --3: if there is a direction, add all focusable moveables to the focusable list to check later + if not dir and self.focused.target then + self.focused.target.states.focus.can = true + G.ARGS.focusables[#G.ARGS.focusables+1] = self.focused.target + else + if not dir then + for k, v in ipairs(self.nodes_at_cursor) do + v.states.focus.can = false + v.states.focus.is = false + if #G.ARGS.focusables == 0 and self:is_node_focusable(v) then + v.states.focus.can = true + G.ARGS.focusables[#G.ARGS.focusables+1] = v + end + end + else + for k, v in pairs(G.MOVEABLES) do + v.states.focus.can = false + v.states.focus.is = false + if self:is_node_focusable(v) then + v.states.focus.can = true + G.ARGS.focusables[#G.ARGS.focusables+1] = v + end + end + end + end + + --If there are any valid focusables + if #G.ARGS.focusables > 0 then + --If a direction control is supplied, set the target to be the closest node in that direction + if dir then + if (dir == 'L' or dir == 'R') and self.focused.target and self.focused.target:is(Card) and self.focused.target.area == G.hand and G.hand then + local nu_rank = self.focused.target.rank + (dir == 'L' and -1 or 1) + if nu_rank > #G.hand.cards then nu_rank = 1 end + if nu_rank == 0 then nu_rank = #G.hand.cards end + if nu_rank ~= self.focused.target.rank then G.ARGS.focus_list[1] = {node = G.hand.cards[nu_rank]} end + else + --set the cursor position to where it currently is on screen + G.ARGS.focus_cursor_pos = G.ARGS.focus_cursor_pos or {} + G.ARGS.focus_cursor_pos.x, G.ARGS.focus_cursor_pos.y = G.CURSOR.T.x - G.ROOM.T.x, G.CURSOR.T.y - G.ROOM.T.y + + --if there is a focused target, set the cursor to the midpoint + if self.focused.target then + _ft = self.focused.target + if self.focused.target.config.focus_args and self.focused.target.config.focus_args.funnel_to then + _ft = self.focused.target.config.focus_args.funnel_to + end + G.ARGS.focus_cursor_pos.x, G.ARGS.focus_cursor_pos.y = _ft.T.x + 0.5*_ft.T.w,_ft.T.y + 0.5*_ft.T.h + --if not but there is a focusable hovering target, put the cursor on it instead + elseif self.hovering.target and self.hovering.target.states.focus.can then + G.ARGS.focus_cursor_pos.x, G.ARGS.focus_cursor_pos.y = self.hovering.target:put_focused_cursor() + G.ARGS.focus_cursor_pos.x = G.ARGS.focus_cursor_pos.x / (G.TILESCALE*G.TILESIZE) - G.ROOM.T.x + G.ARGS.focus_cursor_pos.y = G.ARGS.focus_cursor_pos.y / (G.TILESCALE*G.TILESIZE) - G.ROOM.T.y + end + + --set the list to be all the nodes in that direction sorted by the closest node + for _, v in pairs(G.ARGS.focusables) do + if v ~= self.hovering.target and v ~= self.focused.target then + local eligible = false + + if v.config.focus_args and v.config.focus_args.funnel_to then + v = v.config.focus_args.funnel_to + end + + G.ARGS.focus_vec = G.ARGS.focus_vec or {} + G.ARGS.focus_vec.x = v.T.x + 0.5*v.T.w - (G.ARGS.focus_cursor_pos.x) + G.ARGS.focus_vec.y = v.T.y + 0.5*v.T.h - (G.ARGS.focus_cursor_pos.y) + + if v.config.focus_args and v.config.focus_args.nav then + if v.config.focus_args.nav == 'wide' then + if G.ARGS.focus_vec.y > 0.1 and dir == 'D' then eligible = true + elseif G.ARGS.focus_vec.y < -0.1 and dir == 'U' then eligible = true + elseif math.abs(G.ARGS.focus_vec.y) < v.T.h/2 then eligible = true end + elseif v.config.focus_args.nav == 'tall' then + if G.ARGS.focus_vec.x > 0.1 and dir == 'R' then eligible = true + elseif G.ARGS.focus_vec.x < -0.1 and dir == 'L' then eligible = true + elseif math.abs(G.ARGS.focus_vec.x) < v.T.w/2 then eligible = true end + end + elseif math.abs(G.ARGS.focus_vec.x) > math.abs(G.ARGS.focus_vec.y) then + if G.ARGS.focus_vec.x > 0 and dir == 'R' then eligible = true + elseif G.ARGS.focus_vec.x < 0 and dir == 'L' then eligible = true end + else + if G.ARGS.focus_vec.y > 0 and dir == 'D' then eligible = true + elseif G.ARGS.focus_vec.y < 0 and dir == 'U' then eligible = true end + end + + if eligible then + G.ARGS.focus_list[#G.ARGS.focus_list+1] = {node = v, dist = math.abs(G.ARGS.focus_vec.x) + math.abs(G.ARGS.focus_vec.y)} + end + end + end + if #G.ARGS.focus_list < 1 then + if self.focused.target then self.focused.target.states.focus.is = true end + return + end + table.sort(G.ARGS.focus_list, function (a, b) return a.dist < b.dist end) + end + else + if self.focused.target then + G.ARGS.focus_list[#G.ARGS.focus_list+1] = {node = self.focused.target, dist = 0} + else + --otherwise, get the focusable that collides + G.ARGS.focus_list[#G.ARGS.focus_list+1] = {node = G.ARGS.focusables[1], dist = 0} + end + end + end + + --now with the lists created, set the focused target to be the first node in the list + if G.ARGS.focus_list[1] then + if G.ARGS.focus_list[1].node.config and G.ARGS.focus_list[1].node.config.focus_args and G.ARGS.focus_list[1].node.config.focus_args.funnel_from then + self.focused.target = G.ARGS.focus_list[1].node.config.focus_args.funnel_from + else + self.focused.target = G.ARGS.focus_list[1].node + end + if self.focused.target ~= self.focused.prev_target then G.VIBRATION = G.VIBRATION + 0.7 end + else + self.focused.target = nil + end + + if self.focused.target then self.focused.target.states.focus.is = true end +end + +function Controller:capture_focused_input(button, input_type, dt) + local ret = false + local focused = self.focused.target + local extern_button = false + self.no_holdcap = nil + + --Implementing 'coyote time' type selection where a full button press isnt needed to select a card in hand. As long as a button down has been registered + --before a timer is up and the dpad is used to move to the next card it should register + if input_type == 'press' and (button == 'dpleft' or button == 'dpright') and + focused and self.dragging.target and + (self.held_button_times['a'] and self.held_button_times['a'] < 0.12) and + focused.area and focused.area:can_highlight(focused) then + self:L_cursor_release() + self:navigate_focus(button == 'dpleft' and 'L' or 'R') + self.held_button_times['a'] = nil + self.COYOTE_FOCUS = true + ret = true + elseif input_type == 'press' and focused and focused.area and focused == self.dragging.target then + focused.states.drag.is = false + if button == 'dpleft' and focused.rank > 1 then + focused.rank = focused.rank - 1 + focused.area.cards[focused.rank].rank = focused.rank + 1 + table.sort(focused.area.cards, function (a, b) return a.rank < b.rank end) + focused.area:align_cards() + self:update_cursor() + elseif button == 'dpright' and focused.rank < #focused.area.cards then + focused.rank = focused.rank + 1 + focused.area.cards[focused.rank].rank = focused.rank - 1 + table.sort(focused.area.cards, function (a, b) return a.rank < b.rank end) + focused.area:align_cards() + self:update_cursor() + end + focused.states.drag.is = true + ret = true + end + + if G.OVERLAY_MENU and not self.screen_keyboard and input_type == 'press' and G.OVERLAY_MENU:get_UIE_by_ID('tab_shoulders') and (button == 'leftshoulder' or button == 'rightshoulder') then + focused = G.OVERLAY_MENU:get_UIE_by_ID('tab_shoulders') + extern_button = true + end + if G.OVERLAY_MENU and not self.screen_keyboard and input_type == 'press' and G.OVERLAY_MENU:get_UIE_by_ID('cycle_shoulders') and (button == 'leftshoulder' or button == 'rightshoulder') then + focused = G.OVERLAY_MENU:get_UIE_by_ID('cycle_shoulders').children[1] + extern_button = true + end + if focused and focused.config.focus_args then + if focused.config.focus_args.type == 'cycle' and input_type == 'press' then + if ((extern_button and button == 'leftshoulder') or (not extern_button and button == 'dpleft')) then + focused.children[1]:click() + ret = true + end + if ((extern_button and button == 'rightshoulder') or (not extern_button and button == 'dpright')) then + focused.children[3]:click() + ret = true + end + end + if focused.config.focus_args.type == 'tab' and input_type == 'press' then + local proto_choices = focused.UIBox:get_group(nil, focused.children[1].children[1].config.group) + local choices = {} + for k, v in ipairs(proto_choices) do + if v.config.choice and v.config.button then choices[#choices+1] = v end + end + for k, v in ipairs(choices) do + if v.config.chosen then + if ((extern_button and button == 'leftshoulder') or (not extern_button and button == 'dpleft')) then + local next_i = k ~= 1 and (k-1) or (#choices) + if focused.config.focus_args.no_loop and next_i > k then ret = nil + else + choices[next_i]:click() + self:snap_to({node = choices[next_i]}) + self:update_cursor() + ret = true + end + elseif ((extern_button and button == 'rightshoulder') or (not extern_button and button == 'dpright')) then + local next_i = k ~= #choices and (k+1) or (1) + if focused.config.focus_args.no_loop and next_i < k then ret = nil + else + choices[next_i]:click() + self:snap_to({node = choices[next_i]}) + self:update_cursor() + ret = true + end + end + break + end + end + end + if focused.config.focus_args.type == 'slider' then + if button == 'dpleft' then + self.no_holdcap = true + if input_type == 'hold' and self.held_button_times[button] > 0.2 then + G.FUNCS.slider_descreet(focused.children[1], -dt*self.held_button_times[button]*0.6) + end + if input_type == 'press' then + G.FUNCS.slider_descreet(focused.children[1], -0.01) + end + ret = true + end + if button == 'dpright' then + self.no_holdcap = true + if input_type == 'hold' and self.held_button_times[button] > 0.2 then + G.FUNCS.slider_descreet(focused.children[1], dt*self.held_button_times[button]*0.6) + end + if input_type == 'press' then + G.FUNCS.slider_descreet(focused.children[1], 0.01) + end + ret = true + end + end + end + if ret == true then G.VIBRATION = G.VIBRATION +1 end + return ret +end + +function Controller:navigate_focus(dir) + --Get the corresponding focus target first, with or without a direction + self:update_focus(dir) + + --Set the cursor to be in the correct position for that target + self:update_cursor() +end + diff --git a/src/engine/event.lua b/src/engine/event.lua new file mode 100644 index 0000000..0733213 --- /dev/null +++ b/src/engine/event.lua @@ -0,0 +1,195 @@ +--Class +Event = Object:extend() + +--Class Methods +function Event:init(config) + self.trigger = config.trigger or 'immediate' + if config.blocking ~= nil then + self.blocking = config.blocking + else + self.blocking = true + end + if config.blockable ~= nil then + self.blockable = config.blockable + else + self.blockable = true + end + self.complete = false + self.start_timer = config.start_timer or false + self.func = config.func or function() return true end + self.delay = config.delay or 0 + self.no_delete = config.no_delete + self.created_on_pause = config.pause_force or G.SETTINGS.paused + self.timer = config.timer or (self.created_on_pause and 'REAL') or 'TOTAL' + + if self.trigger == 'ease' then + self.ease = { + type = config.ease or 'lerp', + ref_table = config.ref_table, + ref_value = config.ref_value, + start_val = config.ref_table[config.ref_value], + end_val = config.ease_to, + start_time = nil, + end_time = nil, + } + self.func = config.func or function(t) return t end + end + if self.trigger == 'condition' then + self.condition = { + ref_table = config.ref_table, + ref_value = config.ref_value, + stop_val = config.stop_val, + } + self.func = config.func or function() return self.condition.ref_table[self.condition.ref_value] == self.condition.stop_val end + end + self.time = G.TIMERS[self.timer] +end + +function Event:handle(_results) + _results.blocking, _results.completed = self.blocking, self.complete + if self.created_on_pause == false and G.SETTINGS.paused then _results.pause_skip = true; return end + if not self.start_timer then self.time = G.TIMERS[self.timer]; self.start_timer = true end + if self.trigger == 'after' then + if self.time + self.delay <= G.TIMERS[self.timer] then + _results.time_done = true + _results.completed = self.func() + end + end + if self.trigger == 'ease' then + if not self.ease.start_time then + self.ease.start_time = G.TIMERS[self.timer] + self.ease.end_time = G.TIMERS[self.timer] + self.delay + self.ease.start_val = self.ease.ref_table[self.ease.ref_value] + end + if not self.complete then + + if self.ease.end_time >= G.TIMERS[self.timer] then + local percent_done = ((self.ease.end_time - G.TIMERS[self.timer])/(self.ease.end_time - self.ease.start_time)) + + if self.ease.type == 'lerp' then + self.ease.ref_table[self.ease.ref_value] = self.func(percent_done*self.ease.start_val + (1-percent_done)*self.ease.end_val) + end + if self.ease.type == 'elastic' then + percent_done = -math.pow(2, 10 * percent_done - 10) * math.sin((percent_done * 10 - 10.75) * 2*math.pi/3); + self.ease.ref_table[self.ease.ref_value] = self.func(percent_done*self.ease.start_val + (1-percent_done)*self.ease.end_val) + end + if self.ease.type == 'quad' then + percent_done = percent_done * percent_done; + self.ease.ref_table[self.ease.ref_value] = self.func(percent_done*self.ease.start_val + (1-percent_done)*self.ease.end_val) + end + else + self.ease.ref_table[self.ease.ref_value] = self.func(self.ease.end_val) + self.complete = true + _results.completed = true + _results.time_done = true + end + end + end + if self.trigger == 'condition' then + if not self.complete then _results.completed = self.func() end + _results.time_done = true + end + if self.trigger == 'before' then + if not self.complete then _results.completed = self.func() end + if self.time + self.delay <= G.TIMERS[self.timer] then + _results.time_done = true + end + end + if self.trigger == 'immediate' then + _results.completed = self.func() + _results.time_done = true + end + if _results.completed then self.complete = true end +end + +--Class +EventManager = Object:extend() + +--Class Methods +function EventManager:init() + self.queues = { + unlock = {}, + base ={}, + tutorial = {}, + achievement = {}, + other = {} + } + self.queue_timer = G.TIMERS.REAL + self.queue_dt = 1/60 + self.queue_last_processed = G.TIMERS.REAL +end + +function EventManager:add_event(event, queue, front) + queue = queue or 'base' + if event:is(Event) then + if front then + table.insert(self.queues[queue], 1, event) + else + self.queues[queue][#self.queues[queue]+1] = event + end + end +end + +function EventManager:clear_queue(queue, exception) + if not queue then + --clear all queues + for k, v in pairs(self.queues) do + local i=1 + while i <= #v do + if not v[i].no_delete then + table.remove(v, i) + else + i = i + 1 + end + end + end + elseif exception then --clear all but exception + for k, v in pairs(self.queues) do + if k ~= exception then + local i=1 + while i <= #v do + if not v[i].no_delete then + table.remove(v, i) + else + i = i + 1 + end + end + end + end + else + local i=1 + while i <= #self.queues[queue] do + if not self.queues[queue][i].no_delete then + table.remove(self.queues[queue], i) + else + i = i + 1 + end + end + end +end + +function EventManager:update(dt, forced) + self.queue_timer = self.queue_timer+dt + if self.queue_timer >= self.queue_last_processed + self.queue_dt or forced then + self.queue_last_processed = self.queue_last_processed + (forced and 0 or self.queue_dt) + for k, v in pairs(self.queues) do + local blocked = false + local i=1 + while i <= #v do + G.ARGS.event_manager_update = G.ARGS.event_manager_update or {} + local results = G.ARGS.event_manager_update + results.blocking, results.completed, results.time_done, results.pause_skip = false, false, false, false + if (not blocked or not v[i].blockable) then v[i]:handle(results) end + if results.pause_skip then + i = i + 1 + else if not blocked and results.blocking then blocked = true end + if results.completed and results.time_done then + table.remove(v, i) + else + i = i + 1 + end + end + end + end + end +end diff --git a/src/engine/http_manager.lua b/src/engine/http_manager.lua new file mode 100644 index 0000000..a4d4458 --- /dev/null +++ b/src/engine/http_manager.lua @@ -0,0 +1,23 @@ +require "love.system" + +HTTPS = require('https') +local httpencode = function(str) + str = str..'' + local char_to_hex = function(c) + return string.format("%%%02X", string.byte(c)) + end + str = str:gsub("\n", "\r\n"):gsub("([^%w _%%%-%.~])", char_to_hex):gsub(" ", "+") + return str +end + +if (love.system.getOS() == 'OS X' )and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end + +IN_CHANNEL = love.thread.getChannel("http_request") +OUT_CHANNEL = love.thread.getChannel("http_response") + + while true do + --Monitor the channel for any new requests + local request = IN_CHANNEL:demand() -- Value from channel + if request then + end +end diff --git a/src/engine/moveable.lua b/src/engine/moveable.lua new file mode 100644 index 0000000..6d603df --- /dev/null +++ b/src/engine/moveable.lua @@ -0,0 +1,517 @@ +---@class Moveable: Node +Moveable = Node:extend() + +--Moveable represents any game object that has the ability to move about the gamespace.\ +--All Moveables have a T (transform) that describes their desired transform in game units, as\ +--well as a VT (Visible Transform) that eases to T over time. This allows for simplified movement where\ +--we only need to set T.x, T.y, etc. to their final position and the engine will ensure the Moveable\ +--VT eases to that final location, regargless of any events or timing. +-- +---@param args {T: table, container: Node} +--**T** The transform ititializer, with keys of x|1, y|2, w|3, h|4, r|5\ +--**container** optional container for this Node, defaults to G.ROOM +function Moveable:init(X,Y,W,H) + local args = (type(X) == 'table') and X or {T ={X or 0,Y or 0,W or 0,H or 0}} + Node.init(self, args) + + --The Visible transform is initally set to the same values as the transform T. + --Note that the VT has an extra 'scale' factor, this is used to manipulate the center-adjusted + --scale of any objects that need to be drawn larger or smaller + self.VT = { + x = self.T.x, + y = self.T.y, + w = self.T.w, + h = self.T.h, + r = self.T.r, + scale = self.T.scale + } + + --To determine location of VT, we need to keep track of the velocity of VT as it approaches T for the next frame + self.velocity = {x = 0, y = 0, r = 0, scale = 0, mag = 0} + + --For more robust drawing, attaching, movement and fewer redundant movement calculations, Moveables each have a 'role' + --that describes a heirarchy of move() calls. Any Moveables with 'Major' role type behave normally, essentially recalculating their + --VT every frame to ensure smooth movement. Moveables can be set to 'Minor' role and attached to some 'Major' moveable + --to weld the Minor moveable to the Major moveable. This makes the dependent moveable set their T and VT to be equal to + --the corresponding 'Major' T and VT, plus some defined offset. + --For finer control over what parts of T and VT are inherited, xy_bond, wh_bond, and r_bond can be set to one of + --'Strong' or 'Weak'. Strong simply copies the values, Weak allows the 'Minor' moveable to calculate their own. + self.role = { + role_type = 'Major', --Major dictates movement, Minor is welded to some major + offset = {x = 0, y = 0}, --Offset from Minor to Major + major = nil, + draw_major = self, + xy_bond = 'Strong', + wh_bond = 'Strong', + r_bond = 'Strong', + scale_bond = 'Strong' + } + + self.alignment = { + type = 'a', + offset = {x = 0, y = 0}, + prev_type = '', + prev_offset = {x = 0, y = 0}, + } + + --the pinch table is used to modify the VT.w and VT.h compared to T.w and T.h. If either x or y pinch is + --set to true, the VT width and or height will ease to 0. If pinch is false, they ease to T.w or T.h + self.pinch = {x = false, y = false} + + --Keep track of the last time this Moveable was moved via :move(dt). When it is successfully moved, set to equal + --the current G.TIMERS.REAL, and if it is called again this frame, doesn't recalculate move(dt) + self.last_moved = -1 + self.last_aligned = -1 + + self.static_rotation = false + + self.offset = {x=0, y=0} + self.Mid = self + + self.shadow_parrallax = {x = 0, y = -1.5} + self.layered_parallax = {x = 0, y = 0} + self.shadow_height = 0.2 + + self:calculate_parrallax() + + table.insert(G.MOVEABLES, self) + if getmetatable(self) == Moveable then + table.insert(G.I.MOVEABLE, self) + end +end +function Moveable:draw() + Node.draw(self) + self:draw_boundingrect() +end + +--Sets the alignment of moveable using roles +-- +---@param args {major: Moveable, bond: string, offset: table, type: string} +--**major** The moveable this moveable will attach to\ +--**bond** The bond type, either 'Strong' or 'Weak'. Strong instantly adjusts VT, Weak manually calculates VT changes\ +--**offset** {x , y} offset from the alignment\ +--**type** the alignment type. Vertical options: c - center, t - top, b - bottom. Horizontal options: l - left, m - middle, r - right. i for inner +function Moveable:set_alignment(args) + args = args or {} + if args.major then + self:set_role({ + role_type = 'Minor', + major = args.major, + xy_bond = args.bond or args.xy_bond or 'Weak', + wh_bond = args.wh_bond or self.role.wh_bond, + r_bond = args.r_bond or self.role.r_bond, + scale_bond = args.scale_bond or self.role.scale_bond, + }) + end + self.alignment.type = args.type or self.alignment.type + if args.offset and (type(args.offset)=='table' and not (args.offset.y and args.offset.x)) or type(args.offset) ~= 'table' then + args.offset = nil + end + self.alignment.offset = args.offset or self.alignment.offset + self.alignment.lr_clamp = args.lr_clamp +end + +function Moveable:align_to_major() + if self.alignment.type ~= self.alignment.prev_type then + self.alignment.type_list = { + a = self.alignment.type == 'a', + m = string.find(self.alignment.type, "m"), + c = string.find(self.alignment.type, "c"), + b = string.find(self.alignment.type, "b"), + t = string.find(self.alignment.type, "t"), + l = string.find(self.alignment.type, "l"), + r = string.find(self.alignment.type, "r"), + i = string.find(self.alignment.type, "i"), + } + end + + if self.alignment.prev_offset.x == self.alignment.offset.x and + self.alignment.prev_offset.y == self.alignment.offset.y and + self.alignment.prev_type == self.alignment.type then return end + + self.NEW_ALIGNMENT = true + + if self.alignment.type ~= self.alignment.prev_type then + self.alignment.prev_type = self.alignment.type + end + + if self.alignment.type_list.a or not self.role.major then return end + + if self.alignment.type_list.m then + self.role.offset.x = 0.5*self.role.major.T.w - (self.Mid.T.w)/2 + self.alignment.offset.x - self.Mid.T.x + self.T.x + end + + if self.alignment.type_list.c then + self.role.offset.y = 0.5*self.role.major.T.h - (self.Mid.T.h)/2 + self.alignment.offset.y - self.Mid.T.y + self.T.y + end + + if self.alignment.type_list.b then + if self.alignment.type_list.i then + self.role.offset.y = self.alignment.offset.y + self.role.major.T.h - self.T.h + else + self.role.offset.y = self.alignment.offset.y + self.role.major.T.h + end + end + + if self.alignment.type_list.r then + if self.alignment.type_list.i then + self.role.offset.x = self.alignment.offset.x + self.role.major.T.w - self.T.w + else + self.role.offset.x = self.alignment.offset.x + self.role.major.T.w + end + end + + if self.alignment.type_list.t then + if self.alignment.type_list.i then + self.role.offset.y = self.alignment.offset.y + else + self.role.offset.y = self.alignment.offset.y - self.T.h + end + end + + if self.alignment.type_list.l then + if self.alignment.type_list.i then + self.role.offset.x = self.alignment.offset.x + else + self.role.offset.x = self.alignment.offset.x - self.T.w + end + end + + self.role.offset.x = self.role.offset.x or 0 + self.role.offset.y = self.role.offset.y or 0 + + self.T.x = self.role.major.T.x + self.role.offset.x + self.T.y = self.role.major.T.y + self.role.offset.y + + self.alignment.prev_offset = self.alignment.prev_offset or {} + self.alignment.prev_offset.x, self.alignment.prev_offset.y = self.alignment.offset.x, self.alignment.offset.y +end + +function Moveable:hard_set_T(X, Y, W, H) + self.T.x = X + self.T.y = Y + self.T.w = W + self.T.h = H + + self.velocity.x = 0 + self.velocity.y = 0 + self.velocity.r = 0 + self.velocity.scale = 0 + + self.VT.x = X + self.VT.y = Y + self.VT.w = W + self.VT.h = H + self.VT.r = self.T.r + self.VT.scale = self.T.scale + self:calculate_parrallax() +end + +function Moveable:hard_set_VT() + self.VT.x = self.T.x + self.VT.y = self.T.y + self.VT.w = self.T.w + self.VT.h = self.T.h +end + +function Moveable:drag(offset) + if self.states.drag.can or offset then + self.ARGS.drag_cursor_trans = self.ARGS.drag_cursor_trans or {} + self.ARGS.drag_translation = self.ARGS.drag_translation or {} + local _p = self.ARGS.drag_cursor_trans + local _t = self.ARGS.drag_translation + _p.x = G.CONTROLLER.cursor_position.x/(G.TILESCALE*G.TILESIZE) + _p.y = G.CONTROLLER.cursor_position.y/(G.TILESCALE*G.TILESIZE) + + _t.x, _t.y = -self.container.T.w/2, -self.container.T.h/2 + point_translate(_p, _t) + + point_rotate(_p, self.container.T.r) + + _t.x, _t.y = self.container.T.w/2-self.container.T.x, self.container.T.h/2-self.container.T.y + point_translate(_p, _t) + + if not offset then + offset = self.click_offset + end + + self.T.x = _p.x - offset.x + self.T.y = _p.y - offset.y + self.NEW_ALIGNMENT = true + for k, v in pairs(self.children) do + v:drag(offset) + end + end + if self.states.drag.can then + Node.drag(self) + end +end + +function Moveable:juice_up(amount, rot_amt) + if G.SETTINGS.reduced_motion then return end + local amount = amount or 0.4 + + local end_time = G.TIMERS.REAL + 0.4 + local start_time = G.TIMERS.REAL + self.juice = { + scale = 0, + scale_amt = amount, + r = 0, + r_amt = ((rot_amt or pseudorandom_element({0.6*amount, -0.6*amount})) or 0), + start_time = start_time, + end_time = end_time + } + self.VT.scale = 1-0.6*amount +end + +function Moveable:move_juice(dt) + if self.juice and not self.juice.handled_elsewhere then + if self.juice.end_time < G.TIMERS.REAL then + self.juice = nil + else + self.juice.scale = self.juice.scale_amt*math.sin(50.8*(G.TIMERS.REAL-self.juice.start_time))*math.max(0, ((self.juice.end_time - G.TIMERS.REAL)/(self.juice.end_time - self.juice.start_time))^3) + self.juice.r = self.juice.r_amt*math.sin(40.8*(G.TIMERS.REAL-self.juice.start_time))*math.max(0, ((self.juice.end_time - G.TIMERS.REAL)/(self.juice.end_time - self.juice.start_time))^2) + end + end +end + +function Moveable:move(dt) + if self.FRAME.MOVE >= G.FRAMES.MOVE then return end + self.FRAME.OLD_MAJOR = self.FRAME.MAJOR + self.FRAME.MAJOR = nil + self.FRAME.MOVE = G.FRAMES.MOVE + if not self.created_on_pause and G.SETTINGS.paused then return end + + --WHY ON EARTH DOES THIS LINE MAKE IT RUN 2X AS FAST??? + ------------------------------------------------------- + --local timestart = love.timer.getTime() + ------------------------------------------------------- + + self:align_to_major() + + self.CALCING = nil + if self.role.role_type == 'Glued' then + if self.role.major then self:glue_to_major(self.role.major) end + elseif self.role.role_type == 'Minor' and self.role.major then + if self.role.major.FRAME.MOVE < G.FRAMES.MOVE then self.role.major:move(dt) end + self.STATIONARY = self.role.major.STATIONARY + if (not self.STATIONARY) or self.NEW_ALIGNMENT or + self.config.refresh_movement or + self.juice or + self.role.xy_bond == 'Weak' or + self.role.r_bond == 'Weak' then + self.CALCING = true + self:move_with_major(dt) + end + elseif self.role.role_type == 'Major' then + self.STATIONARY = true + self:move_juice(dt) + self:move_xy(dt) + self:move_r(dt, self.velocity) + self:move_scale(dt) + self:move_wh(dt) + self:calculate_parrallax() + end + if self.alignment and self.alignment.lr_clamp then + self:lr_clamp() + end + + self.NEW_ALIGNMENT = false +end + +function Moveable:lr_clamp() + if self.T.x < 0 then self.T.x = 0 end + if self.VT.x < 0 then self.VT.x = 0 end + if (self.T.x + self.T.w) > G.ROOM.T.w then self.T.x = G.ROOM.T.w - self.T.w end + if (self.VT.x + self.VT.w) > G.ROOM.T.w then self.VT.x = G.ROOM.T.w - self.VT.w end +end + +function Moveable:glue_to_major(major_tab) + self.T = major_tab.T + + self.VT.x = major_tab.VT.x + (0.5*(1 - major_tab.VT.w/(major_tab.T.w))*self.T.w) + self.VT.y = major_tab.VT.y + self.VT.w = major_tab.VT.w + self.VT.h = major_tab.VT.h + self.VT.r = major_tab.VT.r + self.VT.scale = major_tab.VT.scale + + self.pinch = major_tab.pinch + self.shadow_parrallax = major_tab.shadow_parrallax +end + +MWM = { + rotated_offset = {}, + angles = {}, + WH = {}, + offs = {}, +} + +function Moveable:move_with_major(dt) + if self.role.role_type ~= 'Minor' then return end + local major_tab = self.role.major:get_major() + + self:move_juice(dt) + + if self.role.r_bond == 'Weak' then + MWM.rotated_offset.x, MWM.rotated_offset.y = self.role.offset.x + major_tab.offset.x,self.role.offset.y+major_tab.offset.y + else + if major_tab.major.VT.r < 0.0001 and major_tab.major.VT.r > -0.0001 then + MWM.rotated_offset.x = self.role.offset.x + major_tab.offset.x + MWM.rotated_offset.y = self.role.offset.y + major_tab.offset.y + else + MWM.angles.cos, MWM.angles.sin = math.cos(major_tab.major.VT.r),math.sin(major_tab.major.VT.r) + MWM.WH.w, MWM.WH.h = -self.T.w/2 + major_tab.major.T.w/2,-self.T.h/2 + major_tab.major.T.h/2 + MWM.offs.x, MWM.offs.y = self.role.offset.x + major_tab.offset.x - MWM.WH.w,self.role.offset.y + major_tab.offset.y - MWM.WH.h + + MWM.rotated_offset.x = MWM.offs.x*MWM.angles.cos - MWM.offs.y*MWM.angles.sin + MWM.WH.w + MWM.rotated_offset.y = MWM.offs.x*MWM.angles.sin + MWM.offs.y*MWM.angles.cos + MWM.WH.h + end + end + + self.T.x = major_tab.major.T.x + MWM.rotated_offset.x + self.T.y = major_tab.major.T.y + MWM.rotated_offset.y + + if self.role.xy_bond == 'Strong' then + self.VT.x = major_tab.major.VT.x + MWM.rotated_offset.x + self.VT.y = major_tab.major.VT.y + MWM.rotated_offset.y + elseif self.role.xy_bond == 'Weak' then + self:move_xy(dt) + end + + if self.role.r_bond == 'Strong' then + self.VT.r = self.T.r + major_tab.major.VT.r + (self.juice and self.juice.r or 0) + elseif self.role.r_bond == 'Weak' then + self:move_r(dt, self.velocity) + end + + if self.role.scale_bond == 'Strong' then + self.VT.scale = self.T.scale*(major_tab.major.VT.scale/major_tab.major.T.scale) + (self.juice and self.juice.scale or 0) + elseif self.role.scale_bond == 'Weak' then + self:move_scale(dt) + end + + if self.role.wh_bond == 'Strong' then + self.VT.x = self.VT.x + (0.5*(1 - major_tab.major.VT.w/(major_tab.major.T.w))*self.T.w) + self.VT.w = (self.T.w)*(major_tab.major.VT.w/major_tab.major.T.w) + self.VT.h = (self.T.h)*(major_tab.major.VT.h/major_tab.major.T.h) + elseif self.role.wh_bond == 'Weak' then + self:move_wh(dt) + end + + self:calculate_parrallax() +end + +function Moveable:move_xy(dt) + if (self.T.x ~= self.VT.x or math.abs(self.velocity.x) > 0.01) or + (self.T.y ~= self.VT.y or math.abs(self.velocity.y) > 0.01) then + self.velocity.x = G.exp_times.xy*self.velocity.x + (1-G.exp_times.xy)*(self.T.x - self.VT.x)*35*dt + self.velocity.y = G.exp_times.xy*self.velocity.y + (1-G.exp_times.xy)*(self.T.y - self.VT.y)*35*dt + if self.velocity.x*self.velocity.x + self.velocity.y*self.velocity.y > G.exp_times.max_vel*G.exp_times.max_vel then + local actual_vel = math.sqrt(self.velocity.x*self.velocity.x + self.velocity.y*self.velocity.y) + self.velocity.x = G.exp_times.max_vel*self.velocity.x/actual_vel + self.velocity.y = G.exp_times.max_vel*self.velocity.y/actual_vel + end + self.STATIONARY = false + self.VT.x = self.VT.x + self.velocity.x + self.VT.y = self.VT.y + self.velocity.y + if math.abs(self.VT.x - self.T.x) < 0.01 and math.abs(self.velocity.x) < 0.01 then self.VT.x = self.T.x; self.velocity.x = 0 end + if math.abs(self.VT.y - self.T.y) < 0.01 and math.abs(self.velocity.y) < 0.01 then self.VT.y = self.T.y; self.velocity.y = 0 end + end +end + +function Moveable:move_scale(dt) + local des_scale = self.T.scale + (self.zoom and ((self.states.drag.is and 0.1 or 0) + (self.states.hover.is and 0.05 or 0)) or 0) + (self.juice and self.juice.scale or 0) + + if des_scale ~= self.VT.scale or + math.abs(self.velocity.scale) > 0.001 then + self.STATIONARY = false + self.velocity.scale = G.exp_times.scale*self.velocity.scale + (1-G.exp_times.scale)*(des_scale - self.VT.scale) + self.VT.scale = self.VT.scale + self.velocity.scale + end +end + +function Moveable:move_wh(dt) + if (self.T.w ~= self.VT.w and not self.pinch.x) or + (self.T.h ~= self.VT.h and not self.pinch.y) or + (self.VT.w > 0 and self.pinch.x) or + (self.VT.h > 0 and self.pinch.y) then + self.STATIONARY = false + self.VT.w = self.VT.w + (8*dt)*(self.pinch.x and -1 or 1)*self.T.w + self.VT.h = self.VT.h + (8*dt)*(self.pinch.y and -1 or 1)*self.T.h + self.VT.w = math.max(math.min(self.VT.w, self.T.w), 0) + self.VT.h = math.max(math.min(self.VT.h, self.T.h), 0) + end +end + +function Moveable:move_r(dt, vel) + local des_r = self.T.r +0.015*vel.x/dt + (self.juice and self.juice.r*2 or 0) + + if des_r ~= self.VT.r or + math.abs(self.velocity.r) > 0.001 then + self.STATIONARY = false + self.velocity.r = G.exp_times.r*self.velocity.r + (1-G.exp_times.r)*(des_r - self.VT.r) + self.VT.r = self.VT.r + self.velocity.r + end + if math.abs(self.VT.r - self.T.r) < 0.001 and math.abs(self.velocity.r) < 0.001 then self.VT.r = self.T.r; self.velocity.r = 0 end +end + +function Moveable:calculate_parrallax() + if not G.ROOM then return end + self.shadow_parrallax.x = (self.T.x + self.T.w/2 - G.ROOM.T.w/2)/(G.ROOM.T.w/2)*1.5 +end + +function Moveable:set_role(args) + if args.major and not args.major.set_role then return end + if args.offset and (type(args.offset)=='table' and not (args.offset.y and args.offset.x)) or type(args.offset) ~= 'table' then + args.offset = nil + end + self.role = { + role_type = args.role_type or self.role.role_type, + offset = args.offset or self.role.offset, + major = args.major or self.role.major, + xy_bond = args.xy_bond or self.role.xy_bond, + wh_bond = args.wh_bond or self.role.wh_bond, + r_bond = args.r_bond or self.role.r_bond, + scale_bond = args.scale_bond or self.role.scale_bond, + draw_major = args.draw_major or self.role.draw_major, + } + if self.role.role_type == 'Major' then self.role.major = nil end +end + +function Moveable:get_major() + if ( self.role.role_type ~= 'Major' and self.role.major ~= self) and (self.role.xy_bond ~= 'Weak' and self.role.r_bond ~= 'Weak') then + --First, does the major already have their offset precalculated for this frame? + if not self.FRAME.MAJOR or (G.REFRESH_FRAME_MAJOR_CACHE) then + self.FRAME.MAJOR = self.FRAME.MAJOR or EMPTY(self.FRAME.OLD_MAJOR) + self.temp_offs = EMPTY(self.temp_offs) + local major = self.role.major:get_major() + self.FRAME.MAJOR.major = major.major + self.FRAME.MAJOR.offset = self.FRAME.MAJOR.offset or self.temp_offs + self.FRAME.MAJOR.offset.x, self.FRAME.MAJOR.offset.y = major.offset.x + self.role.offset.x + self.layered_parallax.x, major.offset.y + self.role.offset.y + self.layered_parallax.y + end + return self.FRAME.MAJOR + else + self.ARGS.get_major = self.ARGS.get_major or {} + self.ARGS.get_major.major = self + self.ARGS.get_major.offset = self.ARGS.get_major.offset or {} + self.ARGS.get_major.offset.x, self.ARGS.get_major.offset.y = 0,0 + return self.ARGS.get_major + end +end + +function Moveable:remove() + for k, v in pairs(G.MOVEABLES) do + if v == self then + table.remove(G.MOVEABLES, k) + break; + end + end + for k, v in pairs(G.I.MOVEABLE) do + if v == self then + table.remove(G.I.MOVEABLE, k) + break; + end + end + Node.remove(self) +end diff --git a/src/engine/node.lua b/src/engine/node.lua new file mode 100644 index 0000000..d4a1b41 --- /dev/null +++ b/src/engine/node.lua @@ -0,0 +1,389 @@ +---@class Node +Node = Object:extend() + +--Node represent any game object that needs to have some transform available in the game itself.\ +--Everything that you see in the game is a Node, and some invisible things like the G.ROOM are also\ +--represented here. +-- +---@param args {T: table, container: Node} +--**T** The transform ititializer, with keys of x|1, y|2, w|3, h|4, r|5\ +--**container** optional container for this Node, defaults to G.ROOM +function Node:init(args) + --From args, set the values of self transform + args = args or {} + args.T = args.T or {} + + --Store all argument and return tables here for reuse, because Lua likes to generate garbage + self.ARGS = self.ARGS or {} + self.RETS = {} + + --Config table used for any metadata about this node + self.config = self.config or {} + + --For transform init, accept params in the form x|1, y|2, w|3, h|4, r|5 + self.T = { + x = args.T.x or args.T[1] or 0, + y = args.T.y or args.T[2] or 0, + w = args.T.w or args.T[3] or 1, + h = args.T.h or args.T[4] or 1, + r = args.T.r or args.T[5] or 0, + scale = args.T.scale or args.T[6] or 1, + } + --Transform to use for collision detection + self.CT = self.T + + --Create the offset tables, used to determine things like drag offset and 3d shader effects + self.click_offset = {x = 0, y = 0} + self.hover_offset = {x = 0, y = 0} + + --To keep track of all nodes created on pause. If true, this node moves normally even when the G.TIMERS.TOTAL doesn't increment + self.created_on_pause = G.SETTINGS.paused + + --ID tracker, every Node has a unique ID + G.ID = G.ID or 1 + self.ID = G.ID + G.ID = G.ID + 1 + + --Frame tracker to aid in not doing too many extra calculations + self.FRAME = { + DRAW = -1, + MOVE = -1 + } + + --The states for this Node and all derived nodes. This is how we control the visibility and interactibility of any object + --All nodes do not collide by default. This reduces the size of n for the O(n^2) collision detection + self.states = { + visible = true, + collide = {can = false, is = false}, + focus = {can = false, is = false}, + hover = {can = true, is = false}, + click = {can = true, is = false}, + drag = {can = true, is = false}, + release_on = {can = true, is = false} + } + + --If we provide a container, all nodes within that container are translated with that container as the reference frame. + --For example, if G.ROOM is set at x = 5 and y = 5, and we create a new game object at 0, 0, it will actually be drawn at + --5, 5. This allows us to control things like screen shake, room positioning, rotation, padding, etc. without needing to modify + --every game object that we need to draw + self.container = args.container or G.ROOM + + --The list of children give Node a treelike structure. This can be used for things like drawing, deterministice movement and parallax + --calculations when child nodes rely on updated information from parents, and inherited attributes like button click functions + if not self.children then + self.children = {} + end + + --Add this object to the appropriate instance table only if the metatable matches with NODE + if getmetatable(self) == Node then + table.insert(G.I.NODE, self) + end + + --Unless node was created during a stage transition (when G.STAGE_OBJECT_INTERRUPT is true), add all nodes to their appropriate + --stage object table so they can be easily deleted on stage transition + if not G.STAGE_OBJECT_INTERRUPT then + table.insert(G.STAGE_OBJECTS[G.STAGE], self) + end +end + + +--Draw a bounding rectangle representing the transform of this node. Used in debugging. +function Node:draw_boundingrect() + self.under_overlay = G.under_overlay + + if G.DEBUG then + local transform = self.VT or self.T + love.graphics.push() + love.graphics.scale(G.TILESCALE, G.TILESCALE) + love.graphics.translate(transform.x*G.TILESIZE+transform.w*G.TILESIZE*0.5, + transform.y*G.TILESIZE+transform.h*G.TILESIZE*0.5) + love.graphics.rotate(transform.r) + love.graphics.translate(-transform.w*G.TILESIZE*0.5, + -transform.h*G.TILESIZE*0.5) + if self.DEBUG_VALUE then + love.graphics.setColor(1, 1, 0, 1) + love.graphics.print((self.DEBUG_VALUE or ''), transform.w*G.TILESIZE,transform.h*G.TILESIZE, nil, 1/G.TILESCALE) + end + love.graphics.setLineWidth(1 + (self.states.focus.is and 1 or 0)) + if self.states.collide.is then + love.graphics.setColor(0, 1, 0, 0.3) + else + love.graphics.setColor(1, 0, 0, 0.3) + end + if self.states.focus.can then + love.graphics.setColor(G.C.GOLD) + love.graphics.setLineWidth(1) + end + if self.CALCING then + love.graphics.setColor({0,0,1,1}) + love.graphics.setLineWidth(3) + end + love.graphics.rectangle('line', 0, 0, transform.w*G.TILESIZE,transform.h*G.TILESIZE, 3) + love.graphics.pop() + end +end + +--Draws self, then adds self the the draw hash, then draws all children +function Node:draw() + self:draw_boundingrect() + if self.states.visible then + add_to_drawhash(self) + for _, v in pairs(self.children) do + v:draw() + end + end +end + +--Determines if this node collides with some point. Applies any container translations and rotations, then\ +--applies translations and rotations specific to this node. This means the collision detection effectively\ +--determines if some point intersects this node regargless of rotation. +-- +---@param point {x: number, y: number} +--**x and y** The coordinates of the cursor transformed into game units +function Node:collides_with_point(point) + --First reset the collision state to false + if self.container then + local T = self.CT or self.T + self.ARGS.collides_with_point_point = self.ARGS.collides_with_point_point or {} + self.ARGS.collides_with_point_translation = self.ARGS.collides_with_point_translation or {} + self.ARGS.collides_with_point_rotation = self.ARGS.collides_with_point_rotation or {} + local _p = self.ARGS.collides_with_point_point + local _t = self.ARGS.collides_with_point_translation + local _r = self.ARGS.collides_with_point_rotation + + local _b = self.states.hover.is and G.COLLISION_BUFFER or 0 + + _p.x, _p.y = point.x, point.y + + if self.container ~= self then --if there is some valid container, we need to apply all translations and rotations for the container first + if math.abs(self.container.T.r) < 0.1 then + --Translate to normalize this Node to the center of the container + _t.x, _t.y = -self.container.T.w/2, -self.container.T.h/2 + point_translate(_p, _t) + + --Rotate node about the center of the container + point_rotate(_p, self.container.T.r) + + --Translate node to undo the container translation, essentially reframing it in 'container' space + _t.x, _t.y = self.container.T.w/2-self.container.T.x, self.container.T.h/2-self.container.T.y + point_translate(_p, _t) + else + --Translate node to undo the container translation, essentially reframing it in 'container' space + _t.x, _t.y = -self.container.T.x, -self.container.T.y + point_translate(_p, _t) + end + end + if math.abs(T.r) < 0.1 then + --If we can essentially disregard transform rotation, just treat it like a normal rectangle + if _p.x >= T.x - _b and _p.y >= T.y - _b and _p.x <= T.x + T.w + _b and _p.y <= T.y + T.h + _b then + return true + end + else + --Otherwise we need to do some silly point rotation garbage to determine if the point intersects the rotated rectangle + _r.cos, _r.sin = math.cos(T.r+math.pi/2), math.sin(T.r+math.pi/2) + _p.x, _p.y = _p.x - (T.x + 0.5*(T.w)), _p.y - (T.y + 0.5*(T.h)) + _t.x, _t.y = _p.y*_r.cos - _p.x*_r.sin, _p.y*_r.sin + _p.x*_r.cos + _p.x, _p.y = _t.x + (T.x + 0.5*(T.w)), _t.y + (T.y + 0.5*(T.h)) + + if _p.x >= T.x - _b and _p.y >= T.y - _b + and _p.x <= T.x + T.w + _b and _p.y <= T.y + T.h + _b then + return true + end + end + end +end + +--Sets the offset of passed point in terms of this nodes T.x and T.y +-- +---@param point {x: number, y: number} +---@param type string +--**x and y** The coordinates of the cursor transformed into game units +--**type** the type of offset to set for this Node, either 'Click' or 'Hover' +function Node:set_offset(point, type) + self.ARGS.set_offset_point = self.ARGS.set_offset_point or {} + self.ARGS.set_offset_translation = self.ARGS.set_offset_translation or {} + local _p = self.ARGS.set_offset_point + local _t = self.ARGS.set_offset_translation + + _p.x, _p.y = point.x, point.y + + --Translate to middle of the container + _t.x = -self.container.T.w/2 + _t.y = -self.container.T.h/2 + point_translate(_p, _t) + + --Rotate about the container midpoint according to node rotation + point_rotate(_p, self.container.T.r) + + --Translate node to undo the container translation, essentially reframing it in 'container' space + _t.x = self.container.T.w/2-self.container.T.x + _t.y = self.container.T.h/2-self.container.T.y + point_translate(_p, _t) + + if type == 'Click' then + self.click_offset.x = (_p.x - self.T.x) + self.click_offset.y = (_p.y - self.T.y) + elseif type == 'Hover' then + self.hover_offset.x = (_p.x - self.T.x) + self.hover_offset.y = (_p.y - self.T.y) + end +end + +--If the current container is being 'Dragged', usually by a cursor, determine if any drag popups need to be generated and do so +function Node:drag() + if self.config and self.config.d_popup then + if not self.children.d_popup then + self.children.d_popup = UIBox{ + definition = self.config.d_popup, + config = self.config.d_popup_config + } + self.children.h_popup.states.collide.can = false + table.insert(G.I.POPUP, self.children.d_popup) + self.children.d_popup.states.drag.can = true + end + end +end + +--Determines if this Node can be dragged. This is a simple function but more complex objects may redefine this to return a parent\ +--if the parent needs to drag other children with it +function Node:can_drag() + return self.states.drag.can and self or nil +end + +--Called by the CONTROLLER when this node is no longer being dragged, removes any d_popups +function Node:stop_drag() + if self.children.d_popup then + for k, v in pairs(G.I.POPUP) do + if v == self.children.d_popup then + table.remove(G.I.POPUP, k) + end + end + self.children.d_popup:remove() + self.children.d_popup = nil + end +end + +--If the current container is being 'Hovered', usually by a cursor, determine if any hover popups need to be generated and do so +function Node:hover() + if self.config and self.config.h_popup then + if not self.children.h_popup then + self.config.h_popup_config.instance_type = 'POPUP' + self.children.h_popup = UIBox{ + definition = self.config.h_popup, + config = self.config.h_popup_config, + } + self.children.h_popup.states.collide.can = false + self.children.h_popup.states.drag.can = true + end + end +end + +--Called by the CONTROLLER when this node is no longer being hovered, removes any h_popups +function Node:stop_hover() + if self.children.h_popup then + self.children.h_popup:remove() + self.children.h_popup = nil + end +end + +--Called by the CONTROLLER to determine the position the cursor should be set to for this node +function Node:put_focused_cursor() + return (self.T.x + self.T.w/2 + self.container.T.x)*(G.TILESCALE*G.TILESIZE), (self.T.y + self.T.h/2 + self.container.T.y)*(G.TILESCALE*G.TILESIZE) +end + +--Sets the container of this node and all child nodes to be a new container node +-- +---@param container Node The new node that will behave as this nodes container +function Node:set_container(container) + if self.children then + for _, v in pairs(self.children) do + v:set_container(container) + end + end + self.container = container +end + +--Translation function used before any draw calls, translates this node according to the transform of the container node +function Node:translate_container() + if self.container and self.container ~= self then + love.graphics.translate(self.container.T.w*G.TILESCALE*G.TILESIZE*0.5, self.container.T.h*G.TILESCALE*G.TILESIZE*0.5) + love.graphics.rotate(self.container.T.r) + love.graphics.translate( + -self.container.T.w*G.TILESCALE*G.TILESIZE*0.5 + self.container.T.x*G.TILESCALE*G.TILESIZE, + -self.container.T.h*G.TILESCALE*G.TILESIZE*0.5 + self.container.T.y*G.TILESCALE*G.TILESIZE) + end +end + +--When this Node needs to be deleted, removes self from any tables it may have been added to to destroy any weak references\ +--Also calls the remove method of all children to have them do the same +function Node:remove() + + for k, v in pairs(G.I.POPUP) do + if v == self then + table.remove(G.I.POPUP, k) + break; + end + end + for k, v in pairs(G.I.NODE) do + if v == self then + table.remove(G.I.NODE, k) + break; + end + end + for k, v in pairs(G.STAGE_OBJECTS[G.STAGE]) do + if v == self then + table.remove(G.STAGE_OBJECTS[G.STAGE], k) + break; + end + end + if self.children then + for k, v in pairs(self.children) do + v:remove() + end + end + if G.CONTROLLER.clicked.target ==self then + G.CONTROLLER.clicked.target = nil + end + if G.CONTROLLER.focused.target ==self then + G.CONTROLLER.focused.target = nil + end + if G.CONTROLLER.dragging.target ==self then + G.CONTROLLER.dragging.target = nil + end + if G.CONTROLLER.hovering.target ==self then + G.CONTROLLER.hovering.target = nil + end + if G.CONTROLLER.released_on.target ==self then + G.CONTROLLER.released_on.target = nil + end + if G.CONTROLLER.cursor_down.target ==self then + G.CONTROLLER.cursor_down.target = nil + end + if G.CONTROLLER.cursor_up.target ==self then + G.CONTROLLER.cursor_up.target = nil + end + if G.CONTROLLER.cursor_hover.target ==self then + G.CONTROLLER.cursor_hover.target = nil + end + + self.REMOVED = true +end + +--returns the squared(fast) distance in game units from the center of this node to the center of another node +-- +---@param other_node Node to measure the distance from +function Node:fast_mid_dist(other_node) + return math.sqrt((other_node.T.x + 0.5*other_node.T.w) - (self.T.x + self.T.w))^2 + ((other_node.T.y + 0.5*other_node.T.h) - (self.T.y + self.T.h))^2 +end + +--Prototype for a click release function, when the cursor is released on this node +function Node:release(dragged) end + +--Prototype for a click function +function Node:click() end + +--Prototype animation function for any frame manipulation needed +function Node:animate() end + +--Prototype update function for any object specific logic that needs to occur every frame +function Node:update(dt) end diff --git a/src/engine/object.lua b/src/engine/object.lua new file mode 100644 index 0000000..7fad29d --- /dev/null +++ b/src/engine/object.lua @@ -0,0 +1,37 @@ +--||-- +--This Object implementation was taken from SNKRX (MIT license). Slightly modified, this is a very simple OOP base + +Object = {} +Object.__index = Object +function Object:init() +end + +function Object:extend() + local cls = {} + for k, v in pairs(self) do + if k:find("__") == 1 then + cls[k] = v + end + end + cls.__index = cls + cls.super = self + setmetatable(cls, self) + return cls +end + +function Object:is(T) + local mt = getmetatable(self) + while mt do + if mt == T then + return true + end + mt = getmetatable(mt) + end + return false +end + +function Object:__call(...) + local obj = setmetatable({}, self) + obj:init(...) + return obj +end diff --git a/src/engine/particles.lua b/src/engine/particles.lua new file mode 100644 index 0000000..a7d4e9c --- /dev/null +++ b/src/engine/particles.lua @@ -0,0 +1,177 @@ +---@class Particles: Moveable +Particles = Moveable:extend() + +--Class Methods +function Particles:init(X, Y, W, H, config) + config = config or {} + + Moveable.init(self,X, Y, W, H) + + self.fill = config.fill + self.padding = config.padding or 0 + + if config.attach then + self:set_alignment{ + major = config.attach, + type = 'cm', + bond = 'Strong' + } + table.insert(self.role.major.children,self) + self.parent = self.role.major + self.T.x = self.role.major.T.x + self.padding + self.T.y = self.role.major.T.y + self.padding + if self.fill then + self.T.w = self.role.major.T.w - self.padding + self.T.h = self.role.major.T.h - self.padding + end + end + + self.states.hover.can = false + self.states.click.can = false + self.states.collide.can = false + self.states.drag.can = false + self.states.release_on.can = false + + self.timer = config.timer or 0.5 + self.timer_type = (self.created_on_pause and 'REAL') or config.timer_type or 'REAL' + self.last_real_time = G.TIMERS[self.timer_type] - self.timer + self.last_drawn = 0 + self.lifespan = config.lifespan or 1 + self.fade_alpha = 0 + self.speed = config.speed or 1 + self.max = config.max or 1000000000000000 + self.pulse_max = math.min(20, config.pulse_max or 0) + self.pulsed = 0 + self.vel_variation = config.vel_variation or 1 + self.particles = {} + self.scale = config.scale or 1 + self.colours = config.colours or {G.C.BACKGROUND.D} + + if config.initialize then + for i = 1, 60 do + self.last_real_time = self.last_real_time - 15/60 + self:update(15/60) + self:move(15/60) + end + end + + if getmetatable(self) == Particles then + table.insert(G.I.MOVEABLE, self) + end +end + +function Particles:update(dt) + if G.SETTINGS.paused and not self.created_on_pause then self.last_real_time = G.TIMERS[self.timer_type] ; return end + local added_this_frame = 0 + while G.TIMERS[self.timer_type] > self.last_real_time + self.timer and (#self.particles < self.max or self.pulsed < self.pulse_max) and added_this_frame < 20 do + self.last_real_time = self.last_real_time + self.timer + local new_offset = { + x=self.fill and (0.5-math.random())*self.T.w or 0, + y=self.fill and (0.5-math.random())*self.T.h or 0 + } + if self.fill and self.T.r < 0.1 and self.T.r > -0.1 then + local newer_offset = { + x = math.sin(self.T.r)*new_offset.y + math.cos(self.T.r)*new_offset.x, + y = math.sin(self.T.r)*new_offset.x + math.cos(self.T.r)*new_offset.y, + } + new_offset = newer_offset + end + table.insert(self.particles, { + draw = false, + dir = math.random()*2*math.pi, + facing = math.random()*2*math.pi, + size = math.random()*0.5+0.1, + age = 0, + velocity = self.speed*(self.vel_variation*math.random() + (1-self.vel_variation))*0.7, + r_vel = 0.2*(0.5 - math.random()), + e_prev = 0, + e_curr = 0, + scale = 0, + visible_scale = 0, + time = G.TIMERS[self.timer_type], + colour = pseudorandom_element(self.colours), + offset = new_offset + }) + added_this_frame = added_this_frame + 1 + if self.pulsed <= self.pulse_max then self.pulsed = self.pulsed + 1 end + end +end + +function Particles:move(dt) + if G.SETTINGS.paused and not self.created_on_pause then return end + + Moveable.move(self, dt) + + if self.timer_type ~= 'REAL' then dt = dt*G.SPEEDFACTOR end + + for i=#self.particles,1,-1 do + self.particles[i].draw = true + self.particles[i].e_vel = self.particles[i].e_vel or dt*self.scale + self.particles[i].e_prev = self.particles[i].e_curr + self.particles[i].age = self.particles[i].age + dt + + self.particles[i].e_curr = math.min(2*math.min((self.particles[i].age/self.lifespan)*self.scale, self.scale*((self.lifespan - self.particles[i].age)/self.lifespan)), self.scale) + + self.particles[i].e_vel = (self.particles[i].e_curr - self.particles[i].e_prev)*self.scale*dt + (1-self.scale*dt)*self.particles[i].e_vel + + self.particles[i].scale = self.particles[i].scale + self.particles[i].e_vel + self.particles[i].scale = math.min(2*math.min((self.particles[i].age/self.lifespan)*self.scale, self.scale*((self.lifespan - self.particles[i].age)/self.lifespan)), self.scale) + + if self.particles[i].scale < 0 then + table.remove(self.particles, i) + else + self.particles[i].offset.x = self.particles[i].offset.x + self.particles[i].velocity*math.sin(self.particles[i].dir)*dt + self.particles[i].offset.y = self.particles[i].offset.y + self.particles[i].velocity*math.cos(self.particles[i].dir)*dt + self.particles[i].facing = self.particles[i].facing + self.particles[i].r_vel*dt + self.particles[i].velocity = math.max(0, self.particles[i].velocity - self.particles[i].velocity*0.07*dt) + end + end +end + +function Particles:fade(delay, to) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + timer = self.timer_type, + blockable = false, + blocking = false, + ref_value = 'fade_alpha', + ref_table = self, + ease_to = to or 1, + delay = delay + })) +end + +function Particles:draw(alpha) + alpha = alpha or 1 + prep_draw(self, 1) + love.graphics.translate(self.T.w/2, self.T.h/2) + for k, v in pairs(self.particles) do + if v.draw then + love.graphics.push() + love.graphics.setColor(v.colour[1], v.colour[2], v.colour[3], v.colour[4]*alpha*(1-self.fade_alpha)) + love.graphics.translate(v.offset.x, v.offset.y) + love.graphics.rotate(v.facing) + + love.graphics.rectangle('fill', -v.scale/2, -v.scale/2, v.scale, v.scale) -- origin in the middle + love.graphics.pop() + end + end + love.graphics.pop() + + add_to_drawhash(self) + self:draw_boundingrect() +end + +function Particles:remove() + if self.role.major then + for k, v in pairs(self.role.major.children) do + if v == self and type(k) == 'number' then + table.remove(self.role.major.children, k) + end + end + end + + remove_all(self.children) + + Moveable.remove(self) +end diff --git a/src/engine/profile.lua b/src/engine/profile.lua new file mode 100644 index 0000000..fdcb531 --- /dev/null +++ b/src/engine/profile.lua @@ -0,0 +1,188 @@ +local clock = os.clock + +--- Simple profiler written in Lua. +-- @module profile +-- @alias profile +local profile = {} + +-- function labels +local _labeled = {} +-- function definitions +local _defined = {} +-- time of last call +local _tcalled = {} +-- total execution time +local _telapsed = {} +-- number of calls +local _ncalls = {} +-- list of internal profiler functions +local _internal = {} + +--- This is an internal function. +-- @tparam string event Event type +-- @tparam number line Line number +-- @tparam[opt] table info Debug info table +function profile.hooker(event, line, info) + info = info or debug.getinfo(2, 'fnS') + local f = info.func + -- ignore the profiler itself + if _internal[f] or info.what ~= "Lua" then + return + end + -- get the function name if available + if info.name then + _labeled[f] = info.name + end + -- find the line definition + if not _defined[f] then + _defined[f] = info.short_src..":"..info.linedefined + _ncalls[f] = 0 + _telapsed[f] = 0 + end + if _tcalled[f] then + local dt = clock() - _tcalled[f] + _telapsed[f] = _telapsed[f] + dt + _tcalled[f] = nil + end + if event == "tail call" then + local prev = debug.getinfo(3, 'fnS') + profile.hooker("return", line, prev) + profile.hooker("call", line, info) + elseif event == 'call' then + _tcalled[f] = clock() + else + _ncalls[f] = _ncalls[f] + 1 + end +end + +--- Sets a clock function to be used by the profiler. +-- @tparam function func Clock function that returns a number +function profile.setclock(f) + assert(type(f) == "function", "clock must be a function") + clock = f +end + +--- Starts collecting data. +function profile.start() + if rawget(_G, 'jit') then + jit.off() + jit.flush() + end + debug.sethook(profile.hooker, "cr") +end + +--- Stops collecting data. +function profile.stop() + debug.sethook() + for f in pairs(_tcalled) do + local dt = clock() - _tcalled[f] + _telapsed[f] = _telapsed[f] + dt + _tcalled[f] = nil + end + -- merge closures + local lookup = {} + for f, d in pairs(_defined) do + local id = (_labeled[f] or '?')..d + local f2 = lookup[id] + if f2 then + _ncalls[f2] = _ncalls[f2] + (_ncalls[f] or 0) + _telapsed[f2] = _telapsed[f2] + (_telapsed[f] or 0) + _defined[f], _labeled[f] = nil, nil + _ncalls[f], _telapsed[f] = nil, nil + else + lookup[id] = f + end + end + collectgarbage('collect') +end + +--- Resets all collected data. +function profile.reset() + for f in pairs(_ncalls) do + _ncalls[f] = 0 + end + for f in pairs(_telapsed) do + _telapsed[f] = 0 + end + for f in pairs(_tcalled) do + _tcalled[f] = nil + end + collectgarbage('collect') +end + +--- This is an internal function. +-- @tparam function a First function +-- @tparam function b Second function +function profile.comp(a, b) + local dt = _telapsed[b] - _telapsed[a] + if dt == 0 then + return _ncalls[b] < _ncalls[a] + end + return dt < 0 +end + +--- Iterates all functions that have been called since the profile was started. +-- @tparam[opt] number limit Maximum number of rows +function profile.query(limit) + local t = {} + for f, n in pairs(_ncalls) do + if n > 0 then + t[#t + 1] = f + end + end + table.sort(t, profile.comp) + if limit then + while #t > limit do + table.remove(t) + end + end + for i, f in ipairs(t) do + local dt = 0 + if _tcalled[f] then + dt = clock() - _tcalled[f] + end + t[i] = { i, _labeled[f] or '?', _ncalls[f], _telapsed[f] + dt, _defined[f] } + end + return t +end + +local cols = { 3, 29, 11, 24, 32 } + +--- Generates a text report. +-- @tparam[opt] number limit Maximum number of rows +function profile.report(n) + local out = {} + local report = profile.query(n) + for i, row in ipairs(report) do + for j = 1, 5 do + local s = row[j] + local l2 = cols[j] + s = tostring(s) + local l1 = s:len() + if l1 < l2 then + s = s..(' '):rep(l2-l1) + elseif l1 > l2 then + s = s:sub(l1 - l2 + 1, l1) + end + row[j] = s + end + out[i] = table.concat(row, ' | ') + end + + local row = " +-----+-------------------------------+-------------+--------------------------+----------------------------------+ \n" + local col = " | # | Function | Calls | Time | Code | \n" + local sz = row..col..row + if #out > 0 then + sz = sz..' | '..table.concat(out, ' | \n | ')..' | \n' + end + return '\n'..sz..row +end + +-- store all internal profiler functions +for _, v in pairs(profile) do + if type(v) == "function" then + _internal[v] = true + end +end + +return profile diff --git a/src/engine/save_manager.lua b/src/engine/save_manager.lua new file mode 100644 index 0000000..a96efb7 --- /dev/null +++ b/src/engine/save_manager.lua @@ -0,0 +1,84 @@ +require "love.system" + +if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end + +require "love.timer" +require "love.thread" +require 'love.filesystem' +require "engine/object" +require "engine/string_packer" + +--vars needed for sound manager thread +CHANNEL = love.thread.getChannel("save_request") + + while true do + --Monitor the channel for any new requests + local request = CHANNEL:demand() -- Value from channel + if request then + --Saves progress for settings, unlocks, alerts and discoveries + if request.type == 'save_progress' then + local prefix_profile = (request.save_progress.SETTINGS.profile or 1)..'' + if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end + prefix_profile = prefix_profile..'/' + + if not love.filesystem.getInfo(prefix_profile..'meta.jkr') then + love.filesystem.append( prefix_profile..'meta.jkr', 'return {}' ) + end + + local meta = STR_UNPACK(get_compressed(prefix_profile..'meta.jkr') or 'return {}') + meta.unlocked = meta.unlocked or {} + meta.discovered = meta.discovered or {} + meta.alerted = meta.alerted or {} + + local _append = false + + for k, v in pairs(request.save_progress.UDA) do + if string.find(v, 'u') and not meta.unlocked[k] then + meta.unlocked[k] = true + _append = true + end + if string.find(v, 'd') and not meta.discovered[k] then + meta.discovered[k] = true + _append = true + end + if string.find(v, 'a') and not meta.alerted[k] then + meta.alerted[k] = true + _append = true + end + end + if _append then compress_and_save( prefix_profile..'meta.jkr', STR_PACK(meta)) end + + compress_and_save('settings.jkr', request.save_progress.SETTINGS) + compress_and_save(prefix_profile..'profile.jkr', request.save_progress.PROFILE) + + CHANNEL:push('done') + --Saves the settings file + elseif request.type == 'save_settings' then + compress_and_save('settings.jkr', request.save_settings) + compress_and_save(request.profile_num..'/profile.jkr', request.save_profile) + --Saves the metrics file + elseif request.type == 'save_metrics' then + compress_and_save('metrics.jkr', request.save_metrics) + --Saves any notifications + elseif request.type == 'save_notify' then + local prefix_profile = (request.profile_num or 1)..'' + if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end + prefix_profile = prefix_profile..'/' + + if not love.filesystem.getInfo(prefix_profile..'unlock_notify.jkr') then love.filesystem.append( prefix_profile..'unlock_notify.jkr', '') end + local unlock_notify = get_compressed(prefix_profile..'unlock_notify.jkr') or '' + + if request.save_notify and not string.find(unlock_notify, request.save_notify) then + compress_and_save( prefix_profile..'unlock_notify.jkr', unlock_notify..request.save_notify..'\n') + end + + --Saves the run + elseif request.type == 'save_run' then + local prefix_profile = (request.profile_num or 1)..'' + if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end + prefix_profile = prefix_profile..'/' + + compress_and_save(prefix_profile..'save.jkr', request.save_table) + end + end +end diff --git a/src/engine/sound_manager.lua b/src/engine/sound_manager.lua new file mode 100644 index 0000000..237e55a --- /dev/null +++ b/src/engine/sound_manager.lua @@ -0,0 +1,207 @@ +require "love.audio" +require "love.sound" +require "love.system" + +if (love.system.getOS() == 'OS X' )and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end + +--vars needed for sound manager thread +CHANNEL = love.thread.getChannel("sound_request") +LOAD_CHANNEL = love.thread.getChannel('load_channel') +LOAD_CHANNEL:push('audio thread start') +DISABLE_SFX = false + +--create all sounds from resources and play one each to load into mem +SOURCES = {} +local sound_files = love.filesystem.getDirectoryItems("resources/sounds") + +for _, filename in ipairs(sound_files) do + local extension = string.sub(filename, -4) + for i = 1, 1 do + if extension == '.ogg' then + LOAD_CHANNEL:push('audio file - '..filename) + local sound_code = string.sub(filename, 1, -5) + local s = { + sound = love.audio.newSource("resources/sounds/"..filename,string.find(sound_code,'music') and "stream" or 'static'), + filepath = "resources/sounds/"..filename + } + SOURCES[sound_code] = {} + table.insert(SOURCES[sound_code], s) + s.sound_code = sound_code + s.sound:setVolume(0) + love.audio.play(s.sound) + s.sound:stop() + end + end +end + +function PLAY_SOUND(args) + args.per = args.per or 1 + args.vol = args.vol or 1 + SOURCES[args.sound_code] = SOURCES[args.sound_code] or {} + + for _, s in ipairs(SOURCES[args.sound_code]) do + if s.sound and not s.sound:isPlaying() then + s.original_pitch = args.per + s.original_volume = args.vol + s.created_on_pause = args.overlay_menu + s.created_on_state = args.state + s.sfx_handled = 0 + s.transition_timer = 0 + SET_SFX(s, args) + love.audio.play(s.sound) + return s + end + end + + local should_stream = (string.find(args.sound_code,'music') or string.find(args.sound_code,'ambient')) + local s = {sound = love.audio.newSource("resources/sounds/"..args.sound_code..'.ogg', should_stream and "stream" or 'static')} + table.insert(SOURCES[args.sound_code], s) + s.sound_code = args.sound_code + s.original_pitch = args.per or 1 + s.original_volume = args.vol or 1 + s.created_on_pause = (args.overlay_menu and true or false) + s.created_on_state = args.state + s.sfx_handled = 0 + s.transition_timer = 0 + SET_SFX(s, args) + love.audio.play(s.sound) + return s +end + +function STOP_AUDIO() + for _, source in pairs(SOURCES) do + for _, s in pairs(source) do + if s.sound:isPlaying() then + s.sound:stop() + end + end + end +end + +function SET_SFX(s, args) + if string.find(s.sound_code,'music') then + if s.sound_code == args.desired_track then + s.current_volume = s.current_volume or 1 + s.current_volume = 1*(args.dt*3) + (1-(args.dt*3))*s.current_volume + else + s.current_volume = s.current_volume or 0 + s.current_volume = 0*(args.dt*3) + (1-(args.dt*3))*s.current_volume + end + s.sound:setVolume(s.current_volume*s.original_volume*(args.sound_settings.volume/100.0)*(args.sound_settings.music_volume/100.0)) + s.sound:setPitch(s.original_pitch*args.pitch_mod) + else + if s.temp_pitch ~= s.original_pitch then + s.sound:setPitch(s.original_pitch) + s.temp_pitch = s.original_pitch + end + local sound_vol = s.original_volume*(args.sound_settings.volume/100.0)*(args.sound_settings.game_sounds_volume/100.0) + if s.created_on_state == 13 then sound_vol = sound_vol*args.splash_vol end + if sound_vol <= 0 then + s.sound:stop() + else + s.sound:setVolume(sound_vol) + end + end + end + + function MODULATE(args) + for k, v in pairs(SOURCES) do + if (string.find(k,'music') and (args.desired_track ~= '')) then + if v[1] and v[1].sound and v[1].sound:isPlaying() then + else + RESTART_MUSIC(args) + break; + end + end + end + for k, v in pairs(SOURCES) do + local i=1 + while i <= #v do + if not v[i].sound:isPlaying() then + v[i].sound:release() + table.remove(v, i) + else + i = i + 1 + end + end + + for _, s in pairs(v) do + if s.sound and s.sound:isPlaying() and s.original_volume then + SET_SFX(s, args) + end + end + end + end + + function RESTART_MUSIC(args) + for k, v in pairs(SOURCES) do + if string.find(k,'music') then + for i, s in ipairs(v) do + s.sound:stop() + end + SOURCES[k] = {} + args.per = 0.7 + args.vol = 0.6 + args.sound_code = k + local s = PLAY_SOUND(args) + s.initialized = true + end + end + end + + function AMBIENT(args) + for k, v in pairs(SOURCES) do + if args.ambient_control[k] then + local start_ambient = args.ambient_control[k].vol*(args.sound_settings.volume/100.0)*(args.sound_settings.game_sounds_volume/100.0) > 0 + + for i, s in ipairs(v) do + if s.sound and s.sound:isPlaying() and s.original_volume then + s.original_volume = args.ambient_control[k].vol + SET_SFX(s, args) + start_ambient = false + end + end + + if start_ambient then + args.sound_code = k + args.vol = args.ambient_control[k].vol + args.per = args.ambient_control[k].per + PLAY_SOUND(args) + end + end + end + end + + function RESET_STATES(state) + for k, v in pairs(SOURCES) do + for i, s in ipairs(v) do + s.created_on_state = state + end + end + end + + LOAD_CHANNEL:push('finished') + + while true do + --Monitor the channel for any new requests + local request = CHANNEL:demand() -- Value from channel + if request then + --If the request is for an update to the music track, handle it here + if false then elseif request.type == 'sound' then + PLAY_SOUND(request) + elseif request.type == 'stop' then + STOP_AUDIO() + elseif request.type == 'modulate' then + MODULATE(request) + if request.ambient_control then AMBIENT(request) end + elseif request.type == 'restart_music' then + RESTART_MUSIC() + elseif request.type == 'reset_states' then + for k, v in pairs(SOURCES) do + for i, s in ipairs(v) do + s.created_on_state = request.state + end + end + end + end +end diff --git a/src/engine/sprite.lua b/src/engine/sprite.lua new file mode 100644 index 0000000..cd9ce7d --- /dev/null +++ b/src/engine/sprite.lua @@ -0,0 +1,216 @@ +--Class +Sprite = Moveable:extend() + +--Class Methods +function Sprite:init(X, Y, W, H, new_sprite_atlas, sprite_pos) + Moveable.init(self,X, Y, W, H) + self.CT = self.VT + self.atlas = new_sprite_atlas + self.scale = {x=self.atlas.px, y=self.atlas.py} + self.scale_mag = math.min(self.scale.x/W,self.scale.y/H) + self.zoom = true + + self:set_sprite_pos(sprite_pos) + + if getmetatable(self) == Sprite then + table.insert(G.I.SPRITE, self) + end +end + +function Sprite:reset() + self.atlas = G.ASSET_ATLAS[self.atlas.name] + self:set_sprite_pos(self.sprite_pos) +end + +function Sprite:set_sprite_pos(sprite_pos) + if sprite_pos and sprite_pos.v then + self.sprite_pos = {x = (math.random(sprite_pos.v)-1), y = sprite_pos.y} + else + self.sprite_pos = sprite_pos or {x=0,y=0} + end + self.sprite_pos_copy = {x = self.sprite_pos.x, y = self.sprite_pos.y} + + self.sprite = love.graphics.newQuad( + self.sprite_pos.x*self.atlas.px, + self.sprite_pos.y*self.atlas.py, + self.scale.x, + self.scale.y, self.atlas.image:getDimensions()) + + self.image_dims = {} + self.image_dims[1], self.image_dims[2] = self.atlas.image:getDimensions() +end + +function Sprite:get_pos_pixel() + self.RETS.get_pos_pixel = self.RETS.get_pos_pixel or {} + self.RETS.get_pos_pixel[1] = self.sprite_pos.x + self.RETS.get_pos_pixel[2] = self.sprite_pos.y + self.RETS.get_pos_pixel[3] = self.atlas.px --self.scale.x + self.RETS.get_pos_pixel[4] = self.atlas.py --self.scale.y + return self.RETS.get_pos_pixel +end + +function Sprite:get_image_dims() + return self.image_dims +end + +function Sprite:define_draw_steps(draw_step_definitions) + self.draw_steps = EMPTY(self.draw_steps) + for k, v in ipairs(draw_step_definitions) do + self.draw_steps[#self.draw_steps+1] = { + shader = v.shader or 'dissolve', + shadow_height = v.shadow_height or nil, + send = v.send or nil, + no_tilt = v.no_tilt or nil, + other_obj = v.other_obj or nil, + ms = v.ms or nil, + mr = v.mr or nil, + mx = v.mx or nil, + my = v.my or nil + } + end +end + +function Sprite:draw_shader(_shader, _shadow_height, _send, _no_tilt, other_obj, ms, mr, mx, my, custom_shader, tilt_shadow) + if G.SETTINGS.reduced_motion then _no_tilt = true end + local _draw_major = self.role.draw_major or self + if _shadow_height then + self.VT.y = self.VT.y - _draw_major.shadow_parrallax.y*_shadow_height + self.VT.x = self.VT.x - _draw_major.shadow_parrallax.x*_shadow_height + self.VT.scale = self.VT.scale*(1-0.2*_shadow_height) + end + + if custom_shader then + if _send then + for k, v in ipairs(_send) do + G.SHADERS[_shader]:send(v.name, v.val or (v.func and v.func()) or v.ref_table[v.ref_value]) + end + end + elseif _shader == 'vortex' then + G.SHADERS['vortex']:send('vortex_amt', G.TIMERS.REAL - (G.vortex_time or 0)) + else + self.ARGS.prep_shader = self.ARGS.prep_shader or {} + self.ARGS.prep_shader.cursor_pos = self.ARGS.prep_shader.cursor_pos or {} + self.ARGS.prep_shader.cursor_pos[1] = _draw_major.tilt_var and _draw_major.tilt_var.mx*G.CANV_SCALE or G.CONTROLLER.cursor_position.x*G.CANV_SCALE + self.ARGS.prep_shader.cursor_pos[2] = _draw_major.tilt_var and _draw_major.tilt_var.my*G.CANV_SCALE or G.CONTROLLER.cursor_position.y*G.CANV_SCALE + + G.SHADERS[_shader or 'dissolve']:send('mouse_screen_pos', self.ARGS.prep_shader.cursor_pos) + G.SHADERS[_shader or 'dissolve']:send('screen_scale', G.TILESCALE*G.TILESIZE*(_draw_major.mouse_damping or 1)*G.CANV_SCALE) + G.SHADERS[_shader or 'dissolve']:send('hovering',((_shadow_height and not tilt_shadow) or _no_tilt) and 0 or (_draw_major.hover_tilt or 0)*(tilt_shadow or 1)) + G.SHADERS[_shader or 'dissolve']:send("dissolve",math.abs(_draw_major.dissolve or 0)) + G.SHADERS[_shader or 'dissolve']:send("time",123.33412*(_draw_major.ID/1.14212 or 12.5123152)%3000) + G.SHADERS[_shader or 'dissolve']:send("texture_details",self:get_pos_pixel()) + G.SHADERS[_shader or 'dissolve']:send("image_details",self:get_image_dims()) + G.SHADERS[_shader or 'dissolve']:send("burn_colour_1",_draw_major.dissolve_colours and _draw_major.dissolve_colours[1] or G.C.CLEAR) + G.SHADERS[_shader or 'dissolve']:send("burn_colour_2",_draw_major.dissolve_colours and _draw_major.dissolve_colours[2] or G.C.CLEAR) + G.SHADERS[_shader or 'dissolve']:send("shadow",(not not _shadow_height)) + if _send then G.SHADERS[_shader or 'dissolve']:send(_shader,_send) end + end + + love.graphics.setShader( G.SHADERS[_shader or 'dissolve'], G.SHADERS[_shader or 'dissolve']) + + if other_obj then + self:draw_from(other_obj, ms, mr, mx, my) + else + self:draw_self() + end + + love.graphics.setShader() + + if _shadow_height then + self.VT.y = self.VT.y + _draw_major.shadow_parrallax.y*_shadow_height + self.VT.x = self.VT.x + _draw_major.shadow_parrallax.x*_shadow_height + self.VT.scale = self.VT.scale/(1-0.2*_shadow_height) + end +end + +function Sprite:draw_self(overlay) + if not self.states.visible then return end + if self.sprite_pos.x ~= self.sprite_pos_copy.x or self.sprite_pos.y ~= self.sprite_pos_copy.y then + self:set_sprite_pos(self.sprite_pos) + end + prep_draw(self, 1) + love.graphics.scale(1/(self.scale.x/self.VT.w), 1/(self.scale.y/self.VT.h)) + love.graphics.setColor(overlay or G.BRUTE_OVERLAY or G.C.WHITE) + if self.video then + self.video_dims = self.video_dims or { + w = self.video:getWidth(), + h = self.video:getHeight(), + } + love.graphics.draw( + self.video, + 0 ,0, + 0, + self.VT.w/(self.T.w)/(self.video_dims.w/self.scale.x), + self.VT.h/(self.T.h)/(self.video_dims.h/self.scale.y) + ) + else + love.graphics.draw( + self.atlas.image, + self.sprite, + 0 ,0, + 0, + self.VT.w/(self.T.w), + self.VT.h/(self.T.h) + ) + end + love.graphics.pop() + add_to_drawhash(self) + self:draw_boundingrect() + if self.shader_tab then love.graphics.setShader() end +end + +function Sprite:draw(overlay) + if not self.states.visible then return end + if self.draw_steps then + for k, v in ipairs(self.draw_steps) do + self:draw_shader(v.shader, v.shadow_height, v.send, v.no_tilt, v.other_obj, v.ms, v.mr, v.mx, v.my, not not v.send) + end + else + self:draw_self(overlay) + end + + add_to_drawhash(self) + for k, v in pairs(self.children) do + if k ~= 'h_popup' then v:draw() end + end + add_to_drawhash(self) + self:draw_boundingrect() +end + +function Sprite:draw_from(other_obj, ms, mr, mx, my) + self.ARGS.draw_from_offset = self.ARGS.draw_from_offset or {} + self.ARGS.draw_from_offset.x = mx or 0 + self.ARGS.draw_from_offset.y = my or 0 + prep_draw(other_obj, (1 + (ms or 0)), (mr or 0), self.ARGS.draw_from_offset, true) + love.graphics.scale(1/(other_obj.scale_mag or other_obj.VT.scale)) + love.graphics.setColor(G.BRUTE_OVERLAY or G.C.WHITE) + love.graphics.draw( + self.atlas.image, + self.sprite, + -(other_obj.T.w/2 -other_obj.VT.w/2)*10, + 0, + 0, + other_obj.VT.w/(other_obj.T.w), + other_obj.VT.h/(other_obj.T.h) + ) + self:draw_boundingrect() + love.graphics.pop() +end + +function Sprite:remove() + if self.video then + self.video:release() + end + for k, v in pairs(G.ANIMATIONS) do + if v == self then + table.remove(G.ANIMATIONS, k) + end + end + for k, v in pairs(G.I.SPRITE) do + if v == self then + table.remove(G.I.SPRITE, k) + end + end + + Moveable.remove(self) +end diff --git a/src/engine/string_packer.lua b/src/engine/string_packer.lua new file mode 100644 index 0000000..0ff7ada --- /dev/null +++ b/src/engine/string_packer.lua @@ -0,0 +1,72 @@ +--[[ +MIT License +Copyright (c) 2017 Robert Herlihy +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +]] + +--I modified this A LOT. Needed to make it quicker if it is being saved to file every few seconds during a game +function STR_PACK(data, recursive) + local ret_str = (recursive and "" or "return ").."{" + + for i, v in pairs(data) do + local type_i, type_v = type(i), type(v) + assert((type_i ~= "table"), "Data table cannot have an table as a key reference") + if type_i == "string" then + i = '['..string.format("%q",i)..']' + else + i = "["..i.."]" + end + if type_v == "table" then + if v.is and v:is(Object) then + v = [["]].."MANUAL_REPLACE"..[["]] + else + v = STR_PACK(v, true) + end + else + if type_v == "string" then v = string.format("%q", v) end + if type_v == "boolean" then v = v and "true" or "false" end + end + ret_str = ret_str..i.."="..v.."," + end + + return ret_str.."}" +end + +function STR_UNPACK(str) + return assert(loadstring(str))() +end + +function get_compressed(_file) + local file_data = love.filesystem.getInfo(_file) + if file_data ~= nil then + local file_string = love.filesystem.read(_file) + if file_string ~= '' then + if string.sub(file_string, 1, 6) ~= 'return' then + local success = nil + success, file_string = pcall(love.data.decompress, 'string', 'deflate', file_string) + if not success then return nil end + end + return file_string + end + end +end + +function compress_and_save(_file, _data) + local save_string = type(_data) == 'table' and STR_PACK(_data) or _data + save_string = love.data.compress('string', 'deflate', save_string, 1) + love.filesystem.write(_file,save_string) +end diff --git a/src/engine/text.lua b/src/engine/text.lua new file mode 100644 index 0000000..e48a7b6 --- /dev/null +++ b/src/engine/text.lua @@ -0,0 +1,315 @@ +--Class +DynaText = Moveable:extend() + +--Class Methods +function DynaText:init(config) + config = config or {} + self.config = config + self.shadow = config.shadow + self.scale = config.scale or 1 + self.pop_in_rate = config.pop_in_rate or 3 + self.bump_rate = config.bump_rate or 2.666 + self.bump_amount = config.bump_amount or 1 + self.font = config.font or G.LANG.font + if config.string and type(config.string) ~= 'table' then config.string = {config.string} end + self.string = (config.string and type(config.string) == 'table' and config.string[1]) or {'HELLO WORLD'} + self.text_offset = { + x = self.font.TEXT_OFFSET.x*self.scale + (self.config.x_offset or 0), + y = self.font.TEXT_OFFSET.y*self.scale + (self.config.y_offset or 0), + } + self.colours = config.colours or {G.C.RED} + self.created_time = G.TIMERS.REAL + self.silent = (config.silent) + + self.start_pop_in = self.config.pop_in + + config.W = 0 + config.H = 0 + + self.strings = {} + self.focused_string = 1 + + self:update_text(true) + if self.config.maxw and self.config.W > self.config.maxw then + self.start_pop_in = self.config.pop_in + self.scale = self.scale*(self.config.maxw/self.config.W) + self:update_text(true) + end + + if #self.strings > 1 then + self.pop_delay = self.config.pop_delay or 1.5 + self:pop_out(4) + end + + Moveable.init(self,config.X or 0, config.Y or 0, config.W, config.H) + + self.T.r = self.config.text_rot or 0 + + self.states.hover.can = false + self.states.click.can = false + self.states.collide.can = false + self.states.drag.can = false + self.states.release_on.can = false + + self:set_role{ + wh_bond = 'Weak', + scale_bond = 'Weak' + } + + if getmetatable(self) == DynaText then + table.insert(G.I.MOVEABLE, self) + end +end + +function DynaText:update(dt) + self:update_text() + self:align_letters() +end + +function DynaText:update_text(first_pass) + self.config.W = 0 + self.config.H = 0 + + for k, v in ipairs(self.config.string) do + if (type(v) == 'table' and v.ref_table) or first_pass then + local part_a, part_b = 0,1000000 + local new_string = v + local outer_colour = nil + local inner_colour = nil + local part_scale = 1 + if type(v) == 'table' and (v.ref_table or v.string) then + new_string = (v.prefix or '')..tostring(v.ref_table and v.ref_table[v.ref_value] or v.string)..(v.suffix or '') + part_a = #(v.prefix or '') + part_b = #new_string - #(v.suffix or '') + if v.scale then part_scale = v.scale end + if first_pass then + outer_colour = v.outer_colour or nil + inner_colour = v.colour or nil + end + v = new_string + end + + self.strings[k] = self.strings[k] or {} + local old_string = self.strings[k].string + if old_string ~= new_string or first_pass then + if self.start_pop_in then self.reset_pop_in = true end + self.reset_pop_in = self.reset_pop_in or self.config.reset_pop_in + if not self.reset_pop_in then + self.config.pop_out = nil + self.config.pop_in = nil + else + self.config.pop_in = self.config.pop_in or 0 + self.created_time = G.TIMERS.REAL + end + self.strings[k].string = v + local old_letters = self.strings[k].letters + local tempW = 0 + local tempH = 0 + local current_letter = 1 + self.strings[k].letters = {}--EMPTY(self.strings[k].letters) + + for _, c in utf8.chars(v) do + local old_letter = old_letters and old_letters[current_letter] or nil + local let_tab = {letter = love.graphics.newText(self.font.FONT, c), char = c, scale = old_letter and old_letter.scale or part_scale} + self.strings[k].letters[current_letter] = let_tab + local tx = self.font.FONT:getWidth(c)*self.scale*part_scale*G.TILESCALE*self.font.FONTSCALE + 2.7*(self.config.spacing or 0)*G.TILESCALE*self.font.FONTSCALE + local ty = self.font.FONT:getHeight(c)*self.scale*part_scale*G.TILESCALE*self.font.FONTSCALE*self.font.TEXT_HEIGHT_SCALE + let_tab.offset = old_letter and old_letter.offset or {x = 0, y = 0} + let_tab.dims = {x = tx/(self.font.FONTSCALE*G.TILESCALE), y = ty/(self.font.FONTSCALE*G.TILESCALE)} + let_tab.pop_in = first_pass and (old_letter and old_letter.pop_in or (self.config.pop_in and 0 or 1)) or 1 + let_tab.prefix = current_letter <= part_a and outer_colour or nil + let_tab.suffix = current_letter > part_b and outer_colour or nil + let_tab.colour = inner_colour or nil + if k > 1 then let_tab.pop_in = 0 end + tempW = tempW + tx/(G.TILESIZE*G.TILESCALE) + tempH = math.max(ty/(G.TILESIZE*G.TILESCALE), tempH) + current_letter = current_letter + 1 + end + + self.strings[k].W = tempW + self.strings[k].H = tempH + end + end + + if self.strings[k].W > self.config.W then self.config.W = self.strings[k].W; self.strings[k].W_offset = 0 end + if self.strings[k].H > self.config.H then self.config.H = self.strings[k].H; self.strings[k].H_offset = 0 end + end + + if self.T then + if (self.T.w ~= self.config.W or self.T.h ~= self.config.H) and (not first_pass or self.reset_pop_in) then + self.ui_object_updated = true + self.non_recalc = self.config.non_recalc + end + self.T.w = self.config.W + self.T.h = self.config.H + end + + self.reset_pop_in = false + self.start_pop_in = false + + for k, v in ipairs(self.strings) do + v.W_offset = 0.5*(self.config.W - v.W) + v.H_offset = 0.5*(self.config.H - v.H + (self.config.offset_y or 0)) + end +end + +function DynaText:pop_out(pop_out_timer) + self.config.pop_out = pop_out_timer or 1 + self.pop_out_time = G.TIMERS.REAL + (self.pop_delay or 0) +end + +function DynaText:pop_in(pop_in_timer) + self.reset_pop_in = true + self.config.pop_out = nil + self.config.pop_in = pop_in_timer or 0 + self.created_time = G.TIMERS.REAL + + for k, letter in ipairs(self.strings[self.focused_string].letters) do + letter.pop_in = 0 + end + + self:update_text() +end + +function DynaText:align_letters() + if self.pop_cycle then + self.focused_string = (self.config.random_element and math.random(1, #self.strings)) or self.focused_string == #self.strings and 1 or self.focused_string+1 + self.pop_cycle = false + for k, letter in ipairs(self.strings[self.focused_string].letters) do + letter.pop_in = 0 + end + self.config.pop_in = 0.1 + self.config.pop_out = nil + self.created_time = G.TIMERS.REAL + end + self.string = self.strings[self.focused_string].string + for k, letter in ipairs(self.strings[self.focused_string].letters) do + if self.config.pop_out then + letter.pop_in = math.min(1, math.max((self.config.min_cycle_time or 1)-(G.TIMERS.REAL - self.pop_out_time)*self.config.pop_out/(self.config.min_cycle_time or 1), 0)) + letter.pop_in = letter.pop_in*letter.pop_in + if k == #self.strings[self.focused_string].letters and letter.pop_in <= 0 and #self.strings > 1 then self.pop_cycle = true end + elseif self.config.pop_in then + local prev_pop_in = letter.pop_in + letter.pop_in = math.min(1, math.max((G.TIMERS.REAL - self.config.pop_in - self.created_time)*#self.string*self.pop_in_rate - k + 1, self.config.min_cycle_time == 0 and 1 or 0)) + letter.pop_in = letter.pop_in*letter.pop_in + if prev_pop_in <=0 and letter.pop_in > 0 and not self.silent and + (#self.string < 10 or k%2 == 0) then + if self.T.x > G.ROOM.T.w+2 or + self.T.y > G.ROOM.T.h+2 or + self.T.x <-2 or + self.T.y <-2 then else + play_sound('paper1', 0.45+0.05*math.random()+(0.3/#self.string)*k + (self.config.pitch_shift or 0)) + end + end + if k == #self.strings[self.focused_string].letters and letter.pop_in >= 1 then + if #self.strings > 1 then + self.pop_delay = (G.TIMERS.REAL - self.config.pop_in - self.created_time + (self.config.pop_delay or 1.5)) + self:pop_out(4) + else + self.config.pop_in = nil + end + end + end + letter.r = 0 + letter.scale = 1 + if self.config.rotate then letter.r = (self.config.rotate == 2 and -1 or 1)*(0.2*(-#self.strings[self.focused_string].letters/2 - 0.5 + k)/(#self.strings[self.focused_string].letters)+ (G.SETTINGS.reduced_motion and 0 or 1)*0.02*math.sin(2*G.TIMERS.REAL+k)) end + if self.config.pulse then + letter.scale = letter.scale + (G.SETTINGS.reduced_motion and 0 or 1)*(1/self.config.pulse.width)*self.config.pulse.amount*(math.max( + math.min((self.config.pulse.start - G.TIMERS.REAL)*self.config.pulse.speed + k + self.config.pulse.width, + (G.TIMERS.REAL - self.config.pulse.start)*self.config.pulse.speed - k + self.config.pulse.width+ 2), + 0)) + letter.r = letter.r + (G.SETTINGS.reduced_motion and 0 or 1)*(letter.scale - 1)*(0.02*(-#self.strings[self.focused_string].letters/2 - 0.5 + k)) + if self.config.pulse.start > G.TIMERS.REAL + 2*self.config.pulse.speed*#self.strings[self.focused_string].letters then + self.config.pulse = nil + end + end + if self.config.quiver then + letter.scale = letter.scale + (G.SETTINGS.reduced_motion and 0 or 1)*(0.1*self.config.quiver.amount) + letter.r = letter.r + (G.SETTINGS.reduced_motion and 0 or 1)*0.3*self.config.quiver.amount*( + math.sin(41.12342*G.TIMERS.REAL*self.config.quiver.speed + k*1223.2) + + math.cos(63.21231*G.TIMERS.REAL*self.config.quiver.speed + k*1112.2)*math.sin(36.1231*G.TIMERS.REAL*self.config.quiver.speed) + + math.cos(95.123*G.TIMERS.REAL*self.config.quiver.speed + k*1233.2) - + math.sin(30.133421*G.TIMERS.REAL*self.config.quiver.speed + k*123.2)) + end + if self.config.float then letter.offset.y = (G.SETTINGS.reduced_motion and 0 or 1)*math.sqrt(self.scale)*(2+(self.font.FONTSCALE/G.TILESIZE)*2000*math.sin(2.666*G.TIMERS.REAL+200*k)) + 60*(letter.scale-1) end + if self.config.bump then letter.offset.y = (G.SETTINGS.reduced_motion and 0 or 1)*self.bump_amount*math.sqrt(self.scale)*7*math.max(0, (5+self.bump_rate)*math.sin(self.bump_rate*G.TIMERS.REAL+200*k) - 3 - self.bump_rate) end + end +end + +function DynaText:set_quiver(amt) + self.config.quiver = { + speed = 0.5, + amount = amt or 0.7, + silent = false + } +end + +function DynaText:pulse(amt) + self.config.pulse = { + speed = 40, + width = 2.5, + start = G.TIMERS.REAL, + amount = amt or 0.2, + silent = false + } +end + +function DynaText:draw() + if self.children.particle_effect then self.children.particle_effect:draw() end + + if self.shadow then + prep_draw(self, 1) + love.graphics.translate(self.strings[self.focused_string].W_offset + self.text_offset.x*self.font.FONTSCALE/G.TILESIZE, self.strings[self.focused_string].H_offset + self.text_offset.y*self.font.FONTSCALE/G.TILESIZE) + if self.config.spacing then love.graphics.translate(self.config.spacing*self.font.FONTSCALE/G.TILESIZE, 0) end + if self.config.shadow_colour then + love.graphics.setColor(self.config.shadow_colour) + else + love.graphics.setColor(0, 0, 0, 0.3*self.colours[1][4]) + end + for k, letter in ipairs(self.strings[self.focused_string].letters) do + local real_pop_in = self.config.min_cycle_time == 0 and 1 or letter.pop_in + love.graphics.draw( + letter.letter, + 0.5*(letter.dims.x - letter.offset.x)*self.font.FONTSCALE/G.TILESIZE -self.shadow_parrallax.x*self.scale/(G.TILESIZE), + 0.5*(letter.dims.y)*self.font.FONTSCALE/G.TILESIZE -self.shadow_parrallax.y*self.scale/(G.TILESIZE), + letter.r or 0, + real_pop_in*self.scale*self.font.FONTSCALE/G.TILESIZE, + real_pop_in*self.scale*self.font.FONTSCALE/G.TILESIZE, + 0.5*letter.dims.x/self.scale, + 0.5*letter.dims.y/self.scale + ) + love.graphics.translate(letter.dims.x*self.font.FONTSCALE/G.TILESIZE, 0) + end + love.graphics.pop() + end + + prep_draw(self, 1) + love.graphics.translate(self.strings[self.focused_string].W_offset + self.text_offset.x*self.font.FONTSCALE/G.TILESIZE, self.strings[self.focused_string].H_offset + self.text_offset.y*self.font.FONTSCALE/G.TILESIZE) + if self.config.spacing then love.graphics.translate(self.config.spacing*self.font.FONTSCALE/G.TILESIZE, 0) end + self.ARGS.draw_shadow_norm = self.ARGS.draw_shadow_norm or {} + local _shadow_norm = self.ARGS.draw_shadow_norm + _shadow_norm.x, _shadow_norm.y = + self.shadow_parrallax.x/math.sqrt(self.shadow_parrallax.y*self.shadow_parrallax.y + self.shadow_parrallax.x*self.shadow_parrallax.x)*self.font.FONTSCALE/G.TILESIZE, + self.shadow_parrallax.y/math.sqrt(self.shadow_parrallax.y*self.shadow_parrallax.y + self.shadow_parrallax.x*self.shadow_parrallax.x)*self.font.FONTSCALE/G.TILESIZE + + for k, letter in ipairs(self.strings[self.focused_string].letters) do + local real_pop_in = self.config.min_cycle_time == 0 and 1 or letter.pop_in + love.graphics.setColor(letter.prefix or letter.suffix or letter.colour or self.colours[k%#self.colours + 1]) + + love.graphics.draw( + letter.letter, + 0.5*(letter.dims.x - letter.offset.x)*self.font.FONTSCALE/G.TILESIZE + _shadow_norm.x, + 0.5*(letter.dims.y - letter.offset.y)*self.font.FONTSCALE/G.TILESIZE + _shadow_norm.y, + letter.r or 0, + real_pop_in*letter.scale*self.scale*self.font.FONTSCALE/G.TILESIZE, + real_pop_in*letter.scale*self.scale*self.font.FONTSCALE/G.TILESIZE, + 0.5*letter.dims.x/(self.scale), + 0.5*letter.dims.y/(self.scale) + ) + love.graphics.translate(letter.dims.x*self.font.FONTSCALE/G.TILESIZE, 0) + end + love.graphics.pop() + + add_to_drawhash(self) + self:draw_boundingrect() +end diff --git a/src/engine/ui.lua b/src/engine/ui.lua new file mode 100644 index 0000000..9001108 --- /dev/null +++ b/src/engine/ui.lua @@ -0,0 +1,1054 @@ +--Class +UIBox = Moveable:extend() + +--The base level and container of a graph of 1 or more UIElements. These UIEs are\ +--essentially a node based UI implementation. As the root node of the graph, this\ +--node is the first called for any movement, updates, or changes to ensure that all child\ +--nodes are updated and modified in the correct order.\\ +--The UI_definitions file houses the majority of the definition tables needed for UIBox initialization. +-- +---@param args {T: table, definition: table, config: table} +--**T** A standard transform in game units describing the inital position and size of the object with x, y, w, h\ +--ex - {x = 1, y = 5, w = 2, h = 2, r = 0} +-- +--**definition** A table containing a valid UIBox definition. These are mostly generated from UI_definitions +-- +--**config** A configuration table for the UIBox +--ex - { align = 'cm', offset = {x = 1, y = 1}, parent_rect = A, attach_rect = B, can_collide = true } +function UIBox:init(args) + --First initialize the moveable + Moveable.init(self,{args.T}) + + --Initialization of fields + self.states.drag.can = false + self.draw_layers = {} --if we need to explicitly change the draw order of the UIEs + + --The definition table that contains the schematic of this UIBox + self.definition = args.definition + + if args.config then + self.config = args.config + args.config.major = args.config.major or args.config.parent or self + + self:set_alignment({ + major = args.config.major, + type = args.config.align or args.config.type or '', + bond = args.config.bond or 'Strong', + offset = args.config.offset or {x=0,y=0}, + lr_clamp = args.config.lr_clamp + }) + self:set_role{ + xy_bond = args.config.xy_bond, + r_bond = args.config.r_bond, + wh_bond = args.config.wh_bond or 'Weak', + scale_bond = args.config.scale_bond or 'Weak' + } + self.states.collide.can = true + + if args.config.can_collide == nil then + self.states.collide.can = true + else + self.states.collide.can = args.config.can_collide + end + + self.parent = self.config.parent + end + + --inherit the layered_parallax from the parent if there is any + --self.layered_parallax = self.role.major and self.role.major.layered_parallax or self.layered_parallax + + --Initialization of the UIBox from the definition + --First, set parent-child relationships to create the tree structure of the box + + self:set_parent_child(self.definition, nil) + --Set the midpoint for any future alignments to use + self.Mid = self.Mid or self.UIRoot + --Calculate the correct and width/height and offset for each node + self:calculate_xywh(self.UIRoot, self.T) + + --set the transform w/h to equal that of the calculated box + self.T.w = self.UIRoot.T.w + self.T.h = self.UIRoot.T.h + --Then, calculate the correct width and height for each container + self.UIRoot:set_wh() + --Then, set all of the correct alignments for the ui elements\ + + self.UIRoot:set_alignments() + + self:align_to_major() + self.VT.x, self.VT.y = self.T.x, self.T.y + self.VT.w, self.VT.h = self.T.w, self.T.h + + if self.Mid ~= self and self.Mid.parent and false then + self.VT.x = self.VT.x - self.Mid.role.offset.x + (self.Mid.parent.config.padding or 0) + self.VT.y = self.VT.y - self.Mid.role.offset.y + (self.Mid.parent.config.padding or 0) + end + + if self.alignment and self.alignment.lr_clamp then + self:lr_clamp() + end + + self.UIRoot:initialize_VT(true) + if getmetatable(self) == UIBox then + if args.config.instance_type then + table.insert(G.I[args.config.instance_type], self) + else + table.insert(G.I.UIBOX, self) + end + end +end + +function UIBox:get_UIE_by_ID(id, node) + if not node then node = self.UIRoot end + if node.config and node.config.id == id then return node end + for k, v in pairs(node.children) do + local res = self:get_UIE_by_ID(id, v) + if res then + return res + elseif v.config.object and v.config.object.get_UIE_by_ID then + res = v.config.object:get_UIE_by_ID(id, nil) + if res then + return res + end + end + end + return nil +end + +function UIBox:calculate_xywh(node, _T, recalculate, _scale) + node.ARGS.xywh_node_trans = node.ARGS.xywh_node_trans or {} + local _nt = node.ARGS.xywh_node_trans + local _ct = {} + + _ct.x, _ct.y, _ct.w, _ct.h = 0,0,0,0 + + local padding = node.config.padding or G.UIT.padding + --current node does not contain anything + if node.UIT == G.UIT.B or node.UIT == G.UIT.T or node.UIT == G.UIT.O then + _nt.x, _nt.y, _nt.w, _nt.h = + _T.x, + _T.y, + node.config.w or (node.config.object and node.config.object.T.w), + node.config.h or (node.config.object and node.config.object.T.h) + + if node.UIT == G.UIT.T then + node.config.text_drawable = nil + local scale = node.config.scale or 1 + if node.config.ref_table and node.config.ref_value then + node.config.text = tostring(node.config.ref_table[node.config.ref_value]) + if node.config.func and not recalculate then G.FUNCS[node.config.func](node) end + end + if not node.config.text then node.config.text = '[UI ERROR]' end + node.config.lang = node.config.lang or G.LANG + local tx = node.config.lang.font.FONT:getWidth(node.config.text)*node.config.lang.font.squish*scale*G.TILESCALE*node.config.lang.font.FONTSCALE + local ty = node.config.lang.font.FONT:getHeight()*scale*G.TILESCALE*node.config.lang.font.FONTSCALE*node.config.lang.font.TEXT_HEIGHT_SCALE + if node.config.vert then local thunk = tx; tx = ty; ty = thunk end + _nt.x, _nt.y, _nt.w, _nt.h = + _T.x, + _T.y, + tx/(G.TILESIZE*G.TILESCALE), + ty/(G.TILESIZE*G.TILESCALE) + + node.content_dimensions = node.content_dimensions or {} + node.content_dimensions.w = _T.w + node.content_dimensions.h = _T.h + node:set_values(_nt, recalculate) + elseif node.UIT == G.UIT.B or node.UIT == G.UIT.O then + node.content_dimensions = node.content_dimensions or {} + node.content_dimensions.w = _nt.w + node.content_dimensions.h = _nt.h + node:set_values(_nt, recalculate) + end + return _nt.w, _nt.h + else --For all other node containers, treat them explicitly like a column + for i = 1, 2 do + if i == 1 or (i == 2 and ((node.config.maxw and _ct.w > node.config.maxw) or (node.config.maxh and _ct.h > node.config.maxh))) then + local fac = _scale or 1 + if i == 2 then + local restriction = node.config.maxw or node.config.maxh + fac = fac*restriction/(node.config.maxw and _ct.w or _ct.h) + end + _nt.x, _nt.y, _nt.w, _nt.h = + _T.x, + _T.y, + node.config.minw or 0, + node.config.minh or 0 + + if node.UIT == G.UIT.ROOT then + _nt.x, _nt.y, _nt.w, _nt.h = 0, 0, node.config.minw or 0, node.config.minh or 0 + end + _ct.x, _ct.y, _ct.w, _ct.h = _nt.x+padding, _nt.y+padding, 0, 0 + local _tw, _th + for k, v in ipairs(node.children) do + if getmetatable(v) == UIElement then + if v.config and v.config.scale then v.config.scale = v.config.scale*fac end + _tw, _th = self:calculate_xywh(v, _ct, recalculate, fac) + if _th and _tw then + if v.UIT == G.UIT.R then + _ct.h = _ct.h + _th + padding + _ct.y = _ct.y + _th + padding + if _tw + padding > _ct.w then _ct.w = _tw + padding end + if v.config and v.config.emboss then + _ct.h = _ct.h + v.config.emboss + _ct.y = _ct.y + v.config.emboss + end + else + _ct.w = _ct.w + _tw + padding + _ct.x = _ct.x + _tw + padding + if _th + padding > _ct.h then _ct.h = _th + padding end + if v.config and v.config.emboss then + _ct.h = _ct.h + v.config.emboss + end + end + end + end + end + end + end + + node.content_dimensions = node.content_dimensions or {} + node.content_dimensions.w = _ct.w + padding + node.content_dimensions.h = _ct.h + padding + _nt.w = math.max(_ct.w + padding, _nt.w) + _nt.h = math.max(_ct.h + padding, _nt.h)-- + node:set_values(_nt, recalculate) + return _nt.w, _nt.h + end +end + +function UIBox:remove_group(node, group) + node = node or self.UIRoot + for k, v in pairs(node.children) do + if self:remove_group(v, group) then node.children[k] = nil end + end + if node.config and node.config.group and node.config.group == group then node:remove(); return true end + + if not node.parent or true then self:calculate_xywh(self.UIRoot, self.T, true); self.UIRoot:set_wh(); self.UIRoot:set_alignment() end--self:recalculate() end +end + +function UIBox:get_group(node, group, ingroup) + node = node or self.UIRoot + ingroup = ingroup or {} + for k, v in pairs(node.children) do + self:get_group(v, group, ingroup) + end + if node.config and node.config.group and node.config.group == group then table.insert(ingroup, node); return ingroup end + return ingroup +end + +function UIBox:set_parent_child(node, parent) + local UIE = UIElement(parent, self, node.n, node.config) + + --set the group of the element + if parent and parent.config and parent.config.group then if UIE.config then UIE.config.group = parent.config.group else UIE.config = {group = parent.config.group} end end + + --set the button for the element + if parent and parent.config and parent.config.button then if UIE.config then UIE.config.button_UIE = parent else UIE.config = {button_UIE = parent} end end + if parent and parent.config and parent.config.button_UIE then if UIE.config then UIE.config.button_UIE = parent.config.button_UIE else UIE.config = {button = parent.config.button} end end + + if node.n and node.n == G.UIT.O and UIE.config.button then + UIE.config.object.states.click.can = false + end + + --current node is a container + if (node.n and node.n == G.UIT.C or node.n == G.UIT.R or node.n == G.UIT.ROOT) and node.nodes then + for k, v in pairs(node.nodes) do + self:set_parent_child(v, UIE) + end + end + + if not parent then + self.UIRoot = UIE + self.UIRoot.parent = self + else + table.insert(parent.children, UIE) + end + if node.config and node.config.mid then + self.Mid = UIE + end +end +function UIBox:remove() + if self == G.OVERLAY_MENU then G.REFRESH_ALERTS = true end + self.UIRoot:remove() + for k, v in pairs(G.I[self.config.instance_type or 'UIBOX']) do + if v == self then + table.remove(G.I[self.config.instance_type or 'UIBOX'], k) + break; + end + end + remove_all(self.children) + Moveable.remove(self) +end + +function UIBox:draw() + if self.FRAME.DRAW >= G.FRAMES.DRAW and not G.OVERLAY_TUTORIAL then return end + self.FRAME.DRAW = G.FRAMES.DRAW + + for k, v in pairs(self.children) do + if k ~= 'h_popup' and k ~= 'alert' then v:draw() end + end + + if self.states.visible then + add_to_drawhash(self) + self.UIRoot:draw_self() + self.UIRoot:draw_children() + for k, v in ipairs(self.draw_layers) do + if v.draw_self then v:draw_self() else v:draw() end + if v.draw_children then v:draw_children() end + end + end + + if self.children.alert then self.children.alert:draw() end + + self:draw_boundingrect() +end + +function UIBox:recalculate() + --Calculate the correct dimensions and width/height and offset for each node + self:calculate_xywh(self.UIRoot, self.T, true) + --Then, calculate the correct width and height for each container + self.UIRoot:set_wh() + --Then, set all of the correct alignments for the ui elements + self.UIRoot:set_alignments() + self.T.w = self.UIRoot.T.w + self.T.h = self.UIRoot.T.h + G.REFRESH_FRAME_MAJOR_CACHE = (G.REFRESH_FRAME_MAJOR_CACHE or 0) + 1 + self.UIRoot:initialize_VT() + G.REFRESH_FRAME_MAJOR_CACHE = (G.REFRESH_FRAME_MAJOR_CACHE > 1 and G.REFRESH_FRAME_MAJOR_CACHE - 1 or nil) +end + +function UIBox:move(dt) + Moveable.move(self, dt) + Moveable.move(self.UIRoot, dt) +end + +function UIBox:drag(offset) + Moveable.drag(self,offset) + Moveable.move(self.UIRoot, dt) +end + +function UIBox:add_child(node, parent) + self:set_parent_child(node, parent) + self:recalculate() +end + +function UIBox:set_container(container) + self.UIRoot:set_container(container) + Node.set_container(self, container) +end + +function UIBox:print_topology(indent) + local box_str = '| UIBox | - ID:'..self.ID..' w/h:'..self.T.w..'/'..self.T.h + local indent = indent or 0 + box_str = box_str..self.UIRoot:print_topology(indent) + return box_str +end + +--Class +UIElement = Moveable:extend() +--Class Methods +function UIElement:init(parent, new_UIBox, new_UIT, config) + self.parent = parent + self.UIT = new_UIT + self.UIBox = new_UIBox + self.config = config or {} + if self.config and self.config.object then self.config.object.parent = self end + self.children = {} + self.ARGS = self.ARGS or {} + self.content_dimensions = {w=0, h=0} +end +function UIElement:set_values(_T, recalculate) + if not recalculate or not self.T then + Moveable.init(self,{T = _T}) + self.states.click.can = false + self.states.drag.can = false + self.static_rotation = true + else + self.T.x = _T.x + self.T.y = _T.y + self.T.w = _T.w + self.T.h = _T.h + end + + if self.config.button_UIE then self.states.collide.can = true; self.states.hover.can = false; self.states.click.can = true end + if self.config.button then self.states.collide.can = true; self.states.click.can = true end + + if self.config.on_demand_tooltip or self.config.tooltip or self.config.detailed_tooltip then + self.states.collide.can = true + end + + self:set_role{role_type = 'Minor', major = self.UIBox, offset = {x = _T.x, y = _T.y}, wh_bond = 'Weak', scale_bond = 'Weak'} + + if self.config.draw_layer then + self.UIBox.draw_layers[self.config.draw_layer] = self + end + + if self.config.collideable then self.states.collide.can = true end + + if self.config.can_collide ~= nil then + self.states.collide.can = self.config.can_collide + if self.config.object then self.config.object.states.collide.can = self.states.collide.can end + end + + if self.UIT == G.UIT.O and not self.config.no_role then + self.config.object:set_role(self.config.role or {role_type = 'Minor', major = self, xy_bond = 'Strong', wh_bond = 'Weak', scale_bond = 'Weak'}) + end + + if self.config and self.config.ref_value and self.config.ref_table then + self.config.prev_value = self.config.ref_table[self.config.ref_value] + end + + if self.UIT == G.UIT.T then self.static_rotation = true end + + if self.config.juice then + if self.UIT == G.UIT.ROOT then self:juice_up() end + if self.UIT == G.UIT.T then self:juice_up() end + if self.UIT == G.UIT.O then self.config.object:juice_up(0.5) end + if self.UIT == G.UIT.B then self:juice_up() end + if self.UIT == G.UIT.C then self:juice_up() end + if self.UIT == G.UIT.R then self:juice_up() end + self.config.juice = false + end + + if not self.config.colour then + if self.UIT == G.UIT.ROOT then self.config.colour = G.C.UI.BACKGROUND_DARK end + if self.UIT == G.UIT.T then self.config.colour = G.C.UI.TEXT_LIGHT end + if self.UIT == G.UIT.O then self.config.colour = G.C.WHITE end + if self.UIT == G.UIT.B then self.config.colour = G.C.CLEAR end + if self.UIT == G.UIT.C then self.config.colour = G.C.CLEAR end + if self.UIT == G.UIT.R then self.config.colour = G.C.CLEAR end + end + if not self.config.outline_colour then + if self.UIT == G.UIT.ROOT then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.T then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.O then self.config.colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.B then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.C then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.R then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + end + + if self.config.focus_args and not self.config.focus_args.registered then + if self.config.focus_args.button then + G.CONTROLLER:add_to_registry(self.config.button_UIE or self, self.config.focus_args.button) + end + + if self.config.focus_args.snap_to then + G.CONTROLLER:snap_to{node = self} + end + + if self.config.focus_args.funnel_to then + local _par = self.parent + while _par and _par:is(UIElement) do + if _par.config.focus_args and _par.config.focus_args.funnel_from then + _par.config.focus_args.funnel_from = self + self.config.focus_args.funnel_to = _par + break + end + _par = _par.parent + end + end + self.config.focus_args.registered = true + end + + if self.config.force_focus then self.states.collide.can = true end + + if self.config.button_delay and not self.config.button_delay_start then + self.config.button_delay_start = G.TIMERS.REAL + self.config.button_delay_end = G.TIMERS.REAL + self.config.button_delay + self.config.button_delay_progress = 0 + end + + self.layered_parallax = self.layered_parallax or {x=0, y=0} + + if self.config and self.config.func and (((self.config.button_UIE or self.config.button) and self.config.func ~= 'set_button_pip') or self.config.insta_func) then G.FUNCS[self.config.func](self) end +end + +function UIElement:print_topology(indent) + local UIT = '????' + for k, v in pairs(G.UIT) do + if v == self.UIT then UIT = ''..k end + end + local box_str = '\n'..(string.rep(" ", indent))..'| '..UIT..' | - ID:'..self.ID..' w/h:'..self.T.w..'/'..self.T.h + if UIT == 'O' then + box_str = box_str..' OBJ:'..( + getmetatable(self.config.object) == CardArea and 'CardArea' or + getmetatable(self.config.object) == Card and 'Card' or + getmetatable(self.config.object) == UIBox and 'UIBox' or + getmetatable(self.config.object) == Particles and 'Particles' or + getmetatable(self.config.object) == DynaText and 'DynaText' or + getmetatable(self.config.object) == Sprite and 'Sprite' or + getmetatable(self.config.object) == AnimatedSprite and 'AnimatedSprite' or + 'OTHER' + ) + elseif UIT == 'T' then + box_str = box_str..' TEXT:'..(self.config.text or 'REF') + end + + for k, v in ipairs(self.children) do + if v.print_topology then + box_str = box_str..v:print_topology(indent+1) + end + end + return box_str +end + +function UIElement:initialize_VT() + self:move_with_major(0) + self:calculate_parrallax() + + for _, v in pairs(self.children) do + if v.initialize_VT then v:initialize_VT() end + end + + self.VT.w, self.VT.h = self.T.w, self.T.h + + if self.UIT == G.UIT.T then self:update_text() end + if self.config.object then + if not self.config.no_role then + self.config.object:hard_set_T(self.T.x, self.T.y, self.T.w, self.T.h) + self.config.object:move_with_major(0) + self.config.object.alignment.prev_type = '' + self.config.object:align_to_major() + end + if self.config.object.recalculate then + self.config.object:recalculate() + end + end +end + +function UIElement:juice_up(amount, rot_amt) + if self.UIT == G.UIT.O then + if self.config.object then self.config.object:juice_up(amount, rot_amt) end + else + Moveable.juice_up(self, amount, rot_amt) + end +end + +function UIElement:can_drag() + if self.states.drag.can then return self end + return self.UIBox:can_drag() +end + +function UIElement:draw() +end + +function UIElement:draw_children(layer) + if self.states.visible then + for k, v in pairs(self.children) do + if not v.config.draw_layer and k ~= 'h_popup' and k~= 'alert' then + if v.draw_self and not v.config.draw_after then v:draw_self() else v:draw() end + if v.draw_children then v:draw_children() end + if v.draw_self and v.config.draw_after then v:draw_self() else v:draw() end + end + end + end +end + +function UIElement:set_wh() + --Iterate through all children of this node + local padding = (self.config and self.config.padding) or G.UIT.padding + + local _max_w, _max_h = 0,0 + + if next(self.children) == nil or self.config.no_fill then + return self.T.w, self.T.h + else + for k, w in pairs(self.children) do + if w.set_wh then + local _cw, _ch = w:set_wh() + if _cw and _ch then + if _cw > _max_w then _max_w = _cw end + if _ch > _max_h then _max_h = _ch end + else + _max_w = padding + _max_h = padding + end + end + end + for k, w in pairs(self.children) do + if w.UIT == G.UIT.R then w.T.w = _max_w end + if w.UIT == G.UIT.C then w.T.h = _max_h end + end + end + return self.T.w, self.T.h +end + +function UIElement:align(x, y) + self.role.offset.y = self.role.offset.y + y + self.role.offset.x = self.role.offset.x + x + for _, v in pairs(self.children) do + if v.align then + v:align(x, y) + end + end +end + +function UIElement:set_alignments() + --vertically centered is c = centered + --horizontally centered is m = middle + --top and left are default + --bottom is b + --right is r + for k, v in pairs(self.children) do + if self.config and self.config.align and v.align then + + local padding = self.config.padding or G.UIT.padding + + if string.find(self.config.align, "c") then + if v.UIT == G.UIT.T or v.UIT == G.UIT.B or v.UIT == G.UIT.O then + v:align(0,0.5*(self.T.h - 2*padding - v.T.h)) + else + v:align(0,0.5*(self.T.h - self.content_dimensions.h)) + end + end + if string.find(self.config.align, "m") then + v:align(0.5*(self.T.w - self.content_dimensions.w),0) + end + if string.find(self.config.align, "b") then + v:align(0, self.T.h - self.content_dimensions.h) + end + if string.find(self.config.align, "r") then + v:align((self.T.w - self.content_dimensions.w), 0) + end + end + if v.set_alignments then v:set_alignments() end + end +end +function UIElement:update_text() + if self.config and self.config.text and not self.config.text_drawable then + self.config.lang = self.config.lang or G.LANG + self.config.text_drawable = love.graphics.newText(self.config.lang.font.FONT, {G.C.WHITE,self.config.text}) + end + + if self.config.ref_table and self.config.ref_table[self.config.ref_value] ~= self.config.prev_value then + self.config.text = tostring(self.config.ref_table[self.config.ref_value]) + self.config.text_drawable:set(self.config.text) + if not self.config.no_recalc and self.config.prev_value and string.len(self.config.prev_value) ~= string.len(self.config.text) then self.UIBox:recalculate() end + self.config.prev_value = self.config.ref_table[self.config.ref_value] + end +end + +function UIElement:update_object() + if self.config.ref_table and self.config.ref_value and self.config.ref_table[self.config.ref_value] ~= self.config.object then + self.config.object = self.config.ref_table[self.config.ref_value] + self.UIBox:recalculate() + end + + if self.config.object then + self.config.object.config.refresh_movement = true + if self.config.object.states.hover.is and not self.states.hover.is then + self:hover() + self.states.hover.is = true + end + if not self.config.object.states.hover.is and self.states.hover.is then + self:stop_hover() + self.states.hover.is = false + end + end + + if self.config.object and self.config.object.ui_object_updated then + self.config.object.ui_object_updated = nil + self.config.object.parent = self + self.config.object:set_role(self.config.role or {role_type = 'Minor', major = self}) + self.config.object:move_with_major(0) + if self.config.object.non_recalc then + self.parent.content_dimensions.w = self.config.object.T.w + self:align(self.parent.T.x - self.config.object.T.x, self.parent.T.y - self.config.object.T.y) + self.parent:set_alignments() + else + self.UIBox:recalculate() + end + end +end +function UIElement:draw_self() + if not self.states.visible then + if self.config.force_focus then add_to_drawhash(self) end + return + end + + if self.config.force_focus or self.config.force_collision or self.config.button_UIE or self.config.button or self.states.collide.can then + add_to_drawhash(self) + end + + local button_active = true + local parallax_dist = 1.5 + local button_being_pressed = false + + if (self.config.button or self.config.button_UIE) then + self.layered_parallax.x = ((self.parent and self.parent ~= self.UIBox and self.parent.layered_parallax.x or 0) + (self.config.shadow and 0.4*self.shadow_parrallax.x or 0)/G.TILESIZE) + self.layered_parallax.y = ((self.parent and self.parent ~= self.UIBox and self.parent.layered_parallax.y or 0) + (self.config.shadow and 0.4*self.shadow_parrallax.y or 0)/G.TILESIZE) + + if self.config.button and ((self.last_clicked and self.last_clicked > G.TIMERS.REAL - 0.1) or ((self.config.button and (self.states.hover.is or self.states.drag.is)) + and G.CONTROLLER.is_cursor_down)) then + self.layered_parallax.x = self.layered_parallax.x - parallax_dist*self.shadow_parrallax.x/G.TILESIZE*(self.config.button_dist or 1) + self.layered_parallax.y = self.layered_parallax.y - parallax_dist*self.shadow_parrallax.y/G.TILESIZE*(self.config.button_dist or 1) + parallax_dist = 0 + button_being_pressed = true + end + + if self.config.button_UIE and not self.config.button_UIE.config.button then button_active = false end + end + if self.config.colour[4] > 0.01 then + if self.UIT == G.UIT.T and self.config.scale then + self.ARGS.text_parallax = self.ARGS.text_parallax or {} + self.ARGS.text_parallax.sx = -self.shadow_parrallax.x*0.5/(self.config.scale*self.config.lang.font.FONTSCALE) + self.ARGS.text_parallax.sy = -self.shadow_parrallax.y*0.5/(self.config.scale*self.config.lang.font.FONTSCALE) + + if (self.config.button_UIE and button_active) or (not self.config.button_UIE and self.config.shadow and G.SETTINGS.GRAPHICS.shadows == 'On') then + prep_draw(self, 0.97) + if self.config.vert then love.graphics.translate(0,self.VT.h); love.graphics.rotate(-math.pi/2) end + if (self.config.shadow or (self.config.button_UIE and button_active)) and G.SETTINGS.GRAPHICS.shadows == 'On' then + love.graphics.setColor(0, 0, 0, 0.3*self.config.colour[4]) + love.graphics.draw( + self.config.text_drawable, + (self.config.lang.font.TEXT_OFFSET.x + (self.config.vert and -self.ARGS.text_parallax.sy or self.ARGS.text_parallax.sx))*(self.config.scale or 1)*self.config.lang.font.FONTSCALE/G.TILESIZE, + (self.config.lang.font.TEXT_OFFSET.y + (self.config.vert and self.ARGS.text_parallax.sx or self.ARGS.text_parallax.sy))*(self.config.scale or 1)*self.config.lang.font.FONTSCALE/G.TILESIZE, + 0, + (self.config.scale)*self.config.lang.font.squish*self.config.lang.font.FONTSCALE/G.TILESIZE, + (self.config.scale)*self.config.lang.font.FONTSCALE/G.TILESIZE + ) + end + love.graphics.pop() + end + + prep_draw(self, 1) + if self.config.vert then love.graphics.translate(0,self.VT.h); love.graphics.rotate(-math.pi/2) end + if not button_active then + love.graphics.setColor(G.C.UI.TEXT_INACTIVE) + else + love.graphics.setColor(self.config.colour) + end + love.graphics.draw( + self.config.text_drawable, + self.config.lang.font.TEXT_OFFSET.x*(self.config.scale)*self.config.lang.font.FONTSCALE/G.TILESIZE, + self.config.lang.font.TEXT_OFFSET.y*(self.config.scale)*self.config.lang.font.FONTSCALE/G.TILESIZE, + 0, + (self.config.scale)*self.config.lang.font.squish*self.config.lang.font.FONTSCALE/G.TILESIZE, + (self.config.scale)*self.config.lang.font.FONTSCALE/G.TILESIZE + ) + love.graphics.pop() + elseif self.UIT == G.UIT.B or self.UIT == G.UIT.C or self.UIT == G.UIT.R or self.UIT == G.UIT.ROOT then + prep_draw(self, 1) + love.graphics.scale(1/(G.TILESIZE)) + if self.config.shadow and G.SETTINGS.GRAPHICS.shadows == 'On' then + love.graphics.scale(0.98) + if self.config.shadow_colour then + love.graphics.setColor(self.config.shadow_colour) + else + love.graphics.setColor(0,0,0,0.3*self.config.colour[4]) + end + if self.config.r and self.VT.w > 0.01 then + self:draw_pixellated_rect('shadow', parallax_dist) + else + love.graphics.rectangle('fill', -self.shadow_parrallax.x*parallax_dist, -self.shadow_parrallax.y*parallax_dist, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE) + end + love.graphics.scale(1/0.98) + end + + love.graphics.scale(button_being_pressed and 0.985 or 1) + if self.config.emboss then + love.graphics.setColor(darken(self.config.colour, self.states.hover.is and 0.5 or 0.3, true)) + self:draw_pixellated_rect('emboss', parallax_dist, self.config.emboss) + end + local collided_button = self.config.button_UIE or self + self.ARGS.button_colours = self.ARGS.button_colours or {} + self.ARGS.button_colours[1] = self.config.button_delay and mix_colours(self.config.colour, G.C.L_BLACK, 0.5) or self.config.colour + self.ARGS.button_colours[2] = (((collided_button.config.hover and collided_button.states.hover.is) or (collided_button.last_clicked and collided_button.last_clicked > G.TIMERS.REAL - 0.1)) and G.C.UI.HOVER or nil) + for k, v in ipairs(self.ARGS.button_colours) do + love.graphics.setColor(v) + if self.config.r and self.VT.w > 0.01 then + if self.config.button_delay then + love.graphics.setColor(G.C.GREY) + self:draw_pixellated_rect('fill', parallax_dist) + love.graphics.setColor(v) + self:draw_pixellated_rect('fill', parallax_dist, nil, self.config.button_delay_progress) + elseif self.config.progress_bar then + love.graphics.setColor(self.config.progress_bar.empty_col or G.C.GREY) + self:draw_pixellated_rect('fill', parallax_dist) + love.graphics.setColor(self.config.progress_bar.filled_col or G.C.BLUE) + self:draw_pixellated_rect('fill', parallax_dist, nil, self.config.progress_bar.ref_table[self.config.progress_bar.ref_value]/self.config.progress_bar.max) + else + self:draw_pixellated_rect('fill', parallax_dist) + end + else + love.graphics.rectangle('fill', 0,0, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE) + end + end + love.graphics.pop() + elseif self.UIT == G.UIT.O and self.config.object then + --Draw the outline for highlighted objext + if self.config.focus_with_object and self.config.object.states.focus.is then + self.object_focus_timer = self.object_focus_timer or G.TIMERS.REAL + local lw = 50*math.max(0, self.object_focus_timer - G.TIMERS.REAL + 0.3)^2 + prep_draw(self, 1) + love.graphics.scale((1)/(G.TILESIZE)) + love.graphics.setLineWidth(lw + 1.5) + love.graphics.setColor(adjust_alpha(G.C.WHITE, 0.2*lw, true)) + self:draw_pixellated_rect('fill', parallax_dist) + love.graphics.setColor(self.config.colour[4] > 0 and mix_colours(G.C.WHITE, self.config.colour, 0.8) or G.C.WHITE) + self:draw_pixellated_rect('line', parallax_dist) + love.graphics.pop() + else + self.object_focus_timer = nil + end + self.config.object:draw() + end + end + + --Draw the outline of the object + if self.config.outline and self.config.outline_colour[4] > 0.01 then + if self.config.outline then + prep_draw(self, 1) + love.graphics.scale(1/(G.TILESIZE)) + love.graphics.setLineWidth(self.config.outline) + if self.config.line_emboss then + love.graphics.setColor(darken(self.config.outline_colour, self.states.hover.is and 0.5 or 0.3, true)) + self:draw_pixellated_rect('line_emboss', parallax_dist, self.config.line_emboss) + end + love.graphics.setColor(self.config.outline_colour) + if self.config.r and self.VT.w > 0.01 then + self:draw_pixellated_rect('line', parallax_dist) + else + love.graphics.rectangle('line', 0,0, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE) + end + love.graphics.pop() + end + end + + --Draw the outline for highlighted buttons + if self.states.focus.is then + self.focus_timer = self.focus_timer or G.TIMERS.REAL + local lw = 50*math.max(0, self.focus_timer - G.TIMERS.REAL + 0.3)^2 + prep_draw(self, 1) + love.graphics.scale((1)/(G.TILESIZE)) + love.graphics.setLineWidth(lw + 1.5) + love.graphics.setColor(adjust_alpha(G.C.WHITE, 0.2*lw, true)) + self:draw_pixellated_rect('fill', parallax_dist) + love.graphics.setColor(self.config.colour[4] > 0 and mix_colours(G.C.WHITE, self.config.colour, 0.8) or G.C.WHITE) + self:draw_pixellated_rect('line', parallax_dist) + love.graphics.pop() + else + self.focus_timer = nil + end + + --Draw the 'chosen triangle' + if self.config.chosen then + prep_draw(self, 0.98) + love.graphics.scale(1/(G.TILESIZE)) + if self.config.shadow and G.SETTINGS.GRAPHICS.shadows == 'On' then + love.graphics.setColor(0,0,0,0.3*self.config.colour[4]) + love.graphics.polygon("fill", get_chosen_triangle_from_rect(self.layered_parallax.x - self.shadow_parrallax.x*parallax_dist*0.5, self.layered_parallax.y - self.shadow_parrallax.y*parallax_dist*0.5, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE, self.config.chosen == 'vert')) + end + love.graphics.pop() + + prep_draw(self, 1) + love.graphics.scale(1/(G.TILESIZE)) + love.graphics.setColor(G.C.RED) + love.graphics.polygon("fill", get_chosen_triangle_from_rect(self.layered_parallax.x, self.layered_parallax.y, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE, self.config.chosen == 'vert')) + love.graphics.pop() + end + self:draw_boundingrect() +end + +function UIElement:draw_pixellated_rect(_type, _parallax, _emboss, _progress) + if not self.pixellated_rect or + #self.pixellated_rect[_type].vertices < 1 or + _parallax ~= self.pixellated_rect.parallax or + self.pixellated_rect.w ~= self.VT.w or + self.pixellated_rect.h ~= self.VT.h or + self.pixellated_rect.sw ~= self.shadow_parrallax.x or + self.pixellated_rect.sh ~= self.shadow_parrallax.y or + self.pixellated_rect.progress ~= (_progress or 1) + then + self.pixellated_rect = { + w = self.VT.w, + h = self.VT.h, + sw = self.shadow_parrallax.x, + sh = self.shadow_parrallax.y, + progress = (_progress or 1), + fill = {vertices = {}}, + shadow = {vertices = {}}, + line = {vertices = {}}, + emboss = {vertices = {}}, + line_emboss = {vertices = {}}, + parallax = _parallax + } + local ext_up = self.config.ext_up and self.config.ext_up*G.TILESIZE or 0 + local res = self.config.res or math.min(self.VT.w, self.VT.h + math.abs(ext_up)/G.TILESIZE) > 3.5 and 0.8 or math.min(self.VT.w, self.VT.h + math.abs(ext_up)/G.TILESIZE) > 0.3 and 0.6 or 0.15 + local totw, toth, subw, subh = self.VT.w*G.TILESIZE, (self.VT.h + math.abs(ext_up)/G.TILESIZE)*G.TILESIZE, self.VT.w*G.TILESIZE-4*res, (self.VT.h + math.abs(ext_up)/G.TILESIZE)*G.TILESIZE-4*res + + local vertices = { + subw/2, subh/2-ext_up, + 0,4*res-ext_up, + 1*res,4*res-ext_up, + 1*res,2*res-ext_up, + 2*res,2*res-ext_up, + 2*res,1*res-ext_up, + 4*res,1*res-ext_up, + 4*res,0*res-ext_up, + subw,0*res-ext_up, + subw,1*res-ext_up, + subw+2*res,1*res-ext_up, + subw+2*res,2*res-ext_up, + subw+3*res,2*res-ext_up, + subw+3*res,4*res-ext_up, + totw,4*res-ext_up, + totw,subh-ext_up, + subw+3*res, subh-ext_up, + subw+3*res, subh+2*res-ext_up, + subw+2*res, subh+2*res-ext_up, + subw+2*res, subh+3*res-ext_up, + subw, subh+3*res-ext_up, + subw, toth-ext_up, + 4*res, toth-ext_up, + 4*res, subh+3*res-ext_up, + 2*res, subh+3*res-ext_up, + 2*res, subh+2*res-ext_up, + 1*res, subh+2*res-ext_up, + 1*res, subh-ext_up, + 0, subh-ext_up, + 0,4*res-ext_up, + } + for k, v in ipairs(vertices) do + if k%2 == 1 and v > totw*self.pixellated_rect.progress then v = totw*self.pixellated_rect.progress end + self.pixellated_rect.fill.vertices[k] = v + if k > 4 then + self.pixellated_rect.line.vertices[k-4] = v + if _emboss then + self.pixellated_rect.line_emboss.vertices[k-4] = v + (k%2 == 0 and -_emboss*self.shadow_parrallax.y or -0.7*_emboss*self.shadow_parrallax.x) + end + end + if k%2 == 0 then + self.pixellated_rect.shadow.vertices[k] = v -self.shadow_parrallax.y*_parallax + if _emboss then + self.pixellated_rect.emboss.vertices[k] = v + _emboss*G.TILESIZE + end + else + self.pixellated_rect.shadow.vertices[k] = v -self.shadow_parrallax.x*_parallax + if _emboss then + self.pixellated_rect.emboss.vertices[k] = v + end + end + end + end + + love.graphics.polygon((_type == 'line' or _type == 'line_emboss') and 'line' or "fill", self.pixellated_rect[_type].vertices) +end + +function UIElement:update(dt) + G.ARGS.FUNC_TRACKER = G.ARGS.FUNC_TRACKER or {} + if self.config.button_delay then + self.config.button_temp = self.config.button or self.config.button_temp + self.config.button = nil + self.config.button_delay_progress = (G.TIMERS.REAL - self.config.button_delay_start)/self.config.button_delay + if G.TIMERS.REAL >= self.config.button_delay_end then self.config.button_delay = nil end + end + if self.config.button_temp and not self.config.button_delay then self.config.button = self.config.button_temp end + if self.button_clicked then self.button_clicked = nil end + if self.config and self.config.func then + G.ARGS.FUNC_TRACKER[self.config.func] = (G.ARGS.FUNC_TRACKER[self.config.func] or 0) + 1 + G.FUNCS[self.config.func](self) + end + if self.UIT == G.UIT.T then self:update_text() end + if self.UIT == G.UIT.O then self:update_object() end + Node.update(self, dt) +end + +function UIElement:collides_with_point(cursor_trans) + if self.UIBox.states.collide.can then + return Node.collides_with_point(self, cursor_trans) + else + return false + end +end + +function UIElement:click() + if self.config.button and (not self.last_clicked or self.last_clicked + 0.1 < G.TIMERS.REAL) and self.states.visible and not self.under_overlay and not self.disable_button then + if self.config.one_press then self.disable_button = true end + self.last_clicked = G.TIMERS.REAL + + --Removes a layer from the overlay menu stack + if self.config.id == 'overlay_menu_back_button' then + G.CONTROLLER:mod_cursor_context_layer(-1) + G.NO_MOD_CURSOR_STACK = true + end + if G.OVERLAY_TUTORIAL and G.OVERLAY_TUTORIAL.button_listen == self.config.button then + G.FUNCS.tut_next() + end + G.FUNCS[self.config.button](self) + + G.NO_MOD_CURSOR_STACK = nil + + if self.config.choice then + local choices = self.UIBox:get_group(nil, self.config.group) + for k, v in pairs(choices) do + if v.config and v.config.choice then v.config.chosen = false end + end + self.config.chosen = true + end + play_sound('button', 1, 0.3) + G.ROOM.jiggle = G.ROOM.jiggle + 0.5 + self.button_clicked = true + end + if self.config.button_UIE then + self.config.button_UIE:click() + end +end + +function UIElement:put_focused_cursor() + if self.config.focus_args and self.config.focus_args.type == 'tab' then + for k, v in pairs(self.children) do + if v.children[1].config.chosen then return v.children[1]:put_focused_cursor() end + end + else + return Node.put_focused_cursor(self) + end +end + +function UIElement:remove() + if self.config and self.config.object then + self.config.object:remove() + self.config.object = nil + end + + if self == G.CONTROLLER.text_input_hook then + G.CONTROLLER.text_input_hook = nil + end + remove_all(self.children) + + Moveable.remove(self) +end + +function UIElement:hover() + if self.config and self.config.on_demand_tooltip then + self.config.h_popup = create_popup_UIBox_tooltip(self.config.on_demand_tooltip) + self.config.h_popup_config ={align=self.T.y > G.ROOM.T.h/2 and 'tm' or 'bm', offset = {x=0,y=self.T.y > G.ROOM.T.h/2 and -0.1 or 0.1}, parent = self} + end + if self.config.tooltip then + self.config.h_popup = create_popup_UIBox_tooltip(self.config.tooltip) + self.config.h_popup_config ={align="tm", offset = {x=0,y=-0.1}, parent = self} + end + if self.config.detailed_tooltip and G.CONTROLLER.HID.pointer then + self.config.h_popup = create_UIBox_detailed_tooltip(self.config.detailed_tooltip) + self.config.h_popup_config ={align="tm", offset = {x=0,y=-0.1}, parent = self} + end + Node.hover(self) +end + +function UIElement:stop_hover() + Node.stop_hover(self) + if self.config and self.config.on_demand_tooltip then + self.config.h_popup = nil + end +end + +function UIElement:release(other) + if self.parent then self.parent:release(other) end +end + +function is_UI_containter(node) + if node.UIT ~= G.UIT.C and node.UIT ~= G.UIT.R and node.UIT ~= G.UIT.ROOT then + return false + end + return true +end diff --git a/src/functions/UI_definitions.lua b/src/functions/UI_definitions.lua new file mode 100644 index 0000000..b423d7c --- /dev/null +++ b/src/functions/UI_definitions.lua @@ -0,0 +1,6436 @@ +--Create a global UIDEF that contains all UI definition functions\ +--As a rule, these contain functions that return a table T representing the definition for a UIBox +G.UIDEF = {} + +function create_UIBox_debug_tools() + G.debug_tool_config = G.debug_tool_config or {} + G.FUNCS.DT_add_money = function() if G.STAGE == G.STAGES.RUN then ease_dollars(10) end end + G.FUNCS.DT_add_round = function() if G.STAGE == G.STAGES.RUN then ease_round(1) end end + G.FUNCS.DT_add_ante = function() if G.STAGE == G.STAGES.RUN then ease_ante(1) end end + G.FUNCS.DT_add_hand = function() if G.STAGE == G.STAGES.RUN then ease_hands_played(1) end end + G.FUNCS.DT_add_discard = function() if G.STAGE == G.STAGES.RUN then ease_discard(1) end end + G.FUNCS.DT_reroll_boss = function() if G.STAGE == G.STAGES.RUN and G.blind_select_opts then G.from_boss_tag = true; G.FUNCS.reroll_boss(); G.from_boss_tag = nil end end + G.FUNCS.DT_toggle_background = function() G.debug_background_toggle = not G.debug_background_toggle end + G.FUNCS.DT_add_chips = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {chips = 10 + G.GAME.current_round.current_hand.chips}); play_sound('chips1') end end + G.FUNCS.DT_add_mult = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 10 + G.GAME.current_round.current_hand.mult}); play_sound('multhit1') end end + G.FUNCS.DT_x_chips = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {chips = 2*G.GAME.current_round.current_hand.chips}); play_sound('chips1') end end + G.FUNCS.DT_x_mult = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 10*G.GAME.current_round.current_hand.mult}); play_sound('multhit2') end end + G.FUNCS.DT_chip_mult_reset = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 0, chips = 0}) end end + G.FUNCS.DT_win_game = function() if G.STAGE == G.STAGES.RUN then win_game() end end + G.FUNCS.DT_lose_game = function() if G.STAGE == G.STAGES.RUN then G.STATE = G.STATES.GAME_OVER; G.STATE_COMPLETE = false end end + G.FUNCS.DT_jimbo_toggle = function() + if G.DT_jimbo then + if G.DT_jimbo.children.particles.states.visible then + if G.DT_jimbo.children.card.states.visible then + G.DT_jimbo.children.card.states.visible = false + else + G.DT_jimbo.children.card.states.visible = true + G.DT_jimbo.children.particles.states.visible = false + end + else + G.DT_jimbo:remove() + G.DT_jimbo = nil + if G.SPLASH_LOGO then + G.SPLASH_LOGO.states.visible = true + if G.title_top and G.title_top.cards[1] then G.title_top.cards[1].states.visible = true end + end + end + else + if G.SPLASH_LOGO then + G.SPLASH_LOGO.states.visible = false + if G.title_top and G.title_top.cards[1] then G.title_top.cards[1].states.visible = false end + end + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.4, + blockable = false, + func = function() + G.DT_jimbo = Card_Character({x = G.ROOM.T.w/2,y = G.ROOM.T.h/2}) + + G.DT_jimbo:set_alignment{ + major = G.ROOM_ATTACH, + type = 'cm' + } + return true + end + })) + + end end + G.FUNCS.DT_jimbo_talk = function() + if G.DT_jimbo then + G.DT_jimbo:add_speech_bubble({ + " ", + " ", + " ", + }, 'cr') + G.DT_jimbo:say_stuff(4) end + end + + local t = {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "While in collection, hover over a card", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "and press the following keys:", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = "[1] Unlock", scale = 0.25, colour = G.C.WHITE}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = "[2] Discover", scale = 0.25, colour = G.C.WHITE}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = "[3] Spawn", scale = 0.25, colour = G.C.WHITE}} + }} + }} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Hover over any Joker/Playing card", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "and press [Q] to cycle Edition", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Press [H] to isolate background", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Press [J] to play splash animation", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Press [8] to toggle cursor", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Press [9] to toggle all tooltips", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button{ label = {"$10"}, button = "DT_add_money", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+1 Round"}, button = "DT_add_round", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+1 Ante"}, button = "DT_add_ante", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+1 Hand"}, button = "DT_add_hand", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+1 Discard"}, button = "DT_add_discard", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Boss Reroll"}, button = "DT_reroll_boss", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Background"}, button = "DT_toggle_background", minw = 1.7, minh = 0.4, scale = 0.35}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button{ label = {"+10 chips"}, button = "DT_add_chips", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+10 mult"}, button = "DT_add_mult", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"X2 chips"}, button = "DT_x_chips", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"X10 mult"}, button = "DT_x_mult", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Win this Run"}, button = "DT_win_game", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Lose this Run"}, button = "DT_lose_game", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Reset"}, button = "DT_chip_mult_reset", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Jimbo"}, button = "DT_jimbo_toggle", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Jimbo talk"}, button = "DT_jimbo_talk", minw = 1.7, minh = 0.4, scale = 0.35}, + }} + }} + }, true) + }} + return t +end + +function create_UIBox_notify_alert(_achievement, _type) + local _c, _atlas = G.P_CENTERS[_achievement], + _type == 'Joker' and G.ASSET_ATLAS["Joker"] or + _type == 'Voucher' and G.ASSET_ATLAS["Voucher"] or + _type == 'Back' and G.ASSET_ATLAS["centers"] or + G.ASSET_ATLAS["icons"] + + local t_s = Sprite(0,0,1.5*(_atlas.px/_atlas.py),1.5,_atlas, _c and _c.pos or {x=3, y=0}) + t_s.states.drag.can = false + t_s.states.hover.can = false + t_s.states.collide.can = false + + local subtext = _type == 'achievement' and localize(G.F_TROPHIES and 'k_trophy' or 'k_achievement') or + _type == 'Joker' and localize('k_joker') or + _type == 'Voucher' and localize('k_voucher') or + _type == 'Back' and localize('k_deck') or 'ERROR' + + if _achievement == 'b_challenge' then subtext = localize('k_challenges') end + local name = _type == 'achievement' and localize(_achievement, 'achievement_names') or 'ERROR' + + local t = {n=G.UIT.ROOT, config = {align = 'cl', r = 0.1, padding = 0.06, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0.2, minw = 20, r = 0.1, colour = G.C.BLACK, outline = 1.5, outline_colour = G.C.GREY}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1}, nodes={ + {n=G.UIT.O, config={object = t_s}}, + }}, + _type ~= 'achievement' and {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={ + {n=G.UIT.T, config={text = subtext, scale = 0.5, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={ + {n=G.UIT.T, config={text = localize('k_unlocked_ex'), scale = 0.35, colour = G.C.FILTER, shadow = true}}, + }} + }} + or {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 3.4, padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = name, scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={ + {n=G.UIT.T, config={text = subtext, scale = 0.3, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={ + {n=G.UIT.T, config={text = localize('k_unlocked_ex'), scale = 0.35, colour = G.C.FILTER, shadow = true}}, + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_online_high_scores() + G.HTTP_MANAGER.out_channel:push({get_score = true}) + local padding, col, minw = 0.05, G.C.UI.TRANSPARENT_DARK, 0 + local t = {n=G.UIT.ROOT, config = {align = 'cm', minw=minw, r = 0.1, colour = col, padding = padding}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.BLACK}, nodes={ + }} + }} + return t +end + +function create_UIBox_high_scores_filling(_resp) + local scores = {} + _resp = assert(loadstring(_resp))() + if not _resp then + return {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1, colour = G.C.L_BLACK, padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minh = 1.3}, nodes={ + {n=G.UIT.T, config={text = 'ERROR', scale = 0.9, colour = G.C.RED, shadow = true}}, + }} + }} + end + for i = 1, 6 do + local v = _resp[i] or {username = '-'} + v.score = v.score and math.floor(v.score) or nil + local name_col = v.username == (G.SETTINGS.COMP and G.SETTINGS.COMP.name or nil) and G.C.FILTER or G.C.WHITE + scores[#scores+1] = {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cl", padding = 0, minw = 0.3}, nodes={ + {n=G.UIT.T, config={text = i..'.', scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", padding = 0, minw = 1.7, maxw = 1.6}, nodes={ + {n=G.UIT.T, config={text = (v.username), scale = math.min(0.6, 8*0.56/v.username:len()), colour = v.score and name_col or G.C.UI.TRANSPARENT_LIGHT, shadow = true}} + }}, + {n=G.UIT.C, config={align = "cl", minh = 0.8, r = 0.1, minw = 2.5, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 2.6}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {type(v.score) == 'number' and number_format(v.score) or ''}, colours = {G.C.RED},shadow = true, float = true,maxw = 2.5, scale = math.min(0.75, score_number_scale(1.5, v.score))})}}, + }}, + }}, + }}, + }} + end + return {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1, colour = G.C.L_BLACK, padding = 0.05}, nodes=scores} +end + +function G.UIDEF.use_and_sell_buttons(card) + local sell = nil + local use = nil + if card.area and card.area.config.type == 'joker' then + sell = {n=G.UIT.C, config={align = "cr"}, nodes={ + {n=G.UIT.C, config={ref_table = card, align = "cr",padding = 0.1, r=0.08, minw = 1.25, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'sell_card', func = 'can_sell_card'}, nodes={ + {n=G.UIT.B, config = {w=0.1,h=0.6}}, + {n=G.UIT.C, config={align = "tm"}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 1.25}, nodes={ + {n=G.UIT.T, config={text = localize('b_sell'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('$'),colour = G.C.WHITE, scale = 0.4, shadow = true}}, + {n=G.UIT.T, config={ref_table = card, ref_value = 'sell_cost_label',colour = G.C.WHITE, scale = 0.55, shadow = true}} + }} + }} + }}, + }} + end + if card.ability.consumeable then + if (card.area == G.pack_cards and G.pack_cards) then + return { + n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={mid = true}, nodes={ + }}, + {n=G.UIT.R, config={ref_table = card, r = 0.08, padding = 0.1, align = "bm", minw = 0.5*card.T.w - 0.15, minh = 0.8*card.T.h, maxw = 0.7*card.T.w - 0.15, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_use_consumeable'}, nodes={ + {n=G.UIT.T, config={text = localize('b_use'),colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}} + }}, + }} + end + use = + {n=G.UIT.C, config={align = "cr"}, nodes={ + + {n=G.UIT.C, config={ref_table = card, align = "cr",maxw = 1.25, padding = 0.1, r=0.08, minw = 1.25, minh = (card.area and card.area.config.type == 'joker') and 0 or 1, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_use_consumeable'}, nodes={ + {n=G.UIT.B, config = {w=0.1,h=0.6}}, + {n=G.UIT.T, config={text = localize('b_use'),colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}} + }} + }} + elseif card.area and card.area == G.pack_cards then + return { + n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={ref_table = card, r = 0.08, padding = 0.1, align = "bm", minw = 0.5*card.T.w - 0.15, maxw = 0.9*card.T.w - 0.15, minh = 0.3*card.T.h, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_select_card'}, nodes={ + {n=G.UIT.T, config={text = localize('b_select'),colour = G.C.UI.TEXT_LIGHT, scale = 0.45, shadow = true}} + }}, + }} + end + local t = { + n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={padding = 0.15, align = 'cl'}, nodes={ + {n=G.UIT.R, config={align = 'cl'}, nodes={ + sell + }}, + {n=G.UIT.R, config={align = 'cl'}, nodes={ + use + }}, + }}, + }} + return t +end + +function G.UIDEF.card_focus_ui(card) + local card_width = card.T.w + (card.ability.consumeable and -0.1 or card.ability.set == 'Voucher' and -0.16 or 0) + + local playing_card_colour = copy_table(G.C.WHITE) + playing_card_colour[4] = 1.5 + if G.hand and card.area == G.hand then ease_value(playing_card_colour, 4, -1.5, nil, 'REAL',nil, 0.2, 'quad') end + + local tcnx, tcny = card.T.x + card.T.w/2 - G.ROOM.T.w/2, card.T.y + card.T.h/2 - G.ROOM.T.h/2 + + local base_background = UIBox{ + T = {card.VT.x,card.VT.y,0,0}, + definition = + (not G.hand or card.area ~= G.hand) and {n=G.UIT.ROOT, config = {align = 'cm', minw = card_width + 0.3, minh = card.T.h + 0.3, r = 0.1, colour = adjust_alpha(G.C.BLACK, 0.7), outline_colour = lighten(G.C.JOKER_GREY, 0.5), outline = 1.5, line_emboss = 0.8}, nodes={ + {n=G.UIT.R, config={id = 'ATTACH_TO_ME'}, nodes={}} + }} or + {n=G.UIT.ROOT, config = {align = 'cm', minw = card_width, minh = card.T.h, r = 0.1, colour = playing_card_colour}, nodes={ + {n=G.UIT.R, config={id = 'ATTACH_TO_ME'}, nodes={}} + }}, + config = { + align = 'cm', + offset = {x= 0.007*tcnx*card.T.w, y = 0.007*tcny*card.T.h}, + parent = card, + r_bond = (not G.hand or card.area ~= G.hand) and 'Weak' or 'Strong' + } + } + + base_background.set_alignment = function() + local cnx, cny = card.T.x + card.T.w/2 - G.ROOM.T.w/2, card.T.y + card.T.h/2 - G.ROOM.T.h/2 + Moveable.set_alignment(card.children.focused_ui, {offset = {x= 0.007*cnx*card.T.w, y = 0.007*cny*card.T.h}}) + end + + local base_attach = base_background:get_UIE_by_ID('ATTACH_TO_ME') + + --The card UI can have BUY, REDEEM, USE, and SELL buttons depending on the context of the card + if card.area == G.shop_jokers and G.shop_jokers then --Add a buy button + local buy_and_use = nil + if card.ability.consumeable then + base_attach.children.buy_and_use = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'buy_and_use', + func = 'can_buy_and_use', button = 'buy_from_shop', card_width = card_width + } + buy_and_use = true + end + base_attach.children.buy = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'buy', + func = 'can_buy', button = 'buy_from_shop', card_width = card_width, buy_and_use = buy_and_use + } + end + if card.area == G.shop_vouchers and G.shop_vouchers then --Add a redeem button + base_attach.children.redeem = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'buy', + func = 'can_redeem', button = 'redeem_from_shop', card_width = card_width + } + end + if card.area == G.shop_booster and G.shop_booster then --Add a redeem button + base_attach.children.redeem = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'buy', + func = 'can_open', button = 'open_booster', card_width = card_width*0.85 + } + end + if ((card.area == G.consumeables and G.consumeables) or (card.area == G.pack_cards and G.pack_cards)) and + card.ability.consumeable then --Add a use button + base_attach.children.use = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'use', + func = 'can_use_consumeable', button = 'use_card', card_width = card_width + } + end + if (card.area == G.pack_cards and G.pack_cards) and not card.ability.consumeable then --Add a use button + base_attach.children.use = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'select', + func = 'can_select_card', button = 'use_card', card_width = card_width + } + end + if (card.area == G.jokers and G.jokers or card.area == G.consumeables and G.consumeables) and G.STATE ~= G.STATES.TUTORIAL then --Add a sell button + base_attach.children.sell = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'sell', + func = 'can_sell_card', button = 'sell_card', card_width = card_width + } + end + + return base_background +end + +function G.UIDEF.card_focus_button(args) + if not args then return end + + local button_contents = {} + if args.type == 'sell' then + button_contents = + {n=G.UIT.C, config={align = "cl"}, nodes={ + {n=G.UIT.R, config={align = "cl", maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_sell'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cl"}, nodes={ + {n=G.UIT.T, config={text = localize('$'),colour = G.C.WHITE, scale = 0.4, shadow = true}}, + {n=G.UIT.T, config={ref_table = args.card, ref_value = 'sell_cost_label',colour = G.C.WHITE, scale = 0.55, shadow = true}} + }} + }} + elseif args.type == 'buy' then + button_contents = {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}} + elseif args.type == 'select' then + button_contents = {n=G.UIT.T, config={text = localize('b_select'),colour = G.C.WHITE, scale = 0.3}} + elseif args.type == 'redeem' then + button_contents = {n=G.UIT.T, config={text = localize('b_redeem'),colour = G.C.WHITE, scale = 0.5}} + elseif args.type == 'use' then + button_contents = {n=G.UIT.T, config={text = localize('b_use'),colour = G.C.WHITE, scale = 0.5}} + elseif args.type == 'buy_and_use' then + button_contents = + {n=G.UIT.C, config={align = "cr"}, nodes={ + {n=G.UIT.R, config={align = "cr", maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cr", maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_and_use'),colour = G.C.WHITE, scale = 0.3, shadow = true}}, + }} + }} + end + + return UIBox{ + T = {args.card.VT.x,args.card.VT.y,0,0}, + definition = + {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={id = args.type == 'buy_and_use' and 'buy_and_use' or nil, ref_table = args.card, ref_parent = args.parent, align = args.type == 'sell' and 'cl' or 'cr', colour = G.C.BLACK, shadow = true, r = 0.08, func = args.func, one_press = true, button = args.button, focus_args = {type = 'none'}, hover = true}, nodes={ + {n=G.UIT.R, config={align = args.type == 'sell' and 'cl' or 'cr', minw = 1 + (args.type == 'select' and 0.1 or 0), minh = args.type == 'sell' and 1.5 or 1, padding = 0.08, + focus_args = {button = args.type == 'sell' and 'leftshoulder' or args.type == 'buy_and_use' and 'leftshoulder' or 'rightshoulder', scale = 0.55, orientation = args.type == 'sell' and 'tli' or 'tri', offset = {x = args.type == 'sell' and 0.1 or -0.1, y = 0}, type = 'none'}, + func = 'set_button_pip'}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.3}, nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + args.type ~= 'sell' and {n=G.UIT.C, config={align = "cm",minw = 0.2, minh = 0.6}, nodes={}} or nil, + {n=G.UIT.C, config={align = "cm", maxw = 1}, nodes={ + button_contents + }}, + args.type == 'sell' and {n=G.UIT.C, config={align = "cm",minw = 0.2, minh = 0.6}, nodes={}} or nil, + }} + }} + }} + }}, + config = { + align = args.type == 'sell' and 'cl' or 'cr', + offset = {x=(args.type == 'sell' and -1 or 1)*((args.card_width or 0) - 0.17 - args.card.T.w/2),y=args.type == 'buy_and_use' and 0.6 or (args.buy_and_use) and -0.6 or 0}, + parent = args.parent, + } + } +end + +function G.UIDEF.speech_bubble(text_key, loc_vars) + local text = {} + if loc_vars and loc_vars.quip then + localize{type = 'quips', key = text_key or 'lq_1', vars = loc_vars or {}, nodes = text} + else + localize{type = 'tutorial', key = text_key or 'sb_1', vars = loc_vars or {}, nodes = text} + end + local row = {} + for k, v in ipairs(text) do + row[#row+1] = {n=G.UIT.R, config={align = "cl"}, nodes=v} + end + local t = {n=G.UIT.ROOT, config = {align = "cm", minh = 1,r = 0.3, padding = 0.07, minw = 1, colour = G.C.JOKER_GREY, shadow = true}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.1, minw = 1, colour = G.C.WHITE}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.03, minw = 1, colour = G.C.WHITE}, nodes=row}} + } + }} + return t +end + +function create_UIBox_highlight(rect) + local t = {n=G.UIT.ROOT, config = {align = "cm", minh = rect.T.h+0.1, minw = rect.T.w+0.15, r = 0.15, colour = G.C.DARK_EDITION}, nodes={ + }} +return t +end + +function G.UIDEF.deck_preview(args) + + local _minh, _minw = 0.35, 0.5 + local suit_labels = {} + local suit_counts = { + Spades = 0, + Hearts = 0, + Clubs = 0, + Diamonds = 0 + } + local mod_suit_counts = { + Spades = 0, + Hearts = 0, + Clubs = 0, + Diamonds = 0 + } + local mod_suit_diff = false + local wheel_flipped, wheel_flipped_text = 0, nil + local flip_col = G.C.WHITE + local rank_counts = {} + local deck_tables = {} + remove_nils(G.playing_cards) + table.sort(G.playing_cards, function (a, b) return a:get_nominal('suit') > b:get_nominal('suit') end ) + local SUITS = { + Spades = {}, + Hearts = {}, + Clubs = {}, + Diamonds = {}, + } + + for k, v in pairs(SUITS) do + for i = 1, 14 do + SUITS[k][#SUITS[k]+1] = {} + end + end + + local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'} + local stones = nil + local rank_name_mapping = {'A','K','Q','J','10',9,8,7,6,5,4,3,2} + + for k, v in ipairs(G.playing_cards) do + if v.ability.effect == 'Stone Card' then + stones = stones or 0 + end + if (v.area and v.area == G.deck) or v.ability.wheel_flipped then + if v.ability.wheel_flipped then wheel_flipped = wheel_flipped + 1 end + if v.ability.effect == 'Stone Card' then + stones = stones + 1 + else + for kk, vv in pairs(suit_counts) do + if v.base.suit == kk then suit_counts[kk] = suit_counts[kk] + 1 end + if v:is_suit(kk) then mod_suit_counts[kk] = mod_suit_counts[kk] + 1 end + end + if SUITS[v.base.suit][v.base.id] then + table.insert(SUITS[v.base.suit][v.base.id], v) + end + rank_counts[v.base.id] = (rank_counts[v.base.id] or 0) + 1 + end + end + end + + wheel_flipped_text = (wheel_flipped > 0) and {n=G.UIT.T, config={text = '?',colour = G.C.FILTER, scale =0.25, shadow = true}} or nil + flip_col = wheel_flipped_text and mix_colours(G.C.FILTER, G.C.WHITE,0.7) or G.C.WHITE + + suit_labels[#suit_labels+1] = {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, minw = _minw, minh = 2*_minh+0.25}, nodes={ + stones and {n=G.UIT.T, config={text = localize('ph_deck_preview_stones')..': ',colour = G.C.WHITE, scale =0.25, shadow = true}} + or nil, + stones and {n=G.UIT.T, config={text = ''..stones,colour = (stones > 0 and G.C.WHITE or G.C.UI.TRANSPARENT_LIGHT), scale =0.4, shadow = true}} + or nil, + }} + + local _row = {} + local _bg_col = G.C.JOKER_GREY + for k, v in ipairs(rank_name_mapping) do + local _tscale = 0.3 + local _colour = G.C.BLACK + local rank_col = v == 'A' and _bg_col or (v == 'K' or v == 'Q' or v == 'J') and G.C.WHITE or _bg_col + rank_col = mix_colours(rank_col, _bg_col, 0.8) + + local _col = {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, minw = _minw, minh = _minh, colour = rank_col, emboss = 0.04, padding = 0.03}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = ''..v,colour = _colour, scale =1.6*_tscale}}, + }}, + {n=G.UIT.R, config={align = "cm", minw = _minw+0.04, minh = _minh, colour = G.C.L_BLACK, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = ''..(rank_counts[15 - k] or 0),colour = flip_col, scale =_tscale, shadow = true}} + }} + }} + }} + table.insert(_row, _col) + end + table.insert(deck_tables, {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes=_row}) + + for j = 1, 4 do + _row = {} + _bg_col = mix_colours(G.C.SUITS[suit_map[j]], G.C.L_BLACK, 0.7) + for i = 14, 2, -1 do + local _tscale = #SUITS[suit_map[j]][i] > 0 and 0.3 or 0.25 + local _colour = #SUITS[suit_map[j]][i] > 0 and flip_col or G.C.UI.TRANSPARENT_LIGHT + + local _col = {n=G.UIT.C, config={align = "cm",padding = 0.05, minw = _minw+0.098, minh = _minh}, nodes={ + {n=G.UIT.T, config={text = ''..#SUITS[suit_map[j]][i],colour = _colour, scale =_tscale, shadow = true, lang = G.LANGUAGES['en-us']}}, + }} + table.insert(_row, _col) + end + table.insert(deck_tables, {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, minh = 0.4, colour = _bg_col}, nodes=_row}) + end + + for k, v in ipairs(suit_map) do + local _x = (v == 'Spades' and 3) or (v == 'Hearts' and 0) or (v == 'Clubs' and 2) or (v == 'Diamonds' and 1) + local t_s = Sprite(0,0,0.3,0.3,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=_x, y=1}) + t_s.states.drag.can = false + t_s.states.hover.can = false + t_s.states.collide.can = false + + if mod_suit_counts[v] ~= suit_counts[v] then mod_suit_diff = true end + + suit_labels[#suit_labels+1] = + {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.03, colour = G.C.JOKER_GREY}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = _minw, minh = _minh}, nodes={ + {n=G.UIT.O, config={can_collide = false, object = t_s}} + }}, + {n=G.UIT.C, config={align = "cm", minw = _minw*2.4, minh = _minh, colour = G.C.L_BLACK, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = ''..suit_counts[v],colour = flip_col, scale =0.3, shadow = true, lang = G.LANGUAGES['en-us']}}, + mod_suit_counts[v] ~= suit_counts[v] and {n=G.UIT.T, config={text = ' ('..mod_suit_counts[v]..')',colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7), scale =0.28, shadow = true, lang = G.LANGUAGES['en-us']}} or nil, + }} + }} + end + + + local t = + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.JOKER_GREY, r = 0.1, emboss = 0.05, padding = 0.07}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, emboss = 0.05, colour = G.C.BLACK, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.04}, nodes=suit_labels}, + {n=G.UIT.C, config={align = "cm", padding = 0.02}, nodes=deck_tables} + }}, + mod_suit_diff and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7)}, nodes = {}}, + {n=G.UIT.T, config={text =' '..localize('ph_deck_preview_effective'),colour = G.C.WHITE, scale =0.3}}, + }} or nil, + wheel_flipped_text and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = flip_col}, nodes = {}}, + {n=G.UIT.T, config={text =' '..(wheel_flipped > 1 and + localize{type = 'variable', key = 'deck_preview_wheel_plural', vars = {wheel_flipped}} or + localize{type = 'variable', key = 'deck_preview_wheel_singular', vars = {wheel_flipped}}),colour = G.C.WHITE, scale =0.3}}, + }} or nil, + }} + }} + return t +end + +function create_UIBox_character_button(args) + local button = args.button or "NONE" + local func = args.func or nil + local colour = args.colour or G.C.RED + local update_func = args.update_func or nil + + local t = {n=G.UIT.ROOT, config = {align = "cm", padding = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "tm", minw = 1.9, padding = 0.2, minh = 1.2, r = 0.1, hover = true, colour = colour, button = func, func = update_func, shadow = true, maxw = args.maxw}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = button, scale = 0.55, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'x', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }}, + }} + return t +end + +function G.UIDEF.shop() + G.shop_jokers = CardArea( + G.hand.T.x+0, + G.hand.T.y+G.ROOM.T.y + 9, + G.GAME.shop.joker_max*1.02*G.CARD_W, + 1.05*G.CARD_H, + {card_limit = G.GAME.shop.joker_max, type = 'shop', highlight_limit = 1}) + + + G.shop_vouchers = CardArea( + G.hand.T.x+0, + G.hand.T.y+G.ROOM.T.y + 9, + 2.1*G.CARD_W, + 1.05*G.CARD_H, + {card_limit = 1, type = 'shop', highlight_limit = 1}) + + G.shop_booster = CardArea( + G.hand.T.x+0, + G.hand.T.y+G.ROOM.T.y + 9, + 2.4*G.CARD_W, + 1.15*G.CARD_H, + {card_limit = 2, type = 'shop', highlight_limit = 1, card_w = 1.27*G.CARD_W}) + + local shop_sign = AnimatedSprite(0,0, 4.4, 2.2, G.ANIMATION_ATLAS['shop_sign']) + shop_sign:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + G.SHOP_SIGN = UIBox{ + definition = + {n=G.UIT.ROOT, config = {colour = G.C.DYN_UI.MAIN, emboss = 0.05, align = 'cm', r = 0.1, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minw = 4.72, minh = 3.1, colour = G.C.DYN_UI.DARK, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = shop_sign}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_improve_run')}, colours = {lighten(G.C.GOLD, 0.3)},shadow = true, rotate = true, float = true, bump = true, scale = 0.5, spacing = 1, pop_in = 1.5, maxw = 4.3})}} + }}, + }}, + }}, + config = { + align="cm", + offset = {x=0,y=-15}, + major = G.HUD:get_UIE_by_ID('row_blind'), + bond = 'Weak' + } + } + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.SHOP_SIGN.alignment.offset.y = 0 + return true + end) + })) + local t = {n=G.UIT.ROOT, config = {align = 'cl', colour = G.C.CLEAR}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.1, emboss = 0.05, r = 0.1, colour = G.C.DYN_UI.BOSS_MAIN}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R,config={id = 'next_round_button', align = "cm", minw = 2.8, minh = 1.5, r=0.15,colour = G.C.RED, one_press = true, button = 'toggle_shop', hover = true,shadow = true}, nodes = { + {n=G.UIT.R, config={align = "cm", padding = 0.07, focus_args = {button = 'y', orientation = 'cr'}, func = 'set_button_pip'}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text = localize('b_next_round_1'), scale = 0.4, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text = localize('b_next_round_2'), scale = 0.4, colour = G.C.WHITE, shadow = true}} + }} + }}, + }}, + {n=G.UIT.R, config={align = "cm", minw = 2.8, minh = 1.6, r=0.15,colour = G.C.GREEN, button = 'reroll_shop', func = 'can_reroll', hover = true,shadow = true}, nodes = { + {n=G.UIT.R, config={align = "cm", padding = 0.07, focus_args = {button = 'x', orientation = 'cr'}, func = 'set_button_pip'}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text = localize('k_reroll'), scale = 0.4, colour = G.C.WHITE, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", maxw = 1.3, minw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('$'), scale = 0.7, colour = G.C.WHITE, shadow = true}}, + {n=G.UIT.T, config={ref_table = G.GAME.current_round, ref_value = 'reroll_cost', scale = 0.75, colour = G.C.WHITE, shadow = true}}, + }} + }} + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.2, r=0.2, colour = G.C.L_BLACK, emboss = 0.05, minw = 8.2}, nodes={ + {n=G.UIT.O, config={object = G.shop_jokers}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.2}, nodes={}}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.15, r=0.2, colour = G.C.L_BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.2, r=0.2, colour = G.C.BLACK, maxh = G.shop_vouchers.T.h+0.4}, nodes={ + {n=G.UIT.T, config={text = localize{type = 'variable', key = 'ante_x_voucher', vars = {G.GAME.round_resets.ante}}, scale = 0.45, colour = G.C.L_BLACK, vert = true}}, + {n=G.UIT.O, config={object = G.shop_vouchers}}, + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.15, r=0.2, colour = G.C.L_BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.O, config={object = G.shop_booster}}, + }}, + }} + } + }, + + }, false) + }} + return t +end + + function create_card_for_shop(area) + if area == G.shop_jokers and G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_shop and G.SETTINGS.tutorial_progress.forced_shop[#G.SETTINGS.tutorial_progress.forced_shop] then + local t = G.SETTINGS.tutorial_progress.forced_shop + local _center = G.P_CENTERS[t[#t]] or G.P_CENTERS.c_empress + local card = Card(area.T.x + area.T.w/2, area.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, _center, {bypass_discovery_center = true, bypass_discovery_ui = true}) + t[#t] = nil + if not t[1] then G.SETTINGS.tutorial_progress.forced_shop = nil end + + create_shop_card_ui(card) + return card + else + local forced_tag = nil + for k, v in ipairs(G.GAME.tags) do + if not forced_tag then + forced_tag = v:apply_to_run({type = 'store_joker_create', area = area}) + if forced_tag then + for kk, vv in ipairs(G.GAME.tags) do + if vv:apply_to_run({type = 'store_joker_modify', card = forced_tag}) then break end + end + return forced_tag end + end + end + G.GAME.spectral_rate = G.GAME.spectral_rate or 0 + local total_rate = G.GAME.joker_rate + G.GAME.tarot_rate + G.GAME.planet_rate + G.GAME.playing_card_rate + G.GAME.spectral_rate + local polled_rate = pseudorandom(pseudoseed('cdt'..G.GAME.round_resets.ante))*total_rate + local check_rate = 0 + for _, v in ipairs({ + {type = 'Joker', val = G.GAME.joker_rate}, + {type = 'Tarot', val = G.GAME.tarot_rate}, + {type = 'Planet', val = G.GAME.planet_rate}, + {type = (G.GAME.used_vouchers["v_illusion"] and pseudorandom(pseudoseed('illusion')) > 0.6) and 'Enhanced' or 'Base', val = G.GAME.playing_card_rate}, + {type = 'Spectral', val = G.GAME.spectral_rate}, + }) do + if polled_rate > check_rate and polled_rate <= check_rate + v.val then + local card = create_card(v.type, area, nil, nil, nil, nil, nil, 'sho') + create_shop_card_ui(card, v.type, area) + G.E_MANAGER:add_event(Event({ + func = (function() + for k, v in ipairs(G.GAME.tags) do + if v:apply_to_run({type = 'store_joker_modify', card = card}) then break end + end + return true + end) + })) + if (v.type == 'Base' or v.type == 'Enhanced') and G.GAME.used_vouchers["v_illusion"] and pseudorandom(pseudoseed('illusion')) > 0.8 then + local edition_poll = pseudorandom(pseudoseed('illusion')) + local edition = {} + if edition_poll > 1 - 0.15 then edition.polychrome = true + elseif edition_poll > 0.5 then edition.holo = true + else edition.foil = true + end + card:set_edition(edition) + end + return card + end + check_rate = check_rate + v.val + end + end + end + + function create_shop_card_ui(card, type, area) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.43, + blocking = false, + blockable = false, + func = (function() + if card.opening then return true end + local t1 = { + n=G.UIT.ROOT, config = {minw = 0.6, align = 'tm', colour = darken(G.C.BLACK, 0.2), shadow = true, r = 0.05, padding = 0.05, minh = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.BLACK, 0.1), r = 0.1, minw = 1, minh = 0.55, emboss = 0.05, padding = 0.03}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{prefix = localize('$'), ref_table = card, ref_value = 'cost'}}, colours = {G.C.MONEY},shadow = true, silent = true, bump = true, pop_in = 0, scale = 0.5})}}, + }} + }} + local t2 = card.ability.set == 'Voucher' and { + n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GREEN, shadow = true, r = 0.08, minh = 0.94, func = 'can_redeem', one_press = true, button = 'redeem_from_shop', hover = true}, nodes={ + {n=G.UIT.T, config={text = localize('b_redeem'),colour = G.C.WHITE, scale = 0.4}} + }} or card.ability.set == 'Booster' and { + n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GREEN, shadow = true, r = 0.08, minh = 0.94, func = 'can_open', one_press = true, button = 'open_booster', hover = true}, nodes={ + {n=G.UIT.T, config={text = localize('b_open'),colour = G.C.WHITE, scale = 0.5}} + }} or { + n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GOLD, shadow = true, r = 0.08, minh = 0.94, func = 'can_buy', one_press = true, button = 'buy_from_shop', hover = true}, nodes={ + {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}} + }} + local t3 = { + n=G.UIT.ROOT, config = {id = 'buy_and_use', ref_table = card, minh = 1.1, padding = 0.1, align = 'cr', colour = G.C.RED, shadow = true, r = 0.08, minw = 1.1, func = 'can_buy_and_use', one_press = true, button = 'buy_from_shop', hover = true, focus_args = {type = 'none'}}, nodes={ + {n=G.UIT.B, config = {w=0.1,h=0.6}}, + {n=G.UIT.C, config = {align = 'cm'}, nodes={ + {n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}} + }}, + {n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_and_use'),colour = G.C.WHITE, scale = 0.3}} + }}, + }} + }} + + + card.children.price = UIBox{ + definition = t1, + config = { + align="tm", + offset = {x=0,y=1.5}, + major = card, + bond = 'Weak', + parent = card + } + } + + card.children.buy_button = UIBox{ + definition = t2, + config = { + align="bm", + offset = {x=0,y=-0.3}, + major = card, + bond = 'Weak', + parent = card + } + } + + if card.ability.consumeable then --and card:can_use_consumeable(true, true) + card.children.buy_and_use_button = UIBox{ + definition = t3, + config = { + align="cr", + offset = {x=-0.3,y=0}, + major = card, + bond = 'Weak', + parent = card + } + } + end + + card.children.price.alignment.offset.y = card.ability.set == 'Booster' and 0.5 or 0.38 + + return true + end) + })) + end + + + function attention_text(args) + args = args or {} + args.text = args.text or 'test' + args.scale = args.scale or 1 + args.colour = copy_table(args.colour or G.C.WHITE) + args.hold = (args.hold or 0) + 0.1*(G.SPEEDFACTOR) + args.pos = args.pos or {x = 0, y = 0} + args.align = args.align or 'cm' + args.emboss = args.emboss or nil + + args.fade = 1 + + if args.cover then + args.cover_colour = copy_table(args.cover_colour or G.C.RED) + args.cover_colour_l = copy_table(lighten(args.cover_colour, 0.2)) + args.cover_colour_d = copy_table(darken(args.cover_colour, 0.2)) + else + args.cover_colour = copy_table(G.C.CLEAR) + end + + args.uibox_config = { + align = args.align or 'cm', + offset = args.offset or {x=0,y=0}, + major = args.cover or args.major or nil, + } + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0, + blockable = false, + blocking = false, + func = function() + args.AT = UIBox{ + T = {args.pos.x,args.pos.y,0,0}, + definition = + {n=G.UIT.ROOT, config = {align = args.cover_align or 'cm', minw = (args.cover and args.cover.T.w or 0.001) + (args.cover_padding or 0), minh = (args.cover and args.cover.T.h or 0.001) + (args.cover_padding or 0), padding = 0.03, r = 0.1, emboss = args.emboss, colour = args.cover_colour}, nodes={ + {n=G.UIT.O, config={draw_layer = 1, object = DynaText({scale = args.scale, string = args.text, maxw = args.maxw, colours = {args.colour},float = true, shadow = true, silent = not args.noisy, args.scale, pop_in = 0, pop_in_rate = 6, rotate = args.rotate or nil})}}, + }}, + config = args.uibox_config + } + args.AT.attention_text = true + + args.text = args.AT.UIRoot.children[1].config.object + args.text:pulse(0.5) + + if args.cover then + Particles(args.pos.x,args.pos.y, 0,0, { + timer_type = 'TOTAL', + timer = 0.01, + pulse_max = 15, + max = 0, + scale = 0.3, + vel_variation = 0.2, + padding = 0.1, + fill=true, + lifespan = 0.5, + speed = 2.5, + attach = args.AT.UIRoot, + colours = {args.cover_colour, args.cover_colour_l, args.cover_colour_d}, + }) + end + if args.backdrop_colour then + args.backdrop_colour = copy_table(args.backdrop_colour) + Particles(args.pos.x,args.pos.y,0,0,{ + timer_type = 'TOTAL', + timer = 5, + scale = 2.4*(args.backdrop_scale or 1), + lifespan = 5, + speed = 0, + attach = args.AT, + colours = {args.backdrop_colour} + }) + end + return true + end + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = args.hold, + blockable = false, + blocking = false, + func = function() + if not args.start_time then + args.start_time = G.TIMERS.TOTAL + args.text:pop_out(3) + else + --args.AT:align_to_attach() + args.fade = math.max(0, 1 - 3*(G.TIMERS.TOTAL - args.start_time)) + if args.cover_colour then args.cover_colour[4] = math.min(args.cover_colour[4], 2*args.fade) end + if args.cover_colour_l then args.cover_colour_l[4] = math.min(args.cover_colour_l[4], args.fade) end + if args.cover_colour_d then args.cover_colour_d[4] = math.min(args.cover_colour_d[4], args.fade) end + if args.backdrop_colour then args.backdrop_colour[4] = math.min(args.backdrop_colour[4], args.fade) end + args.colour[4] = math.min(args.colour[4], args.fade) + if args.fade <= 0 then + args.AT:remove() + return true + end + end + end + })) + end + + function create_UIBox_buttons() + local text_scale = 0.45 + local button_height = 1.3 + local play_button = {n=G.UIT.C, config={id = 'play_button', align = "tm", minw = 2.5, padding = 0.3, r = 0.1, hover = true, colour = G.C.BLUE, button = "play_cards_from_highlighted", one_press = true, shadow = true, func = 'can_play'}, nodes={ + {n=G.UIT.R, config={align = "bcm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_play_hand'), scale = text_scale, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'x', orientation = 'bm'}, func = 'set_button_pip'}} + }}, + }} + + local discard_button = {n=G.UIT.C, config={id = 'discard_button',align = "tm", padding = 0.3, r = 0.1, minw = 2.5, minh = button_height, hover = true, colour = G.C.RED, button = "discard_cards_from_highlighted", one_press = true, shadow = true, func = 'can_discard'}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_discard'), scale = text_scale, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + + local t = { + n=G.UIT.ROOT, config = {align = "cm", minw = 1, minh = 0.3,padding = 0.15, r = 0.1, colour = G.C.CLEAR}, nodes={ + G.SETTINGS.play_button_pos == 1 and discard_button or play_button, + + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour =G.C.UI.TRANSPARENT_DARK, outline = 1.5, outline_colour = mix_colours(G.C.WHITE,G.C.JOKER_GREY, 0.7), line_emboss = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_sort_hand'), scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 0.7, minw = 0.9, padding = 0.1, r = 0.1, hover = true, colour =G.C.ORANGE, button = "sort_hand_value", shadow = true}, nodes={ + {n=G.UIT.T, config={text = localize('k_rank'), scale = text_scale*0.7, colour = G.C.UI.TEXT_LIGHT}} + }}, + {n=G.UIT.C, config={align = "cm", minh = 0.7, minw = 0.9, padding = 0.1, r = 0.1, hover = true, colour =G.C.ORANGE, button = "sort_hand_suit", shadow = true}, nodes={ + {n=G.UIT.T, config={text = localize('k_suit'), scale = text_scale*0.7, colour = G.C.UI.TEXT_LIGHT}} + }} + }} + }} + }}, + + G.SETTINGS.play_button_pos == 1 and play_button or discard_button, + } + } + return t + end + + function desc_from_rows(desc_nodes, empty, maxw) + local t = {} + for k, v in ipairs(desc_nodes) do + t[#t+1] = {n=G.UIT.R, config={align = "cm", maxw = maxw}, nodes=v} + end + return {n=G.UIT.R, config={align = "cm", colour = empty and G.C.CLEAR or G.C.UI.BACKGROUND_WHITE, r = 0.1, padding = 0.04, minw = 2, minh = 0.8, emboss = not empty and 0.05 or nil, filler = true}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t} + }} + end + + function transparent_multiline_text(desc_nodes) + local t = {} + for k, v in ipairs(desc_nodes) do + t[#t+1] = {n=G.UIT.R, config={align = "cm", maxw = maxw}, nodes=v} + end + return {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t} + end + + function info_tip_from_rows(desc_nodes, name) + local t = {} + for k, v in ipairs(desc_nodes) do + t[#t+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v} + end + return {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.GREY, 0.15), r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "tm", minh = 0.36, padding = 0.03}, nodes={{n=G.UIT.T, config={text = name, scale = 0.32, colour = G.C.UI.TEXT_LIGHT}}}}, + {n=G.UIT.R, config={align = "cm", minw = 1.5, minh = 0.4, r = 0.1, padding = 0.05, colour = G.C.WHITE}, nodes={{n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t}}} + }} + end + + function overlay_infotip(text_rows) + local t = {} + if type(text_rows) ~= 'table' then text_rows = {"ERROR"} end + for k, v in ipairs(text_rows) do + t[#t+1] = {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = v,colour = G.C.UI.TEXT_LIGHT, scale = 0.45, juice = true, shadow = true, lang = text_rows.lang}} + }} + end + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, padding = 0.1}, nodes=t} + end + + function name_from_rows(name_nodes, background_colour) + if not name_nodes or (type(name_nodes) ~= 'table') or not next(name_nodes) then return end + return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = background_colour, emboss = background_colour and 0.05 or nil}, nodes=name_nodes} + end + + function G.UIDEF.card_h_popup(card) + if card.ability_UIBox_table then + local AUT = card.ability_UIBox_table + local debuffed = card.debuff + local card_type_colour = get_type_colour(card.config.center or card.config, card) + local card_type_background = + (AUT.card_type == 'Locked' and G.C.BLACK) or + ((AUT.card_type == 'Undiscovered') and darken(G.C.JOKER_GREY, 0.3)) or + (AUT.card_type == 'Enhanced' or AUT.card_type == 'Default') and darken(G.C.BLACK, 0.1) or + (debuffed and darken(G.C.BLACK, 0.1)) or + (card_type_colour and darken(G.C.BLACK, 0.1)) or + G.C.SET[AUT.card_type] or + {0, 1, 1, 1} + + local outer_padding = 0.05 + local card_type = localize('k_'..string.lower(AUT.card_type)) + + if AUT.card_type == 'Joker' or (AUT.badges and AUT.badges.force_rarity) then card_type = ({localize('k_common'), localize('k_uncommon'), localize('k_rare'), localize('k_legendary')})[card.config.center.rarity] end + if AUT.card_type == 'Enhanced' then card_type = localize{type = 'name_text', key = card.config.center.key, set = 'Enhanced'} end + card_type = (debuffed and AUT.card_type ~= 'Enhanced') and localize('k_debuffed') or card_type + + local disp_type, is_playing_card = + (AUT.card_type ~= 'Locked' and AUT.card_type ~= 'Undiscovered' and AUT.card_type ~= 'Default') or debuffed, + AUT.card_type == 'Enhanced' or AUT.card_type == 'Default' + + local info_boxes = {} + local badges = {} + + if AUT.badges.card_type or AUT.badges.force_rarity then + badges[#badges + 1] = create_badge(((card.ability.name == 'Pluto' or card.ability.name == 'Ceres' or card.ability.name == 'Eris') and localize('k_dwarf_planet')) or (card.ability.name == 'Planet X' and localize('k_planet_q') or card_type),card_type_colour, nil, 1.2) + end + if AUT.badges then + for k, v in ipairs(AUT.badges) do + if v == 'negative_consumable' then v = 'negative' end + badges[#badges + 1] = create_badge(localize(v, "labels"), get_badge_colour(v)) + end + end + + if AUT.info then + for k, v in ipairs(AUT.info) do + info_boxes[#info_boxes+1] = + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, padding = 0.05, emboss = 0.05}, nodes={ + info_tip_from_rows(v, v.name), + }} + }} + end + end + + return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", func = 'show_infotip',object = Moveable(),ref_table = next(info_boxes) and info_boxes or nil}, nodes={ + {n=G.UIT.R, config={padding = outer_padding, r = 0.12, colour = lighten(G.C.JOKER_GREY, 0.5), emboss = 0.07}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.07, r = 0.1, colour = adjust_alpha(card_type_background, 0.8)}, nodes={ + name_from_rows(AUT.name, is_playing_card and G.C.WHITE or nil), + desc_from_rows(AUT.main), + badges[1] and {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=badges} or nil, + }} + }} + }}, + }} + end + end + + function get_badge_colour(key) + G.BADGE_COL = G.BADGE_COL or { + eternal = G.C.ETERNAL, + perishable = G.C.PERISHABLE, + rental = G.C.RENTAL, + foil = G.C.DARK_EDITION, + holographic = G.C.DARK_EDITION, + polychrome = G.C.DARK_EDITION, + negative = G.C.DARK_EDITION, + gold_seal = G.C.GOLD, + red_seal = G.C.RED, + blue_seal = G.C.BLUE, + purple_seal = G.C.PURPLE, + pinned_left = G.C.ORANGE, + } + return G.BADGE_COL[key] or {1, 0, 0, 1} + end + + function create_badge(_string, _badge_col, _text_col, scaling) + scaling = scaling or 1 + return {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = _badge_col or G.C.GREEN, r = 0.1, minw = 2, minh = 0.4*scaling, emboss = 0.05, padding = 0.03*scaling}, nodes={ + {n=G.UIT.B, config={h=0.1,w=0.03}}, + {n=G.UIT.O, config={object = DynaText({string = _string or 'ERROR', colours = {_text_col or G.C.WHITE},float = true, shadow = true, offset_y = -0.05, silent = true, spacing = 1, scale = 0.33*scaling})}}, + {n=G.UIT.B, config={h=0.1,w=0.03}}, + }} + }} + end + + function create_UIBox_detailed_tooltip(_center) + local full_UI_table = { + main = {}, + info = {}, + type = {}, + name = 'done', + badges = badges or {} + } + local desc = generate_card_ui(_center, full_UI_table, nil, _center.set, nil) + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, padding = 0.05, emboss = 0.05}, nodes={ + info_tip_from_rows(desc.info[1], desc.info[1].name), + }} + }} + end + + function create_popup_UIBox_tooltip(tooltip) + local title = tooltip.title or nil + local text = tooltip.text or {} + local rows = {} + if title then + local r = {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = title,colour = G.C.UI.TEXT_DARK, scale = 0.4}}}}}} + table.insert(rows, r) + end + for i = 1, #text do + if type(text[i]) == 'table' then + local r = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={ + {n=G.UIT.T, config={ref_table = text[i].ref_table, ref_value = text[i].ref_value,colour = G.C.UI.TEXT_DARK, scale = 0.4}}}} + table.insert(rows, r) + else + local r = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={ + {n=G.UIT.T, config={text = text[i],colour = G.C.UI.TEXT_DARK, scale = 0.4}}}} + table.insert(rows, r) + end + end + if tooltip.filler then + table.insert(rows, tooltip.filler.func(tooltip.filler.args)) + end + local t = { + n=G.UIT.ROOT, config = {align = "cm", padding = 0.05, r=0.1, colour = G.C.RED, emboss = 0.05}, nodes= + {{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.WHITE, emboss = 0.05}, nodes=rows}}} + return t + end + +function create_UIBox_HUD_blind() + local scale = 0.4 + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5) + G.GAME.blind:change_dim(1.5,1.5) + + return {n=G.UIT.ROOT, config={align = "cm", minw = 4.5, r = 0.1, colour = G.C.BLACK, emboss = 0.05, padding = 0.05, func = 'HUD_blind_visible', id = 'HUD_blind'}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.7, r = 0.1, emboss = 0.05, colour = G.C.DYN_UI.MAIN}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 3}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.blind, ref_value = 'loc_name'}}, colours = {G.C.UI.TEXT_LIGHT},shadow = true, rotate = true, silent = true, float = true, scale = 1.6*scale, y_offset = -4}),id = 'HUD_blind_name'}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 2.74, r = 0.1,colour = G.C.DYN_UI.DARK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.3, maxw = 4.2}, nodes={ + {n=G.UIT.T, config={ref_table = {val = ''}, ref_value = 'val', scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, func = 'HUD_blind_debuff_prefix'}}, + {n=G.UIT.T, config={ref_table = G.GAME.blind.loc_debuff_lines, ref_value = 1, scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, id = 'HUD_blind_debuff_1', func = 'HUD_blind_debuff'}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.3, maxw = 4.2}, nodes={ + {n=G.UIT.T, config={ref_table = G.GAME.blind.loc_debuff_lines, ref_value = 2, scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, id = 'HUD_blind_debuff_2', func = 'HUD_blind_debuff'}} + }}, + }}, + {n=G.UIT.R, config={align = "cm",padding = 0.15}, nodes={ + {n=G.UIT.O, config={object = G.GAME.blind, draw_layer = 1}}, + {n=G.UIT.C, config={align = "cm",r = 0.1, padding = 0.05, emboss = 0.05, minw = 2.9, colour = G.C.BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.3, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5, colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.B, config={h=0.1,w=0.1}}, + {n=G.UIT.T, config={ref_table = G.GAME.blind, ref_value = 'chip_text', scale = 0.001, colour = G.C.RED, shadow = true, id = 'HUD_blind_count', func = 'blind_chip_UI_scale'}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.45, maxw = 2.8, func = 'HUD_blind_reward'}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.3, colour = G.C.WHITE}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'dollars_to_be_earned'}}, colours = {G.C.MONEY},shadow = true, rotate = true, bump = true, silent = true, scale = 0.45}),id = 'dollars_to_be_earned'}}, + }}, + }}, + }}, + }}, + }} +end + +function add_tag(_tag) + G.HUD_tags = G.HUD_tags or {} + local tag_sprite_ui = _tag:generate_UI() + G.HUD_tags[#G.HUD_tags+1] = UIBox{ + definition = {n=G.UIT.ROOT, config={align = "cm",padding = 0.05, colour = G.C.CLEAR}, nodes={ + tag_sprite_ui + }}, + config = { + align = G.HUD_tags[1] and 'tm' or 'bri', + offset = G.HUD_tags[1] and {x=0,y=0} or {x=0.7,y=0}, + major = G.HUD_tags[1] and G.HUD_tags[#G.HUD_tags] or G.ROOM_ATTACH} + } + discover_card(G.P_TAGS[_tag.key]) + + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'tag_add', tag = _tag}) + end + + G.GAME.tags[#G.GAME.tags+1] = _tag + _tag.HUD_tag = G.HUD_tags[#G.HUD_tags] +end + +function create_UIBox_HUD() + local scale = 0.4 + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5) + + local contents = {} + + local spacing = 0.13 + local temp_col = G.C.DYN_UI.BOSS_MAIN + local temp_col2 = G.C.DYN_UI.BOSS_DARK + contents.round = { + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={id = 'hud_hands',align = "cm", padding = 0.05, minw = 1.45, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={ + {n=G.UIT.T, config={text = localize('k_hud_hands'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'hands_left'}}, font = G.LANGUAGES['en-us'].font, colours = {G.C.BLUE},shadow = true, rotate = true, scale = 2*scale}),id = 'hand_UI_count'}}, + }} + }}, + {n=G.UIT.C, config={minw = spacing},nodes={}}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={ + {n=G.UIT.T, config={text = localize('k_hud_discards'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'discards_left'}}, font = G.LANGUAGES['en-us'].font, colours = {G.C.RED},shadow = true, rotate = true, scale = 2*scale}),id = 'discard_UI_count'}}, + }} + }}, + }}, + }}, + {n=G.UIT.R, config={minh = spacing},nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45*2 + spacing, minh = 1.15, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, minw = 1.28*2+spacing, minh = 1, colour = temp_col2}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'dollars', prefix = localize('$')}}, maxw = 1.35, colours = {G.C.MONEY}, font = G.LANGUAGES['en-us'].font, shadow = true,spacing = 2, bump = true, scale = 2.2*scale}), id = 'dollar_text_UI'}} + }}, + }}, + }}, + }}, + {n=G.UIT.R, config={minh = spacing},nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={id = 'hud_ante',align = "cm", padding = 0.05, minw = 1.45, minh = 1, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={ + {n=G.UIT.T, config={text = localize('k_ante'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.round_resets, ref_value = 'ante'}}, colours = {G.C.IMPORTANT},shadow = true, font = G.LANGUAGES['en-us'].font, scale = 2*scale}),id = 'ante_UI_count'}}, + {n=G.UIT.T, config={text = " ", scale = 0.3*scale}}, + {n=G.UIT.T, config={text = "/ ", scale = 0.7*scale, colour = G.C.WHITE, shadow = true}}, + {n=G.UIT.T, config={ref_table = G.GAME, ref_value='win_ante', scale = scale, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.C, config={minw = spacing},nodes={}}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45, minh = 1, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 1.35}, nodes={ + {n=G.UIT.T, config={text = localize('k_round'), minh = 0.33, scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2, id = 'row_round_text'}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'round'}}, colours = {G.C.IMPORTANT},shadow = true, scale = 2*scale}),id = 'round_UI_count'}}, + }}, + }}, + }}, + } + + contents.hand = + {n=G.UIT.R, config={align = "cm", id = 'hand_text_area', colour = darken(G.C.BLACK, 0.1), r = 0.1, emboss = 0.05, padding = 0.03}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 1.1}, nodes={ + {n=G.UIT.O, config={id = 'hand_name', func = 'hand_text_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "handname_text"}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, float = true, scale = scale*1.4})}}, + {n=G.UIT.O, config={id = 'hand_chip_total', func = 'hand_chip_total_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "chip_total_text"}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, float = true, scale = scale*1.4})}}, + {n=G.UIT.T, config={ref_table = G.GAME.current_round.current_hand, ref_value='hand_level', scale = scale, colour = G.C.UI.TEXT_LIGHT, id = 'hand_level', shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 1, padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cr", minw = 2, minh =1, r = 0.1,colour = G.C.UI_CHIPS, id = 'hand_chip_area', emboss = 0.05}, nodes={ + {n=G.UIT.O, config={func = 'flame_handler',no_role = true, id = 'flame_chips', object = Moveable(0,0,0,0), w = 0, h = 0}}, + {n=G.UIT.O, config={id = 'hand_chips', func = 'hand_chip_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "chip_text"}}, colours = {G.C.UI.TEXT_LIGHT}, font = G.LANGUAGES['en-us'].font, shadow = true, float = true, scale = scale*2.3})}}, + {n=G.UIT.B, config={w=0.1,h=0.1}}, + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = "X", lang = G.LANGUAGES['en-us'], scale = scale*2, colour = G.C.UI_MULT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", minw = 2, minh=1, r = 0.1,colour = G.C.UI_MULT, id = 'hand_mult_area', emboss = 0.05}, nodes={ + {n=G.UIT.O, config={func = 'flame_handler',no_role = true, id = 'flame_mult', object = Moveable(0,0,0,0), w = 0, h = 0}}, + {n=G.UIT.B, config={w=0.1,h=0.1}}, + {n=G.UIT.O, config={id = 'hand_mult', func = 'hand_mult_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "mult_text"}}, colours = {G.C.UI.TEXT_LIGHT}, font = G.LANGUAGES['en-us'].font, shadow = true, float = true, scale = scale*2.3})}}, + }} + }} + }} + }} + contents.dollars_chips = {n=G.UIT.R, config={align = "cm",r=0.1, padding = 0,colour = G.C.DYN_UI.BOSS_MAIN, emboss = 0.05, id = 'row_dollars_chips'}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 1.3}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text = localize('k_round'), scale = 0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text =localize('k_lower_score'), scale = 0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }}, + {n=G.UIT.C, config={align = "cm", minw = 3.3, minh = 0.7, r = 0.1, colour = G.C.DYN_UI.BOSS_DARK}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5 , object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.B, config={w=0.1,h=0.1}}, + {n=G.UIT.T, config={ref_table = G.GAME, ref_value = 'chips_text', lang = G.LANGUAGES['en-us'], scale = 0.85, colour = G.C.WHITE, id = 'chip_UI_count', func = 'chip_UI_set', shadow = true}} + }} + }} + }} + + contents.buttons = { + {n=G.UIT.C, config={align = "cm", r=0.1, colour = G.C.CLEAR, shadow = true, id = 'button_area', padding = 0.2}, nodes={ + {n=G.UIT.R, config={id = 'run_info_button', align = "cm", minh = 1.75, minw = 1.5,padding = 0.05, r = 0.1, hover = true, colour = G.C.RED, button = "run_info", shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.4}, nodes={ + {n=G.UIT.T, config={text = localize('b_run_info_1'), scale = 1.2*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.4}, nodes={ + {n=G.UIT.T, config={text = localize('b_run_info_2'), scale = 1*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true, focus_args = {button = G.F_GUIDE and 'guide' or 'back', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }}, + {n=G.UIT.R, config={align = "cm", minh = 1.75, minw = 1.5,padding = 0.05, r = 0.1, hover = true, colour = G.C.ORANGE, button = "options", shadow = true}, nodes={ + {n=G.UIT.C, config={align = "cm", maxw = 1.4, focus_args = {button = 'start', orientation = 'bm'}, func = 'set_button_pip'}, nodes={ + {n=G.UIT.T, config={text = localize('b_options'), scale = scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + }} + }} + } + + return {n=G.UIT.ROOT, config = {align = "cm", padding = 0.03, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + {n=G.UIT.R, config = {align = "cm", padding= 0.05, colour = G.C.DYN_UI.MAIN, r=0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = G.C.DYN_UI.BOSS_DARK, r=0.1, minh = 30, padding = 0.08}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.3}, nodes={}}, + {n=G.UIT.R, config={align = "cm", id = 'row_blind', minw = 1, minh = 3.75}, nodes={}}, + contents.dollars_chips, + contents.hand, + {n=G.UIT.R, config={align = "cm", id = 'row_round'}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes=contents.buttons}, + {n=G.UIT.C, config={align = "cm"}, nodes=contents.round} + }}, + }} + }} + }} +end + +function create_UIBox_blind_select() + G.blind_prompt_box = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, padding = 0.2}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('ph_choose_blind_1'), colours = {G.C.WHITE}, shadow = true, bump = true, scale = 0.6, pop_in = 0.5, maxw = 5}), id = 'prompt_dynatext1'}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('ph_choose_blind_2'), colours = {G.C.WHITE}, shadow = true, bump = true, scale = 0.7, pop_in = 0.5, maxw = 5, silent = true}), id = 'prompt_dynatext2'}} + }}, + (G.GAME.used_vouchers["v_retcon"] or G.GAME.used_vouchers["v_directors_cut"]) and + UIBox_button({label = {localize('b_reroll_boss'), localize('$')..'10'}, button = "reroll_boss", func = 'reroll_boss_button'}) or nil + }}, + config = {align="cm", offset = {x=0,y=-15},major = G.HUD:get_UIE_by_ID('row_blind'), bond = 'Weak'} + } + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.blind_prompt_box.alignment.offset.y = 0 + return true + end) + })) + + local width = G.hand.T.w + G.GAME.blind_on_deck = + not (G.GAME.round_resets.blind_states.Small == 'Defeated' or G.GAME.round_resets.blind_states.Small == 'Skipped' or G.GAME.round_resets.blind_states.Small == 'Hide') and 'Small' or + not (G.GAME.round_resets.blind_states.Big == 'Defeated' or G.GAME.round_resets.blind_states.Big == 'Skipped'or G.GAME.round_resets.blind_states.Big == 'Hide') and 'Big' or + 'Boss' + + G.blind_select_opts = {} + G.blind_select_opts.small = G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Small')},false,get_blind_main_colour('Small'))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil + G.blind_select_opts.big = G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Big')},false,get_blind_main_colour('Big'))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil + G.blind_select_opts.boss = G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Boss')},false,get_blind_main_colour('Boss'), mix_colours(G.C.BLACK, get_blind_main_colour('Boss'), 0.8))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil + + local t = {n=G.UIT.ROOT, config = {align = 'tm',minw = width, r = 0.15, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.5}, nodes={ + G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.small}} or nil, + G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.big}} or nil, + G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.boss}} or nil, + }} + }} + return t +end + +function create_UIBox_blind_tag(blind_choice, run_info) + G.GAME.round_resets.blind_tags = G.GAME.round_resets.blind_tags or {} + if not G.GAME.round_resets.blind_tags[blind_choice] then return nil end + local _tag = Tag(G.GAME.round_resets.blind_tags[blind_choice], nil, blind_choice) + local _tag_ui, _tag_sprite = _tag:generate_UI() + _tag_sprite.states.collide.can = not not run_info + return + {n=G.UIT.R, config={id = 'tag_container', ref_table = _tag, align = "cm"}, nodes={ + {n=G.UIT.R, config={align = 'tm', minh = 0.65}, nodes={ + {n=G.UIT.T, config={text = localize('k_or'), scale = 0.55, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}}, + }}, + {n=G.UIT.R, config={id = 'tag_'..blind_choice, align = "cm", r = 0.1, padding = 0.1, minw = 1, can_collide = true, ref_table = _tag_sprite}, nodes={ + {n=G.UIT.C, config={id = 'tag_desc', align = "cm", minh = 1}, nodes={ + _tag_ui + }}, + not run_info and {n=G.UIT.C, config={align = "cm", colour = G.C.UI.BACKGROUND_INACTIVE, minh = 0.6, minw = 2, maxw = 2, padding = 0.07, r = 0.1, shadow = true, hover = true, one_press = true, button = 'skip_blind', func = 'hover_tag_proxy', ref_table = _tag}, nodes={ + {n=G.UIT.T, config={text = localize('b_skip_blind'), scale = 0.4, colour = G.C.UI.TEXT_INACTIVE}} + }} or {n=G.UIT.C, config={align = "cm", padding = 0.1, emboss = 0.05, colour = mix_colours(G.C.BLUE, G.C.BLACK, 0.4), r = 0.1, maxw = 2}, nodes={ + {n=G.UIT.T, config={text = localize('b_skip_reward'), scale = 0.35, colour = G.C.WHITE}}, + }}, + }} + }} +end + +function create_UIBox_blind_choice(type, run_info) + if not G.GAME.blind_on_deck then + G.GAME.blind_on_deck = 'Small' + end + if not run_info then G.GAME.round_resets.blind_states[G.GAME.blind_on_deck] = 'Select' end + + local disabled = false + type = type or 'Small' + + local blind_choice = { + config = G.P_BLINDS[G.GAME.round_resets.blind_choices[type]], + } + + blind_choice.animation = AnimatedSprite(0,0, 1.4, 1.4, G.ANIMATION_ATLAS['blind_chips'], blind_choice.config.pos) + blind_choice.animation:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + local extras = nil + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5) + + G.GAME.orbital_choices = G.GAME.orbital_choices or {} + G.GAME.orbital_choices[G.GAME.round_resets.ante] = G.GAME.orbital_choices[G.GAME.round_resets.ante] or {} + + if not G.GAME.orbital_choices[G.GAME.round_resets.ante][type] then + local _poker_hands = {} + for k, v in pairs(G.GAME.hands) do + if v.visible then _poker_hands[#_poker_hands+1] = k end + end + + G.GAME.orbital_choices[G.GAME.round_resets.ante][type] = pseudorandom_element(_poker_hands, pseudoseed('orbital')) + end + + + + if type == 'Small' then + extras = create_UIBox_blind_tag(type, run_info) + elseif type == 'Big' then + extras = create_UIBox_blind_tag(type, run_info) + elseif not run_info then + local dt1 = DynaText({string = {{string = localize('ph_up_ante_1'), colour = G.C.FILTER}}, colours = {G.C.BLACK}, scale = 0.55, silent = true, pop_delay = 4.5, shadow = true, bump = true, maxw = 3}) + local dt2 = DynaText({string = {{string = localize('ph_up_ante_2'), colour = G.C.WHITE}},colours = {G.C.CHANCE}, scale = 0.35, silent = true, pop_delay = 4.5, shadow = true, maxw = 3}) + local dt3 = DynaText({string = {{string = localize('ph_up_ante_3'), colour = G.C.WHITE}},colours = {G.C.CHANCE}, scale = 0.35, silent = true, pop_delay = 4.5, shadow = true, maxw = 3}) + extras = + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.07, r = 0.1, colour = {0,0,0,0.12}, minw = 2.9}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = dt1}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = dt2}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = dt3}}, + }}, + }}, + }} + end + G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante + local loc_target = localize{type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')}} + local loc_name = localize{type = 'name_text', key = blind_choice.config.key, set = 'Blind'} + local text_table = loc_target + local blind_col = get_blind_main_colour(type) + local blind_amt = get_blind_amount(G.GAME.round_resets.blind_ante)*blind_choice.config.mult*G.GAME.starting_params.ante_scaling + + local blind_state = G.GAME.round_resets.blind_states[type] + local _reward = true + if G.GAME.modifiers.no_blind_reward and G.GAME.modifiers.no_blind_reward[type] then _reward = nil end + if blind_state == 'Select' then blind_state = 'Current' end + local run_info_colour = run_info and (blind_state == 'Defeated' and G.C.GREY or blind_state == 'Skipped' and G.C.BLUE or blind_state == 'Upcoming' and G.C.ORANGE or blind_state == 'Current' and G.C.RED or G.C.GOLD) + local t = + {n=G.UIT.R, config={id = type, align = "tm", func = 'blind_choice_handler', minh = not run_info and 10 or nil, ref_table = {deck = nil, run_info = run_info}, r = 0.1, padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = mix_colours(G.C.BLACK, G.C.L_BLACK, 0.5), r = 0.1, outline = 1, outline_colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + not run_info and {n=G.UIT.R, config={id = 'select_blind_button', align = "cm", ref_table = blind_choice.config, colour = disabled and G.C.UI.BACKGROUND_INACTIVE or G.C.ORANGE, minh = 0.6, minw = 2.7, padding = 0.07, r = 0.1, shadow = true, hover = true, one_press = true, button = 'select_blind'}, nodes={ + {n=G.UIT.T, config={ref_table = G.GAME.round_resets.loc_blind_states, ref_value = type, scale = 0.45, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.UI.TEXT_LIGHT, shadow = not disabled}} + }} or + {n=G.UIT.R, config={id = 'select_blind_button', align = "cm", ref_table = blind_choice.config, colour = run_info_colour, minh = 0.6, minw = 2.7, padding = 0.07, r = 0.1, emboss = 0.08}, nodes={ + {n=G.UIT.T, config={text = localize(blind_state, 'blind_states'), scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }}, + {n=G.UIT.R, config={id = 'blind_name',align = "cm", padding = 0.07}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, outline = 1, outline_colour = blind_col, colour = darken(blind_col, 0.3), minw = 2.9, emboss = 0.1, padding = 0.07, line_emboss = 1}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = loc_name, colours = {disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE}, shadow = not disabled, float = not disabled, y_offset = -4, scale = 0.45, maxw =2.8})}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={id = 'blind_desc', align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 1.5}, nodes={ + {n=G.UIT.O, config={object = blind_choice.animation}}, + }}, + text_table[1] and {n=G.UIT.R, config={align = "cm", minh = 0.7, padding = 0.05, minw = 2.9}, nodes={ + text_table[1] and {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={ + {n=G.UIT.T, config={id = blind_choice.config.key, ref_table = {val = ''}, ref_value = 'val', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled, func = 'HUD_blind_debuff_prefix'}}, + {n=G.UIT.T, config={text = text_table[1] or '-', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}} + }} or nil, + text_table[2] and {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={ + {n=G.UIT.T, config={text = text_table[2] or '-', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}} + }} or nil, + }} or nil, + }}, + {n=G.UIT.R, config={align = "cm",r = 0.1, padding = 0.05, minw = 3.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 3}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.3, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5, colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.B, config={h=0.1,w=0.1}}, + {n=G.UIT.T, config={text = number_format(blind_amt), scale = score_number_scale(0.9, blind_amt), colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.RED, shadow = not disabled}} + }}, + _reward and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.35, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}}, + {n=G.UIT.T, config={text = string.rep(localize("$"), blind_choice.config.dollars)..'+', scale = 0.35, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.MONEY, shadow = not disabled}} + }} or nil, + }}, + }}, + }}, + }}, + {n=G.UIT.R, config={id = 'blind_extras', align = "cm"}, nodes={ + extras, + }} + + }} + return t +end + +function create_UIBox_round_evaluation() + local width = G.hand.T.w-2 + local t = {n=G.UIT.ROOT, config = {align = 'tm',colour = G.C.CLEAR}, nodes={ + UIBox_dyn_container( + { + {n=G.UIT.R, config={align = "tm", minw = width, minh = 3, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", minw = width, minh = 1.4}, nodes={}}, + {n=G.UIT.R, config={align = "cm", minw = width, id = 'base_round_eval'}, nodes={}}, + {n=G.UIT.R, config={align = "cm", minw = width, id = 'bonus_round_eval'}, nodes={}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={}}, + {n=G.UIT.R, config={align = "cm", minw = width, id = 'eval_bottom'}, nodes={}} + },false) + }} +return t +end + +function create_UIBox_arcana_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_arcana_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_spectral_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_spectral_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_standard_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W*1.1, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_standard_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_buffoon_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W*1.1, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_buffoon_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_celestial_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W*1.1 + 0.5, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_celestial_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_card_alert(args) + args = args or {} + return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, refresh_movement = true}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.15, minw = 0.42, minh = 0.42, colour = args.no_bg and G.C.CLEAR or args.bg_col or (args.red_bad and darken(G.C.RED, 0.1) or G.C.RED), draw_layer = 1, emboss = 0.05, refresh_movement = true}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = args.text or '!', colours = {G.C.WHITE},shadow = true, rotate = true,H_offset = args.y_offset or 0,bump_rate = args.text and 3 or 7, bump_amount = args.bump_amount or 3, bump = true,maxw = args.maxw, text_rot = args.text_rot or 0.2, spacing = 3*(args.scale or 1), scale = args.scale or 0.48})}} + }}, + }} +end + +function create_slider(args) + args = args or {} + args.colour = args.colour or G.C.RED + args.w = args.w or 1 + args.h = args.h or 0.5 + args.label_scale = args.label_scale or 0.5 + args.text_scale = args.text_scale or 0.3 + args.min = args.min or 0 + args.max = args.max or 1 + args.decimal_places = args.decimal_places or 0 + args.text = string.format("%."..tostring(args.decimal_places).."f", args.ref_table[args.ref_value]) + local startval = args.w * (args.ref_table[args.ref_value] - args.min)/(args.max - args.min) + + local t = + {n=G.UIT.C, config={align = "cm", minw = args.w, min_h = args.h, padding = 0.1, r = 0.1, colour = G.C.CLEAR, focus_args = {type = 'slider'}}, nodes={ + {n=G.UIT.C, config={align = "cl", minw = args.w, r = 0.1,min_h = args.h,collideable = true, hover = true, colour = G.C.BLACK,emboss = 0.05,func = 'slider', refresh_movement = true}, nodes={ + {n=G.UIT.B, config={w=startval,h=args.h, r = 0.1, colour = args.colour, ref_table = args, refresh_movement = true}}, + }}, + {n=G.UIT.C, config={align = "cm", minh = args.h,r = 0.1, minw = 0.8, colour = args.colour,shadow = true}, nodes={ + {n=G.UIT.T, config={ref_table = args, ref_value = 'text', scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, decimal_places = args.decimal_places}} + }}, + }} + if args.label then + t = {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.1*args.label_scale, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = args.label, scale = args.label_scale, colour = G.C.UI.TEXT_LIGHT}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + t + }} + }} + end + return t +end + +function create_toggle(args) + args = args or {} + args.active_colour = args.active_colour or G.C.RED + args.inactive_colour = args.inactive_colour or G.C.BLACK + args.w = args.w or 3 + args.h = args.h or 0.5 + args.scale = args.scale or 1 + args.label = args.label or 'TEST?' + args.label_scale = args.label_scale or 0.4 + args.ref_table = args.ref_table or {} + args.ref_value = args.ref_value or 'test' + + local check = Sprite(0,0,0.5*args.scale,0.5*args.scale,G.ASSET_ATLAS["icons"], {x=1, y=0}) + check.states.drag.can = false + check.states.visible = false + + local info = nil + if args.info then + info = {} + for k, v in ipairs(args.info) do + table.insert(info, {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={ + {n=G.UIT.T, config={text = v, scale = 0.25, colour = G.C.UI.TEXT_LIGHT}} + }}) + end + info = {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes=info} + end + + local t = + {n=args.col and G.UIT.C or G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR, focus_args = {funnel_from = true}}, nodes={ + {n=G.UIT.C, config={align = "cr", minw = args.w}, nodes={ + {n=G.UIT.T, config={text = args.label, scale = args.label_scale, colour = G.C.UI.TEXT_LIGHT}}, + {n=G.UIT.B, config={w = 0.1, h = 0.1}}, + }}, + {n=G.UIT.C, config={align = "cl", minw = 0.3*args.w}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, padding = 0.03, minw = 0.4*args.scale, minh = 0.4*args.scale, outline_colour = G.C.WHITE, outline = 1.2*args.scale, line_emboss = 0.5*args.scale, ref_table = args, + colour = args.inactive_colour, + button = 'toggle_button', button_dist = 0.2, hover = true, toggle_callback = args.callback, func = 'toggle', focus_args = {funnel_to = true}}, nodes={ + {n=G.UIT.O, config={object = check}}, + }}, + }} + }}, + }} + if args.info then + t = {n=args.col and G.UIT.C or G.UIT.R, config={align = "cm"}, nodes={ + t, + info, + }} + end + return t +end + +function create_option_cycle(args) + args = args or {} + args.colour = args.colour or G.C.RED + args.options = args.options or { + 'Option 1', + 'Option 2' + } + args.current_option = args.current_option or 1 + args.current_option_val = args.options[args.current_option] + args.opt_callback = args.opt_callback or nil + args.scale = args.scale or 1 + args.ref_table = args.ref_table or nil + args.ref_value = args.ref_value or nil + args.w = (args.w or 2.5)*args.scale + args.h = (args.h or 0.8)*args.scale + args.text_scale = (args.text_scale or 0.5)*args.scale + args.l = '<' + args.r = '>' + args.focus_args = args.focus_args or {} + args.focus_args.type = 'cycle' + + local info = nil + if args.info then + info = {} + for k, v in ipairs(args.info) do + table.insert(info, {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={ + {n=G.UIT.T, config={text = v, scale = 0.3*args.scale, colour = G.C.UI.TEXT_LIGHT}} + }}) + end + info = {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes=info} + end + + local disabled = #args.options < 2 + local pips = {} + for i = 1, #args.options do + pips[#pips+1] = {n=G.UIT.B, config={w = 0.1*args.scale, h = 0.1*args.scale, r = 0.05, id = 'pip_'..i, colour = args.current_option == i and G.C.WHITE or G.C.BLACK}} + end + + local choice_pips = not args.no_pips and {n=G.UIT.R, config={align = "cm", padding = (0.05 - (#args.options > 15 and 0.03 or 0))*args.scale}, nodes=pips} or nil + + local t = + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR, id = args.id and (not args.label and args.id or nil) or nil, focus_args = args.focus_args}, nodes={ + {n=G.UIT.C, config={align = "cm",r = 0.1, minw = 0.6*args.scale, hover = not disabled, colour = not disabled and args.colour or G.C.BLACK,shadow = not disabled, button = not disabled and 'option_cycle' or nil, ref_table = args, ref_value = 'l', focus_args = {type = 'none'}}, nodes={ + {n=G.UIT.T, config={ref_table = args, ref_value = 'l', scale = args.text_scale, colour = not disabled and G.C.UI.TEXT_LIGHT or G.C.UI.TEXT_INACTIVE}} + }}, + args.mid and + {n=G.UIT.C, config={id = 'cycle_main'}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={ + args.mid + }}, + not disabled and choice_pips or nil + }} + or {n=G.UIT.C, config={id = 'cycle_main', align = "cm", minw = args.w, minh = args.h, r = 0.1, padding = 0.05, colour = args.colour,emboss = 0.1, hover = true, can_collide = true, on_demand_tooltip = args.on_demand_tooltip}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = args, ref_value = "current_option_val"}}, colours = {G.C.UI.TEXT_LIGHT},pop_in = 0, pop_in_rate = 8, reset_pop_in = true,shadow = true, float = true, silent = true, bump = true, scale = args.text_scale, non_recalc = true})}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={ + }}, + not disabled and choice_pips or nil + }} + }}, + {n=G.UIT.C, config={align = "cm",r = 0.1, minw = 0.6*args.scale, hover = not disabled, colour = not disabled and args.colour or G.C.BLACK,shadow = not disabled, button = not disabled and 'option_cycle' or nil, ref_table = args, ref_value = 'r', focus_args = {type = 'none'}}, nodes={ + {n=G.UIT.T, config={ref_table = args, ref_value = 'r', scale = args.text_scale, colour = not disabled and G.C.UI.TEXT_LIGHT or G.C.UI.TEXT_INACTIVE}} + }}, + }} + + if args.cycle_shoulders then + t = + {n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR}, nodes = { + {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'leftshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = -0.1, y = 0}}}, nodes = {}}, + {n=G.UIT.C, config={id = 'cycle_shoulders', padding = 0.1}, nodes={t}}, + {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'rightshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = 0.1, y = 0}}}, nodes = {}}, + }} + else + t = + {n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR, padding = 0.0}, nodes = { + t + }} + end + if args.label or args.info then + t = {n=G.UIT.R, config={align = "cm", padding = 0.05, id = args.id or nil}, nodes={ + args.label and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = args.label, scale = 0.5*args.scale, colour = G.C.UI.TEXT_LIGHT}} + }} or nil, + t, + info, + }} + end + return t +end + +function create_tabs(args) + args = args or {} + args.colour = args.colour or G.C.RED + args.tab_alignment = args.tab_alignment or 'cm' + args.opt_callback = args.opt_callback or nil + args.scale = args.scale or 1 + args.tab_w = args.tab_w or 0 + args.tab_h = args.tab_h or 0 + args.text_scale = (args.text_scale or 0.5) + args.tabs = args.tabs or { + { + label = 'tab 1', + chosen = true, + func = nil, + tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'A', scale = 1, colour = G.C.UI.TEXT_LIGHT}} + }} end + }, + { + label = 'tab 2', + chosen = false, + tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'B', scale = 1, colour = G.C.UI.TEXT_LIGHT}} + }} end + }, + { + label = 'tab 3', + chosen = false, + tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'C', scale = 1, colour = G.C.UI.TEXT_LIGHT}} + }} end + } + } + + local tab_buttons = {} + + for k, v in ipairs(args.tabs) do + if v.chosen then args.current = {k = k, v = v} end + tab_buttons[#tab_buttons+1] = UIBox_button({id = 'tab_but_'..(v.label or ''), ref_table = v, button = 'change_tab', label = {v.label}, minh = 0.8*args.scale, minw = 2.5*args.scale, col = true, choice = true, scale = args.text_scale, chosen = v.chosen, func = v.func, focus_args = {type = 'none'}}) + end + + local t = + {n=G.UIT.R, config={padding = 0.0, align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR}, nodes = { + (#args.tabs > 1 and not args.no_shoulders) and {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'leftshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = -0.1, y = 0}}}, nodes = {}} or nil, + {n=G.UIT.C, config={id = args.no_shoulders and 'no_shoulders' or 'tab_shoulders', ref_table = args, align = "cm", padding = 0.15, group = 1, collideable = true, focus_args = #args.tabs > 1 and {type = 'tab', nav = 'wide',snap_to = args.snap_to_nav, no_loop = args.no_loop} or nil}, nodes=tab_buttons}, + (#args.tabs > 1 and not args.no_shoulders) and {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'rightshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = 0.1, y = 0}}}, nodes = {}} or nil, + }}, + {n=G.UIT.R, config={align = args.tab_alignment, padding = args.padding or 0.1, no_fill = true, minh = args.tab_h, minw = args.tab_w}, nodes={ + {n=G.UIT.O, config={id = 'tab_contents', object = UIBox{definition = args.current.v.tab_definition_function(args.current.v.tab_definition_function_args), config = {offset = {x=0,y=0}}}}} + }}, + }} + + return t +end + +function create_text_input(args) + args = args or {} + args.colour = copy_table(args.colour) or copy_table(G.C.BLUE) + args.hooked_colour = copy_table(args.hooked_colour) or darken(copy_table(G.C.BLUE), 0.3) + args.w = args.w or 2.5 + args.h = args.h or 0.7 + args.text_scale = args.text_scale or 0.4 + args.max_length = args.max_length or 16 + args.all_caps = args.all_caps or false + args.prompt_text = args.prompt_text or localize('k_enter_text') + args.current_prompt_text = '' + + local text = {ref_table = args.ref_table, ref_value = args.ref_value, letters = {}, current_position = string.len(args.ref_table[args.ref_value])} + local ui_letters = {} + for i = 1, args.max_length do + text.letters[i] = (args.ref_table[args.ref_value] and (string.sub(args.ref_table[args.ref_value], i, i) or '')) or '' + ui_letters[i] = {n=G.UIT.T, config={ref_table = text.letters, ref_value = i, scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, id = 'letter_'..i}} + end + args.text = text + + local position_text_colour = lighten(copy_table(G.C.BLUE), 0.4) + + ui_letters[#ui_letters+1] = {n=G.UIT.T, config={ref_table = args, ref_value = 'current_prompt_text', scale = args.text_scale, colour = lighten(copy_table(args.colour), 0.4), id = 'prompt'}} + ui_letters[#ui_letters+1] = {n=G.UIT.B, config={r = 0.03,w=0.1, h=0.4, colour = position_text_colour, id = 'position', func = 'flash'}} + + local t = + {n=G.UIT.C, config={align = "cm", draw_layer = 1, colour = G.C.CLEAR}, nodes = { + {n=G.UIT.C, config={id = 'text_input', align = "cm", padding = 0.05, r = 0.1, draw_layer = 2, hover = true, colour = args.colour,minw = args.w, min_h = args.h, button = 'select_text_input', shadow = true}, nodes={ + {n=G.UIT.R, config={ref_table = args, padding = 0.05, align = "cm", r = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={ref_table = args, align = "cm", r = 0.1, colour = G.C.CLEAR, func = 'text_input'}, nodes= + ui_letters + } + }} + }} + }} + return t +end + +function create_keyboard_input(args) + local keyboard_rows = { + '1234567890', + 'QWERTYUIOP', + 'ASDFGHJKL', + 'ZXCVBNM', + args.space_key and ' ' or nil + } + local keyboard_button_rows = { + {},{},{},{},{} + } + for k, v in ipairs(keyboard_rows) do + for i = 1, #v do + local c = v:sub(i,i) + keyboard_button_rows[k][#keyboard_button_rows[k] +1] = create_keyboard_button(c, c == ' ' and 'y' or nil) + end + end + return {n=G.UIT.ROOT, config={align = "cm", padding = 15, r = 0.1, colour = {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = { + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLACK, emboss = 0.05, r = 0.1, mid = true}, nodes = { + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes = { + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = { + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[1]}, + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[2]}, + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[3]}, + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[4]}, + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[5]} + }}, + (args.backspace_key or args.return_key) and {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = { + args.backspace_key and {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('backspace', 'x')}} or nil, + args.return_key and {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('return', 'start')}} or nil, + {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('back', 'b')}} + }} or nil + }}, + }} + }}, + + }} +end + +function create_keyboard_button(key, binding) + local key_label = (key == 'backspace' and 'Backspace') or (key == ' ' and 'Space') or (key == 'back' and 'Back') or (key == 'return' and 'Enter') or key + return UIBox_button{ label = {key_label}, button = "key_button", ref_table = {key = key == 'back' and 'return' or key}, + minw = key == ' ' and 6 or key == 'return' and 2.5 or key == 'backspace' and 2.5 or key == 'back' and 2.5 or 0.8, + minh = key == 'return' and 1.5 or key == 'backspace' and 1.5 or key == 'back' and 0.8 or 0.7, + col = true, colour = G.C.GREY, focus_args = binding and {button = binding, orientation = (key == ' ' or key == 'back') and 'cr' or 'bm', set_button_pip= true} or nil} +end + +function create_dynatext_pips(args) + args = args or {} + + args.active_colour = copy_table(args.colour) or G.C.RED + args.inactive_colour = copy_table(args.inactive_colour) or {0,0,0,0.08} + args.w = args.w or 0.07 + args.h = args.h or 0.07 + + if not (args.dynatext) or not (#args.dynatext.strings > 1) then return end + + local pips = {} + + for i = 1, #args.dynatext.strings do + pips[i] = {n=G.UIT.C, config={ref_table = args.dynatext, minw = args.w, minh = args.h, colour = G.C.UI.TEXT_INACTIVE, r = 0.1, id = 'pip_'..i, pipcol1 = args.active_colour, pipcol2 = args.inactive_colour, func = 'pip_dynatext'}} + end + + return {n=G.UIT.R, config={padding = 0.05, align = "cm"}, nodes=pips} +end + +function create_UIBox_options() + local current_seed = nil + local restart = nil + local main_menu = nil + local your_collection = nil + local credits = nil + local customize = nil + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = function() + G.REFRESH_ALERTS = true + return true + end + })) + + if G.STAGE == G.STAGES.RUN then + restart = UIBox_button{id = 'restart_button', label = {localize('b_start_new_run')}, button = "setup_run", minw = 5} + main_menu = UIBox_button{ label = {localize('b_main_menu')}, button = "go_to_menu", minw = 5} + your_collection = UIBox_button{ label = {localize('b_collection')}, button = "your_collection", minw = 5, id = 'your_collection'} + current_seed = {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_seed')..": ", scale = 0.4, colour = G.C.WHITE}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0, minh = 0.8}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0, minh = 0.8}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.GAME.seeded and G.C.RED or G.C.BLACK, minw = 1.8, minh = 0.5, padding = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={ text = tostring(G.GAME.pseudorandom.seed), scale = 0.43, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }} + }} + }}, + UIBox_button({col = true, button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 1.3, minh = 0.5,}), + }} + end + if G.STAGE == G.STAGES.MAIN_MENU then + credits = UIBox_button{ label = {localize('b_credits')}, button = "show_credits", minw = 5} + end + + local settings = UIBox_button({button = 'settings', label = {localize('b_settings')}, minw = 5, focus_args = {snap_to = true}}) + local high_scores = UIBox_button{ label = {localize('b_stats')}, button = "high_scores", minw = 5} + local customize = UIBox_button{ label = {localize('b_customize_deck')}, button = "customize_deck", minw = 5} + + local t = create_UIBox_generic_options({ contents = { + settings, + G.GAME.seeded and current_seed or nil, + restart, + main_menu, + high_scores, + your_collection, + customize, + credits + }}) + return t +end + +function create_UIBox_settings() + local tabs = {} + tabs[#tabs+1] = { + label = localize('b_set_game'), + chosen = true, + tab_definition_function = G.UIDEF.settings_tab, + tab_definition_function_args = 'Game' + } + if G.F_VIDEO_SETTINGS then tabs[#tabs+1] = { + label = localize('b_set_video'), + tab_definition_function = G.UIDEF.settings_tab, + tab_definition_function_args = 'Video' + } + end + tabs[#tabs+1] = { + label = localize('b_set_graphics'), + tab_definition_function = G.UIDEF.settings_tab, + tab_definition_function_args = 'Graphics' + } + tabs[#tabs+1] = { + label = localize('b_set_audio'), + tab_definition_function = G.UIDEF.settings_tab, + tab_definition_function_args = 'Audio' + } + + local t = create_UIBox_generic_options({back_func = 'options',contents = {create_tabs( + {tabs = tabs, + tab_h = 7.05, + tab_alignment = 'tm', + snap_to_nav = true} + )}}) +return t +end + +function G.UIDEF.settings_tab(tab) + if tab == 'Game' then + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + create_option_cycle({label = localize('b_set_gamespeed'),scale = 0.8, options = {0.5, 1, 2, 4}, opt_callback = 'change_gamespeed', current_option = (G.SETTINGS.GAMESPEED == 0.5 and 1 or G.SETTINGS.GAMESPEED == 4 and 4 or G.SETTINGS.GAMESPEED + 1)}), + create_option_cycle({w = 5, label = localize('b_set_play_discard_pos'),scale = 0.8, options = localize('ml_play_discard_pos_opt'), opt_callback = 'change_play_discard_position', current_option = (G.SETTINGS.play_button_pos)}), + G.F_RUMBLE and create_toggle({label = localize('b_set_rumble'), ref_table = G.SETTINGS, ref_value = 'rumble'}) or nil, + create_slider({label = localize('b_set_screenshake'),w = 4, h = 0.4, ref_table = G.SETTINGS, ref_value = 'screenshake', min = 0, max = 100}), + create_toggle({label = localize('ph_display_stickers'), ref_table = G.SETTINGS, ref_value = 'run_stake_stickers'}), + create_toggle({label = localize('b_high_contrast_cards'), ref_table = G.SETTINGS, ref_value = 'colourblind_option', callback = G.FUNCS.refresh_contrast_mode}), + create_toggle({label = localize('b_reduced_motion'), ref_table = G.SETTINGS, ref_value = 'reduced_motion'}), + G.F_CRASH_REPORTS and create_toggle({label = localize('b_set_crash_reports'), ref_table = G.SETTINGS, ref_value = 'crashreports', info = localize('ml_crash_report_info')}) or nil, + }} + elseif tab == 'Video' then + --Reset the queue so there are no pending changes + G.SETTINGS.QUEUED_CHANGE = {} + + --Refresh the display information for all displays based on the screenmode selected + local res_option = GET_DISPLAYINFO(G.SETTINGS.WINDOW.screenmode, G.SETTINGS.WINDOW.selected_display) + + return + {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + create_option_cycle({w = 4,scale = 0.8, label = localize('b_set_monitor'), options = G.SETTINGS.WINDOW.display_names, opt_callback = 'change_display', current_option = (G.SETTINGS.WINDOW.selected_display)}), + create_option_cycle({w = 4,scale = 0.8, label = localize('b_set_windowmode'), options = localize('ml_windowmode_opt'), opt_callback = 'change_screenmode', current_option = (({Windowed = 1, Fullscreen = 2, Borderless = 3})[G.SETTINGS.WINDOW.screenmode] or 1)}), + {n=G.UIT.R, config={align = "cm", id = 'resolution_cycle'}, nodes={create_option_cycle({w = 4,scale = 0.8, options = G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_resolutions.strings, opt_callback = 'change_screen_resolution',current_option = res_option or 1})}}, + {n=G.UIT.R, config={align = "cm"}, nodes={create_option_cycle({w = 4,scale = 0.8, options = localize('ml_vsync_opt'), opt_callback = 'change_vsync',current_option = G.SETTINGS.WINDOW.vsync == 0 and 2 or 1})}}, + UIBox_button({button = 'apply_window_changes', label = {localize('b_set_apply')}, minw = 3, func = 'can_apply_window_changes'}), + }} + elseif tab == 'Audio' then + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + create_slider({label = localize('b_set_master_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'volume', min = 0, max = 100}), + create_slider({label = localize('b_set_music_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'music_volume', min = 0, max = 100}), + create_slider({label = localize('b_set_game_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'game_sounds_volume', min = 0, max = 100}), + }} + elseif tab == 'Graphics' then + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_shadows"),options = localize('ml_shadow_opt'), opt_callback = 'change_shadows', current_option = (G.SETTINGS.GRAPHICS.shadows == 'On' and 1 or 2)}), + create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_pixel_smoothing"),options = localize('ml_smoothing_opt'), opt_callback = 'change_pixel_smoothing', current_option = G.SETTINGS.GRAPHICS.texture_scaling}), + create_slider({label = localize('b_set_CRT'),w = 4, h = 0.4, ref_table = G.SETTINGS.GRAPHICS, ref_value = 'crt', min = 0, max = 100}), + create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_CRT_bloom"),options = localize('ml_bloom_opt'), opt_callback = 'change_crt_bloom', current_option = G.SETTINGS.GRAPHICS.bloom}), + }} + end + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR, minh = 5, minw = 5}, nodes={}} +end + +function create_UIBox_test_framework(variables) + variables = variables or {}; + local nodes = {} + for k, v in pairs(variables) do + if v.type == 'cycle' then + table.insert(nodes, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = v.label or '', scale = 0.5, colour = G.C.UI.TEXT_DARK}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = v.options, opt_callback = 'test_framework_cycle_callback', ref_table = v.ref_table, ref_value = v.ref_value}) + }}, + }}) + elseif v.type == 'slider' then + table.insert(nodes, + {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.05, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = v.label, scale = 0.5, colour = G.C.UI.TEXT_DARK}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_slider({w = 5, h = 0.4, ref_table = v.ref_table, ref_value = v.ref_value, min = v.min or 0, max = v.max or 1}), + }}, + }}) + elseif v.type == 'text_input' then + table.insert(nodes, + {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.05, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = v.label, scale = 0.5, colour = G.C.UI.TEXT_DARK}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_text_input(v.options), + }}, + }}) + end + end + local t = {n=G.UIT.ROOT, config = {align = "cm", minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5,padding = 0.15, r = 0.1, colour = {G.C.BLACK[1], G.C.BLACK[2], G.C.BLACK[3],0.6}}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.3, padding = 0.1, minw = 1, colour = G.C.WHITE, shadow = true}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.2, minw = 1, colour = G.C.CLEAR, outline = 1, outline_colour = G.C.BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes= + nodes + }, + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, hover = true, colour = G.C.ORANGE, button = "exit_overlay_menu", shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.T, config={text = "Back", scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + }} + }} + }} +return t +end + +function G.UIDEF.usage_tabs() + return create_UIBox_generic_options({back_func = 'high_scores', contents ={create_tabs( + {tabs = { + { + label = localize('b_stat_jokers'), + chosen = true, + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'joker_usage'}, + }, + { + label = localize('b_stat_consumables'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'consumeable_usage'}, + }, + { + label = localize('b_stat_tarots'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'consumeable_usage', 'Tarot'}, + }, + { + label = localize('b_stat_planets'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'consumeable_usage', 'Planet'}, + }, + { + label = localize('b_stat_spectrals'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'consumeable_usage', 'Spectral'}, + }, + { + label = localize('b_stat_vouchers'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'voucher_usage', 'Voucher'}, + }, + }, + tab_h = 8, + snap_to_nav = true})}}) +end + +function create_UIBox_usage(args) + args = args or {} + _type, _set = args[1], args[2] + local used_cards = {} + local max_amt = 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile][_type]) do + if G.P_CENTERS[k] and (not _set or G.P_CENTERS[k].set == _set) and G.P_CENTERS[k].discovered then + used_cards[#used_cards + 1] = {count = v.count, key = k} + if v.count > max_amt then max_amt = v.count end + end + end + + local _col = G.C.SECONDARY_SET[_set] or G.C.RED + + table.sort(used_cards, function (a, b) return a.count > b.count end ) + + local histograms = {} + + for i = 1, 10 do + local v = used_cards[i] + if v then + local card = Card(0,0, 0.7*G.CARD_W, 0.7*G.CARD_H, nil, G.P_CENTERS[v.key]) + card.ambient_tilt = 0.8 + local cardarea = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + G.CARD_W*0.7, + G.CARD_H*0.7, + {card_limit = 2, type = 'title', highlight_limit = 0}) + cardarea:emplace(card) + + histograms[#histograms +1] = + {n=G.UIT.C, config={align = "bm",minh = 6.2, colour = G.C.UI.TRANSPARENT_DARK, r = 0.1}, nodes={ + + {n=G.UIT.R, config={align = "bm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.7*G.CARD_H+0.1} , nodes={ + {n=G.UIT.O, config={object = cardarea}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = v.count, scale = 0.35, colour = mix_colours(G.C.FILTER, G.C.WHITE, 0.8), shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = v.count/max_amt*3.6, minw = 0.8, colour = G.C.SECONDARY_SET[G.P_CENTERS[v.key].set] or G.C.RED, res = 0.15, r = 0.001}, nodes={}}, + }}, + }}, + }} + else + histograms[#histograms +1] = + {n=G.UIT.C, config={align = "bm",minh = 6.2, colour = G.C.UI.TRANSPARENT_DARK, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "bm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.7*G.CARD_H+0.1, minw = 0.7*G.CARD_W} , nodes={ + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = '-', scale = 0.35, colour = mix_colours(G.C.FILTER, G.C.WHITE, 0.8), shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.2, minw = 0.8, colour = G.C.UI.TRANSPARENT_LIGHT, res = 0.15, r = 0.001}, nodes={}}, + }}, + }}, + }} + end + end + + local t = {n=G.UIT.ROOT, config={align = "cm", minw = 3, padding = 0.1, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.B, config={w=0.2,h=0.2,r =0.1,colour = G.C.FILTER}}, + {n=G.UIT.T, config={text = + _type == 'joker_usage' and localize('ph_stat_joker') or + _type == 'consumeable_usage' and localize('ph_stat_consumable') or + _type == 'voucher_usage' and localize('ph_stat_voucher'), + scale = 0.35, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=histograms}, + }} + + return t +end + +function create_UIBox_customize_deck() + local t = create_UIBox_generic_options({ back_func = 'options', snap_back = nil, contents = { + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_tabs( + {tabs = { + { + label = localize('Spades', 'suits_plural'), + chosen = true, + tab_definition_function = G.UIDEF.custom_deck_tab, + tab_definition_function_args = 'Spades' + }, + { + label = localize('Hearts', 'suits_plural'), + tab_definition_function = G.UIDEF.custom_deck_tab, + tab_definition_function_args = 'Hearts' + }, + { + label = localize('Clubs', 'suits_plural'), + tab_definition_function = G.UIDEF.custom_deck_tab, + tab_definition_function_args = 'Clubs' + }, + { + label = localize('Diamonds', 'suits_plural'), + tab_definition_function = G.UIDEF.custom_deck_tab, + tab_definition_function_args = 'Diamonds' + } + },snap_to_nav = true, no_shoulders = true} + )}}} + }) + return t +end + +function G.UIDEF.custom_deck_tab(_suit) + local t = {} + + local face_cards = CardArea( + 0,0, + 4*G.CARD_W, + 1.4*G.CARD_H, + {card_limit = 3, type = 'title', highlight_limit = 0}) + + table.insert(t, + {n=G.UIT.R, config={align = "cm", colour = G.C.BLACK, r = 0.1, padding = 0.07, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = face_cards}} + }} + ) + + local loc_options = localize(_suit, 'collabs') + local conv_loc_options = {} + for k, v in pairs(loc_options) do + conv_loc_options[tonumber(k)] = v + end + + loc_options = conv_loc_options + + local current_option = 1 + for k, v in pairs(G.COLLABS.options[_suit]) do + if G.SETTINGS.CUSTOM_DECK.Collabs[_suit] == v then current_option = k end + end + + table.insert(t, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = loc_options, w = 5.5, cycle_shoulders = true, curr_suit = _suit, opt_callback = 'change_collab', current_option = current_option, colour = G.C.RED, focus_args = {snap_to = true, nav = 'wide'}}), + }} + ) + table.insert(t, create_toggle({label = localize('b_high_contrast_cards'), ref_table = G.SETTINGS, ref_value = 'colourblind_option', callback = G.FUNCS.refresh_contrast_mode})) + + local faces = {'K','Q','J'} + for i = 1, 3 do + local card_code = (string.sub(_suit, 1, 1))..'_'..faces[i] + local card = Card(0,0, G.CARD_W*1.2, G.CARD_H*1.2, G.P_CARDS[card_code], G.P_CENTERS.c_base) + card.no_ui = true + face_cards:emplace(card) + end + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0, colour = G.C.CLEAR, r = 0.1, minw = 7, minh = 4.2}, nodes=t} +end + +function create_UIBox_high_scores() + fetch_achievements() + set_profile_progress() + set_discover_tallies() + + local scores = { + create_UIBox_high_scores_row("hand"), + create_UIBox_high_scores_row("furthest_round"), + create_UIBox_high_scores_row("furthest_ante"), + create_UIBox_high_scores_row("poker_hand"), + create_UIBox_high_scores_row("most_money"), + create_UIBox_high_scores_row("win_streak"), + } + G.focused_profile = G.SETTINGS.profile + local cheevs = {} + + local t = create_UIBox_generic_options({ back_func = 'options', snap_back = true, contents = { + {n=G.UIT.C, config={align = "cm", minw = 3, padding = 0.2, r = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes= + scores + }, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR}, nodes={ + create_progress_box(), + UIBox_button({button = 'usage', label = {localize('k_card_stats')}, minw = 7.5, minh =1, focus_args = {nav = 'wide'}}), + }}, + not G.F_NO_ACHIEVEMENTS and {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.CLEAR}, nodes=cheevs} or nil + }}) + + return t +end + +function create_progress_box(_profile_progress, smaller) + local rows, protos = {}, {'collection', 'challenges', 'joker_stickers', 'deck_stake_wins'} + _profile_progress = _profile_progress or G.PROFILES[G.SETTINGS.profile].progress + + + _profile_progress.overall_tally, _profile_progress.overall_of = + _profile_progress.discovered.tally/_profile_progress.discovered.of + + _profile_progress.deck_stakes.tally/_profile_progress.deck_stakes.of + + _profile_progress.joker_stickers.tally/_profile_progress.joker_stickers.of + + _profile_progress.challenges.tally/_profile_progress.challenges.of, + 4 + + local text_scale = smaller and 0.7 or 1 + local bar_colour = G.PROFILES[G.focused_profile].all_unlocked and G.C.RED or G.C.BLUE + + for _, v in ipairs(protos) do + local tab, val, max = nil,nil,nil + if v == 'collection' then + tab, val, max = _profile_progress.discovered, 'tally', _profile_progress.discovered.of + elseif v == 'deck_stake_wins' then + tab, val, max = _profile_progress.deck_stakes, 'tally', _profile_progress.deck_stakes.of + elseif v == 'joker_stickers' then + tab, val, max = _profile_progress.joker_stickers, 'tally', _profile_progress.joker_stickers.of + elseif v == 'challenges' then + tab, val, max = _profile_progress.challenges, 'tally', _profile_progress.challenges.of + end + local filling = v == 'collection' and { + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.discovered.tally/_profile_progress.discovered.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}}, + {n=G.UIT.T, config={text = " (".._profile_progress.discovered.tally..'/'.._profile_progress.discovered.of..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } or v == 'deck_stake_wins' and { + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.deck_stakes.tally/_profile_progress.deck_stakes.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}}, + {n=G.UIT.T, config={text = " (".._profile_progress.deck_stakes.tally..'/'.._profile_progress.deck_stakes.of..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } or v == 'joker_stickers' and { + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.joker_stickers.tally/_profile_progress.joker_stickers.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}}, + {n=G.UIT.T, config={text = " (".._profile_progress.joker_stickers.tally..'/'.._profile_progress.joker_stickers.of..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } or v == 'challenges' and { + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.challenges.tally/_profile_progress.challenges.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}}, + {n=G.UIT.T, config={text = " (".._profile_progress.challenges.tally..'/'.._profile_progress.challenges.of..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } + + rows[#rows+1] = {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 3.5*text_scale, maxw = 3.5*text_scale}, nodes={ + {n=G.UIT.T, config={text = localize('k_'..v), scale = 0.5*text_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", minh =smaller and 0.5 or 0.8, r = 0.1, minw = 3.5*text_scale, colour = G.C.BLACK, emboss = 0.05, + progress_bar = { + max = max, ref_table = tab, ref_value = val, empty_col = G.C.BLACK, filled_col = adjust_alpha(bar_colour, 0.5) + }}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 3.5*text_scale}, nodes=filling}, + }}, + }} + end + + return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 3.5*text_scale, maxw = 3.5*text_scale}, nodes={ + {n=G.UIT.T, config={text = localize('k_progress'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", minh = 0.6, r = 0.1, minw = 3.5*text_scale, colour = G.C.BLACK, emboss = 0.05, + progress_bar = { + max = _profile_progress.overall_of, ref_table = _profile_progress, ref_value = 'overall_tally', empty_col = G.C.BLACK, filled_col = adjust_alpha(bar_colour, 0.5) + }}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 3.5*text_scale}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.overall_tally/_profile_progress.overall_of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55})}}, + }}, + }} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes=rows}, + }} +end + +function create_UIBox_high_scores_row(score) + if not G.PROFILES[G.SETTINGS.profile].high_scores[score] then return nil end + local label_scale = 0.65 - 0.025*math.max(string.len(G.PROFILES[G.SETTINGS.profile].high_scores[score].label)-8, 0) + local label_w, score_w, h = 3.5, 4, 0.8 + local score_tab = {} + + if score == 'poker_hand' then + local handname, amount = localize('k_none'), 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].hand_usage) do if v.count > amount then handname = v.order; amount = v.count end end + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {amount < 1 and handname or localize(handname,'poker_hands')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55})}}, + {n=G.UIT.T, config={text = " ("..amount..")", scale = 0.45, colour = G.C.JOKER_GREY}} + } + elseif score == 'most_money' then + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {localize('$')..number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.MONEY},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}}, + } + elseif score == 'win_streak' then + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.WHITE},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}}, + {n=G.UIT.T, config={text = " ("..G.PROFILES[G.SETTINGS.profile].high_scores["current_streak"].amt..")", scale = 0.45, colour = G.C.JOKER_GREY}} + } + elseif score == 'hand' then + local chip_sprite = Sprite(0,0,0.4,0.4,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0}) + chip_sprite.states.drag.can = false + score_tab = { + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={w=0.4,h=0.4 , object = chip_sprite}} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.RED},shadow = true, float = true, scale = math.min(0.75, score_number_scale(1.5, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt))})}}, + }}, + } + elseif score == 'collection' then + score_tab = { + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {'%'..math.floor(0.01+100*G.PROFILES[G.SETTINGS.profile].high_scores[score].amt/G.PROFILES[G.SETTINGS.profile].high_scores[score].tot)}, colours = {G.C.WHITE},shadow = true, float = true, scale = math.min(0.75, score_number_scale(1.5, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt))})}}, + {n=G.UIT.T, config={text = " ("..G.PROFILES[G.SETTINGS.profile].high_scores[score].amt..'/'..G.PROFILES[G.SETTINGS.profile].high_scores[score].tot..")", scale = 0.45, colour = G.C.JOKER_GREY}} + }}, + } + else + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.FILTER},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}}, + } + end + return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = label_w, maxw = label_w}, nodes={ + {n=G.UIT.T, config={text = localize(score, 'high_scores'), scale = label_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", minh = h, r = 0.1, minw = score_w, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = score_w, maxw = score_w}, nodes=score_tab}, + }}, + }} +end + +function create_UIBox_win() + local show_lose_cta = false + local eased_green = copy_table(G.C.GREEN) + eased_green[4] = 0 + ease_value(eased_green, 4, 0.5, nil, nil, true) + local t = create_UIBox_generic_options({ padding = 0, bg_colour = eased_green , colour = G.C.BLACK, outline_colour = G.C.EDITION, no_back = true, no_esc = true, contents = { + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_you_win')}, colours = {G.C.EDITION},shadow = true, float = true, spacing = 10, rotate = true, scale = 1.5, pop_in = 0.4, maxw = 6.5})}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('hand'), + create_UIBox_round_scores_row('poker_hand'), + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('cards_played', G.C.BLUE), + create_UIBox_round_scores_row('cards_discarded', G.C.RED), + create_UIBox_round_scores_row('cards_purchased', G.C.MONEY), + create_UIBox_round_scores_row('times_rerolled', G.C.GREEN), + create_UIBox_round_scores_row('new_collection', G.C.WHITE), + create_UIBox_round_scores_row('seed', G.C.WHITE), + UIBox_button({button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 2.3, minh = 0.4,}), + }}, + {n=G.UIT.C, config={align = "tr", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('furthest_ante', G.C.FILTER), + create_UIBox_round_scores_row('furthest_round', G.C.FILTER), + {n=G.UIT.R, config={align = "cm", minh = 0.4, minw = 0.1}, nodes={}}, + show_win_cta and UIBox_button({id = 'win_cta', button = 'show_main_cta', label = {localize('b_next')}, colour = G.C.GREEN, scale = 0.8, minw = 2.5, minh = 2.5, focus_args = {nav = 'wide', snap_to = true}}) or nil, + not show_win_cta and UIBox_button({id = 'from_game_won', button = 'notify_then_setup_run', label = {localize('b_start_new_run')}, minw = 2.5, maxw = 2.5, minh = 1, focus_args = {nav = 'wide', snap_to = true}}) or nil, + not show_win_cta and {n=G.UIT.R, config={align = "cm", minh = 0.2, minw = 0.1}, nodes={}} or nil, + not show_win_cta and UIBox_button({button = 'go_to_menu', label = {localize('b_main_menu')}, minw = 2.5, maxw = 2.5, minh = 1, focus_args = {nav = 'wide'}}) or nil, + }} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={ + UIBox_button({button = 'exit_overlay_menu', label = {localize('b_endless')}, minw = 6.5, maxw = 5, minh = 1.2, scale = 0.7, shadow = true, colour = G.C.BLUE, focus_args = {nav = 'wide', button = 'x',set_button_pip = true}}), + }}, + }} + }} + }}) + t.nodes[1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 2}, nodes={ + {n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={t.nodes[1]} + }} + } + --t.nodes[1].config.mid = true + t.config.id = 'you_win_UI' + return t +end + +function create_UIBox_exit_CTA() + + local t = create_UIBox_generic_options({ back_label = 'Quit Game', back_func = 'quit' , colour = G.C.BLACK, back_colour = G.C.RED, padding = 0, contents = { + {n=G.UIT.C, config={align = "tm", padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_1')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.9})}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_2')}, colours = {G.C.WHITE},shadow = true, bump = true, rotate = true, pop_in = 0.2, scale = 1.4})}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0.12, emboss = 0.1, colour = G.C.L_BLACK, r = 0.1}, nodes={ + simple_text_container('ml_demo_thanks_message',{colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}), + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + UIBox_button({button = 'wishlist_steam', label = {localize('b_wishlist')}, minw = 5.9, minh = 1.1, scale = 0.5, shadow = true, colour = G.C.GREEN, focus_args = {nav = 'wide', button = 'x',set_button_pip = true, snap_to = true}}), + UIBox_button({button = 'go_to_playbalatro', label = {localize('b_playbalatro')}, minw = 4.9, minh = 0.8, scale = 0.4, shadow = true, colour = G.C.BLUE, focus_args = {nav = 'wide', button = 'y',set_button_pip = true}}), + }}, + }}, + }} + }}) + t.nodes[2] = t.nodes[1] + t.nodes[1] = {n=G.UIT.C, config={align = "cm", padding = 2}, nodes={ + {n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}}, + }} + --t.nodes[1].config.mid = true + return t +end + +function create_UIBox_small_cta() + return {n=G.UIT.ROOT, config={align = "cm", minw = 4, minh = 3}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_1')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.3})}}, + }} +end + +function create_UIBox_demo_video_CTA() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 21.7, + blockable = false, + blocking = false, + func = (function() + G.exception_queue = 'other' + G.FUNCS.go_to_demo_cta() + G.exception_queue = nil + return true + end)}), 'other') + + RESTART_MUSIC() + + local video_file = love.graphics.newVideo('resources/democta.ogv') + local vid_sprite = Sprite(0,0,11*16/9,11,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0}) + video_file:getSource():setVolume(G.SETTINGS.SOUND.volume*G.SETTINGS.SOUND.game_sounds_volume/(100*100)) + vid_sprite.video = video_file + video_file:play() + + local t = create_UIBox_generic_options({ back_delay = 7, back_label = localize('b_skip'), back_func = 'go_to_demo_cta' , colour = G.C.BLACK, padding = 0, contents = { + {n=G.UIT.O, config={object = vid_sprite}}, + }}) + return t +end + +function create_UIBox_game_over() + local show_lose_cta = false + + + local eased_red = copy_table(G.GAME.round_resets.ante <= G.GAME.win_ante and G.C.RED or G.C.BLUE) + eased_red[4] = 0 + ease_value(eased_red, 4, 0.8, nil, nil, true) + local t = create_UIBox_generic_options({ bg_colour = eased_red ,no_back = true, padding = 0, contents = { + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_game_over')}, colours = {G.C.RED},shadow = true, float = true, scale = 1.5, pop_in = 0.4, maxw = 6.5})}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.BLACK, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('hand'), + create_UIBox_round_scores_row('poker_hand'), + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('cards_played', G.C.BLUE), + create_UIBox_round_scores_row('cards_discarded', G.C.RED), + create_UIBox_round_scores_row('cards_purchased', G.C.MONEY), + create_UIBox_round_scores_row('times_rerolled', G.C.GREEN), + create_UIBox_round_scores_row('new_collection', G.C.WHITE), + create_UIBox_round_scores_row('seed', G.C.WHITE), + UIBox_button({button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 2.3, minh = 0.4, focus_args = {nav = 'wide'}}), + }}, + {n=G.UIT.C, config={align = "tr", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('furthest_ante', G.C.FILTER), + create_UIBox_round_scores_row('furthest_round', G.C.FILTER), + create_UIBox_round_scores_row('defeated_by'), + }} + }} + }}, + show_lose_cta and + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={id = 'lose_cta', align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.GREEN, button = "show_main_cta", shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.T, config={text = localize('b_next'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, focus_args = {nav = 'wide', snap_to = true}}} + }} + }} + }} or + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, config={id = 'from_game_over', align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.RED, button = "notify_then_setup_run", shadow = true, focus_args = {nav = 'wide', snap_to = true}}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true, maxw = 4.8}, nodes={ + {n=G.UIT.T, config={text = localize('b_start_new_run'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + {n=G.UIT.R, config={align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.RED, button = "go_to_menu", shadow = true, focus_args = {nav = 'wide'}}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true, maxw = 4.8}, nodes={ + {n=G.UIT.T, config={text = localize('b_main_menu'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }} + }} + }}, + }} +}}) + t.nodes[1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 2}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}}, + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={t.nodes[1]}}} +} + + --t.nodes[1].config.mid = true + return t +end + +function create_UIBox_round_scores_row(score, text_colour) + local label = G.GAME.round_scores[score] and localize('ph_score_'..score) or '' + local check_high_score = false + local score_tab = {} + local label_w, score_w, h = ({hand=true,poker_hand=true})[score] and 3.5 or 2.9, ({hand=true,poker_hand=true})[score] and 3.5 or 1, 0.5 + + if score == 'furthest_ante' then + label_w = 1.9 + check_high_score = true + label = localize('k_ante') + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_resets.ante)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = 0.45})}}, + } + end + if score == 'furthest_round' then + label_w = 1.9 + check_high_score = true + label = localize('k_round') + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = 0.45})}}, + } + end + if score == 'seed' then + label_w = 1.9 + score_w = 1.9 + label = localize('k_seed') + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {G.GAME.pseudorandom.seed}, colours = {text_colour or G.C.WHITE},shadow = true, float = true, scale = 0.45})}}, + } + end + if score == 'defeated_by' then + label = localize('k_defeated_by') + local blind_choice = {config = G.GAME.blind.config.blind or G.P_BLINDS.bl_small} + blind_choice.animation = AnimatedSprite(0,0, 1.4, 1.4, G.ANIMATION_ATLAS['blind_chips'], blind_choice.config.pos) + blind_choice.animation:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + + score_tab = { + {n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize{type ='name_text', key = blind_choice.config.key, set = 'Blind'}, colours = {G.C.WHITE},shadow = true, float = true,maxw = 2.2, scale = 0.45})}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.O, config={object = blind_choice.animation}} + }}, + } + end + + local label_scale = 0.5 + + if score == 'poker_hand' then + local handname, amount = localize('k_none'), 0 + for k, v in pairs(G.GAME.hand_usage) do if v.count > amount then handname = v.order; amount = v.count end end + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {amount <1 and handname or localize(handname,'poker_hands')}, colours = {text_colour or G.C.WHITE},shadow = true, float = true, scale = 0.45, maxw = 2.5})}}, + {n=G.UIT.T, config={text = " ("..amount..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } + elseif score == 'hand' then + check_high_score = true + local chip_sprite = Sprite(0,0,0.3,0.3,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0}) + chip_sprite.states.drag.can = false + score_tab = { + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={w=0.3,h=0.3 , object = chip_sprite}} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_scores[score].amt)}, colours = {text_colour or G.C.RED},shadow = true, float = true, scale = math.min(0.6, score_number_scale(1.2, G.GAME.round_scores[score].amt))})}}, + }}, + } + elseif G.GAME.round_scores[score] and not score_tab[1] then + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_scores[score].amt)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = score_number_scale(0.6, G.GAME.round_scores[score].amt)})}}, + } + end + return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05, func = check_high_score and 'high_score_alert' or nil, id = score}, nodes={ + {n=score=='defeated_by' and G.UIT.R or G.UIT.C, config={align = "cm", padding = 0.02, minw = label_w, maxw = label_w}, nodes={ + {n=G.UIT.T, config={text = label, scale = label_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=score=='defeated_by' and G.UIT.R or G.UIT.C, config={align = "cr"}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = h, r = 0.1, minw = score=='defeated_by' and label_w or score_w, colour = (score == 'seed' and G.GAME.seeded) and G.C.RED or G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = score_w}, nodes=score_tab}, + }} + }}, + }} +end + +function create_UIBox_hand_tip(handname) + if not G.GAME.hands[handname].example then return {n=G.UIT.R, config={align = "cm"},nodes = {}} end + local cardarea = CardArea( + 2,2, + 3.5*G.CARD_W, + 0.75*G.CARD_H, + {card_limit = 5, type = 'title', highlight_limit = 0}) + for k, v in ipairs(G.GAME.hands[handname].example) do + local card = Card(0,0, 0.5*G.CARD_W, 0.5*G.CARD_H, G.P_CARDS[v[1]], G.P_CENTERS.c_base) + if v[2] then card:juice_up(0.3, 0.2) end + if k == 1 then play_sound('paper1',0.95 + math.random()*0.1, 0.3) end + ease_value(card.T, 'scale',v[2] and 0.25 or -0.15,nil,'REAL',true,0.2) + cardarea:emplace(card) + end + + return {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, r = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = cardarea}} + }} + }} +end + +function create_UIBox_current_hand_row(handname, simple) + return (G.GAME.hands[handname].visible) and + (not simple and + {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05, hover = true, force_focus = true, on_demand_tooltip = {text = localize(handname, 'poker_hand_descriptions'), filler = {func = create_UIBox_hand_tip, args = handname}}}, nodes={ + {n=G.UIT.C, config={align = "cl", padding = 0, minw = 5}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.01, r = 0.1, colour = G.C.HAND_LEVELS[math.min(7, G.GAME.hands[handname].level)], minw = 1.5, outline = 0.8, outline_colour = G.C.WHITE}, nodes={ + {n=G.UIT.T, config={text = localize('k_level_prefix')..G.GAME.hands[handname].level, scale = 0.5, colour = G.C.UI.TEXT_DARK}} + }}, + {n=G.UIT.C, config={align = "cm", minw = 4.5, maxw = 4.5}, nodes={ + {n=G.UIT.T, config={text = ' '..localize(handname,'poker_hands'), scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLACK,r = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cr", padding = 0.01, r = 0.1, colour = G.C.CHIPS, minw = 1.1}, nodes={ + {n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}, + {n=G.UIT.B, config={w = 0.08, h = 0.01}} + }}, + {n=G.UIT.T, config={text = "X", scale = 0.45, colour = G.C.MULT}}, + {n=G.UIT.C, config={align = "cl", padding = 0.01, r = 0.1, colour = G.C.MULT, minw = 1.1}, nodes={ + {n=G.UIT.B, config={w = 0.08,h = 0.01}}, + {n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = ' #', scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK,r = 0.1, minw = 0.9}, nodes={ + {n=G.UIT.T, config={text = G.GAME.hands[handname].played, scale = 0.45, colour = G.C.FILTER, shadow = true}}, + }} + }} + or {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), force_focus = true, emboss = 0.05, hover = true, on_demand_tooltip = {text = localize(handname, 'poker_hand_descriptions'), filler = {func = create_UIBox_hand_tip, args = handname}}, focus_args = {snap_to = (simple and handname == 'Straight Flush')}}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0, minw = 5}, nodes={ + {n=G.UIT.T, config={text = localize(handname,'poker_hands'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }}) + or nil +end + +function create_UIBox_current_hands(simple) + local hands = { + create_UIBox_current_hand_row("Flush Five", simple), + create_UIBox_current_hand_row("Flush House", simple), + create_UIBox_current_hand_row("Five of a Kind", simple), + create_UIBox_current_hand_row("Straight Flush", simple), + create_UIBox_current_hand_row("Four of a Kind", simple), + create_UIBox_current_hand_row("Full House", simple), + create_UIBox_current_hand_row("Flush", simple), + create_UIBox_current_hand_row("Straight", simple), + create_UIBox_current_hand_row("Three of a Kind", simple), + create_UIBox_current_hand_row("Two Pair", simple), + create_UIBox_current_hand_row("Pair", simple), + create_UIBox_current_hand_row("High Card", simple) + } + + local t = {n=G.UIT.ROOT, config={align = "cm", minw = 3, padding = 0.1, r = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes= + hands + }, + }} + + return t +end + +function G.UIDEF.deck_info(_show_remaining) + return create_UIBox_generic_options({contents ={create_tabs( + {tabs = _show_remaining and { + { + label = localize('b_remaining'), + chosen = true, + tab_definition_function = G.UIDEF.view_deck, + tab_definition_function_args = true, + }, + { + label = localize('b_full_deck'), + tab_definition_function = G.UIDEF.view_deck + }, + } or { + { + label = localize('b_full_deck'), + chosen = true, + tab_definition_function = G.UIDEF.view_deck + }, + }, + tab_h = 8, + snap_to_nav = true})}}) +end + +function G.UIDEF.run_info() + return create_UIBox_generic_options({contents ={create_tabs( + {tabs = { + { + label = localize('b_poker_hands'), + chosen = true, + tab_definition_function = create_UIBox_current_hands, + }, + { + label = localize('b_blinds'), + tab_definition_function = G.UIDEF.current_blinds, + }, + { + label = localize('b_vouchers'), + tab_definition_function = G.UIDEF.used_vouchers, + }, + G.GAME.stake > 1 and { + label = localize('b_stake'), + tab_definition_function = G.UIDEF.current_stake, + } or nil, + }, + tab_h = 8, + snap_to_nav = true})}}) +end + +function G.UIDEF.current_blinds() + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, padding = 0.2}, nodes={ + G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={ + create_UIBox_blind_choice('Small', true) + }} or nil, + G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={ + create_UIBox_blind_choice('Big', true) + }} or nil, + G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={ + create_UIBox_blind_choice('Boss', true) + }} or nil + }} +end + +function G.UIDEF.deck_stake_column(_deck_key) + local deck_usage = G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key] + local stake_col = {} + local valid_option = nil + for i = #G.P_CENTER_POOLS['Stake'], 1, -1 do + local _wins = deck_usage and deck_usage.wins[i] or 0 + if (deck_usage and deck_usage.wins[i-1]) or i == 1 or G.PROFILES[G.SETTINGS.profile].all_unlocked then valid_option = true end + stake_col[#stake_col+1] = {n=G.UIT.R, config={id = i, align = "cm", colour = _wins > 0 and G.C.GREY or G.C.CLEAR, outline = 0, outline_colour = G.C.WHITE, r = 0.1, minh = 0.25, minw = valid_option and 0.45 or 0.25, func = 'RUN_SETUP_check_back_stake_highlight'}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = valid_option and 0.17 or 0.13, minw = valid_option and 0.37 or 0.13, colour = _wins > 0 and get_stake_col(i) or G.C.UI.TRANSPARENT_LIGHT, r = 0.1},nodes={}} + }} + if i > 1 then stake_col[#stake_col+1] = {n=G.UIT.R, config={align = "cm", minh = 0.1, minw = 0.04},nodes={}} end + end + return {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes =stake_col} +end + +function G.UIDEF.current_stake() + local other_col = nil + if G.GAME.stake > 2 then + local stake_desc_rows = {{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = localize('k_also_applied'), scale = 0.4, colour = G.C.WHITE}} + }} + } + for i = G.GAME.stake-1, 2, -1 do + local _stake_desc = {} + local _stake_center = G.P_CENTER_POOLS.Stake[i] + localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = _stake_desc} + local _full_desc = {} + for k, v in ipairs(_stake_desc) do + _full_desc[#_full_desc+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v} + end + _full_desc[#_full_desc] = nil + stake_desc_rows[#stake_desc_rows+1] = {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = 'cm'}, nodes ={{n=G.UIT.C, config={align = "cm", colour = get_stake_col(i), r = 0.1, minh = 0.35, minw = 0.35, emboss = 0.05}, nodes={}}, {n=G.UIT.B, config={w=0.1,h=0.1}}}}, + {n=G.UIT.C, config={align = "cm", padding = 0.03, colour = G.C.WHITE, r = 0.1, minh = 0.7, minw = 4.8}, nodes=_full_desc}, + }} + end + other_col = {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.L_BLACK}, nodes=stake_desc_rows} + end + + local stake_sprite = get_stake_sprite(G.GAME.stake, 0.8) + local _stake_desc = {} + local _stake_center = G.P_CENTER_POOLS.Stake[G.GAME.stake] + localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = _stake_desc} + local _full_desc = {} + for k, v in ipairs(_stake_desc) do + _full_desc[#_full_desc+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v} + end + _full_desc[#_full_desc] = nil + local current_col = {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minw = 4}, nodes={ + {n=G.UIT.O, config={colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.T, config={text = localize{type = 'name_text', key = G.P_CENTER_POOLS.Stake[G.GAME.stake].key, set = 'Stake'}, scale = 0.45, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = get_stake_col(G.GAME.stake), r = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.WHITE, r = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.03, minh = 0.7, minw = 3.8}, nodes=_full_desc} + }} + }} + }} + + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, r = 0.1, padding = 0.1}, nodes={ + current_col,other_col + }} +end + +function G.UIDEF.view_deck(unplayed_only) + local deck_tables = {} + remove_nils(G.playing_cards) + G.VIEWING_DECK = true + table.sort(G.playing_cards, function (a, b) return a:get_nominal('suit') > b:get_nominal('suit') end ) + local SUITS = { + Spades = {}, + Hearts = {}, + Clubs = {}, + Diamonds = {}, + } + local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'} + for k, v in ipairs(G.playing_cards) do + table.insert(SUITS[v.base.suit], v) + end + for j = 1, 4 do + if SUITS[suit_map[j]][1] then + local view_deck = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 6.5*G.CARD_W, + 0.6*G.CARD_H, + {card_limit = #SUITS[suit_map[j]], type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = view_deck}} + }} + ) + + for i = 1, #SUITS[suit_map[j]] do + if SUITS[suit_map[j]][i] then + local greyed, _scale = nil, 0.7 + if unplayed_only and not ((SUITS[suit_map[j]][i].area and SUITS[suit_map[j]][i].area == G.deck) or SUITS[suit_map[j]][i].ability.wheel_flipped) then + greyed = true + end + local copy = copy_card(SUITS[suit_map[j]][i],nil, _scale) + copy.greyed = greyed + copy.T.x = view_deck.T.x + view_deck.T.w/2 + copy.T.y = view_deck.T.y + + copy:hard_set_T() + view_deck:emplace(copy) + end + end + end + end + + local flip_col = G.C.WHITE + + local suit_tallies = {['Spades'] = 0, ['Hearts'] = 0, ['Clubs'] = 0, ['Diamonds'] = 0} + local mod_suit_tallies = {['Spades'] = 0, ['Hearts'] = 0, ['Clubs'] = 0, ['Diamonds'] = 0} + local rank_tallies = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + local mod_rank_tallies = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + local rank_name_mapping = {2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A'} + local face_tally = 0 + local mod_face_tally = 0 + local num_tally = 0 + local mod_num_tally = 0 + local ace_tally = 0 + local mod_ace_tally = 0 + local wheel_flipped = 0 + + for k, v in ipairs(G.playing_cards) do + if v.ability.name ~= 'Stone Card' and (not unplayed_only or ((v.area and v.area == G.deck) or v.ability.wheel_flipped)) then + if v.ability.wheel_flipped and unplayed_only then wheel_flipped = wheel_flipped + 1 end + --For the suits + suit_tallies[v.base.suit] = (suit_tallies[v.base.suit] or 0) + 1 + mod_suit_tallies['Spades'] = (mod_suit_tallies['Spades'] or 0) + (v:is_suit('Spades') and 1 or 0) + mod_suit_tallies['Hearts'] = (mod_suit_tallies['Hearts'] or 0) + (v:is_suit('Hearts') and 1 or 0) + mod_suit_tallies['Clubs'] = (mod_suit_tallies['Clubs'] or 0) + (v:is_suit('Clubs') and 1 or 0) + mod_suit_tallies['Diamonds'] = (mod_suit_tallies['Diamonds'] or 0) + (v:is_suit('Diamonds') and 1 or 0) + + --for face cards/numbered cards/aces + local card_id = v:get_id() + face_tally = face_tally + ((card_id ==11 or card_id ==12 or card_id ==13) and 1 or 0) + mod_face_tally = mod_face_tally + (v:is_face() and 1 or 0) + if card_id > 1 and card_id < 11 then + num_tally = num_tally + 1 + if not v.debuff then mod_num_tally = mod_num_tally + 1 end + end + if card_id == 14 then + ace_tally = ace_tally + 1 + if not v.debuff then mod_ace_tally = mod_ace_tally + 1 end + end + + --ranks + rank_tallies[card_id - 1] = rank_tallies[card_id - 1] + 1 + if not v.debuff then mod_rank_tallies[card_id - 1] = mod_rank_tallies[card_id - 1] + 1 end + end + end + + local modded = (face_tally ~= mod_face_tally) or + (mod_suit_tallies['Spades'] ~= suit_tallies['Spades']) or + (mod_suit_tallies['Hearts'] ~= suit_tallies['Hearts']) or + (mod_suit_tallies['Clubs'] ~= suit_tallies['Clubs']) or + (mod_suit_tallies['Diamonds'] ~= suit_tallies['Diamonds']) + + if wheel_flipped > 0 then flip_col = mix_colours(G.C.FILTER, G.C.WHITE,0.7) end + + local rank_cols = {} + for i = 13, 1, -1 do + local mod_delta = mod_rank_tallies[i] ~= rank_tallies[i] + rank_cols[#rank_cols+1] = {n=G.UIT.R, config={align = "cm", padding = 0.07}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, padding = 0.04, emboss = 0.04, minw = 0.5, colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.T, config={text = rank_name_mapping[i],colour = G.C.JOKER_GREY, scale = 0.35, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cr", minw = 0.4}, nodes={ + mod_delta and {n=G.UIT.O, config={object = DynaText({string = {{string = ''..rank_tallies[i], colour = flip_col},{string =''..mod_rank_tallies[i], colour = G.C.BLUE}}, colours = {G.C.RED}, scale = 0.4, y_offset = -2, silent = true, shadow = true, pop_in_rate = 10, pop_delay = 4})}} or + {n=G.UIT.T, config={text = rank_tallies[i] or 'NIL',colour = flip_col, scale = 0.45, shadow = true}}, + }} + }} + end + + + local t = + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 1.5, minh = 2, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.C.L_BLACK, emboss = 0.05, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = G.GAME.selected_back.loc_name, colours = {G.C.WHITE}, bump = true, rotate = true, shadow = true, scale = 0.6 - string.len(G.GAME.selected_back.loc_name)*0.01})}}, + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.1, minw = 2.5, minh = 1.3, colour = G.C.WHITE, emboss = 0.05}, nodes={ + {n=G.UIT.O, config={object = UIBox{ + definition = G.GAME.selected_back:generate_UI(nil,0.7, 0.5, G.GAME.challenge), + config = {offset = {x=0,y=0}} + }}} + }} + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, outline_colour = G.C.L_BLACK, line_emboss = 0.05, outline = 1.5}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.07}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{string = localize('k_base_cards'), colour = G.C.RED}, modded and {string = localize('k_effective'), colour = G.C.BLUE} or nil}, colours = {G.C.RED}, silent = true,scale = 0.4,pop_in_rate = 10, pop_delay = 4})}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={ + tally_sprite({x=1,y=0},{{string = ''..ace_tally, colour = flip_col},{string =''..mod_ace_tally, colour = G.C.BLUE}}, {localize('k_aces')}),--Aces + tally_sprite({x=2,y=0},{{string = ''..face_tally, colour = flip_col},{string =''..mod_face_tally, colour = G.C.BLUE}}, {localize('k_face_cards')}),--Face + tally_sprite({x=3,y=0},{{string = ''..num_tally, colour = flip_col},{string =''..mod_num_tally, colour = G.C.BLUE}}, {localize('k_numbered_cards')}),--Numbers + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={ + tally_sprite({x=3,y=1}, {{string = ''..suit_tallies['Spades'], colour = flip_col},{string =''..mod_suit_tallies['Spades'], colour = G.C.BLUE}}, {localize('Spades', 'suits_plural')}), + tally_sprite({x=0,y=1}, {{string = ''..suit_tallies['Hearts'], colour = flip_col},{string =''..mod_suit_tallies['Hearts'], colour = G.C.BLUE}}, {localize('Hearts', 'suits_plural')}), + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={ + tally_sprite({x=2,y=1}, {{string = ''..suit_tallies['Clubs'], colour = flip_col},{string =''..mod_suit_tallies['Clubs'], colour = G.C.BLUE}}, {localize('Clubs', 'suits_plural')}), + tally_sprite({x=1,y=1}, {{string = ''..suit_tallies['Diamonds'], colour = flip_col},{string =''..mod_suit_tallies['Diamonds'], colour = G.C.BLUE}}, {localize('Diamonds', 'suits_plural')}), + }}, + }} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes=rank_cols}, + {n=G.UIT.B, config={w = 0.1, h = 0.1}}, + }}, + {n=G.UIT.B, config={w = 0.2, h = 0.1}}, + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.8, padding = 0.05}, nodes={ + modded and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7)}, nodes = {}}, + {n=G.UIT.T, config={text =' '..localize('ph_deck_preview_effective'),colour = G.C.WHITE, scale =0.3}}, + }} or nil, + wheel_flipped > 0 and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = flip_col}, nodes = {}}, + {n=G.UIT.T, config={text =' '..(wheel_flipped > 1 and + localize{type = 'variable', key = 'deck_preview_wheel_plural', vars = {wheel_flipped}} or + localize{type = 'variable', key = 'deck_preview_wheel_singular', vars = {wheel_flipped}}),colour = G.C.WHITE, scale =0.3}}, + }} or nil, + }} + }} + return t +end + +function tally_sprite(pos, value, tooltip) + local text_colour = G.C.BLACK + if type(value) == "table" and value[1].string==value[2].string then + text_colour = value[1].colour or G.C.WHITE + value = value[1].string + end + local t_s = Sprite(0,0,0.5,0.5,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=pos.x or 0, y=pos.y or 0}) + t_s.states.drag.can = false + t_s.states.hover.can = false + t_s.states.collide.can = false + return + {n=G.UIT.C, config={align = "cm", padding = 0.07,force_focus = true, focus_args = {type = 'tally_sprite'}, tooltip = {text = tooltip}}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, emboss = 0.05, colour = G.C.JOKER_GREY}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5 ,can_collide = false, object = t_s, tooltip = {text = tooltip}}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + type(value) == "table" and {n=G.UIT.O, config={object = DynaText({string = value, colours = {G.C.RED}, scale = 0.4, silent = true, shadow = true, pop_in_rate = 10, pop_delay = 4})}} or + {n=G.UIT.T, config={text = value or 'NIL',colour = text_colour, scale = 0.4, shadow = true}}, + }}, + }} +end + +function G.UIDEF.used_vouchers() + + local silent = false + local keys_used = {} + local area_count = 0 + local voucher_areas = {} + local voucher_tables = {} + local voucher_table_rows = {} + for k, v in ipairs(G.P_CENTER_POOLS["Voucher"]) do + local key = 1 + math.floor((k-0.1)/2) + keys_used[key] = keys_used[key] or {} + if G.GAME.used_vouchers[v.key] then + keys_used[key][#keys_used[key]+1] = v + end + end + for k, v in ipairs(keys_used) do + if next(v) then + area_count = area_count + 1 + end + end + for k, v in ipairs(keys_used) do + if next(v) then + if #voucher_areas == 5 or #voucher_areas == 10 then + table.insert(voucher_table_rows, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes=voucher_tables} + ) + voucher_tables = {} + end + voucher_areas[#voucher_areas + 1] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (#v == 1 and 1 or 1.33)*G.CARD_W, + (area_count >=10 and 0.75 or 1.07)*G.CARD_H, + {card_limit = 2, type = 'voucher', highlight_limit = 0}) + for kk, vv in ipairs(v) do + local center = G.P_CENTERS[vv.key] + local card = Card(voucher_areas[#voucher_areas].T.x + voucher_areas[#voucher_areas].T.w/2, voucher_areas[#voucher_areas].T.y, G.CARD_W, G.CARD_H, nil, center, {bypass_discovery_center=true,bypass_discovery_ui=true,bypass_lock=true}) + card.ability.order = vv.order + card:start_materialize(nil, silent) + silent = true + voucher_areas[#voucher_areas]:emplace(card) + end + table.insert(voucher_tables, + {n=G.UIT.C, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = voucher_areas[#voucher_areas]}} + }} + ) + end + end + table.insert(voucher_table_rows, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes=voucher_tables} + ) + + + local t = silent and {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_vouchers_redeemed')}, colours = {G.C.UI.TEXT_LIGHT}, bump = true, scale = 0.6})}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.5}, nodes={ + }}, + {n=G.UIT.R, config={align = "cm", colour = G.C.BLACK, r = 1, padding = 0.15, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes=voucher_table_rows}, + }} + }} or + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_no_vouchers')}, colours = {G.C.UI.TEXT_LIGHT}, bump = true, scale = 0.6})}} + }} + return t +end + + + +function create_UIBox_your_collection() + set_discover_tallies() + G.E_MANAGER:add_event(Event({ + blockable = false, + func = function() + G.REFRESH_ALERTS = true + return true + end + })) + local t = create_UIBox_generic_options({ back_func = G.STAGE == G.STAGES.RUN and 'options' or 'exit_overlay_menu', contents = { + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button({button = 'your_collection_jokers', label = {localize('b_jokers')}, count = G.DISCOVER_TALLIES.jokers, minw = 5, minh = 1.7, scale = 0.6, id = 'your_collection_jokers'}), + UIBox_button({button = 'your_collection_decks', label = {localize('b_decks')}, count = G.DISCOVER_TALLIES.backs, minw = 5}), + UIBox_button({button = 'your_collection_vouchers', label = {localize('b_vouchers')}, count = G.DISCOVER_TALLIES.vouchers, minw = 5, id = 'your_collection_vouchers'}), + {n=G.UIT.R, config={align = "cm", padding = 0.1, r=0.2, colour = G.C.BLACK}, nodes={ + {n=G.UIT.C, config={align = "cm", maxh=2.9}, nodes={ + {n=G.UIT.T, config={text = localize('k_cap_consumables'), scale = 0.45, colour = G.C.L_BLACK, vert = true, maxh=2.2}}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button({button = 'your_collection_tarots', label = {localize('b_tarot_cards')}, count = G.DISCOVER_TALLIES.tarots, minw = 4, id = 'your_collection_tarots', colour = G.C.SECONDARY_SET.Tarot}), + UIBox_button({button = 'your_collection_planets', label = {localize('b_planet_cards')}, count = G.DISCOVER_TALLIES.planets, minw = 4, id = 'your_collection_planets', colour = G.C.SECONDARY_SET.Planet}), + UIBox_button({button = 'your_collection_spectrals', label = {localize('b_spectral_cards')}, count = G.DISCOVER_TALLIES.spectrals, minw = 4, id = 'your_collection_spectrals', colour = G.C.SECONDARY_SET.Spectral}), + }} + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button({button = 'your_collection_enhancements', label = {localize('b_enhanced_cards')}, minw = 5}), + UIBox_button({button = 'your_collection_seals', label = {localize('b_seals')}, minw = 5, id = 'your_collection_seals'}), + UIBox_button({button = 'your_collection_editions', label = {localize('b_editions')}, count = G.DISCOVER_TALLIES.editions, minw = 5, id = 'your_collection_editions'}), + UIBox_button({button = 'your_collection_boosters', label = {localize('b_booster_packs')}, count = G.DISCOVER_TALLIES.boosters, minw = 5, id = 'your_collection_boosters'}), + UIBox_button({button = 'your_collection_tags', label = {localize('b_tags')}, count = G.DISCOVER_TALLIES.tags, minw = 5, id = 'your_collection_tags'}), + UIBox_button({button = 'your_collection_blinds', label = {localize('b_blinds')}, count = G.DISCOVER_TALLIES.blinds, minw = 5, minh = 2.0, id = 'your_collection_blinds', focus_args = {snap_to = true}}), + }}, + + }}) + return t +end + +function create_UIBox_your_collection_jokers() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 3 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 5*G.CARD_W, + 0.95*G.CARD_H, + {card_limit = 5, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0.07, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + local joker_options = {} + for i = 1, math.ceil(#G.P_CENTER_POOLS.Joker/(5*#G.your_collection)) do + table.insert(joker_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Joker/(5*#G.your_collection)))) + end + + for i = 1, 5 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card.sticker = get_joker_win_sticker(center) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = joker_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_joker_page', current_option = 1, colour = G.C.RED, no_pips = true, focus_args = {snap_to = true, nav = 'wide'}}) + }} + }}) + return t +end + +function create_UIBox_your_collection_tarots() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (4.25+j)*G.CARD_W, + 1*G.CARD_H, + {card_limit = 4 + j, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + local tarot_options = {} + for i = 1, math.floor(#G.P_CENTER_POOLS.Tarot/11) do + table.insert(tarot_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.floor(#G.P_CENTER_POOLS.Tarot/11))) + end + + for j = 1, #G.your_collection do + for i = 1, 4+j do + local center = G.P_CENTER_POOLS["Tarot"][i+(j-1)*(5)] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = tarot_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_tarot_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true}) + }} + }}) + return t +end + +function create_UIBox_your_collection_boosters() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (5.25)*G.CARD_W, + 1.3*G.CARD_H, + {card_limit = 4, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + local booster_options = {} + for i = 1, math.ceil(#G.P_CENTER_POOLS.Booster/8) do + table.insert(booster_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Booster/8))) + end + + for j = 1, #G.your_collection do + for i = 1, 4 do + local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W*1.27, G.CARD_H*1.27, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = booster_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_booster_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true}) + }} + }}) + return t +end + +function create_UIBox_your_collection_planets() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (6.25)*G.CARD_W, + 1*G.CARD_H, + {card_limit = 6, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + for j = 1, #G.your_collection do + for i = 1, 6 do + local center = G.P_CENTER_POOLS["Planet"][i+(j-1)*(6)] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm", padding = 0.7}, nodes={}}, + }}) + return t +end + +function create_UIBox_your_collection_spectrals() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (3.25+j)*G.CARD_W, + 1*G.CARD_H, + {card_limit = 3+j, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + for j = 1, #G.your_collection do + for i = 1, 3+j do + local center = G.P_CENTER_POOLS["Spectral"][i+(j-1)*3 + j - 1] + + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + local spectral_options = {} + for i = 1, math.floor(#G.P_CENTER_POOLS.Tarot/9) do + table.insert(spectral_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.floor(#G.P_CENTER_POOLS.Spectral/9))) + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_option_cycle({options = spectral_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_spectral_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true}) + }}, + }}) + return t +end + +function create_UIBox_your_collection_vouchers(exit) + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 4.25*G.CARD_W, + 1*G.CARD_H, + {card_limit = 4, type = 'voucher', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + local voucher_options = {} + for i = 1, math.ceil(#G.P_CENTER_POOLS.Voucher/(4*#G.your_collection)) do + table.insert(voucher_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Voucher/(4*#G.your_collection)))) + end + + for i = 1, 4 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card.ability.order = i+(j-1)*4 + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = voucher_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_voucher_page', focus_args = {snap_to = true, nav = 'wide'}, current_option = 1, colour = G.C.RED, no_pips = true}) + }} + }}) + return t +end + +function create_UIBox_your_collection_seals(exit) + local deck_tables = {} + + G.your_collection = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 4.25*G.CARD_W, + 1.03*G.CARD_H, + {card_limit = 4, type = 'title', highlight_limit = 0}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection}} + }} + ) + + for k, v in ipairs(G.P_CENTER_POOLS['Seal']) do + local center = G.P_CENTERS.c_base + local card = Card(G.your_collection.T.x + G.your_collection.T.w/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) + card:set_seal(v.key, true) + G.your_collection:emplace(card) + end + + local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = exit or 'your_collection', snap_back = true, contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + }}) + return t +end + +function create_UIBox_your_collection_enhancements(exit) + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 4.25*G.CARD_W, + 1.03*G.CARD_H, + {card_limit = 4, type = 'title', highlight_limit = 0}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + for i = 1, 4 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Enhanced"][i+(j-1)*4] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) + G.your_collection[j]:emplace(card) + end + end + + local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = exit or 'your_collection', snap_back = true, contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + }}) + return t +end + +function create_UIBox_your_collection_editions() + G.your_collection = {} + G.your_collection[1] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 5.3*G.CARD_W, + 1.03*G.CARD_H, + {card_limit = 5, type = 'title', highlight_limit = 0, collection = true}) + local deck_tables = + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[1]}} + }} + + local editions = {'base', 'foil','holo','polychrome','negative'} + + for i = 1, 5 do + local card = Card(G.your_collection[1].T.x + G.your_collection[1].T.w/2, G.your_collection[1].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['e_'..editions[i]]) + card:start_materialize() + if G.P_CENTERS['e_'..editions[i]].discovered then card:set_edition({[editions[i]] = true}, true, true) end + G.your_collection[1]:emplace(card) + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = 'your_collection', snap_back = true, contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={deck_tables}}, + }}) + return t +end + +function create_UIBox_your_collection_decks() + G.GAME.viewed_back = Back(G.P_CENTERS.b_red) + + local area = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 1.2*G.CARD_W, + 1.2*G.CARD_H, + {card_limit = 52, type = 'deck', highlight_limit = 0}) + + for i = 1, 52 do + local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W*1.2, G.CARD_H*1.2, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {playing_card = i, viewed_back = true}) + card.sprite_facing = 'back' + card.facing = 'back' + area:emplace(card) + if i == 52 then G.sticker_card = card; card.sticker = get_deck_win_sticker(G.GAME.viewed_back.effect.center) end + end + + local ordered_names = {} + for k, v in ipairs(G.P_CENTER_POOLS.Back) do + ordered_names[#ordered_names+1] = v.name + end + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + create_option_cycle({options = ordered_names, opt_callback = 'change_viewed_back', current_option = 1, colour = G.C.RED, w = 4.5, focus_args = {snap_to = true}, mid = + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.2}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = area}} + }}, + {n=G.UIT.C, config={align = "tm", minw = 3.7, minh = 2.1, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", emboss = 0.1, r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}}, + }}, + {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, emboss = 0.1, minh = 2.2, r = 0.1}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back', object = UIBox{definition = G.GAME.viewed_back:generate_UI(), config = {offset = {x=0,y=0}}}}} + }} + }}, + }}, + }}}), + }}) + return t +end + +function create_UIBox_your_collection_tags() + local tag_matrix = { + {},{},{},{}, + } + local tag_tab = {} + for k, v in pairs(G.P_TAGS) do + tag_tab[#tag_tab+1] = v + end + + table.sort(tag_tab, function (a, b) return a.order < b.order end) + + local tags_to_be_alerted = {} + for k, v in ipairs(tag_tab) do + local discovered = v.discovered + local temp_tag = Tag(v.key, true) + if not v.discovered then temp_tag.hide_ability = true end + local temp_tag_ui, temp_tag_sprite = temp_tag:generate_UI() + tag_matrix[math.ceil((k-1)/6+0.001)][1+((k-1)%6)] = {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + temp_tag_ui, + }} + if discovered and not v.alerted then + tags_to_be_alerted[#tags_to_be_alerted+1] = temp_tag_sprite + end + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + for _, v in ipairs(tags_to_be_alerted) do + v.children.alert = UIBox{ + definition = create_UIBox_card_alert(), + config = { align="tri", offset = {x = 0.1, y = 0.1}, parent = v} + } + v.children.alert.states.collide.can = false + end + return true + end) + })) + + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK, padding = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[1]}, + {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[2]}, + {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[3]}, + {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[4]}, + }} + }} + }} + }}) + return t +end + +function create_UIBox_your_collection_blinds(exit) + local blind_matrix = { + {},{},{}, {}, {}, {} + } + local blind_tab = {} + for k, v in pairs(G.P_BLINDS) do + blind_tab[#blind_tab+1] = v + end + + table.sort(blind_tab, function (a, b) return a.order < b.order end) + + local blinds_to_be_alerted = {} + for k, v in ipairs(blind_tab) do + local discovered = v.discovered + local temp_blind = AnimatedSprite(0,0,1.3,1.3, G.ANIMATION_ATLAS['blind_chips'], discovered and v.pos or G.b_undiscovered.pos) + temp_blind:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + if k == 1 then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.CONTROLLER:snap_to{node = temp_blind} + return true + end) + })) + end + temp_blind.float = true + temp_blind.states.hover.can = true + temp_blind.states.drag.can = false + temp_blind.states.collide.can = true + temp_blind.config = {blind = v, force_focus = true} + if discovered and not v.alerted then + blinds_to_be_alerted[#blinds_to_be_alerted+1] = temp_blind + end + temp_blind.hover = function() + if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then + if not temp_blind.hovering and temp_blind.states.visible then + temp_blind.hovering = true + temp_blind.hover_tilt = 3 + temp_blind:juice_up(0.05, 0.02) + play_sound('chips1', math.random()*0.1 + 0.55, 0.12) + temp_blind.config.h_popup = create_UIBox_blind_popup(v, discovered) + temp_blind.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = temp_blind} + Node.hover(temp_blind) + if temp_blind.children.alert then + temp_blind.children.alert:remove() + temp_blind.children.alert = nil + temp_blind.config.blind.alerted = true + G:save_progress() + end + end + end + temp_blind.stop_hover = function() temp_blind.hovering = false; Node.stop_hover(temp_blind); temp_blind.hover_tilt = 0 end + end + blind_matrix[math.ceil((k-1)/5+0.001)][1+((k-1)%5)] = {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + (k==6 or k ==16 or k == 26) and {n=G.UIT.B, config={h=0.2,w=0.5}} or nil, + {n=G.UIT.O, config={object = temp_blind, focus_with_object = true}}, + (k==5 or k ==15 or k == 25) and {n=G.UIT.B, config={h=0.2,w=0.5}} or nil, + }} + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + for _, v in ipairs(blinds_to_be_alerted) do + v.children.alert = UIBox{ + definition = create_UIBox_card_alert(), + config = { align="tri", offset = {x = 0.1, y = 0.1}, parent = v} + } + v.children.alert.states.collide.can = false + end + return true + end) + })) + + local ante_amounts = {} + for i = 1, math.min(16, math.max(16, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt)) do + local spacing = 1 - math.min(20, math.max(15, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt))*0.06 + if spacing > 0 and i > 1 then + ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={minh = spacing}, nodes={}} + end + local blind_chip = Sprite(0,0,0.2,0.2,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0}) + blind_chip.states.drag.can = false + ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 0.7}, nodes={ + {n=G.UIT.T, config={text = i, scale = 0.4, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cr", minw = 2.8}, nodes={ + {n=G.UIT.O, config={object = blind_chip}}, + {n=G.UIT.C, config={align = "cm", minw = 0.03, minh = 0.01}, nodes={}}, + {n=G.UIT.T, config={text =number_format(get_blind_amount(i)), scale = 0.4, colour = i <= G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt and G.C.RED or G.C.JOKER_GREY, shadow = true}}, + }} + }} + end + + local extras = nil + local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = { + {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK, padding = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.L_BLACK, padding = 0.1, force_focus = true, focus_args = {nav = 'tall'}}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 0.7}, nodes={ + {n=G.UIT.T, config={text = localize('k_ante_cap'), scale = 0.4, colour = lighten(G.C.FILTER, 0.2), shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cr", minw = 2.8}, nodes={ + {n=G.UIT.T, config={text = localize('k_base_cap'), scale = 0.4, colour = lighten(G.C.RED, 0.2), shadow = true}}, + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes=ante_amounts} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[1]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[2]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[3]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[4]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[5]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[6]}, + }} + }} + }} + }}) + return t +end + +function create_UIBox_blind_popup(blind, discovered, vars) + local blind_text = {} + + local _dollars = blind.dollars + local loc_target = localize{type = 'raw_descriptions', key = blind.key, set = 'Blind', vars = vars or blind.vars} + local loc_name = localize{type = 'name_text', key = blind.key, set = 'Blind'} + + if discovered then + local ability_text = {} + if loc_target then + for k, v in ipairs(loc_target) do + ability_text[#ability_text + 1] = {n=G.UIT.R, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = (k ==1 and blind.name == 'The Wheel' and '1' or '')..v, scale = 0.35, shadow = true, colour = G.C.WHITE}}}} + end + end + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.4) + blind_text[#blind_text + 1] = + {n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.07, colour = G.C.WHITE}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 2.4}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.35, colour = G.C.UI.TEXT_DARK}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = stake_sprite}}, + {n=G.UIT.T, config={text = blind.mult..localize('k_x_base'), scale = 0.4, colour = G.C.RED}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.35, colour = G.C.UI.TEXT_DARK}}, + {n=G.UIT.O, config={object = DynaText({string = {_dollars and string.rep(localize('$'),_dollars) or '-'}, colours = {G.C.MONEY}, rotate = true, bump = true, silent = true, scale = 0.45})}}, + }}, + ability_text[1] and {n=G.UIT.R, config={align = "cm", padding = 0.08, colour = mix_colours(blind.boss_colour, G.C.GREY, 0.4), r = 0.1, emboss = 0.05, minw = 2.5, minh = 0.9}, nodes=ability_text} or nil + }} + else + blind_text[#blind_text + 1] = + {n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.1, colour = G.C.WHITE}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('ph_defeat_this_blind_1'), scale = 0.4, colour = G.C.UI.TEXT_DARK}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('ph_defeat_this_blind_2'), scale = 0.4, colour = G.C.UI.TEXT_DARK}}, + }}, + }} + end + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.1, colour = not discovered and G.C.JOKER_GREY or blind.boss_colour or G.C.GREY}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = discovered and loc_name or localize('k_not_discovered'), colours = {G.C.UI.TEXT_LIGHT}, shadow = true, rotate = not discovered, spacing = discovered and 2 or 0, bump = true, scale = 0.4})}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_text}, + }} +end + + +function create_UIBox_card_unlock(card_center) + G.your_collection = CardArea( + G.ROOM.T.x + G.ROOM.T.w/2,G.ROOM.T.h, + 1*G.CARD_W, + 1*G.CARD_H, + {card_limit = 2, type = 'consumeable', highlight_limit = 0}) + + local card = Card(G.your_collection.T.x + G.your_collection.T.w/2 - G.CARD_W/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, card_center, {bypass_discovery_center = true, bypass_discovery_ui = true}) + local locked_card = Card(G.your_collection.T.x + G.your_collection.T.w/2 - G.CARD_W/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, card_center.set == 'Voucher' and G.v_locked or G.j_locked) + locked_card:remove_UI() + locked_card.ID = card.ID + card.states.click.can = false + locked_card.states.click.can = false + card.states.visible = false + card.no_ui = true + + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, + func = (function() G.OVERLAY_MENU.joker_unlock_table = card.ID return true end) })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 0.6, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.3, 0.2); play_sound('cancel', 0.8) end; return true end) })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 1.15, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.45, 0.3); play_sound('cancel', 0.92) end; return true end) })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 1.8, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.6, 0.4); play_sound('cancel', 1.03) end; return true end) })) + + G.E_MANAGER:add_event(Event({ + timer = 'REAL', + blockable = false, + blocking = false, + trigger = 'after', + delay = 2.3, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:start_dissolve({G.C.BLACK}) end + return true end) + })) + G.E_MANAGER:add_event(Event({ + timer = 'REAL', + blockable = false, + blocking = false, + trigger = 'after', + delay = 2.7, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then + card:start_materialize({G.C.BLUE}, true) + play_sound('crumple1', 0.8, 1); + end + return true end) + })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 2.78, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then card.no_ui = nil; play_sound('timpani', 0.8, 1.8) end return true end) })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 2.95, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then play_sound('timpani', 1, 1.8) end return true end) })) + + G.your_collection:emplace(card) + G.your_collection:emplace(locked_card) + + local t = create_UIBox_generic_options({padding = 0,back_label = localize('b_continue'), no_pip = true, snap_back = true, back_func = 'continue_unlock', minw = 4.5, contents = { + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {card_center.set == 'Voucher' and localize('k_voucher') or localize('k_joker')}, colours = {G.C.BLUE},shadow = true, rotate = true, bump = true, pop_in = 0.3, pop_in_rate = 2, scale = 1.2})}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_unlocked_ex')}, colours = {G.C.RED},shadow = true, rotate = true, bump = true, pop_in = 0.6, pop_in_rate = 2, scale = 0.8})}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0, draw_layer = 1}, nodes={ + {n=G.UIT.O, config={object = G.your_collection}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, emboss = 0.05, colour = G.C.WHITE, r = 0.1}, nodes={ + desc_from_rows(card:generate_UIBox_unlock_table(true).main) + }} + }} + }} + }} + }}) + return t +end + +function create_UIBox_deck_unlock(deck_center) + G.GAME.viewed_back = Back(deck_center) + local area = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 1.2*G.CARD_W, + 1.2*G.CARD_H, + {card_limit = 52, type = 'deck', highlight_limit = 0}) + + for i = 1, 52 do + local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W*1.2, G.CARD_H*1.2, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {bypass_back = deck_center.pos, playing_card = i, viewed_back = true}) + area:emplace(card) + card[deck_center.key] = true + card.sprite_facing = 'back' + card.facing = 'back' + end + local deck_criteria = {} + if deck_center.unlock_condition.type == 'win_deck' then + local other_name = localize{type = 'name_text', set = 'Back', key = deck_center.unlock_condition.deck} + localize{type = 'descriptions', key = 'deck_locked_win', set = "Other", nodes = deck_criteria, vars = {other_name}, default_col = G.C.WHITE, shadow = true} + elseif deck_center.unlock_condition.type == 'win_stake' then + local other_name = localize{type = 'name_text', set = 'Stake', key = G.P_CENTER_POOLS.Stake[deck_center.unlock_condition.stake].key} + localize{type = 'descriptions', key = 'deck_locked_stake', set = "Other", nodes = deck_criteria, vars = {other_name, colours = {get_stake_col(deck_center.unlock_condition.stake)}}, default_col = G.C.WHITE, shadow = true} + elseif deck_center.unlock_condition.type == 'discover_amount' then + localize{type = 'descriptions', key = 'deck_locked_discover', set = "Other", nodes = deck_criteria, vars = {deck_center.unlock_condition.amount}, default_col = G.C.WHITE, shadow = true} + end + + local deck_criteria_cols = {} + for k, v in ipairs(deck_criteria) do + if k > 1 then deck_criteria_cols[#deck_criteria_cols+1] = {n=G.UIT.C, config={align = "cm", padding = 0, minw = 0.1}, nodes={}} end + deck_criteria_cols[#deck_criteria_cols+1] = {n=G.UIT.C, config={align = "cm", padding = 0}, nodes=v} + end + + local t = create_UIBox_generic_options({ back_label = localize('b_continue'), no_pip = true, snap_back = true, back_func = 'continue_unlock', minw = 7, contents = { + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{string = localize{type = 'name_text', set = 'Back', key = deck_center.key}, suffix = ' '..localize('k_unlocked_ex'), outer_colour = G.C.UI.TEXT_LIGHT}}, colours = {G.C.BLUE},shadow = true, rotate = true, float = true, scale = 0.7, pop_in = 0.1})}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes=deck_criteria_cols}, + {n=G.UIT.R, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.2}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = area}} + }}, + {n=G.UIT.C, config={align = "cm", r = 0.2, colour = G.C.WHITE, emboss = 0.05, padding = 0.2, minw = 4}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes=G.GAME.viewed_back:generate_UI(deck_center).nodes} + }} + }} + }}) + return t +end + +function G.UIDEF.multiline_credit_text(_lines) + local t = {} + for k, v in ipairs(_lines) do + t[#t+1] = {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = v, scale = 0.28, colour = G.C.WHITE}}, + }} + end + + return t +end + +function G.UIDEF.viewed_collab_option(_new_option) + G.viewed_collab = G.viewed_collab or 'The Binding of Isaac' + + local curr_collab = G.collab_credits[G.viewed_collab] or G.collab_credits['The Binding of Isaac'] + local collab_sprite = Sprite(0,0,0.8*G.CARD_W,0.8*G.CARD_H,G.ASSET_ATLAS[curr_collab.art..'_1'], {x=2,y=0}) + + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = G.viewed_collab, scale = 0.5, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1, minw = 9, minh = 4.2}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes=G.UIDEF.multiline_credit_text({ + 'All rights reserved. No part of this work may be', + 'reproduced in any form or by any means— graphic,', + 'electronic, or mechanical, including recording,', + 'online distribution, or information storage and retrieval', + 'systems—without the written permission of the publisher', + 'or the designated rightsholder, as applicable.' + })}, + curr_collab.ml_text and {n=G.UIT.R, config={align = "cl", padding = 0}, nodes=G.UIDEF.multiline_credit_text(curr_collab.ml_text)} or nil, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1, minw = 3, minh = 4.2}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.0}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, r = 0.3}, nodes={ + {n=G.UIT.O, config={colour = G.C.BLUE, object = collab_sprite, hover = true, can_collide = false}}, + }}, + }}, + curr_collab.artist and {n=G.UIT.R, config={align = "cm", padding = 0.07, r = 0.1, outline = 0.7, outline_colour = G.C.WHITE}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Art created by:", scale = 0.3, colour = G.C.WHITE}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = curr_collab.artist, scale = 0.3, colour = G.C.GOLD}} + }}, + curr_collab.artist_link and {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = curr_collab.artist_link, scale = 0.3, colour = G.C.BLUE}} + }} or nil + }} or nil + }} + }} + }} +end + +function G.UIDEF.credits() + local text_scale = 0.75 + local t = create_UIBox_generic_options({contents ={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_tabs( + {tabs = { + { + label = "Production", + chosen = true, + tab_definition_function = function() return + {n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.2,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Original Soundtrack", scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "composed by ", scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = "LouisF", scale = text_scale*0.8, colour = G.C.BLUE, shadow = true}} + }}, + G.F_EXTERNAL_LINKS and {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + UIBox_button({label = {'Instagram'}, button = 'louisf_insta'}) + }} or nil, + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + {n=G.UIT.T, config={text = "Modified with their permission", scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.C, config={align = "tm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Porting", scale = text_scale*0.6, colour = G.C.WHITE, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "PlayStation", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Maarten De Meyer', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Xbox", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Maarten De Meyer', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Android", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Maarten De Meyer', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Apple Platforms", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Maarten De Meyer', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Mac (Steam)", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'william341', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Localization", scale = text_scale*0.6, colour = G.C.WHITE, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Universally Speaking", scale = text_scale*0.6, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'German', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Spanish Latam', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'French', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Indonesian', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Italian', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Japanese', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Korean', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Dutch', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Polish', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Portuguese Brasilian', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Russian', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Simplified Chinese', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Traditional Chinese', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Project managers', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}}, + }}, + }}, + {n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Dominik May, Lisa-Marie Beck', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Román René Orozco, Javier Gómez', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Romain Vervaecke, Claire Gérard', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Yopi Jalu Paksi, Sutarto Mohammad', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Oliver Cozzio, Giulia Benassi', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Takashi Fujimoto, Ai Parlow', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Haejung Lee, Sanghyun Bae', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Ellis Jongsma, Erik Nusselder', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Mariusz Wlodarczyk, Bartosz Klofik', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Samuel Modesto, R. Cali', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Yuliia Tatsenko, Natalia Rudane', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Shuai Fang, Liqi Ye', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Pauline Lin, AngelRabbitBB', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Ruoyang Yuan, Tania Carè', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + }}, + }}, + {n=G.UIT.C, config={align = "tm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Testing/QA", scale = text_scale*0.6, colour = G.C.WHITE, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Vishwak Kondapalli', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Basha Syed', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'CampfireCollective', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'drspectred', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'TheRealEvab', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Brightqwerty', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'MrWizzrd', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'mcpower', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + + }}, + }}, + + }} + end, + }, + { + label = "Publishing", + tab_definition_function = function() return + {n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Playstack", scale = text_scale*0.6, colour = G.C.RED, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Harvey Elliott', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Kevin Shrapnell', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Rob Crossley', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Liz Cheng-Moore', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Will Newell', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Charlotte Riley', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Alexander Saunders', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Naman Budhwar', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Tomasz Wisniowski', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Patrick Johnson', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Tom Verney', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Wouter van Halderen', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Shawn Cotter', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.C, config={align = "tl", padding = 0.093}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'CEO', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'COO', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'VP of Publishing', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Lead Marketing Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Producer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Producer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Producer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Lead Visual Marketing Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Producer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Senior Discovery Scout', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Discovery Scout', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'PR Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Marketing Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + }}, + {n=G.UIT.B, config={align = "tl", w=0.25, h=0}, nodes={}}, + {n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Marta Matyjewicz', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Rebecca Bell', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Alex Flynn', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Justas Pugaciauskas', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Jessica Chu', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Millicent Su', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Carla Malavasi', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Pawel Kwietniak', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Ela Müller', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Edgar Khoo', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Dami Ajiboye', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Aaron Ludlow', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Jenny Quintero', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.C, config={align = "tl", padding = 0.093}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Marketing Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Finance', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Creative Director', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Graphic Designer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Lead Video Artist', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Senior User Acquisition Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Director of Publishing Services', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Front-end Developer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Graphic Designer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Video Editor', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Data Analyst', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Product Director', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Senior Partnerships Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + }}, + {n=G.UIT.B, config={align = "tl", w=0.25, h=0}, nodes={}}, + {n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Stephanie Marti', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Emma Smith-Bodie', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Moe Abrams', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Piotr Kowalik', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Carmen Martino', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Rong Lin', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Bea Gomez', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Jose Olivares', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Joanna Kieronska', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Zuzanna Dawidowska', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Jean-Claude Vidanes ', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'AJ Purnell', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.C, config={align = "tl", padding = 0.093}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Senior Video Artist', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Community Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Customer Support', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Software Engineer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'HR & Office Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Finance Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Video Editor', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'QA & Localisation Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'QA Tester', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'QA Tester', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'QA Tester', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'QA Tester', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}}, + }}, + }}, + }}, + }} + }} + end, + }, + { + label = "Collabs", + tab_definition_function = function() + G.collab_credits = G.collab_credits or { + + ['Vault-Tec'] = { + artist = 'Franek', + ml_text = { + '© 2025 ZeniMax. ZeniMax and Bethesda Game Studios', + 'are trademarks of the ZeniMax group of companies. ', + 'All rights reserved.', + }, + art = 'collab_FO' + }, + ['The Witcher'] = { + artist = nil, + ml_text = { + '© 2024 CD PROJEKT S.A. All rights reserved. CD PROJEKT,', + 'the CD PROJEKT logo, The Witcher and The Witcher Logo,', + 'Geralt, Geralt of Rivia and Yennefer are trademarks and/or', + 'registered trademarks of CD PROJEKT S.A. in the US and/or', + 'other countries. The Witcher game is set in the universe', + 'created by Andrzej Sapkowski in his series of books.' + }, + art = 'collab_TW' + }, + ['Cyberpunk 2077'] = { + artist = nil, + ml_text = { + 'Cyberpunk 2077 © 2024 CD PROJEKT S.A. All rights reserved.' + }, + art = 'collab_CYP' + }, + ['Shovel Knight'] = { + artist = 'Neato', + artist_link = 'twitch.tv/neato', + ml_text = { + 'Shovel Knight © 2024 Yacht Club Games, LLC. All Rights Reserved.' + }, + art = 'collab_SK' + }, + ['Don\'t Starve'] = { + artist = nil, + ml_text = { + '“KLEI” “DON\'T STARVE” © 2024 All Rights Reserved', + 'Klei Entertainment 2024' + }, + art = 'collab_DS' + }, + ['Assassin\'s Creed'] = { + artist = 'Franek', + ml_text = { + 'Assassin\'s Creed © 2025 Ubisoft Entertainment.', + 'All Rights Reserved.' + }, + art = 'collab_AC' + }, + ['Slay the Princess'] = { + artist = 'Franek', + ml_text = { + 'Slay the Princess (c) 2025 Black Tabby Games. All Rights Reserved.', + '"SLAY THE PRINCESS" - Canadian Trademark App: 2351515', + 'SLAY THE PRINCESS LOGO - Canadian Trademark App: 2351516', + '"BLACK TABBY GAMES" - Canadian Trademark App: 2351514' + }, + art = 'collab_STP' + }, + ['Among Us'] = { + artist = nil, + ml_text = { + 'Among Us © 2024 Innersloth LLC. All Rights Reserved.' + }, + art = 'collab_AU' + }, + ['The Binding of Isaac'] = { + artist = 'Neato', + artist_link = 'twitch.tv/neato', + ml_text = { + 'The Binding of Isaac is copyright McMillen Games, Inc.', + 'All Rights Reserved' + }, + art = 'collab_TBoI' + }, + ['Cult of the Lamb'] = { + artist = nil, + ml_text = { + 'Cult of the Lamb © 2024 Massive Monster All Rights Reserved' + }, + art = 'collab_CL' + }, + ['Divinity Original Sin 2'] = { + artist = nil, + ml_text = { + '©2024 Larian Studios. Larian Studios, Divinity, Divinity: Original Sin', + 'and the Larian Studios logo are registered trademarks of Larian Studios', + 'Games Limited affiliates. All rights reserved.' + }, + art = 'collab_D2' + }, + ['Critical Role'] = { + artist = 'Grace Berrios', + artist_link = '@lassflores', + ml_text = { + '2025 © Gilmore’s Glorious Goods LLC. All Rights Reserved.', + 'Critical Role, Vox Machina, Mighty Nein, Bells Hells, character names,', + 'associated logos and images are all trademarks of Critical Role LLC."' + }, + art = 'collab_CR' + }, + ['Bugsnax'] = { + artist = 'Neato', + artist_link = 'twitch.tv/neato', + ml_text = { + '© 2025 Bugsnax © Young Horses Inc. All Rights Reserved.' + }, + art = 'collab_BUG' + }, + ['Vampire Survivors'] = { + artist = nil, + ml_text = nil, + art = 'collab_VS' + }, + ['Slay the Spire'] = { + artist = 'Neato', + artist_link = 'twitch.tv/neato', + ml_text = { + 'Slay the Spire ©2024 Mega Crit Games, LLC. All Rights Reserved.' + }, + art = 'collab_STS' + }, + ['Potion Craft'] = { + artist = nil, + ml_text = { + 'Potion Craft © 2024 tinyBuild, LLC. All Rights Reserved.' + }, + art = 'collab_PC' + }, + ['Warframe'] = { + artist = nil, + ml_text = { + 'Warframe ©2024 Digital Extremes Ltd. All rights reserved. Warframe', + 'and the Warframe logo are registered trademarks of Digital Extremes Ltd.' + }, + art = 'collab_WF' + }, + ['Dead By Daylight'] = { + artist = nil, + ml_text = { + '© 2015-2025 and BEHAVIOUR, DEAD BY DAYLIGHT and other related trademarks', + 'and logos belong to Behaviour Interactive Inc. All rights reserved.' + }, + art = 'collab_DBD' + }, + ['Dave the Diver'] = { + artist = nil, + ml_text = { + 'Dave the Diver © Mintrocket. All Rights Reserved.' + }, + art = 'collab_DTD' + }, + ['Stardew Valley'] = { + artist = 'ConcernedApe', + ml_text = { + '"Stardew Valley" is a trademark of ConcernedApe LLC. All Rights Reserved' + }, + art = 'collab_SV' + }, + ['Enter the Gungeon'] = { + artist = nil, + ml_text = { + 'Enter the Gungeon © 2024 Devolver Digital Inc.All Rights Reserved.' + }, + art = 'collab_EG' + }, + ['1000xRESIST'] = { + artist = nil, + ml_text = nil, + art = 'collab_XR' + }, + ['Civilization VII'] = { + artist = nil, + ml_text = { + 'CIVILIZATION Licensed Assets Courtesy of 2K Games, Inc.', + '© 2025 Take-Two Interactive Software, Inc. and its subsidiaries.' + }, + art = 'collab_C7' + }, + ['Rust'] = { + artist = nil, + ml_text = { + 'Rust (c) 2025 Facepunch Studios Ltd. All Rights Reserved.' + }, + art = 'collab_R' + }, + } + + local middle = {n=G.UIT.R, config={align = "cm", minh = 4.8, minw = 12.3}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'CREDITS_check_collab', object = Moveable()}}, + }} + + local collab_options = {} + for k, v in pairs(G.collab_credits) do + collab_options[#collab_options+1] = k + end + + table.sort(collab_options) + + G.viewed_collab = collab_options[1] + + return + {n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.L_BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.2,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + create_option_cycle({options = + collab_options, opt_callback = 'change_viewed_collab', current_option = 1, colour = G.C.RED, w = 4, mid = middle + }) + }} + }} + end, + }, + { + label = "Sounds", + tab_definition_function = function() return + {n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "All sounds not listed here fall under ", scale = text_scale*0.6, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = "Creative Commons - CC0", scale = text_scale*0.6, colour = G.C.BLUE, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = '"chamber_choir_chord_o.wav" (Used for Polychrome sound) by uair01 (https://freesound.org/people/uair01/sounds/65195/)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'is licensed under ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = "Attribution 3.0 License", scale = text_scale*0.5, colour = G.C.GOLD, shadow = true}}, + {n=G.UIT.T, config={text = '. This work has been modified from its original state', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = '"Coffee1.wav" (Used for Tarot card sound) by Nathan Gibson (https://nathangibson.myportfolio.com)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'is licensed under ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = "Attribution 4.0 License", scale = text_scale*0.5, colour = G.C.ORANGE, shadow = true}}, + {n=G.UIT.T, config={text = '.', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = '"Wood Block1.wav" (Used for Tarot card sound) by Nathan Gibson (https://nathangibson.myportfolio.com)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'is licensed under ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = "Attribution 4.0 License", scale = text_scale*0.5, colour = G.C.ORANGE, shadow = true}}, + {n=G.UIT.T, config={text = '.', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = '"Toy records#06-E3-02.wav" (Used for Mult sounds) by poissonmort (https://freesound.org/people/poissonmort/sounds/253249/)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'is licensed under ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = "Attribution 4.0 License", scale = text_scale*0.5, colour = G.C.ORANGE, shadow = true}}, + {n=G.UIT.T, config={text = '. This work has been modified from its original state', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + }} + end, + }, + { + label = "Imagery", + tab_definition_function = function() return + {n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'The font "m6x11.ttf" by Daniel Linssen (https://managore.itch.io/m6x11)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'is licensed under an ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = "Attribution License", scale = text_scale*0.5, colour = G.C.GOLD, shadow = true}}, + {n=G.UIT.T, config={text = '.', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + not G.F_BASIC_CREDITS and + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Check out his itch.io profile, he has made an incredible catalogue of games.', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }} or nil, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'The Joker "Vagabond" was created by Lumpy Touch', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'The Collab art for Slay the Spire and The Binding of Isaac was', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'created by ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = "Neato", scale = text_scale*0.5, colour = G.C.GOLD, shadow = true}}, + {n=G.UIT.T, config={text = ' (twitch.tv/neato)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "All sprites, shaders, and any other visual assets", scale = text_scale*0.6, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "not listed here were created by LocalThunk.", scale = text_scale*0.6, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "©2024 - All rights reserved", scale = text_scale*0.6, colour = G.C.BLUE, shadow = true}}, + }}, + }} + end, + }, + { + label = "Misc", + tab_definition_function = function() return + {n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 6}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "For Marshal", scale = text_scale*0.6, colour = G.C.WHITE, shadow = true}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Special Thanks", scale = text_scale*0.6, colour = G.C.GREEN, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "tl", padding = 0.05, minw = 2.5}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Nicole', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Josh', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Jeremy', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Dylan', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Justin', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Daniel', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Colby', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Thomas', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Mom & Dad', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Luc & Donna', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + {n=G.UIT.C, config={align = "tl", padding = 0.05, minw = 2.5}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'GothicLordUK', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Big Simple', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'MALF', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Northernlion', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Purple Moss Collectors', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Dan Gheesling', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Fabian Fischer', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'newobject', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'MurphyObv', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={ + {n=G.UIT.T, config={text = 'Love2D', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + }}, + }}, + }} + }} + end, + }, + }, + snap_to_nav = true}), + }} + }}) + return t +end + +function G.UIDEF.challenges(from_game_over) + + if G.PROFILES[G.SETTINGS.profile].all_unlocked then G.PROFILES[G.SETTINGS.profile].challenges_unlocked = #G.CHALLENGES end + + if not G.PROFILES[G.SETTINGS.profile].challenges_unlocked then + local deck_wins = 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage) do + if v.wins and v.wins[1] then + deck_wins = deck_wins + 1 + end + end + local loc_nodes = {} + localize{type = 'descriptions', key = 'challenge_locked', set = 'Other', nodes = loc_nodes, vars = {G.CHALLENGE_WINS, deck_wins}, default_col = G.C.WHITE} + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.1, colour = G.C.CLEAR, minh = 8.02, minw = 7}, nodes={ + transparent_multiline_text(loc_nodes) + }} + end + + G.run_setup_seed = nil + if G.OVERLAY_MENU then + local seed_toggle = G.OVERLAY_MENU:get_UIE_by_ID('run_setup_seed') + if seed_toggle then seed_toggle.states.visible = false end + end + + + local _ch_comp, _ch_tot = 0,#G.CHALLENGES + for k, v in ipairs(G.CHALLENGES) do + if v.id and G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or ''] then + _ch_comp = _ch_comp + 1 + end + end + + local _ch_tab = {comp = _ch_comp, unlocked = G.PROFILES[G.SETTINGS.profile].challenges_unlocked} + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.1, colour = G.C.CLEAR, minh = 8, minw = 7}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1 ,colour = G.C.BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = localize('k_challenge_mode'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minw = 8.5, minh = 1.5, padding = 0.2}, nodes={ + UIBox_button({id = from_game_over and 'from_game_over' or nil, label = {localize('b_new_challenge')}, button = 'challenge_list', minw = 4, scale = 0.4, minh = 0.6}), + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.8, r = 0.1, minw = 4.5, colour = G.C.L_BLACK, emboss = 0.05, + progress_bar = { + max = _ch_tot, ref_table = _ch_tab, ref_value = 'unlocked', empty_col = G.C.L_BLACK, filled_col = G.C.FILTER + }}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 4.5}, nodes={ + {n=G.UIT.T, config={text = localize{type = 'variable', key = 'unlocked', vars = {_ch_tab.unlocked, _ch_tot}}, scale = 0.3, colour = G.C.WHITE, shadow =true}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.8, r = 0.1, minw = 4.5, colour = G.C.L_BLACK, emboss = 0.05, + progress_bar = { + max = _ch_tot, ref_table = _ch_tab, ref_value = 'comp', empty_col = G.C.L_BLACK, filled_col = adjust_alpha(G.C.GREEN, 0.5) + }}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 4.5}, nodes={ + {n=G.UIT.T, config={text = localize{type = 'variable', key = 'completed', vars = {_ch_comp, _ch_tot}}, scale = 0.3, colour = G.C.WHITE, shadow = true}}, + }}, + }}, + }}, + G.F_DAILIES and {n=G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1 ,colour = G.C.BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = localize('k_daily_run'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cl", minw = 8.5, minh = 4}, nodes={ + G.UIDEF.daily_overview() + }} + }} or nil, + }} +end + +function G.UIDEF.daily_overview() + local hist_height, hist_width = 3, 3 + + local daily_results = { + score = { + me = {val = 20000, percentile = 75}, + hist = { + 0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.15,0.1,0.1,0.05,0.05,0.05,0.05,0.05 + } + } + } + local score_hist, max_score_hist = {}, 0 + for k, v in ipairs(daily_results.score.hist) do if max_score_hist < v then max_score_hist = v end end + for k, v in ipairs(daily_results.score.hist) do + score_hist[#score_hist+1] = {n=G.UIT.C, config={align = 'bm'}, nodes ={{n=G.UIT.C, config={colour = G.C.BLUE, minw = hist_width/#daily_results.score.hist, minh = (v + 0.05*math.random())/max_score_hist*hist_height}}}} + end + + return {n=G.UIT.R, config={align = "cm"}, nodes=score_hist} +end + +function G.UIDEF.run_setup(from_game_over) + G.run_setup_seed = nil + local _challenge_chosen = from_game_over == 'challenge_list' + from_game_over = from_game_over and not (from_game_over == 'challenge_list') + + local _can_continue = G.MAIN_MENU_UI and G.FUNCS.can_continue({config = {func = true}}) + G.FUNCS.false_ret = function() return false end + local t = create_UIBox_generic_options({no_back = from_game_over, no_esc = from_game_over, contents ={ + {n=G.UIT.R, config={align = "cm", padding = 0, draw_layer = 1}, nodes={ + create_tabs( + {tabs = { + { + label = localize('b_new_run'), + chosen = (not _challenge_chosen) and (not _can_continue), + tab_definition_function = G.UIDEF.run_setup_option, + tab_definition_function_args = 'New Run' + }, + G.STAGE == G.STAGES.MAIN_MENU and { + label = localize('b_continue'), + chosen = (not _challenge_chosen) and _can_continue, + tab_definition_function = G.UIDEF.run_setup_option, + tab_definition_function_args = 'Continue', + func = 'can_continue' + } or { + label = localize('b_challenges'), + tab_definition_function = G.UIDEF.challenges, + tab_definition_function_args = from_game_over, + chosen = _challenge_chosen + }, + G.STAGE == G.STAGES.MAIN_MENU and { + label = localize('b_challenges'), + tab_definition_function = G.UIDEF.challenges, + tab_definition_function_args = from_game_over, + chosen = _challenge_chosen + } or nil, + }, + snap_to_nav = true}), + }}, + }}) + return t +end + +function G.UIDEF.profile_select() + G.focused_profile = G.focused_profile or G.SETTINGS.profile or 1 + + local t = create_UIBox_generic_options({padding = 0,contents ={ + {n=G.UIT.R, config={align = "cm", padding = 0, draw_layer = 1, minw = 4}, nodes={ + create_tabs( + {tabs = { + { + label = 1, + chosen = G.focused_profile == 1, + tab_definition_function = G.UIDEF.profile_option, + tab_definition_function_args = 1 + }, + { + label = 2, + chosen = G.focused_profile == 2, + tab_definition_function = G.UIDEF.profile_option, + tab_definition_function_args = 2 + }, + { + label = 3, + chosen = G.focused_profile == 3, + tab_definition_function = G.UIDEF.profile_option, + tab_definition_function_args = 3 + } + }, + snap_to_nav = true}), + }}, + }}) + return t +end + +function G.UIDEF.profile_option(_profile) + set_discover_tallies() + G.focused_profile = _profile + local profile_data = get_compressed(G.focused_profile..'/'..'profile.jkr') + if profile_data ~= nil then + profile_data = STR_UNPACK(profile_data) + profile_data.name = profile_data.name or ("P".._profile) + end + G.PROFILES[_profile].name = profile_data and profile_data.name or '' + + local lwidth, rwidth, scale = 1, 1, 1 + G.CHECK_PROFILE_DATA = nil + local t = {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = 'cm',padding = 0.1, minh = 0.8}, nodes={ + ((_profile == G.SETTINGS.profile) or not profile_data) and {n=G.UIT.R, config={align = "cm"}, nodes={ + create_text_input({ + w = 4, max_length = 16, prompt_text = localize('k_enter_name'), + ref_table = G.PROFILES[_profile], ref_value = 'name',extended_corpus = true, keyboard_offset = 1, + callback = function() + G:save_settings() + G.FILE_HANDLER.force = true + end + }), + }} or {n=G.UIT.R, config={align = 'cm',padding = 0.1, minw = 4, r = 0.1, colour = G.C.BLACK, minh = 0.6}, nodes={ + {n=G.UIT.T, config={text = G.PROFILES[_profile].name, scale = 0.45, colour = G.C.WHITE}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 6}, nodes={ + (G.PROFILES[_profile].progress and G.PROFILES[_profile].progress.discovered) and create_progress_box(G.PROFILES[_profile].progress, 0.5) or + {n=G.UIT.C, config={align = "cm", minh = 4, minw = 5.2, colour = G.C.BLACK, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = localize('k_empty_caps'), scale = 0.5, colour = G.C.UI.TRANSPARENT_LIGHT}} + }}, + }}, + {n=G.UIT.C, config={align = "cm", minh = 4}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 1}, nodes={ + profile_data and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_wins'),colour = G.C.UI.TEXT_LIGHT, scale = scale*0.7}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_LIGHT, scale = scale*0.7}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth}, nodes={{n=G.UIT.T, config={text = tostring(profile_data.career_stats.c_wins),colour = G.C.RED, shadow = true, scale = 1*scale}}}} + }} or nil, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.R, config={align = "cm", minw = 4, maxw = 4, minh = 0.8, padding = 0.2, r = 0.1, hover = true, colour = G.C.BLUE,func = 'can_load_profile', button = "load_profile", shadow = true, focus_args = {nav = 'wide'}}, nodes={ + {n=G.UIT.T, config={text = _profile == G.SETTINGS.profile and localize('b_current_profile') or profile_data and localize('b_load_profile') or localize('b_create_profile'), ref_value = 'load_button_text', scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0, minh = 0.7}, nodes={ + {n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.6, padding = 0.2, r = 0.1, hover = true, colour = G.C.RED,func = 'can_delete_profile', button = "delete_profile", shadow = true, focus_args = {nav = 'wide'}}, nodes={ + {n=G.UIT.T, config={text = _profile == G.SETTINGS.profile and localize('b_reset_profile') or localize('b_delete_profile'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + (_profile == G.SETTINGS.profile and not G.PROFILES[G.SETTINGS.profile].all_unlocked) and {n=G.UIT.R, config={align = "cm", padding = 0, minh = 0.7}, nodes={ + {n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.6, padding = 0.2, r = 0.1, hover = true, colour = G.C.ORANGE,func = 'can_unlock_all', button = "unlock_all", shadow = true, focus_args = {nav = 'wide'}}, nodes={ + {n=G.UIT.T, config={text = localize('b_unlock_all'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} + }} + }} or {n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.7}, nodes={ + G.PROFILES[_profile].all_unlocked and ((not G.F_NO_ACHIEVEMENTS) and {n=G.UIT.T, config={text = localize(G.F_TROPHIES and 'k_trophies_disabled' or 'k_achievements_disabled'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} or + nil) or nil + }}, + }}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={id = 'warning_text', text = localize('ph_click_confirm'), scale = 0.4, colour = G.C.CLEAR}} + }} + }} + return t +end + +function G.UIDEF.stake_description(_stake) + local _stake_center = G.P_CENTER_POOLS.Stake[_stake] + local ret_nodes = {} + if _stake_center then localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = ret_nodes} end + + local desc_t = {} + for k, v in ipairs(ret_nodes) do + desc_t[#desc_t+1] = {n=G.UIT.R, config={align = "cm", maxw = 5.3}, nodes=v} + end + + return {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize{type = 'name_text', key = _stake_center.key, set = _stake_center.set}, scale = 0.35, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.03, colour = G.C.WHITE, r = 0.1, minh = 1, minw = 5.5}, nodes=desc_t} + }} +end + +function G.UIDEF.stake_option(_type) + local middle = {n=G.UIT.R, config={align = "cm", minh = 1.7, minw = 7.3}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake2', object = Moveable()}}, + }} + + local max_stake = get_deck_win_stake(G.GAME.viewed_back.effect.center.key) + if G.PROFILES[G.SETTINGS.profile].all_unlocked then max_stake = 8 end + local stake_options = {} + for i = 1, math.min(max_stake+1, 8) do + stake_options[i] = i + end + + return {n=G.UIT.ROOT, config={align = "tm", colour = G.C.CLEAR, minh = 2.03, minw = 8.3}, nodes={_type == 'Continue' and middle or create_option_cycle({options = + stake_options, + opt_callback = 'change_stake', current_option = G.viewed_stake, colour = G.C.RED, w = 6, mid = middle + }) +}} +end + +function G.UIDEF.viewed_stake_option() + G.viewed_stake = G.viewed_stake or 1 + local max_stake = get_deck_win_stake(G.GAME.viewed_back.effect.center.key) + if G.PROFILES[G.SETTINGS.profile].all_unlocked then max_stake = 8 end + + G.viewed_stake = math.min(max_stake+1, G.viewed_stake) + if _type ~= 'Continue' then G.PROFILES[G.SETTINGS.profile].MEMORY.stake = G.viewed_stake end + + local stake_sprite = get_stake_sprite(G.viewed_stake) + + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, r = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('k_stake'), scale = 0.4, colour = G.C.L_BLACK, vert = true}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}}, + }}, + G.UIDEF.stake_description(G.viewed_stake) + }} + }} +end + +function G.UIDEF.challenge_list(from_game_over) + G.CHALLENGE_PAGE_SIZE = 10 + local challenge_pages = {} + for i = 1, math.ceil(#G.CHALLENGES/G.CHALLENGE_PAGE_SIZE) do + table.insert(challenge_pages, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.CHALLENGES/G.CHALLENGE_PAGE_SIZE))) + end + G.E_MANAGER:add_event(Event({func = (function() + G.FUNCS.change_challenge_list_page{cycle_config = {current_option = 1}} + return true end)})) + + local _ch_comp, _ch_tot = 0,#G.CHALLENGES + for k, v in ipairs(G.CHALLENGES) do + if v.id and G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or ''] then + _ch_comp = _ch_comp + 1 + end + end + + local t = create_UIBox_generic_options({ back_id = from_game_over and 'from_game_over' or nil, back_func = 'setup_run', back_id = 'challenge_list', contents = { + {n=G.UIT.C, config={align = "cm", padding = 0.0}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minh = 7, minw = 4.2}, nodes={ + {n=G.UIT.O, config={id = 'challenge_list', object = Moveable()}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + create_option_cycle({id = 'challenge_page',scale = 0.9, h = 0.3, w = 3.5, options = challenge_pages, cycle_shoulders = true, opt_callback = 'change_challenge_list_page', current_option = 1, colour = G.C.RED, no_pips = true, focus_args = {snap_to = true}}) + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = localize{type = 'variable', key = 'challenges_completed', vars = {_ch_comp, _ch_tot}}, scale = 0.4, colour = G.C.WHITE}}, + }}, + + }}, + {n=G.UIT.C, config={align = "cm", minh = 9, minw = 11.5}, nodes={ + {n=G.UIT.O, config={id = 'challenge_area', object = Moveable()}}, + }}, + }}) + return t +end + +function G.UIDEF.challenge_list_page(_page) + local snapped = false + local challenge_list = {} + for k, v in ipairs(G.CHALLENGES) do + if k > G.CHALLENGE_PAGE_SIZE*(_page or 0) and k <= G.CHALLENGE_PAGE_SIZE*((_page or 0) + 1) then + if G.CONTROLLER.focused.target and G.CONTROLLER.focused.target.config.id == 'challenge_page' then snapped = true end + local challenge_completed = G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or ''] + local challenge_unlocked = G.PROFILES[G.SETTINGS.profile].challenges_unlocked and (G.PROFILES[G.SETTINGS.profile].challenges_unlocked >= k) + + challenge_list[#challenge_list+1] = + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = 'cl', minw = 0.8}, nodes = { + {n=G.UIT.T, config={text = k..'', scale = 0.4, colour = G.C.WHITE}}, + }}, + UIBox_button({id = k, col = true, label = {challenge_unlocked and localize(v.id, 'challenge_names') or localize('k_locked'),}, button = challenge_unlocked and 'change_challenge_description' or 'nil', colour = challenge_unlocked and G.C.RED or G.C.GREY, minw = 4, scale = 0.4, minh = 0.6, focus_args = {snap_to = not snapped}}), + {n=G.UIT.C, config={align = 'cm', padding = 0.05, minw = 0.6}, nodes = { + {n=G.UIT.C, config={minh = 0.4, minw = 0.4, emboss = 0.05, r = 0.1, colour = challenge_completed and G.C.GREEN or G.C.BLACK}, nodes = { + challenge_completed and {n=G.UIT.O, config={object = Sprite(0,0,0.4,0.4, G.ASSET_ATLAS["icons"], {x=1, y=0})}} or nil + }}, + }}, + }} + snapped = true + end + end + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.1, colour = G.C.CLEAR}, nodes=challenge_list} +end + +function G.UIDEF.challenge_description(_id, daily, is_row) + local challenge = G.CHALLENGES[_id] + if not challenge then return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, minh = 8.82, minw = 11.5, r = 0.1}, nodes={{n=G.UIT.T, config={text = localize('ph_select_challenge'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}}}} end + + local joker_size = 0.6 + local jokers = CardArea(0,0, + 10*joker_size, + 0.6*G.CARD_H, + {card_limit = get_challenge_rule(challenge, 'modifiers', 'joker_limit') or 5, + card_w = joker_size*G.CARD_W, type = 'title_2', highlight_limit = 0}) + + if challenge.jokers then + for k, v in ipairs(challenge.jokers) do + local card = Card(0,0, G.CARD_W*joker_size, G.CARD_H*joker_size, nil, G.P_CENTERS[v.id], {bypass_discovery_center = true,bypass_discovery_ui = true, bypass_lock=true}) + if v.edition then card:set_edition({[v.edition] = true}, true, true) end + if v.eternal then card:set_eternal(true) end + if v.pinned then card.pinned = true end + jokers:emplace(card) + end + end + + local joker_col = {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK, r = 0.1, maxh = 1.8}, nodes={ + {n=G.UIT.T, config={text = localize('k_jokers_cap'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, vert = true, shadow = true}}, + {n=G.UIT.C, config={align = "cm", minh = 0.6*G.CARD_H, minw = 5, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + jokers and {n=G.UIT.O, config={object = jokers}} or {n=G.UIT.T, config={text = localize('k_none'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }} + + local consumeables = CardArea(0,0, + 3*joker_size, + 0.6*G.CARD_H, + {card_limit = get_challenge_rule(challenge, 'modifiers', 'consumable_limit') or 2, + card_w = joker_size*G.CARD_W, type = 'title_2', spread = true, highlight_limit = 0}) + + if challenge.consumeables then + for k, v in ipairs(challenge.consumeables) do + local card = Card(0,0, G.CARD_W*joker_size, G.CARD_H*joker_size, nil, G.P_CENTERS[v.id], {bypass_discovery_center = true,bypass_discovery_ui = true, bypass_lock=true}) + if v.edition then card:set_edition({[v.edition] = true}, true, true) end + if v.eternal then card:set_eternal(true) end + consumeables:emplace(card) + end + end + + local consumable_col = {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK, r = 0.1, maxh = 1.8}, nodes={ + {n=G.UIT.T, config={text = localize('k_cap_consumables'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT, vert = true, shadow = true}}, + {n=G.UIT.C, config={align = "cm", minh = 0.6*G.CARD_H, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + consumeables and {n=G.UIT.O, config={object = consumeables}} or {n=G.UIT.T, config={text = localize('k_none'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}}, + }} + }} + + local vouchers = CardArea(0,0, + 3*joker_size, + 0.6*G.CARD_H, + {card_limit = nil, + card_w = joker_size*G.CARD_W, type = 'title_2', spread = true, highlight_limit = 0}) + + if challenge.vouchers then + for k, v in ipairs(challenge.vouchers) do + local card = Card(0,0, G.CARD_W*joker_size, G.CARD_H*joker_size, nil, G.P_CENTERS[v.id], {bypass_discovery_center = true,bypass_discovery_ui = true, bypass_lock=true}) + if v.edition then card:set_edition({[v.edition] = true}, true, true) end + if v.eternal then card:set_eternal(true) end + vouchers:emplace(card) + end + end + + local voucher_col = {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK, r = 0.1, maxh = 1.8}, nodes={ + {n=G.UIT.T, config={text = localize('k_vouchers_cap'), scale = 0.33, colour = G.C.UI.TEXT_LIGHT, vert = true, shadow = true}}, + {n=G.UIT.C, config={align = "cm", minh = 0.6*G.CARD_H, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + vouchers and {n=G.UIT.O, config={object = vouchers}} or {n=G.UIT.T, config={text = localize('k_none'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}}, + }} + }} + + + + return {n=is_row and G.UIT.R or G.UIT.ROOT, config={align = "cm", r = 0.1, colour = G.C.BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + joker_col, consumable_col, voucher_col + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_tabs( + {tabs = { + { + label = localize('b_rules'), + chosen = true, + tab_definition_function = G.UIDEF.challenge_description_tab, + tab_definition_function_args = {_id = _id, _tab = 'Rules'} + }, + { + label = localize('b_restrictions'), + tab_definition_function = G.UIDEF.challenge_description_tab, + tab_definition_function_args = {_id = _id, _tab = 'Restrictions'} + }, + { + label = localize('b_deck'), + tab_definition_function = G.UIDEF.challenge_description_tab, + tab_definition_function_args = {_id = _id, _tab = 'Deck'} + } + }, + tab_h = 5, + padding = 0, + text_scale = 0.36, + scale = 0.85, + no_shoulders = true, + no_loop = true} + )}}, + not is_row and {n=G.UIT.R, config={align = "cm", minh = 0.9}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minh = 0.7, minw = 9, r = 0.1, hover = true, colour = G.C.BLUE, button = "start_challenge_run", shadow = true, id = _id}, nodes={ + {n=G.UIT.T, config={text = localize('b_play_cap'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT,func = 'set_button_pip', focus_args = {button = 'x',set_button_pip = true}}} + }} + }} or nil, + }} +end + +function G.UIDEF.challenge_description_tab(args) + args = args or {} + if args._tab == 'Rules' then + local challenge = G.CHALLENGES[args._id] + local start_rules = {} + local modded_starts = nil + local game_rules = {} + local starting_params = get_starting_params() + local base_modifiers = { + dollars = {value = starting_params.dollars, order = 6}, + discards = {value = starting_params.discards, order = 2}, + hands = {value = starting_params.hands, order = 1}, + reroll_cost = {value = starting_params.reroll_cost, order = 7}, + joker_slots = {value = starting_params.joker_slots, order = 4}, + consumable_slots = {value = starting_params.consumable_slots, order = 5}, + hand_size = {value = starting_params.hand_size, order = 3}, + } + local bonus_mods = 100 + if challenge.rules then + if challenge.rules.modifiers then + for k, v in ipairs(challenge.rules.modifiers) do + base_modifiers[v.id] = {value = v.value, order = base_modifiers[v.id] and base_modifiers[v.id].order or bonus_mods, custom = true, old_val = base_modifiers[v.id].value} + bonus_mods = bonus_mods + 1 + end + end + end + local nu_base_modifiers = {} + for k, v in pairs(base_modifiers) do + v.key = k + nu_base_modifiers[#nu_base_modifiers+1] = v + end + table.sort(nu_base_modifiers, function(a,b) return a.order < b.order end) + for k, v in ipairs(nu_base_modifiers) do + if v.old_val then + modded_starts = modded_starts or {} + modded_starts[#modded_starts+1] = {n=G.UIT.R, config={align = "cl", maxw = 3.5}, nodes= localize{type = 'text', key = 'ch_m_'..v.key, vars = {v.value}, default_col = G.C.L_BLACK}} + + else + start_rules[#start_rules+1] = {n=G.UIT.R, config={align = "cl", maxw =3.5}, nodes= localize{type = 'text', key = 'ch_m_'..v.key, vars = {v.value}, default_col = not v.custom and G.C.UI.TEXT_INACTIVE or nil}} + end + end + + if modded_starts then + start_rules = { + modded_starts and {n=G.UIT.R, config={align = "cl", padding = 0.05}, nodes=modded_starts} or nil, + {n=G.UIT.R, config={align = "cl", padding = 0.05, colour = G.C.GREY}, nodes={}}, + {n=G.UIT.R, config={align = "cl", padding = 0.05}, nodes=start_rules}, + } + end + + if challenge.rules then + if challenge.rules.custom then + for k, v in ipairs(challenge.rules.custom) do + game_rules[#game_rules+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_'..v.id, vars = {v.value}}} + end + end + end + if (not start_rules[1]) and (not modded_starts) then start_rules[#start_rules+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_m_none', vars = {}}} end + if not game_rules[1] then game_rules[#game_rules+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end + + local starting_rule_list = {n=G.UIT.C, config={align = "cm", minw = 3, r = 0.1, colour = G.C.BLUE}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6}, nodes={ + {n=G.UIT.T, config={text = localize('k_game_modifiers'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 4.2, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= start_rules} + }} + + local override_rule_list = {n=G.UIT.C, config={align = "cm", minw = 3, r = 0.1, colour = G.C.BLUE}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6}, nodes={ + {n=G.UIT.T, config={text = localize('k_custom_rules'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 6.8, maxw = 6.7, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= game_rules} + }} + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1, colour = G.C.L_BLACK, r = 0.1, minw = 3}, nodes={ + override_rule_list,starting_rule_list + }} + }} + elseif args._tab == 'Restrictions' then + local challenge = G.CHALLENGES[args._id] + + local banned_cards, banned_tags, banned_other = {}, {}, {} + + if challenge.restrictions then + if challenge.restrictions.banned_cards then + local row_cards = {} + local n_rows = math.max(1, math.floor(#challenge.restrictions.banned_cards/10) + 2 - math.floor(math.log(6, #challenge.restrictions.banned_cards))) + local max_width = 1 + for k, v in ipairs(challenge.restrictions.banned_cards) do + local _row = math.floor((k-1)*n_rows/(#challenge.restrictions.banned_cards)+1) + row_cards[_row] = row_cards[_row] or {} + row_cards[_row][#row_cards[_row]+1] = v + if #row_cards[_row] > max_width then max_width = #row_cards[_row] end + end + + local card_size = math.max(0.3, 0.75 - 0.01*(max_width*n_rows)) + + for _, row_card in ipairs(row_cards) do + local banned_card_area = CardArea( + 0,0, + 6.7, + 3.3/n_rows, + {card_limit = nil, type = 'title_2', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*card_size}) + table.insert(banned_cards, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = banned_card_area}} + }} + ) + for k, v in ipairs(row_card) do + local card = Card(0,0, G.CARD_W*card_size, G.CARD_H*card_size, nil, G.P_CENTERS[v.id], {bypass_discovery_center = true,bypass_discovery_ui = true}) + banned_card_area:emplace(card) + end + end + end + if challenge.restrictions.banned_tags then + local tag_tab = {} + for k, v in pairs(challenge.restrictions.banned_tags) do + tag_tab[#tag_tab+1] = G.P_TAGS[v.id] + end + + table.sort(tag_tab, function (a, b) return a.order < b.order end) + + for k, v in ipairs(tag_tab) do + local temp_tag = Tag(v.key) + local temp_tag_ui = temp_tag:generate_UI(1.1 - 0.25*(math.sqrt(#challenge.restrictions.banned_tags))) + table.insert(banned_tags, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + temp_tag_ui + }} + ) + end + end + if challenge.restrictions.banned_other then + local other_tab = {} + for k, v in pairs(challenge.restrictions.banned_other) do + if v.type == 'blind' then + other_tab[#other_tab+1] = G.P_BLINDS[v.id] + end + end + + table.sort(other_tab, function (a, b) return a.order < b.order end) + + for k, v in ipairs(other_tab) do + local temp_blind = AnimatedSprite(0,0,1,1, G.ANIMATION_ATLAS['blind_chips'], v.pos) + temp_blind:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + temp_blind.float = true + temp_blind.states.hover.can = true + temp_blind.states.drag.can = false + temp_blind.states.collide.can = true + temp_blind.config = {blind = v, force_focus = true} + temp_blind.hover = function() + if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then + if not temp_blind.hovering and temp_blind.states.visible then + temp_blind.hovering = true + temp_blind.hover_tilt = 3 + temp_blind:juice_up(0.05, 0.02) + play_sound('chips1', math.random()*0.1 + 0.55, 0.12) + temp_blind.config.h_popup = create_UIBox_blind_popup(v, true) + temp_blind.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = temp_blind} + Node.hover(temp_blind) + end + end + end + temp_blind.stop_hover = function() temp_blind.hovering = false; Node.stop_hover(temp_blind); temp_blind.hover_tilt = 0 end + + table.insert(banned_other, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = temp_blind}} + }} + ) + end + end + end + if not banned_cards[1] then banned_cards[#banned_cards+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_m_none', vars = {}}} end + if not banned_tags[1] then banned_tags[#banned_tags+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end + if not banned_other[1] then banned_other[#banned_other+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end + + local banned_cards = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6}, nodes={ + {n=G.UIT.T, config={text = localize('k_banned_cards'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 4.1, minw =7.33, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= + banned_cards + } + }} + + local banned_tags = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6, maxw = 1.48}, nodes={ + {n=G.UIT.T, config={text = localize('k_banned_tags'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 1.48, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= + banned_tags} + }} + + local banned_other = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6, maxw = 1.84}, nodes={ + {n=G.UIT.T, config={text = localize('k_other'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 2, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= + banned_other} + }} + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1, colour = G.C.L_BLACK, r = 0.1}, nodes={ + banned_cards, banned_tags, banned_other + }} + }} + elseif args._tab == 'Deck' then + local challenge = G.CHALLENGES[args._id] + local deck_tables = {} + local SUITS = { + S = {}, + H = {}, + C = {}, + D = {}, + } + local suit_map = {'S', 'H', 'C', 'D'} + local card_protos = nil + local _de = nil + if challenge then + _de = challenge.deck + end + + if _de and _de.cards then + card_protos = _de.cards + end + + if not card_protos then + card_protos = {} + for k, v in pairs(G.P_CARDS) do + local _r, _s = string.sub(k, 3, 3), string.sub(k, 1, 1) + local keep, _e, _d, _g = true, nil, nil, nil + if _de then + if _de.yes_ranks and not _de.yes_ranks[_r] then keep = false end + if _de.no_ranks and _de.no_ranks[_r] then keep = false end + if _de.yes_suits and not _de.yes_suits[_s] then keep = false end + if _de.no_suits and _de.no_suits[_s] then keep = false end + if _de.enhancement then _e = _de.enhancement end + if _de.edition then _d = _de.edition end + if _de.seal then _g = _de.seal end + end + + if keep then card_protos[#card_protos+1] = {s=_s,r=_r,e=_e,d=_d,g=_g} end + end + end + for k, v in ipairs(card_protos) do + local _card = Card(0,0, G.CARD_W*0.45, G.CARD_H*0.45, G.P_CARDS[v.s..'_'..v.r], G.P_CENTERS[v.e or 'c_base']) + if v.d then _card:set_edition({[v.d] = true}, true, true) end + if v.g then _card:set_seal(v.g, true, true) end + SUITS[v.s][#SUITS[v.s]+1] = _card + end + + for j = 1, 4 do + if SUITS[suit_map[j]][1] then + table.sort(SUITS[suit_map[j]], function(a,b) return a:get_nominal() > b:get_nominal() end ) + local view_deck = CardArea( + 0,0, + 5.5*G.CARD_W, + 0.42*G.CARD_H, + {card_limit = #SUITS[suit_map[j]], type = 'title_2', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.5, draw_layers = {'card'}}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = view_deck}} + }} + ) + + for i = 1, #SUITS[suit_map[j]] do + if SUITS[suit_map[j]][i] then + view_deck:emplace(SUITS[suit_map[j]][i]) + end + end + end + end + return {n=G.UIT.ROOT, config={align = "cm", padding = 0, colour = G.C.BLACK, r = 0.1, minw = 11.4, minh = 4.2}, nodes=deck_tables} + end +end + +function G.UIDEF.run_setup_option(type) + if not G.SAVED_GAME then + G.SAVED_GAME = get_compressed(G.SETTINGS.profile..'/'..'save.jkr') + if G.SAVED_GAME ~= nil then G.SAVED_GAME = STR_UNPACK(G.SAVED_GAME) end + end + + G.SETTINGS.current_setup = type + G.GAME.viewed_back = Back(get_deck_from_name(G.PROFILES[G.SETTINGS.profile].MEMORY.deck)) + + G.PROFILES[G.SETTINGS.profile].MEMORY.stake = G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1 + + if type == 'Continue' then + + G.viewed_stake = 1 + if G.SAVED_GAME ~= nil then + saved_game = G.SAVED_GAME + local viewed_deck = 'b_red' + for k, v in pairs(G.P_CENTERS) do + if v.name == saved_game.BACK.name then viewed_deck = k end + end + G.GAME.viewed_back:change_to(G.P_CENTERS[viewed_deck]) + G.viewed_stake = saved_game.GAME.stake or 1 + end + end + + if type == 'New Run' then + if G.OVERLAY_MENU then + local seed_toggle = G.OVERLAY_MENU:get_UIE_by_ID('run_setup_seed') + if seed_toggle then seed_toggle.states.visible = true end + end + G.viewed_stake = G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1 + G.FUNCS.change_stake({to_key = G.viewed_stake}) + else + G.run_setup_seed = nil + if G.OVERLAY_MENU then + local seed_toggle = G.OVERLAY_MENU:get_UIE_by_ID('run_setup_seed') + if seed_toggle then seed_toggle.states.visible = false end + end + end + + local area = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + G.CARD_W, + G.CARD_H, + {card_limit = 5, type = 'deck', highlight_limit = 0, deck_height = 0.75, thin_draw = 1}) + + for i = 1, 10 do + local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W, G.CARD_H, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {playing_card = i, viewed_back = true}) + card.sprite_facing = 'back' + card.facing = 'back' + area:emplace(card) + if i == 10 then G.sticker_card = card; card.sticker = get_deck_win_sticker(G.GAME.viewed_back.effect.center) end + end + + local ordered_names, viewed_deck = {}, 1 + for k, v in ipairs(G.P_CENTER_POOLS.Back) do + ordered_names[#ordered_names+1] = v.name + if v.name == G.GAME.viewed_back.name then viewed_deck = k end + end + + local lwidth, rwidth = 1.4, 1.8 + + local type_colour = G.C.BLUE + + local scale = 0.39 + G.setup_seed = '' + + local t = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, minh = 6.6, minw = 6}, nodes={ + type == 'Continue' and {n=G.UIT.R, config={align = "tm", minh = 3.8, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 3.3, minw = 6.8}, nodes={ + {n=G.UIT.C, config={align = "cm", colour = G.C.BLACK, padding = 0.15, r = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", shadow = false}, nodes={ + {n=G.UIT.O, config={object = area}} + }}, + }},{n=G.UIT.C, config={align = "cm", minw = 4, maxw = 4, minh = 1.7, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}}, + }}, + {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE,padding = 0.03, minh = 1.75, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_round'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.round),colour = G.C.RED, scale = 0.8*scale}}}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_ante'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.round_resets.ante),colour = G.C.BLUE, scale = 0.8*scale}}}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_money'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('$')..tostring(saved_game.GAME.dollars),colour = G.C.ORANGE, scale = 0.8*scale}}}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_best_hand'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = number_format(saved_game.GAME.round_scores.hand.amt),colour = G.C.RED, scale = scale_number(saved_game.GAME.round_scores.hand.amt, 0.8*scale)}}}} + }}, + saved_game.GAME.seeded and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_seed'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.pseudorandom.seed),colour = G.C.RED, scale = 0.8*scale}}}} + }} or nil, + }} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back_stake_column', object = UIBox{definition = G.UIDEF.deck_stake_column(G.GAME.viewed_back.effect.center.key), config = {offset = {x=0,y=0}}}}} + }} + }} + }}}} or + {n=G.UIT.R, config={align = "cm", minh = 3.8}, nodes={ + create_option_cycle({options = ordered_names, opt_callback = 'change_viewed_back', current_option = viewed_deck, colour = G.C.RED, w = 3.5, mid = + {n=G.UIT.R, config={align = "cm", minh = 3.3, minw = 5}, nodes={ + {n=G.UIT.C, config={align = "cm", colour = G.C.BLACK, padding = 0.15, r = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", shadow = false}, nodes={ + {n=G.UIT.O, config={object = area}} + }}, + }},{n=G.UIT.C, config={align = "cm", minh = 1.7, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}}, + }}, + {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, minh = 1.7, r = 0.1}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back', object = UIBox{definition = G.GAME.viewed_back:generate_UI(), config = {offset = {x=0,y=0}}}}} + }} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back_stake_column', object = UIBox{definition = G.UIDEF.deck_stake_column(G.GAME.viewed_back.effect.center.key), config = {offset = {x=0,y=0}}}}} + }} + }} + }} + }) + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + type == 'Continue' and {n=G.UIT.R, config={align = "cm", minh = 2.2, minw = 5}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.17}, nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake', insta_func = true, object = Moveable()}}, + }} + }} + or {n=G.UIT.R, config={align = "cm", minh = 2.2, minw = 6.8}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake', insta_func = true, object = Moveable()}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05, minh = 0.9}, nodes={ + {n=G.UIT.O, config={align = "cm", func = 'toggle_seeded_run', object = Moveable()}, nodes={ + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 2.4, id = 'run_setup_seed'}, nodes={ + type == 'New Run' and create_toggle{col = true, label = localize('k_seeded_run'), label_scale = 0.25, w = 0, scale = 0.7, ref_table = G, ref_value = 'run_setup_seed'} or nil + }}, + {n=G.UIT.C, config={align = "cm", minw = 5, minh = 0.8, padding = 0.2, r = 0.1, hover = true, colour = G.C.BLUE, button = "start_setup_run", shadow = true, func = 'can_start_run'}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_play_cap'), scale = 0.8, colour = G.C.UI.TEXT_LIGHT,func = 'set_button_pip', focus_args = {button = 'x',set_button_pip = true}}} + }} + }}, + {n=G.UIT.C, config={align = "cm", minw = 2.5}, nodes={}} + }} + }} + return t +end + +function create_button_binding_pip(args) + + local button_sprite_map = { + ['a'] = G.F_SWAP_AB_PIPS and 1 or 0, + ['b'] = G.F_SWAP_AB_PIPS and 0 or 1, + ['x'] = 2, + ['y'] = 3, + ['leftshoulder'] = 4, + ['rightshoulder'] = 5, + ['triggerleft'] = 6, + ['triggerright'] = 7, + ['start'] = 8, + ['back'] = 9, + ['dpadup'] = 10, + ['dpadright'] = 11, + ['dpaddown'] = 12, + ['dpadleft'] = 13, + ['left'] = 14, + ['right'] = 15, + ['leftstick'] = 16, + ['rightstick'] = 17, + ['guide'] = 19 + } + local BUTTON_SPRITE = Sprite(0,0,args.scale or 0.45,args.scale or 0.45,G.ASSET_ATLAS["gamepad_ui"], + {x=button_sprite_map[args.button], + y=G.CONTROLLER.GAMEPAD_CONSOLE == 'Nintendo' and 2 or G.CONTROLLER.GAMEPAD_CONSOLE == 'Playstation' and (G.F_PS4_PLAYSTATION_GLYPHS and 3 or 1) or 0}) + + return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.O, config={object = BUTTON_SPRITE}}, + }} +end + +function create_UIBox_profile_button() + + local letters = {} + if G.F_DISP_USERNAME then + for _, c in utf8.chars(G.F_DISP_USERNAME) do + local _char = c + local leng = G.LANGUAGES['all1'].font.FONT:hasGlyphs(c) + letters[#letters+1] = {n=G.UIT.T, config={lang = G.LANGUAGES[leng and 'all1' or 'all2'],text = _char, scale = 0.3, colour = mix_colours(G.C.GREEN, G.C.WHITE, 0.7), shadow = true}} + end + end + + if not G.PROFILES[G.SETTINGS.profile].name then + G.PROFILES[G.SETTINGS.profile].name = "P"..G.SETTINGS.profile + end + + return {n=G.UIT.ROOT, config = {align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('k_profile'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.15, minw = 2, minh = 0.8, maxw = 2, r = 0.1, hover = true, colour = mix_colours(G.C.WHITE, G.C.GREY, 0.2), button = 'profile_select', shadow = true}, nodes={ + {n=G.UIT.T, config={ref_table = G.PROFILES[G.SETTINGS.profile], ref_value = 'name', scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + }} + }}, + G.F_DISP_USERNAME and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('k_playing_as'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.12}, nodes={}}, + {n=G.UIT.R, config={align = "cm", maxw = 2}, nodes=letters} + }} or nil, + }} +end + +function create_UIBox_main_menu_buttons() + local text_scale = 0.45 + local language = nil + if not G.F_ENGLISH_ONLY then + language = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=2, y=0}) + language.states.drag.can = false + end + local discord = nil + local twitter = nil + if G.F_DISCORD then + discord = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=0, y=0}) + discord.states.drag.can = false + twitter = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=0, y=1}) + twitter.states.drag.can = false + end + + local quit_func = 'quit' + + local t = { + n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "bm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK, mid = true}, nodes={ + UIBox_button{id = 'main_menu_play', button = not G.SETTINGS.tutorial_complete and "start_run" or "setup_run", colour = G.C.BLUE, minw = 3.65, minh = 1.55, label = {localize('b_play_cap')}, scale = text_scale*2, col = true}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + UIBox_button{button = 'options', colour = G.C.ORANGE, minw = 2.65, minh = 1.35, label = {localize('b_options_cap')}, scale = text_scale * 1.2, col = true}, + G.F_QUIT_BUTTON and {n=G.UIT.C, config={align = "cm", minw = 0.2}, nodes={}} or nil, + G.F_QUIT_BUTTON and UIBox_button{button = quit_func, colour = G.C.RED, minw = 2.65, minh = 1.35, label = {localize('b_quit_cap')}, scale = text_scale * 1.2, col = true} or nil, + }}, + UIBox_button{id = 'collection_button', button = "your_collection", colour = G.C.PALE_GREEN, minw = 3.65, minh = 1.55, label = {localize('b_collection_cap')}, scale = text_scale*1.5, col = true}, + }}, + }}, + {n=G.UIT.C, config={align = "br", minw = 3.2, padding = 0.1}, nodes={ + G.F_DISCORD and {n=G.UIT.R, config = {align = "cm", padding = 0.2}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, hover = true, colour = mix_colours(G.C.BLUE, G.C.GREY, 0.4), button = 'go_to_discord', shadow = true}, nodes={ + {n=G.UIT.O, config={object = discord}}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, hover = true, colour = G.C.BLACK, button = 'go_to_twitter', shadow = true}, nodes={ + {n=G.UIT.O, config={object = twitter}}, + }} + }} or nil, + not G.F_ENGLISH_ONLY and {n=G.UIT.R, config = {align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.15, minw = 1, r = 0.1, hover = true, colour = mix_colours(G.C.WHITE, G.C.GREY, 0.2), button = 'language_selection', shadow = true}, nodes={ + {n=G.UIT.O, config={object = language}}, + {n=G.UIT.T, config={text = G.LANG.label, scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }} or nil, + }}, + }} + return t +end + +function create_UIBox_main_menu_competittion_name() + G.SETTINGS.COMP.name = '' + local t = { + n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK, mid = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_text_input({ + w = 4, max_length = 16,prompt_text = 'Enter Name', + ref_table = G.SETTINGS.COMP, ref_value = 'name' + }), + }}, + UIBox_button{button = "confirm_contest_name", colour = G.C.PALE_GREEN, minw = 2.65, minh = 1, label = {'Confirm'}, scale = 0.5}, + }}, + }} + return t +end + +function G.UIDEF.language_selector() + local rows = {} + local langs = {} + for k, v in pairs(G.LANGUAGES) do + if not v.omit then + langs[#langs+1] = v + end + end + table.sort(langs, (function(a, b) return a.label < b.label end)) + local _row = {} + for k, v in ipairs(langs) do + if not G.F_HIDE_BETA_LANGS or (not v.beta) then + _row[#_row+1] = {n=G.UIT.C, config={align = "cm", func = 'beta_lang_alert', padding = 0.05, r = 0.1, minh = 0.7, minw = 4.5, button = v.beta and 'warn_lang' or 'change_lang', ref_table = v, colour = v.beta and G.C.RED or G.C.BLUE, hover = true, shadow = true, focus_args = {snap_to = (k == 1)}}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = v.label, lang = v, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }} + end + if _row[3] or (k == #langs) then + rows[#rows+1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=_row} + _row = {} + end + end + + local discord = nil + discord = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=2, y=0}) + discord.states.drag.can = false + + local t = create_UIBox_generic_options({contents ={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes=rows}, + G.F_EXTERNAL_LINKS and {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1, minw = 4, maxw = 4, r = 0.1, minh = 0.8, hover = true, colour = mix_colours(G.C.GREEN, G.C.GREY, 0.4), button = 'loc_survey', shadow = true}, nodes={ + {n=G.UIT.O, config={object = discord}}, + {n=G.UIT.T, config={text = G.LANG.button, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + }} or nil + }}) + return t +end + +function create_UIBox_highlight(rect) + local t = {n=G.UIT.ROOT, config = {align = "cm", minh = rect.T.h+0.1, minw = rect.T.w+0.15, r = 0.15, colour = G.C.DARK_EDITION}, nodes={ + }} +return t +end + +function create_UIBox_generic_options(args) + args = args or {} + local back_func = args.back_func or "exit_overlay_menu" + local contents = args.contents or ({n=G.UIT.T, config={text = "EMPTY",colour = G.C.UI.RED, scale = 0.4}}) + if args.infotip then + G.E_MANAGER:add_event(Event({ + blocking = false, + blockable = false, + timer = 'REAL', + func = function() + if G.OVERLAY_MENU then + local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip') + if _infotip_object then + _infotip_object.config.object:remove() + _infotip_object.config.object = UIBox{ + definition = overlay_infotip(args.infotip), + config = {offset = {x=0,y=0}, align = 'bm', parent = _infotip_object} + } + end + end + return true + end + })) + end + + return {n=G.UIT.ROOT, config = {align = "cm", minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5,padding = 0.1, r = 0.1, colour = args.bg_colour or {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 1,r = 0.3, padding = 0.07, minw = 1, colour = args.outline_colour or G.C.JOKER_GREY, emboss = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.2, minw = 1, colour = args.colour or G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm",padding = args.padding or 0.2, minw = args.minw or 7}, nodes= + contents + }, + not args.no_back and {n=G.UIT.R, config={id = args.back_id or 'overlay_menu_back_button', align = "cm", minw = 2.5, button_delay = args.back_delay, padding =0.1, r = 0.1, hover = true, colour = args.back_colour or G.C.ORANGE, button = back_func, shadow = true, focus_args = {nav = 'wide', button = 'b', snap_to = args.snap_back}}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.T, config={id = args.back_id or nil, text = args.back_label or localize('b_back'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true, func = not args.no_pip and 'set_button_pip' or nil, focus_args = not args.no_pip and {button = args.back_button or 'b'} or nil}} + }} + }} or nil + }}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={id = 'overlay_menu_infotip', object = Moveable()}}, + }}, + }} +end + +function UIBox_dyn_container(inner_table, horizontal, colour_override, background_override, flipped, padding) + return {n=G.UIT.R, config = {align = "cm", padding= 0.03, colour = G.C.UI.TRANSPARENT_DARK, r=0.1}, nodes={ + {n=G.UIT.R, config = {align = "cm", padding= 0.05, colour = colour_override or G.C.DYN_UI.MAIN, r=0.1}, nodes={ + {n=G.UIT.R, config={align = horizontal and "cl" or (flipped and 'bm' or "tm"), colour = background_override or G.C.DYN_UI.BOSS_DARK, minw = horizontal and 100 or 0, minh = horizontal and 0 or 30, r=0.1, padding = padding or 0.08}, nodes= + inner_table + }}}}} +end + +function simple_text_container(_loc, args) + if not _loc then return nil end + args = args or {} + local container = {} + local loc_result = localize(_loc) + if loc_result and type(loc_result) == 'table' then + for k, v in ipairs(loc_result) do + container[#container+1] = + {n=G.UIT.R, config = {align = "cm", padding= 0}, nodes={ + {n=G.UIT.T, config={text = v, scale = args.scale or 0.35, colour = args.colour or G.C.UI.TEXT_DARK, shadow = args.shadow}} + }} + end + return {n=args.col and G.UIT.C or G.UIT.R, config = {align = "cm", padding= args.padding or 0.03}, nodes=container} + end +end + +function UIBox_button(args) + args = args or {} + args.button = args.button or "exit_overlay_menu" + args.func = args.func or nil + args.colour = args.colour or G.C.RED + args.choice = args.choice or nil + args.chosen = args.chosen or nil + args.label = args.label or {'LABEL'} + args.minw = args.minw or 2.7 + args.maxw = args.maxw or (args.minw - 0.2) + if args.minw < args.maxw then args.maxw = args.minw - 0.2 end + args.minh = args.minh or 0.9 + args.scale = args.scale or 0.5 + args.focus_args = args.focus_args or nil + args.text_colour = args.text_colour or G.C.UI.TEXT_LIGHT + local but_UIT = args.col == true and G.UIT.C or G.UIT.R + + local but_UI_label = {} + + local button_pip = nil + for k, v in ipairs(args.label) do + if k == #args.label and args.focus_args and args.focus_args.set_button_pip then + button_pip ='set_button_pip' + end + table.insert(but_UI_label, {n=G.UIT.R, config={align = "cm", padding = 0, minw = args.minw, maxw = args.maxw}, nodes={ + {n=G.UIT.T, config={text = v, scale = args.scale, colour = args.text_colour, shadow = args.shadow, focus_args = button_pip and args.focus_args or nil, func = button_pip, ref_table = args.ref_table}} + }}) + end + + if args.count then + table.insert(but_UI_label, + {n=G.UIT.R, config={align = "cm", minh = 0.4}, nodes={ + {n=G.UIT.T, config={scale = 0.35,text = args.count.tally..' / '..args.count.of, colour = {1,1,1,0.9}}} + }} + ) + end + + return + {n= but_UIT, config = {align = 'cm'}, nodes={ + {n= G.UIT.C, config={ + align = "cm", + padding = args.padding or 0, + r = 0.1, + hover = true, + colour = args.colour, + one_press = args.one_press, + button = (args.button ~= 'nil') and args.button or nil, + choice = args.choice, + chosen = args.chosen, + focus_args = args.focus_args, + minh = args.minh - 0.3*(args.count and 1 or 0), + shadow = true, + func = args.func, + id = args.id, + back_func = args.back_func, + ref_table = args.ref_table, + mid = args.mid + }, nodes= + but_UI_label + }}} +end diff --git a/src/functions/button_callbacks.lua b/src/functions/button_callbacks.lua new file mode 100644 index 0000000..d6b9866 --- /dev/null +++ b/src/functions/button_callbacks.lua @@ -0,0 +1,3203 @@ +--Moves the tutorial to the next step in queue +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.tut_next = function(e) + if G.OVERLAY_TUTORIAL then + G.OVERLAY_TUTORIAL.Jimbo:remove_button() + G.OVERLAY_TUTORIAL.Jimbo:remove_speech_bubble() + G.OVERLAY_TUTORIAL.step_complete = false + G.OVERLAY_TUTORIAL.step = G.OVERLAY_TUTORIAL.step+1 + end +end + +--Ensures the compatibility indicator for the Blueprint and Brainstorm Jokers +--matches with any new changes of compatibility determined by the Joker +-- +---@param e {} +--**e** Is the UIE that called this function\ +--**e.config.ref_table** points to the joker +G.FUNCS.blueprint_compat = function(e) + if e.config.ref_table.ability.blueprint_compat ~= e.config.ref_table.ability.blueprint_compat_check then + if e.config.ref_table.ability.blueprint_compat == 'compatible' then + e.config.colour = mix_colours(G.C.GREEN, G.C.JOKER_GREY, 0.8) + elseif e.config.ref_table.ability.blueprint_compat == 'incompatible' then + e.config.colour = mix_colours(G.C.RED, G.C.JOKER_GREY, 0.8) + end + e.config.ref_table.ability.blueprint_compat_ui = ' '..localize('k_'..e.config.ref_table.ability.blueprint_compat)..' ' + e.config.ref_table.ability.blueprint_compat_check = e.config.ref_table.ability.blueprint_compat + end +end + +--Sorts G.hand in descending order by suit (spades, hearts, clubs, diamonds, then rank) +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.sort_hand_suit = function(e) + G.hand:sort('suit desc') + play_sound('paper1') +end + +--Sorts G.hand in descending order by rank (rank, then spades, hearts, clubs, diamonds) +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.sort_hand_value = function(e) + G.hand:sort('desc') + play_sound('paper1') +end + +--Checks if the cost of a non voucher card is greater than what the player can afford and changes the +--buy button visuals accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_buy = function(e) + if (e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) and (e.config.ref_table.cost > 0) then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.ORANGE + e.config.button = 'buy_from_shop' + end + if e.config.ref_parent and e.config.ref_parent.children.buy_and_use then + if e.config.ref_parent.children.buy_and_use.states.visible then + e.UIBox.alignment.offset.y = -0.6 + else + e.UIBox.alignment.offset.y = 0 + end + end +end + +--Checks if the cost of a non voucher card is greater than what the player can afford and changes the +--buy button visuals accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_buy_and_use = function(e) + if (((e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) and (e.config.ref_table.cost > 0)) or (not e.config.ref_table:can_use_consumeable())) then + e.UIBox.states.visible = false + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + if e.config.ref_table.highlighted then + e.UIBox.states.visible = true + end + e.config.colour = G.C.SECONDARY_SET.Voucher + e.config.button = 'buy_from_shop' + end +end + +--Checks if the cost of a voucher card is greater than what the player can afford and changes the +--redeem button visuals accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_redeem = function(e) + if e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.GREEN + e.config.button = 'use_card' + end +end + +--Checks if the cost of a booster pack is too much +--adjusts booster button visuals accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_open = function(e) + if (e.config.ref_table.cost) > 0 and (e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.GREEN + e.config.button = 'use_card' + end +end + +--ensures that the HUD blind section is only visible when there is an active blind +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.HUD_blind_visible = function(e) + if G.GAME.blind and (G.GAME.blind.name ~= '' and G.GAME.blind.blind_set) then + G.GAME.blind.states.visible = true + elseif G.GAME.blind then + G.GAME.blind.states.visible = false + end +end + +--Expands or contracts the 'debuff text' area of the blind HUD when it changes, +--either bigger with a new boss or smaller when it is disabled, or for a smaller blind +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.HUD_blind_debuff = function(e) + if G.GAME.blind and G.GAME.blind.loc_debuff_text and G.GAME.blind.loc_debuff_text ~= '' then + if e.parent.config.minh == 0 or e.config.prev_loc ~= G.GAME.blind.loc_debuff_text then + e.parent.config.minh = 0.35 + e.config.scale = 0.36 + if G.GAME.blind.loc_debuff_lines[e.config.ref_value] == '' then e.config.scale = 0.0; e.parent.config.minh = 0.001 end + e.config.prev_loc = G.GAME.blind.loc_debuff_text + e.UIBox:recalculate(true) + end + else + if e.parent.config.minh > 0 then + e.parent.config.minh = 0 + e.config.scale = 0 + e.UIBox:recalculate(true) + end + end +end + +--Adds the prefix for the debuff text for the wheel blind +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.HUD_blind_debuff_prefix = function(e) + if (G.GAME.blind and G.GAME.blind.name == 'The Wheel' and not G.GAME.blind.disabled) or + e.config.id == 'bl_wheel' then + e.config.ref_table.val = ''..G.GAME.probabilities.normal + e.config.scale = 0.32 + else + e.config.ref_table.val = '' + e.config.scale = 0 + end +end + +G.FUNCS.HUD_blind_reward = function(e) + if G.GAME.modifiers.no_blind_reward and (G.GAME.blind and G.GAME.modifiers.no_blind_reward[G.GAME.blind:get_type()]) then + if e.config.minh > 0.44 then + e.config.minh = 0.4 + e.children[1].config.text = localize('k_no_reward') + --e.children[2].states.visible = false + e.UIBox:recalculate(true) + end + else + if e.config.minh < 0.45 then + e.config.minh = 0.45 + e.children[1].config.text = localize('k_reward')..': ' + e.children[2].states.visible = true + e.UIBox:recalculate(true) + end + end +end + +--Determines if there is a valid save file to load and continue from main menu +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_continue = function(e) + if e.config.func then --refers to this function, or 'can_continue', so this doesn't run repeatedly + local _can_continue = nil + local savefile = love.filesystem.getInfo(G.SETTINGS.profile..'/'..'save.jkr') + if savefile == nil then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + if not G.SAVED_GAME then + G.SAVED_GAME = get_compressed(G.SETTINGS.profile..'/'..'save.jkr') + if G.SAVED_GAME ~= nil then G.SAVED_GAME = STR_UNPACK(G.SAVED_GAME) end + end + if not G.SAVED_GAME.VERSION or G.SAVED_GAME.VERSION < '0.9.2' then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + _can_continue = true + end + end + e.config.func = nil + return _can_continue + end +end + +G.FUNCS.can_load_profile = function(e) + if G.SETTINGS.profile == G.focused_profile then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.BLUE + e.config.button = 'load_profile' + end +end + +G.FUNCS.load_profile = function(delete_prof_data) + G.SAVED_GAME = nil + G.E_MANAGER:clear_queue() + G.FUNCS.wipe_on() + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + G:delete_run() + local _name = nil + if G.PROFILES[G.focused_profile].name and G.PROFILES[G.focused_profile].name ~= '' then + _name = G.PROFILES[G.focused_profile].name + end + if delete_prof_data then G.PROFILES[G.focused_profile] = {} end + G.DISCOVER_TALLIES = nil + G.PROGRESS = nil + G:load_profile(G.focused_profile) + G.PROFILES[G.focused_profile].name = _name + G:init_item_prototypes() + return true + end + })) + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = true, + blocking = false, + func = function() + G:main_menu() + G.FILE_HANDLER.force = true + return true + end + })) + G.FUNCS.wipe_off() +end + +G.FUNCS.can_delete_profile = function(e) + G.CHECK_PROFILE_DATA = G.CHECK_PROFILE_DATA or love.filesystem.getInfo(G.focused_profile..'/'..'profile.jkr') + if (not G.CHECK_PROFILE_DATA) or e.config.disable_button then + G.CHECK_PROFILE_DATA = false + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.RED + e.config.button = 'delete_profile' + end +end + +G.FUNCS.delete_profile = function(e) + local warning_text = e.UIBox:get_UIE_by_ID('warning_text') + if warning_text.config.colour ~= G.C.WHITE then + warning_text:juice_up() + warning_text.config.colour = G.C.WHITE + warning_text.config.shadow = true + e.config.disable_button = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.35, blockable = false, blocking = false, func = function() + e.config.disable_button = nil;return true end})) + + play_sound('tarot2', 1, 0.4) + else + love.filesystem.remove(G.focused_profile..'/'..'profile.jkr') + love.filesystem.remove(G.focused_profile..'/'..'save.jkr') + love.filesystem.remove(G.focused_profile..'/'..'meta.jkr') + love.filesystem.remove(G.focused_profile..'/'..'unlock_notify.jkr') + love.filesystem.remove(G.focused_profile..'') + G.SAVED_GAME = nil + G.DISCOVER_TALLIES = nil + G.PROGRESS = nil + G.PROFILES[G.focused_profile] = {} + if G.focused_profile == G.SETTINGS.profile then + G.FUNCS.load_profile(true) + else + local tab_but = G.OVERLAY_MENU:get_UIE_by_ID('tab_but_'..G.focused_profile) + G.FUNCS.change_tab(tab_but) + end + end +end + +G.FUNCS.can_unlock_all = function(e) + if G.PROFILES[G.SETTINGS.profile].all_unlocked or e.config.disable_button then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.GREY + e.config.button = 'unlock_all' + end +end + +G.FUNCS.unlock_all = function(e) + local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip') + + if (not _infotip_object.config.set) and (not G.F_NO_ACHIEVEMENTS) then + _infotip_object.config.object:remove() + _infotip_object.config.object = UIBox{ + definition = overlay_infotip(localize(G.F_TROPHIES and 'ml_unlock_all_trophies' or 'ml_unlock_all_explanation')), + config = {offset = {x=0,y=0}, align = 'bm', parent = _infotip_object} + } + _infotip_object.config.object.UIRoot:juice_up() + _infotip_object.config.set = true + e.config.disable_button = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.35, blockable = false, blocking = false, func = function() + e.config.disable_button = nil;return true end})) + + play_sound('tarot2', 1, 0.4) + else + G.PROFILES[G.SETTINGS.profile].all_unlocked = true + for k, v in pairs(G.P_CENTERS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + for k, v in pairs(G.P_BLINDS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + for k, v in pairs(G.P_TAGS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + set_profile_progress() + set_discover_tallies() + G:save_progress() + G.FILE_HANDLER.force = true + + local tab_but = G.OVERLAY_MENU:get_UIE_by_ID('tab_but_'..G.focused_profile) + G.FUNCS.change_tab(tab_but) + end +end + +--Creates an alert on this UIE if the round score for this id is a career high score +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.high_score_alert = function(e) + if e.config.id and not e.children.alert then + if G.GAME.round_scores[e.config.id] and G.GAME.round_scores[e.config.id].high_score then + e.children.alert = UIBox{ + definition = create_UIBox_card_alert({no_bg = true,text = localize('k_high_score_ex'), scale = 0.3}), + config = { + instance_type = 'ALERT', + align="tri", + offset = {x = 0.3, y = -0.18}, + major = e, parent = e} + } + e.children.alert.states.collide.can = false + end + end +end + +G.FUNCS.beta_lang_alert = function(e) + if not e.children.alert then + if e.config.ref_table and e.config.ref_table.beta then + e.children.alert = UIBox{ + definition = create_UIBox_card_alert({no_bg = true, text = 'BETA', scale = 0.35}), + config = { + instance_type = 'ALERT', + align="tri", + offset = {x = 0.07, y = -0.07}, + major = e, parent = e} + } + e.children.alert.states.collide.can = false + end + end +end + +--Creates a binding pip on this UIE if controller is being used +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.set_button_pip = function(e) + if G.CONTROLLER.HID.controller and e.config.focus_args and not e.children.button_pip then + e.children.button_pip = UIBox{ + definition = create_button_binding_pip{button = e.config.focus_args.button, scale = e.config.focus_args.scale}, + config = { + align= e.config.focus_args.orientation or 'cr', + offset = e.config.focus_args.offset or e.config.focus_args.orientation == 'bm' and {x = 0, y = 0.02} or {x = 0.1, y = 0.02}, + major = e, parent = e} + } + e.children.button_pip.states.collide.can = false + end + if not G.CONTROLLER.HID.controller and e.children.button_pip then + e.children.button_pip:remove() + e.children.button_pip = nil + end +end + +--Flashes text input cursor for the hooked text input, otherwise sets the width and alpha to 0 +-- +---@param e {} +--**e** Is the UIE cursor that called this function +G.FUNCS.flash = function(e) + if G.CONTROLLER.text_input_hook then + if (math.floor(G.TIMERS.REAL*2))%2 == 1 then + e.config.colour[4] = 0 + else + e.config.colour[4] = 1 + end + if e.config.w ~= 0.1 then e.config.w = 0.1; e.UIBox:recalculate(true) end + else + e.config.colour[4] = 0 + if e.config.w ~= 0 then e.config.w = 0; e.UIBox:recalculate(true) end + end +end + +--highlights/lowlights the pips for any dynatext with multiple values based on which one is displaying +-- +---@param e {} +--**e** Is the dynatext that called this function +G.FUNCS.pip_dynatext = function(e) + if 'pip_'..tostring(e.config.ref_table.focused_string) == e.config.id then + if e.config.pip_state ~= 1 then + e.config.colour = e.config.pipcol1 + e.config.pip_state = 1 + end + elseif e.config.pip_state ~= 2 then + e.config.colour = e.config.pipcol2 + e.config.pip_state = 2 + end +end + +--for the toggle +-- +---@param e {} +--**e** Is the slider UIE that called this function +function G.FUNCS.toggle_button(e) + e.config.ref_table.ref_table[e.config.ref_table.ref_value] = not e.config.ref_table.ref_table[e.config.ref_table.ref_value] + if e.config.toggle_callback then + e.config.toggle_callback(e.config.ref_table.ref_table[e.config.ref_table.ref_value]) + end +end + +--for the toggle +-- +---@param e {} +--**e** Is the slider UIE that called this function +function G.FUNCS.toggle(e) + if not e.config.ref_table.ref_table[e.config.ref_table.ref_value] and e.config.toggle_active then + e.config.toggle_active = nil + e.config.colour = e.config.ref_table.inactive_colour + e.children[1].states.visible = false + e.children[1].config.object.states.visible = false + elseif e.config.ref_table.ref_table[e.config.ref_table.ref_value] and not e.config.toggle_active then + e.config.toggle_active = true + e.config.colour = e.config.ref_table.active_colour + e.children[1].states.visible = true + e.children[1].config.object.states.visible = true + end + +end + + +--Modifies the slider value if it is being dragged. e contains the 'container' for the bar and +--c contains the 'child' for the bar. either can be dragged. The value is lerped between the size +--of the child bar and the parent bar depending on any min/max values. Also changes the display text for the slider. +-- +---@param e {} +--**e** Is the slider UIE that called this function +function G.FUNCS.slider(e) + local c = e.children[1] + e.states.drag.can = true + c.states.drag.can = true + if G.CONTROLLER and G.CONTROLLER.dragging.target and + (G.CONTROLLER.dragging.target == e or + G.CONTROLLER.dragging.target == c) then + local rt = c.config.ref_table + rt.ref_table[rt.ref_value] = math.min(rt.max,math.max(rt.min, rt.min + (rt.max - rt.min)*(G.CURSOR.T.x - e.parent.T.x - G.ROOM.T.x)/e.T.w)) + rt.text = string.format("%."..tostring(rt.decimal_places).."f", rt.ref_table[rt.ref_value]) + c.T.w = (rt.ref_table[rt.ref_value] - rt.min)/(rt.max - rt.min)*rt.w + c.config.w = c.T.w + if rt.callback then G.FUNCS[rt.callback](rt) end + end +end + +--Modifies the slider value descreetly by percentage +--c contains the 'child' for the bar. either can be dragged. The value is lerped between the size +--of the child bar and the parent bar depending on any min/max values. Also changes the display text for the slider. +-- +---@param e {} +--**e** Is the slider UIE that called this function +function G.FUNCS.slider_descreet(e, per) + local c = e.children[1] + e.states.drag.can = true + c.states.drag.can = true + if per then + local rt = c.config.ref_table + rt.ref_table[rt.ref_value] = math.min(rt.max,math.max(rt.min, rt.ref_table[rt.ref_value] + per*(rt.max - rt.min))) + rt.text = string.format("%."..tostring(rt.decimal_places).."f", rt.ref_table[rt.ref_value]) + c.T.w = (rt.ref_table[rt.ref_value] - rt.min)/(rt.max - rt.min)*rt.w + c.config.w = c.T.w + end +end + +--When clicked, changes the selected option from an option cycle. Wraps around. +--Modifies any pips to show the currently selected option and resets last pip. +--Calls any functions from opt_callback defined in the option cycle when the value changes. +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.option_cycle = function(e) + local from_val = e.config.ref_table.options[e.config.ref_table.current_option] + local from_key = e.config.ref_table.current_option + local old_pip = e.UIBox:get_UIE_by_ID('pip_'..e.config.ref_table.current_option, e.parent.parent) + local cycle_main = e.UIBox:get_UIE_by_ID('cycle_main', e.parent.parent) + + if cycle_main and cycle_main.config.h_popup then + cycle_main:stop_hover() + G.E_MANAGER:add_event(Event({ + func = function() + cycle_main:hover() + return true + end + })) + end + + if e.config.ref_value == 'l' then + --cycle left + e.config.ref_table.current_option = e.config.ref_table.current_option - 1 + if e.config.ref_table.current_option <= 0 then e.config.ref_table.current_option = #e.config.ref_table.options end + else + --cycle right + e.config.ref_table.current_option = e.config.ref_table.current_option + 1 + if e.config.ref_table.current_option > #e.config.ref_table.options then e.config.ref_table.current_option = 1 end + end + local to_val = e.config.ref_table.options[e.config.ref_table.current_option] + local to_key = e.config.ref_table.current_option + e.config.ref_table.current_option_val = e.config.ref_table.options[e.config.ref_table.current_option] + + local new_pip = e.UIBox:get_UIE_by_ID('pip_'..e.config.ref_table.current_option, e.parent.parent) + + if old_pip then old_pip.config.colour = G.C.BLACK end + if new_pip then new_pip.config.colour = G.C.WHITE end + + if e.config.ref_table.opt_callback then + G.FUNCS[e.config.ref_table.opt_callback]{ + from_val = from_val, + to_val = to_val, + from_key = from_key, + to_key = to_key, + cycle_config = e.config.ref_table + } + end +end + +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-- CYCLE CALLBACKS +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +--Generalized test framework callback for any testing option cycles +-- +---@param args {cycle_config: table, to_val: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** is the value the option is changing to +G.FUNCS.test_framework_cycle_callback = function(args) + args = args or {} + if args.cycle_config and args.cycle_config.ref_table and args.cycle_config.ref_value then + args.cycle_config.ref_table[args.cycle_config.ref_value] = args.to_val + end +end + +--Changing the current page being viewed for the Joker Collection +-- +---@param args {cycle_config: table} +--**cycle_config** Is the config table from the original option cycle UIE +G.FUNCS.your_collection_joker_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + for i = 1, 5 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5 + (5*#G.your_collection*(args.cycle_config.current_option - 1))] + if not center then break end + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) + card.sticker = get_joker_win_sticker(center) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +--Changing the current page being viewed for the tarot and planet card collection +-- +---@param args {cycle_config: table} +--**cycle_config** Is the config table from the original option cycle UIE +G.FUNCS.your_collection_tarot_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + + for j = 1, #G.your_collection do + for i = 1, 4+j do + local center = G.P_CENTER_POOLS["Tarot"][i+(j-1)*(5) + (11*(args.cycle_config.current_option - 1))] + if not center then break end + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +G.FUNCS.your_collection_spectral_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + + for j = 1, #G.your_collection do + for i = 1, 3+j do + local center = G.P_CENTER_POOLS["Spectral"][i+(j-1)*(4) + (9*(args.cycle_config.current_option - 1))] + if not center then break end + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +--Changing the current page being viewed for the booster pack card collection +-- +---@param args {cycle_config: table} +--**cycle_config** Is the config table from the original option cycle UIE +G.FUNCS.your_collection_booster_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + + for j = 1, #G.your_collection do + for i = 1, 4 do + local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))] + if not center then break end + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W*1.27, G.CARD_H*1.27, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +--Changing the current page being viewed for the voucher collection +-- +---@param args {cycle_config: table} +--**cycle_config** Is the config table from the original option cycle UIE +G.FUNCS.your_collection_voucher_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + for i = 1, 4 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))] + if not center then break end + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +--Changing the selected card back +-- +---@param args {to_val: value} +--**to_val** Deck back name being changed to +G.FUNCS.change_selected_back = function(args) + G.GAME.selected_back:change_to(G.P_CENTER_POOLS.Back[args.to_key]) +end + +--Changing the collection viewed card back +-- +---@param args {to_val: value} +--**to_val** Deck back name being changed to +G.FUNCS.change_viewed_back = function(args) + G.viewed_stake = G.viewed_stake or 1 + G.GAME.viewed_back:change_to(G.P_CENTER_POOLS.Back[args.to_key]) + if G.sticker_card then G.sticker_card.sticker = get_deck_win_sticker(G.GAME.viewed_back.effect.center) end + local max_stake = get_deck_win_stake(G.GAME.viewed_back.effect.center.key) or 0 + G.viewed_stake = math.min(G.viewed_stake, max_stake + 1) + G.PROFILES[G.SETTINGS.profile].MEMORY.deck = args.to_val +end + +G.FUNCS.change_stake = function(args) + G.viewed_stake = args.to_key + G.PROFILES[G.SETTINGS.profile].MEMORY.stake = args.to_key +end + +--Switch VSync on or off - add the change to the settings change queue +-- +---@param args {to_key: key} +--**to_key** new VSync key setting, 1 for On, 2 for Off +G.FUNCS.change_vsync = function(args) + G.SETTINGS.QUEUED_CHANGE.vsync = (G.SETTINGS.WINDOW.vsync == 0 and args.to_key == 1 and 1) or (G.SETTINGS.WINDOW.vsync == 1 and args.to_key == 2 and 0) or nil +end + +--Changes the screen resolution to the cycled resolution.\ +--Note - an issue with windows scaling above 100% means that these resolutions may not match the actual monitor resolution, +--they are more like render resolutions adjusted to fit the screen with scaling +-- +---@param args {cycle_config: table, to_key: key} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_key** The new resolution setting, refers to a resolution table generated with the option cycle +G.FUNCS.change_screen_resolution = function(args) + local curr_disp = G.SETTINGS.WINDOW.selected_display + local to_resolution = G.SETTINGS.WINDOW.DISPLAYS[curr_disp].screen_resolutions.values[args.to_key] + G.SETTINGS.QUEUED_CHANGE.screenres = {w = to_resolution.w, h = to_resolution.h} + +end + +--Changes the screen mode\ +--Options: Windowed, Fullscreen, Borderless +-- +---@param args {cycle_config: table, to_val: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new screenmode setting value +G.FUNCS.change_screenmode = function(args) + G.ARGS.screenmode_vals = G.ARGS.screenmode_vals or {"Windowed", "Fullscreen", "Borderless"} + G.SETTINGS.QUEUED_CHANGE.screenmode = G.ARGS.screenmode_vals[args.to_key] + G.FUNCS.change_window_cycle_UI() +end + +--Changes the displaying monitors +-- +---@param args {cycle_config: table, to_key: key} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_key** The new screenmode setting key +G.FUNCS.change_display = function(args) + G.SETTINGS.QUEUED_CHANGE.selected_display = args.to_key + G.FUNCS.change_window_cycle_UI() +end + +--Helper function to re-add the resolution cycle UIE with updated data +G.FUNCS.change_window_cycle_UI = function() + if G.OVERLAY_MENU then + local swap_node = G.OVERLAY_MENU:get_UIE_by_ID('resolution_cycle') + if swap_node then + local focused_display, focused_screenmode = G.SETTINGS.QUEUED_CHANGE.selected_display or G.SETTINGS.WINDOW.selected_display, G.SETTINGS.QUEUED_CHANGE.screenmode or G.SETTINGS.WINDOW.screenmode + + --Refresh the display information + local res_option = GET_DISPLAYINFO(focused_screenmode, focused_display) + + --Remove the old cycle, replace it with a new updated one reflecting any changes + swap_node.children[1]:remove() + swap_node.children[1] = nil + swap_node.UIBox:add_child( + create_option_cycle({w = 4,scale = 0.8, options = G.SETTINGS.WINDOW.DISPLAYS[focused_display].screen_resolutions.strings, opt_callback = 'change_screen_resolution',current_option = res_option or 1}), + swap_node) + end + end +end + +--Changes the speed that the game runs at, does not affect all timers, just G.TIMERS.TOTAL +-- +---@param args {cycle_config: table, to_val: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new screenmode setting key +G.FUNCS.change_gamespeed = function(args) + G.SETTINGS.GAMESPEED = args.to_val +end + +--Changes the relative position of play and discard buttons +-- +---@param args {cycle_config: table, to_key: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new screenmode setting key +G.FUNCS.change_play_discard_position = function(args) + G.SETTINGS.play_button_pos = args.to_key + if G.buttons then + G.buttons:remove() + G.buttons = UIBox{ + definition = create_UIBox_buttons(), + config = {align="bm", offset = {x=0,y=0.3},major = G.hand, bond = 'Weak'} + } + end +end + +--Changes the Shadow setting +-- +---@param args {cycle_config: table, to_val: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new value for shadows, 'On' or 'Off' +G.FUNCS.change_shadows = function(args) + G.SETTINGS.GRAPHICS.shadows = args.to_key == 1 and 'On' or 'Off' + G:save_settings() +end + +--Changes the Pixel smoothing, all sprites need to be realoaded when this changes\ +-- +---@param args {cycle_config: table, to_key: key} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new value for shadows, 'On' or 'Off' +G.FUNCS.change_pixel_smoothing = function(args) + G.SETTINGS.GRAPHICS.texture_scaling = args.to_key--^2 + G:set_render_settings() + G:save_settings() +end + +--Changes the Bloom amount for the CRT effect, number of samples to take for bloom\ +-- +---@param args {cycle_config: table, to_key: key} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new value for shadows, 'On' or 'Off' +G.FUNCS.change_crt_bloom = function(args) + G.SETTINGS.GRAPHICS.bloom = args.to_key + G:save_settings() +end + +G.FUNCS.change_collab = function(args) + G.SETTINGS.CUSTOM_DECK.Collabs[args.cycle_config.curr_suit] = G.COLLABS.options[args.cycle_config.curr_suit][args.to_key] or 'default' + for k, v in pairs(G.I.CARD) do + if v.config and v.config.card and v.children.front and v.ability.effect ~= 'Stone Card' then + v:set_sprites(nil, v.config.card) + end + end + G:save_settings() +end + +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-- TEXT ENTRY +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +--passes a keyboard input to the controller when a key UI button is pressed +-- +---@param e table +-- +--[e is the UI Element that calls this update function, contains ARGS in e.config.ref_table] +G.FUNCS.key_button = function(e) + local args = e.config.ref_table + if args.key then G.CONTROLLER:key_press_update(args.key) end +end + +--Modifies the text input to show the current text value being modified. Shows the prompt text if\ +--the text input area is not hooked. Also modifies the UIE colour to show the hooked/non hooked colour\ +--If using a keyboard, pops it up here or removes it if using KBM +-- +---@param e table +-- +--[e is the UI Element that calls this update function, contains ARGS in e.config.ref_table] +G.FUNCS.text_input = function(e) + local args =e.config.ref_table + if G.CONTROLLER.text_input_hook == e then + e.parent.parent.config.colour = args.hooked_colour + args.current_prompt_text = '' + args.current_position_text = args.position_text + else + e.parent.parent.config.colour = args.colour + args.current_prompt_text = (args.text.ref_table[args.text.ref_value] == '' and args.prompt_text or '') + args.current_position_text = '' + end + + local OSkeyboard_e = e.parent.parent.parent + if G.CONTROLLER.text_input_hook == e and G.CONTROLLER.HID.controller then + if not OSkeyboard_e.children.controller_keyboard then + OSkeyboard_e.children.controller_keyboard = UIBox{ + definition = create_keyboard_input{backspace_key = true, return_key = true, space_key = false}, + config = { + align= 'cm', + offset = {x = 0, y = G.CONTROLLER.text_input_hook.config.ref_table.keyboard_offset or -4}, + major = e.UIBox, parent = OSkeyboard_e} + } + G.CONTROLLER.screen_keyboard = OSkeyboard_e.children.controller_keyboard + G.CONTROLLER:mod_cursor_context_layer(1) + end + elseif OSkeyboard_e.children.controller_keyboard then + OSkeyboard_e.children.controller_keyboard:remove() + OSkeyboard_e.children.controller_keyboard = nil + G.CONTROLLER.screen_keyboard = nil + G.CONTROLLER:mod_cursor_context_layer(-1) + end +end + +G.FUNCS.paste_seed = function(e) + G.CONTROLLER.text_input_hook = e.UIBox:get_UIE_by_ID('text_input').children[1].children[1] + for i = 1, 8 do + G.FUNCS.text_input_key({key = 'right'}) + end + for i = 1, 8 do + G.FUNCS.text_input_key({key = 'backspace'}) + end + local clipboard = (G.F_LOCAL_CLIPBOARD and G.CLIPBOARD or love.system.getClipboardText()) or '' + for i = 1, #clipboard do + local c = clipboard:sub(i,i) + G.FUNCS.text_input_key({key = c}) + end + G.FUNCS.text_input_key({key = 'return'}) +end + +--When clicked, hooks the text input defined by e->1->1, which should be the text input UIE +-- +---@param e table +-- +--[e is the UI Element that calls this click function] +G.FUNCS.select_text_input = function(e) + G.CONTROLLER.text_input_hook = e.children[1].children[1] + + --Start by setting the cursor position to the correct location + TRANSPOSE_TEXT_INPUT(0) + e.UIBox:recalculate(true) +end + +--Handles all key inputs for the hooked text input. +-- +---@param args {key: string, caps: boolean} +--**key** the key being pressed\ +--**caps** if the key should be capitalized +G.FUNCS.text_input_key = function(args) + args = args or {} + + if args.key == '[' or args.key == ']' then return end + if args.key == '0' then args.key = 'o' end + + --shortcut to hook config + local hook_config = G.CONTROLLER.text_input_hook.config.ref_table + hook_config.orig_colour = hook_config.orig_colour or copy_table(hook_config.colour) + + args.key = args.key or '%' + args.caps = args.caps or G.CONTROLLER.capslock or hook_config.all_caps --capitalize if caps lock or hook requires + + --Some special keys need to be mapped accordingly before passing through the corpus + local keymap = { + space = ' ', + backspace = 'BACKSPACE', + delete = 'DELETE', + ['return'] = 'RETURN', + right = 'RIGHT', + left = 'LEFT' + } + local hook = G.CONTROLLER.text_input_hook + local corpus = '123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'..(hook.config.ref_table.extended_corpus and " 0!$&()<>?:{}+-=,.[]_" or '') + + if hook.config.ref_table.extended_corpus then + local lower_ext = '1234567890-=;\',./' + local upper_ext = '!@#$%^&*()_+:"<>?' + if string.find(lower_ext, args.key) and args.caps then + args.key = string.sub(string.sub(upper_ext,string.find(lower_ext, args.key)), 0, 1) + end + end + local text = hook_config.text + + --set key to mapped key or upper if caps is true + args.key = keymap[args.key] or (args.caps and string.upper(args.key) or args.key) + + --Start by setting the cursor position to the correct location + TRANSPOSE_TEXT_INPUT(0) + + if string.len(text.ref_table[text.ref_value]) > 0 and args.key == 'BACKSPACE' then --If not at start, remove preceding letter + MODIFY_TEXT_INPUT{ + letter = '', + text_table = text, + pos = text.current_position, + delete = true + } + TRANSPOSE_TEXT_INPUT(-1) + elseif string.len(text.ref_table[text.ref_value]) > 0 and args.key == 'DELETE' then --if not at end, remove following letter + MODIFY_TEXT_INPUT{ + letter = '', + text_table = text, + pos = text.current_position+1, + delete = true + } + TRANSPOSE_TEXT_INPUT(0) + elseif args.key == 'RETURN' then --Release the hook + if hook.config.ref_table.callback then hook.config.ref_table.callback() end + hook.parent.parent.config.colour = hook_config.colour + local temp_colour = copy_table(hook_config.orig_colour) + hook_config.colour[1] = G.C.WHITE[1] + hook_config.colour[2] = G.C.WHITE[2] + hook_config.colour[3] = G.C.WHITE[3] + ease_colour(hook_config.colour, temp_colour) + G.CONTROLLER.text_input_hook = nil + elseif args.key == 'LEFT' then --Move cursor position to the left + TRANSPOSE_TEXT_INPUT(-1) + elseif args.key == 'RIGHT' then --Move cursor position to the right + TRANSPOSE_TEXT_INPUT(1) + elseif hook_config.max_length > string.len(text.ref_table[text.ref_value]) and + (string.len(args.key) == 1) and + string.find( corpus, args.key , 1, true) then --check to make sure the key is in the valid corpus, add it to the string + MODIFY_TEXT_INPUT{ + letter = args.key, + text_table = text, + pos = text.current_position+1 + } + TRANSPOSE_TEXT_INPUT(1) + end +end + +--Helper function for G.FUNCS.text_input_key +function GET_TEXT_FROM_INPUT() + local new_text = '' + local hook = G.CONTROLLER.text_input_hook + for i = 1, #hook.children do + if hook.children[i].config and hook.children[i].config.id:sub(1, 7) == 'letter_' and hook.children[i].config.text ~= '' then + new_text = new_text..hook.children[i].config.text + end + end + return new_text +end + +--Helper function for G.FUNCS.text_input_key +-- +---@param args {letter: string, text_table: table, pos: number, delete: boolean} +--**letter** the letter being pressed\ +--**text_table** the table full of letters from hook\ +--**pos** the current position of the iterator\ +--**delete** if the action is a deletion action +function MODIFY_TEXT_INPUT(args) + args = args or {} + + if args.delete and args.pos > 0 then + if args.pos >= #args.text_table.letters then + args.text_table.letters[args.pos] = '' + else + args.text_table.letters[args.pos] = args.text_table.letters[args.pos+1] + MODIFY_TEXT_INPUT{ + letter = args.letter, + text_table = args.text_table, + pos = args.pos+1, + delete = args.delete + } + end + return + end + local swapped_letter = args.text_table.letters[args.pos] + args.text_table.letters[args.pos] = args.letter + if swapped_letter and swapped_letter ~= '' then + MODIFY_TEXT_INPUT{ + letter = swapped_letter, + text_table = args.text_table, + pos = args.pos+1 + } + end +end + +--Helper function for G.FUNCS.text_input_key\ +--Moves the cursor left or right. Typing a key, deleting or backspacing also counts\ +--as a cursor move, since empty strings are used to fill the hook +-- +---@param amount number +function TRANSPOSE_TEXT_INPUT(amount) + local position_child = nil + local hook = G.CONTROLLER.text_input_hook + local text = G.CONTROLLER.text_input_hook.config.ref_table.text + for i = 1, #hook.children do + if hook.children[i].config then + if hook.children[i].config.id == 'position' then + position_child = i; break + end + end + end + + local dir = (amount/math.abs(amount)) or 0 + + while amount ~= 0 do + if position_child + dir < 1 or position_child + dir >= #hook.children then break end + local real_letter = hook.children[position_child+dir].config.id:sub(1, 7) == 'letter_' and hook.children[position_child+dir].config.text ~= '' + SWAP(hook.children, position_child, position_child + dir) + if real_letter then amount = amount - dir end + position_child = position_child + dir + end + + text.current_position = math.min(position_child-1, string.len(text.ref_table[text.ref_value])) + hook.UIBox:recalculate(true) + text.ref_table[text.ref_value] = GET_TEXT_FROM_INPUT() +end + +--Determines if there are any graphical changes in the queue that require window re-initialization, +--changes the button accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_apply_window_changes = function(e) + local can_apply = false + if G.SETTINGS.QUEUED_CHANGE then + if G.SETTINGS.QUEUED_CHANGE.screenmode and + G.SETTINGS.QUEUED_CHANGE.screenmode ~= G.SETTINGS.WINDOW.screenmode then + can_apply = true + elseif G.SETTINGS.QUEUED_CHANGE.screenres then + can_apply = true + elseif G.SETTINGS.QUEUED_CHANGE.vsync then + can_apply = true + elseif G.SETTINGS.QUEUED_CHANGE.selected_display and + G.SETTINGS.QUEUED_CHANGE.selected_display ~= G.SETTINGS.WINDOW.selected_display then + can_apply = true + end + end + + if can_apply then + e.config.button = 'apply_window_changes' + e.config.colour = G.C.RED + else + e.config.button = nil + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + end +end + +--Applies all window changes, including updates to the screenmode, selected display, resolution and vsync.\ +--These changes are all defined in the G.SETTINGS.QUEUED_CHANGE table. Any unchanged settings use the previous value +G.FUNCS.apply_window_changes = function(_initial) + --Set the screenmode setting from Windowed, Fullscreen or Borderless + G.SETTINGS.WINDOW.screenmode = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenmode) or G.SETTINGS.WINDOW.screenmode or 'Windowed' + + --Set the monitor the window should be rendered to + G.SETTINGS.WINDOW.selected_display = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.selected_display) or G.SETTINGS.WINDOW.selected_display or 1 + + --Set the screen resolution + G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_res = { + w = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenres and G.SETTINGS.QUEUED_CHANGE.screenres.w) or (G.SETTINGS.screen_res and G.SETTINGS.screen_res.w) or love.graphics.getWidth( ), + h = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenres and G.SETTINGS.QUEUED_CHANGE.screenres.h) or (G.SETTINGS.screen_res and G.SETTINGS.screen_res.h) or love.graphics.getHeight( ) + } + + --Set the vsync value, 0 is off 1 is on + G.SETTINGS.WINDOW.vsync = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.vsync) or G.SETTINGS.WINDOW.vsync or 1 + + love.window.updateMode( + (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenmode == 'Windowed') and love.graphics.getWidth()*0.8 or G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_res.w, + (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenmode == 'Windowed') and love.graphics.getHeight()*0.8 or G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_res.h, + {fullscreen = G.SETTINGS.WINDOW.screenmode ~= 'Windowed', + fullscreentype = (G.SETTINGS.WINDOW.screenmode == 'Borderless' and 'desktop') or (G.SETTINGS.WINDOW.screenmode == 'Fullscreen' and 'exclusive') or nil, + vsync = G.SETTINGS.WINDOW.vsync, + resizable = true, + display = G.SETTINGS.WINDOW.selected_display, + highdpi = (love.system.getOS() == 'OS X') + }) + G.SETTINGS.QUEUED_CHANGE = {} + if _initial ~= true then + love.resize(love.graphics.getWidth(),love.graphics.getHeight()) + G:save_settings() + end + if G.OVERLAY_MENU then + local tab_but = G.OVERLAY_MENU:get_UIE_by_ID('tab_but_Video') + G.FUNCS.change_tab(tab_but) + end +end + +--Iterates through any collection cardareas, applies the initial collection alert update.\ +--This update_alert function for each card is also called by the card in its own update function +function INIT_COLLECTION_CARD_ALERTS() + for j = 1, #G.your_collection do + for _, v in ipairs(G.your_collection[j].cards) do + v:update_alert() + end + end +end + +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-- RUN SETUP +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +--Monitors the run option deck to determine if a new 'back' has been chosen from the option cycle\ +--if so, this function removes the old UI describing the ability of the back and replaces it with the new ability UI +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.RUN_SETUP_check_back = function(e) + if G.GAME.viewed_back.name ~= e.config.id then + --removes the UI from the previously selected back and adds the new one + + e.config.object:remove() + e.config.object = UIBox{ + definition = G.GAME.viewed_back:generate_UI(), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.GAME.viewed_back.name + end +end + +G.FUNCS.RUN_SETUP_check_back_name = function(e) + if e.config.object and G.GAME.viewed_back.name ~= e.config.id then + --removes the UI from the previously selected back and adds the new one + + e.config.object:remove() + e.config.object = UIBox{ + definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back_name', object = DynaText({string = G.GAME.viewed_back:get_name(),maxw = 4, colours = {G.C.WHITE}, shadow = true, bump = true, scale = 0.5, pop_in = 0, silent = true})}}, + }}, + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.GAME.viewed_back.name + end +end + +G.FUNCS.RUN_SETUP_check_stake = function(e) + if (G.GAME.viewed_back.name ~= e.config.id) then + e.config.object:remove() + e.config.object = UIBox{ + definition = G.UIDEF.stake_option(G.SETTINGS.current_setup), + config = {offset = {x=0,y=0}, align = 'tmi', parent = e} + } + e.config.id = G.GAME.viewed_back.name + end +end + +G.FUNCS.RUN_SETUP_check_stake2 = function(e) + if (G.viewed_stake ~= e.config.id) then + e.config.object:remove() + e.config.object = UIBox{ + definition = G.UIDEF.viewed_stake_option(), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.viewed_stake + end +end + +G.FUNCS.change_viewed_collab = function(args) + G.viewed_collab = args.to_val +end + +G.FUNCS.CREDITS_check_collab = function(e) + if (G.viewed_collab ~= e.config.id) then + e.config.object:remove() + e.config.object = UIBox{ + definition = G.UIDEF.viewed_collab_option(), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.viewed_collab + end +end + +G.FUNCS.RUN_SETUP_check_back_stake_column= function(e) + if G.GAME.viewed_back.name ~= e.config.id then + --removes the UI from the previously selected back and adds the new one + e.config.object:remove() + e.config.object = UIBox{ + definition = G.UIDEF.deck_stake_column(G.GAME.viewed_back.effect.center.key), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.GAME.viewed_back.name + end +end + +G.FUNCS.RUN_SETUP_check_back_stake_highlight= function(e) + if G.viewed_stake == e.config.id and e.config.outline < 0.1 then + e.config.outline = 0.8 + elseif G.viewed_stake ~= e.config.id and e.config.outline > 0.1 then + e.config.outline = 0 + end +end + +G.FUNCS.change_tab = function(e) + if not e then return end + local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip') + if _infotip_object and _infotip_object.config.object then + _infotip_object.config.object:remove() + _infotip_object.config.object = Moveable() + end + + local tab_contents = e.UIBox:get_UIE_by_ID('tab_contents') + tab_contents.config.object:remove() + tab_contents.config.object = UIBox{ + definition = e.config.ref_table.tab_definition_function(e.config.ref_table.tab_definition_function_args), + config = {offset = {x=0,y=0}, parent = tab_contents, type = 'cm'} + } + tab_contents.UIBox:recalculate() +end + +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-- OVERLAY MENUS +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +--The overlay menu is a full screen menu interface, and is usually called from button presses. The base Overlay menu function here\ +--creates a global G.OVERLAY_MENU that represents this full screen UIBox. The game may be paused at this time as well\ +--The generated UIBox is created below the visible screen area and eased up to the center of the screen +-- +---@param args {definition: table, config: table, pause: boolean} +--**definition** The definition table for the UIBox\ +--**config** A configuration table for the UIBox\ +--**pause** Whether the game should be paused on creation of the UIBox +G.FUNCS.overlay_menu = function(args) + if not args then return end + --Remove any existing overlays if there is one + if G.OVERLAY_MENU then G.OVERLAY_MENU:remove() end + G.CONTROLLER.locks.frame_set = true + G.CONTROLLER.locks.frame = true + G.CONTROLLER.cursor_down.target = nil + G.CONTROLLER:mod_cursor_context_layer(G.NO_MOD_CURSOR_STACK and 0 or 1) + + args.config = args.config or {} + args.config = { + align = args.config.align or "cm", + offset = args.config.offset or {x=0,y=10}, + major = args.config.major or G.ROOM_ATTACH, + bond = 'Weak', + no_esc = args.config.no_esc + } + G.OVERLAY_MENU = true + --Generate the UIBox + G.OVERLAY_MENU = UIBox{ + definition = args.definition, + config = args.config + } + + --Set the offset and align. The menu overlay can be initially offset in the y direction and this will ensure it slides to middle + G.OVERLAY_MENU.alignment.offset.y = 0 + G.ROOM.jiggle = G.ROOM.jiggle + 1 + G.OVERLAY_MENU:align_to_major() +end + +--Removes the overlay menu if one exists, unpauses the game, and saves the settings to file +G.FUNCS.exit_overlay_menu = function() + if not G.OVERLAY_MENU then return end + G.CONTROLLER.locks.frame_set = true + G.CONTROLLER.locks.frame = true + G.CONTROLLER:mod_cursor_context_layer(-1000) + G.OVERLAY_MENU:remove() + G.OVERLAY_MENU = nil + G.VIEWING_DECK = nil + G.SETTINGS.paused = false + + --Save settings to file + G:save_settings() +end + +--Removes overlay menu and immediately generates the next unlock menu if there is one +G.FUNCS.continue_unlock = function() + G.FUNCS.exit_overlay_menu() + G.CONTROLLER:mod_cursor_context_layer(-2000) + G.E_MANAGER:update(0, true) +end + +G.FUNCS.test_framework = function(options) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_test_framework(options), + } +end + +G.FUNCS.options = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_options(), + } +end + +G.FUNCS.current_hands = function(e, simple) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_current_hands(simple), + } +end + +G.FUNCS.run_info = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.run_info(), + } +end + +G.FUNCS.deck_info = function(e) + G.SETTINGS.paused = true + if G.deck_preview then + G.deck_preview:remove() + G.deck_preview = nil + end + G.FUNCS.overlay_menu{ + definition = G.UIDEF.deck_info( + G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.HAND_PLAYED or G.STATE == G.STATES.DRAW_TO_HAND + ), + } +end + +G.FUNCS.settings = function(e, instant) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_settings(), + config = {offset = {x=0,y=instant and 0 or 10}} +} +end + +G.FUNCS.show_credits = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.credits(), + } +end + +G.FUNCS.language_selection = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.language_selector(), + } +end + +G.FUNCS.your_collection = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection(), + } +end + +G.FUNCS.your_collection_blinds = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_blinds(), + } +end + +G.FUNCS.your_collection_jokers = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_jokers(), + } +end + +G.FUNCS.your_collection_tarots = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_tarots(), + } +end + +G.FUNCS.your_collection_planets = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_planets(), + } +end + +G.FUNCS.your_collection_spectrals = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_spectrals(), + } +end + +G.FUNCS.your_collection_vouchers = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_vouchers(), + } +end + +G.FUNCS.your_collection_enhancements_exit_overlay_menu = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_enhancements('exit_overlay_menu'), + } +end + +G.FUNCS.your_collection_enhancements = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_enhancements(), + } +end + +G.FUNCS.your_collection_decks = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_decks(), + } +end + +G.FUNCS.your_collection_editions = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_editions(), + } +end + +G.FUNCS.your_collection_tags = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_tags(), + } +end + +G.FUNCS.your_collection_seals = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_seals(), + } +end + +G.FUNCS.your_collection_boosters = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_boosters(), + } +end + +G.FUNCS.challenge_list = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.challenge_list((e.config.id == 'from_game_over')), + } + if (e.config.id == 'from_game_over') then G.OVERLAY_MENU.config.no_esc =true end +end + +G.FUNCS.high_scores = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_high_scores(), + } +end + +G.FUNCS.customize_deck = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_customize_deck(), + } +end + +G.FUNCS.usage = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.usage_tabs() + } +end + +G.FUNCS.setup_run = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.run_setup((e.config.id == 'from_game_over' or e.config.id == 'from_game_won' or e.config.id == 'challenge_list') and e.config.id), + } + if (e.config.id == 'from_game_over' or e.config.id == 'from_game_won') then G.OVERLAY_MENU.config.no_esc =true end +end + +G.FUNCS.wait_for_high_scores = function(e) + if G.ARGS.HIGH_SCORE_RESPONSE then + e.config.object:remove() + e.config.object = UIBox{ + definition = create_UIBox_high_scores_filling(G.ARGS.HIGH_SCORE_RESPONSE), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + G.ARGS.HIGH_SCORE_RESPONSE = nil + end +end + +G.FUNCS.notify_then_setup_run = function(e) + G.OVERLAY_MENU:remove() + G.OVERLAY_MENU = nil + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + unlock_notify() + return true + end) + })) + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + if #G.E_MANAGER.queues.unlock <= 0 and not G.OVERLAY_MENU then + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.run_setup((e.config.id == 'from_game_over' or e.config.id == 'from_game_won') and e.config.id), + } + if (e.config.id == 'from_game_over' or e.config.id == 'from_game_won') then G.OVERLAY_MENU.config.no_esc =true end + return true + end + end) + })) +end + +G.FUNCS.change_challenge_description = function(e) + if G.OVERLAY_MENU then + local desc_area = G.OVERLAY_MENU:get_UIE_by_ID('challenge_area') + if desc_area and desc_area.config.oid ~= e.config.id then + if desc_area.config.old_chosen then desc_area.config.old_chosen.config.chosen = nil end + e.config.chosen = 'vert' + if desc_area.config.object then + desc_area.config.object:remove() + end + desc_area.config.object = UIBox{ + definition = G.UIDEF.challenge_description(e.config.id), + config = {offset = {x=0,y=0}, align = 'cm', parent = desc_area} + } + desc_area.config.oid = e.config.id + desc_area.config.old_chosen = e + end + end +end + +G.FUNCS.change_challenge_list_page = function(args) + if not args or not args.cycle_config then return end + if G.OVERLAY_MENU then + local ch_list = G.OVERLAY_MENU:get_UIE_by_ID('challenge_list') + if ch_list then + if ch_list.config.object then + ch_list.config.object:remove() + end + ch_list.config.object = UIBox{ + definition = G.UIDEF.challenge_list_page(args.cycle_config.current_option-1), + config = {offset = {x=0,y=0}, align = 'cm', parent = ch_list} + } + G.FUNCS.change_challenge_description{config = {id = 'nil'}} + end + end +end + +G.FUNCS.deck_view_challenge = function(e) + G.FUNCS.overlay_menu{ + definition = create_UIBox_generic_options({back_func = 'deck_info', contents ={ + G.UIDEF.challenge_description(get_challenge_int_from_id(e.config.id.id or ''), nil, true) + } + }) + } +end + +G.FUNCS.profile_select = function(e) + G.SETTINGS.paused = true + G.focused_profile = G.SETTINGS.profile + + for i = 1, 3 do + if i ~= G.focused_profile and love.filesystem.getInfo(i..'/'..'profile.jkr') then G:load_profile(i) end + end + G:load_profile(G.focused_profile) + + G.FUNCS.overlay_menu{ + definition = G.UIDEF.profile_select(), + } +end + +G.FUNCS.quit = function(e) + love.event.quit() +end + +G.FUNCS.quit_cta = function(e) + G.SETTINGS.paused = true + G.SETTINGS.DEMO.quit_CTA_shown = true + + G:save_progress() + + G.FUNCS.overlay_menu{ + definition = create_UIBox_exit_CTA(), + config = {no_esc = true} + } + local Jimbo = nil + + if not G.jimboed then + G.jimboed = true + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 2.5, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') then + Jimbo = Card_Character({x = 0, y = 5}) + local spot = G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') + spot.config.object:remove() + spot.config.object = Jimbo + Jimbo.ui_object_updated = true + Jimbo:add_speech_bubble( {"Having fun?", {{text = "Wishlist Balatro!", type = 'GREEN'}}}) + Jimbo:say_stuff(5) + end + return true + end) + })) + end +end + +G.FUNCS.demo_survey = function(e) + love.system.openURL( "https://forms.gle/WX26BHq1AwwV5xyH9")--"https://forms.gle/P8F4WzdCsccrm15T6" ) +end + +G.FUNCS.louisf_insta = function(e) + love.system.openURL( "https://www.instagram.com/louisfsoundtracks/" ) +end + +G.FUNCS.wishlist_steam = function(e) + love.system.openURL( "https://store.steampowered.com/app/2379780/Balatro/#game_area_purchase" ) +end + +G.FUNCS.go_to_playbalatro = function(e) + love.system.openURL( "https://www.playbalatro.com" ) +end + +G.FUNCS.go_to_discord = function(e) + love.system.openURL( "https://discord.gg/balatro" ) +end + +G.FUNCS.go_to_discord_loc = function(e) + love.system.openURL( "https://discord.com/channels/1116389027176787968/1207803392978853898" ) +end + +G.FUNCS.loc_survey = function(e) + love.system.openURL( "https://forms.gle/pL5tMh1oXLmv8czz9" ) +end + +G.FUNCS.go_to_twitter = function(e) + love.system.openURL( "https://twitter.com/LocalThunk" ) +end + +G.FUNCS.unlock_this = function(e) + unlock_achievement(e.config.id) +end + +G.FUNCS.reset_achievements = function(e) + G.ACHIEVEMENTS = nil + G.SETTINGS.ACHIEVEMENTS_EARNED = {} + G:save_progress() + G.FUNCS.exit_overlay_menu() +end + +G.FUNCS.refresh_contrast_mode = function() + local new_colour_proto = G.C["SO_"..(G.SETTINGS.colourblind_option and 2 or 1)] + G.C.SUITS.Hearts = new_colour_proto.Hearts + G.C.SUITS.Diamonds = new_colour_proto.Diamonds + G.C.SUITS.Spades = new_colour_proto.Spades + G.C.SUITS.Clubs = new_colour_proto.Clubs + for k, v in pairs(G.I.CARD) do + if v.config and v.config.card and v.children.front and v.ability.effect ~= 'Stone Card' then + v:set_sprites(nil, v.config.card) + end + end +end + +G.FUNCS.warn_lang = function(e) + local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip') + if (_infotip_object.config.set ~= e.config.ref_table.label) and (not G.F_NO_ACHIEVEMENTS) then + _infotip_object.config.object:remove() + _infotip_object.config.object = UIBox{ + definition = overlay_infotip({e.config.ref_table.warning[1],e.config.ref_table.warning[2],e.config.ref_table.warning[3], lang = e.config.ref_table}), + config = {offset = {x=0,y=0}, align = 'bm', parent = _infotip_object} + } + _infotip_object.config.object.UIRoot:juice_up() + _infotip_object.config.set = e.config.ref_table.label + e.config.disable_button = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.35, blockable = false, blocking = false, func = function() + e.config.disable_button = nil;return true end})) + e.config.button = 'change_lang' + play_sound('tarot2', 1, 0.4) + end +end + + + +G.FUNCS.change_lang = function(e) + local lang = e.config.ref_table + if not lang or lang == G.LANG then + G.FUNCS.exit_overlay_menu() + else + G.SETTINGS.language = lang.key + G:set_language() + G.E_MANAGER:clear_queue() + G.FUNCS.wipe_on() + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = true, + blocking = false, + func = function() + G:delete_run() + G:init_item_prototypes() + G:main_menu() + return true + end + })) + G.FUNCS.wipe_off() + end +end + +G.FUNCS.copy_seed = function(e) + if G.F_LOCAL_CLIPBOARD then + G.CLIPBOARD = G.GAME.pseudorandom.seed + else + love.system.setClipboardText(G.GAME.pseudorandom.seed) + end +end + +G.FUNCS.start_setup_run = function(e) + if G.OVERLAY_MENU then G.FUNCS.exit_overlay_menu() end + if G.SETTINGS.current_setup == 'New Run' then + if not G.GAME or (not G.GAME.won and not G.GAME.seeded) then + if G.SAVED_GAME ~= nil then + if not G.SAVED_GAME.GAME.won then + G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt = 0 + end + G:save_settings() + end + end + local _seed = G.run_setup_seed and G.setup_seed or G.forced_seed or nil + local _challenge = G.challenge_tab or nil + local _stake = G.forced_stake or G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1 + G.FUNCS.start_run(e, {stake = _stake, seed = _seed, challenge = _challenge}) + + elseif G.SETTINGS.current_setup == 'Continue' then + if G.SAVED_GAME ~= nil then + G.FUNCS.start_run(nil, {savetext = G.SAVED_GAME}) + end + end +end + +G.FUNCS.start_challenge_run = function(e) + if G.OVERLAY_MENU then G.FUNCS.exit_overlay_menu() end + G.FUNCS.start_run(e, {stake = 1, challenge = G.CHALLENGES[e.config.id]}) +end + +function G.FUNCS.toggle_seeded_run(e) + if e.config.object and not G.run_setup_seed then + e.config.object:remove() + e.config.object = nil + elseif not e.config.object and G.run_setup_seed then + e.config.object = UIBox{ + definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 2.5, padding = 0.05}, nodes={ + simple_text_container('ml_disabled_seed',{colour = G.C.UI.TEXT_LIGHT, scale = 0.26, shadow = true}), + }}, + {n=G.UIT.C, config={align = "cm", minw = 0.1}, nodes={ + create_text_input({max_length = 8, all_caps = true, ref_table = G, ref_value = 'setup_seed', prompt_text = localize('k_enter_seed')}), + {n=G.UIT.C, config={align = "cm", minw = 0.1}, nodes={}}, + UIBox_button({label = localize('ml_paste_seed'),minw = 1, minh = 0.6, button = 'paste_seed', colour = G.C.BLUE, scale = 0.3, col = true}) + }}, + + {n=G.UIT.C, config={align = "cm", minw = 2.5}, nodes={ + }}, + }}, + config = {offset = {x=0,y=0}, parent = e, type = 'cm'} + } + e.config.object:recalculate() + end +end + +G.FUNCS.start_tutorial = function(e) + if G.OVERLAY_MENU then G.FUNCS.exit_overlay_menu() end + G.SETTINGS.tutorial_progress = + { + forced_shop = {'j_joker', 'c_empress'}, + forced_voucher = 'v_grabber', + forced_tags = {'tag_handy', 'tag_garbage'}, + hold_parts = {}, + completed_parts = {}, + } + G.SETTINGS.tutorial_complete = false + G.FUNCS.start_run(e) +end + +G.FUNCS.chip_UI_set = function(e) + local new_chips_text = number_format(G.GAME.chips) + if G.GAME.chips_text ~= new_chips_text then + e.config.scale = math.min(0.8, scale_number(G.GAME.chips, 1.1)) + G.GAME.chips_text = new_chips_text + end +end + +G.FUNCS.blind_chip_UI_scale = function(e) + if G.GAME.blind and G.GAME.blind.chips then + e.config.scale = scale_number(G.GAME.blind.chips, 0.7, 100000) + end +end + +function scale_number(number, scale, max) + G.E_SWITCH_POINT = G.E_SWITCH_POINT or 100000000000 + if not number or type(number) ~= 'number' then return scale end + if not max then max = 10000 end + if number >= G.E_SWITCH_POINT then + scale = scale*math.floor(math.log(max*10, 10))/math.floor(math.log(1000000*10, 10)) + elseif number >= max then + scale = scale*math.floor(math.log(max*10, 10))/math.floor(math.log(number*10, 10)) + end + return scale +end + +G.FUNCS.hand_mult_UI_set = function(e) + local new_mult_text = number_format(G.GAME.current_round.current_hand.mult) + if new_mult_text ~= G.GAME.current_round.current_hand.mult_text then + G.GAME.current_round.current_hand.mult_text = new_mult_text + e.config.object.scale = scale_number(G.GAME.current_round.current_hand.mult, 0.9, 1000) + e.config.object:update_text() + if not G.TAROT_INTERRUPT_PULSE then G.FUNCS.text_super_juice(e, math.max(0,math.floor(math.log10(type(G.GAME.current_round.current_hand.mult) == 'number' and G.GAME.current_round.current_hand.mult or 1)))) end + end +end + +G.FUNCS.hand_chip_UI_set = function(e) + local new_chip_text = number_format(G.GAME.current_round.current_hand.chips) + if new_chip_text ~= G.GAME.current_round.current_hand.chip_text then + G.GAME.current_round.current_hand.chip_text = new_chip_text + e.config.object.scale = scale_number(G.GAME.current_round.current_hand.chips, 0.9, 1000) + e.config.object:update_text() + if not G.TAROT_INTERRUPT_PULSE then G.FUNCS.text_super_juice(e, math.max(0,math.floor(math.log10(type(G.GAME.current_round.current_hand.chips) == 'number' and G.GAME.current_round.current_hand.chips or 1)))) end + end +end + +G.FUNCS.hand_chip_total_UI_set = function(e) + if G.GAME.current_round.current_hand.chip_total < 1 then + G.GAME.current_round.current_hand.chip_total_text = '' + else + local new_chip_total_text = number_format(G.GAME.current_round.current_hand.chip_total) + if new_chip_total_text ~= G.GAME.current_round.current_hand.chip_total_text then + e.config.object.scale = scale_number(G.GAME.current_round.current_hand.chip_total, 0.95, 100000000) + + G.GAME.current_round.current_hand.chip_total_text = new_chip_total_text + if not G.ARGS.hand_chip_total_UI_set or G.ARGS.hand_chip_total_UI_set < G.GAME.current_round.current_hand.chip_total then + G.FUNCS.text_super_juice(e, math.floor(math.log10(G.GAME.current_round.current_hand.chip_total))) + end + G.ARGS.hand_chip_total_UI_set = G.GAME.current_round.current_hand.chip_total + --e.UIBox:recalculate() + end + end +end + +function G.FUNCS.text_super_juice(e, _amount) + e.config.object:set_quiver(0.03*_amount) + e.config.object:pulse(0.3 + 0.08*_amount) + e.config.object:update_text() + e.config.object:align_letters() + e:update_object() +end + +G.FUNCS.flame_handler = function(e) + G.C.UI_CHIPLICK = G.C.UI_CHIPLICK or {1, 1, 1, 1} + G.C.UI_MULTLICK = G.C.UI_MULTLICK or {1, 1, 1, 1} + for i=1, 3 do + G.C.UI_CHIPLICK[i] = math.min(math.max(((G.C.UI_CHIPS[i]*0.5+G.C.YELLOW[i]*0.5) + 0.1)^2, 0.1), 1) + G.C.UI_MULTLICK[i] = math.min(math.max(((G.C.UI_MULT[i]*0.5+G.C.YELLOW[i]*0.5) + 0.1)^2, 0.1), 1) + end + + G.ARGS.flame_handler = G.ARGS.flame_handler or { + chips = { + id = 'flame_chips', + arg_tab = 'chip_flames', + colour = G.C.UI_CHIPS, + accent = G.C.UI_CHIPLICK + }, + mult = { + id = 'flame_mult', + arg_tab = 'mult_flames', + colour = G.C.UI_MULT, + accent = G.C.UI_MULTLICK + } + } + for k, v in pairs(G.ARGS.flame_handler) do + if e.config.id == v.id then + if not e.config.object:is(Sprite) or e.config.object.ID ~= v.ID then + e.config.object:remove() + e.config.object = Sprite(0, 0, 2.5, 2.5, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + v.ID = e.config.object.ID + G.ARGS[v.arg_tab] = { + intensity = 0, + real_intensity = 0, + intensity_vel = 0, + colour_1 = v.colour, + colour_2 = v.accent, + timer = G.TIMERS.REAL + } + e.config.object:set_alignment({ + major = e.parent, + type = 'bmi', + offset = {x=0,y=0}, + xy_bond = 'Weak' + }) + e.config.object:define_draw_steps({{ + shader = 'flame', + send = { + {name = 'time', ref_table = G.ARGS[v.arg_tab], ref_value = 'timer'}, + {name = 'amount', ref_table = G.ARGS[v.arg_tab], ref_value = 'real_intensity'}, + {name = 'image_details', ref_table = e.config.object, ref_value = 'image_dims'}, + {name = 'texture_details', ref_table = e.config.object.RETS, ref_value = 'get_pos_pixel'}, + {name = 'colour_1', ref_table = G.ARGS[v.arg_tab], ref_value = 'colour_1'}, + {name = 'colour_2', ref_table = G.ARGS[v.arg_tab], ref_value = 'colour_2'}, + {name = 'id', val = e.config.object.ID}, + }}}) + e.config.object:get_pos_pixel() + end + local _F = G.ARGS[v.arg_tab] + local exptime = math.exp(-0.4*G.real_dt) + + if G.ARGS.score_intensity.earned_score >= G.ARGS.score_intensity.required_score and G.ARGS.score_intensity.required_score > 0 then + _F.intensity = ((G.pack_cards and not G.pack_cards.REMOVED) or (G.TAROT_INTERRUPT)) and 0 or math.max(0., math.log(G.ARGS.score_intensity.earned_score, 5)-2) + else + _F.intensity = 0 + end + + _F.timer = _F.timer + G.real_dt*(1 + _F.intensity*0.2) + if _F.intensity_vel < 0 then _F.intensity_vel = _F.intensity_vel*(1 - 10*G.real_dt) end + _F.intensity_vel = (1-exptime)*(_F.intensity - _F.real_intensity)*G.real_dt*25 + exptime*_F.intensity_vel + _F.real_intensity = math.max(0, _F.real_intensity + _F.intensity_vel) + _F.change = (_F.change or 0)*(1 - 4.*G.real_dt) + ( 4.*G.real_dt)*(_F.real_intensity < _F.intensity - 0.0 and 1 or 0)*_F.real_intensity + end + end +end + +G.FUNCS.hand_text_UI_set = function(e) + if G.GAME.current_round.current_hand.handname ~= G.GAME.current_round.current_hand.handname_text then + G.GAME.current_round.current_hand.handname_text = G.GAME.current_round.current_hand.handname + if G.GAME.current_round.current_hand.handname:len() >= 13 then + e.config.object.scale = 12*0.56/G.GAME.current_round.current_hand.handname:len() + else + e.config.object.scale = 2.4/math.sqrt(G.GAME.current_round.current_hand.handname:len()+5) + end + e.config.object:update_text() + end +end + + G.FUNCS.can_play = function(e) + if #G.hand.highlighted <= 0 or G.GAME.blind.block_play or #G.hand.highlighted > 5 then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.BLUE + e.config.button = 'play_cards_from_highlighted' + end + end + + G.FUNCS.can_start_run = function(e) + if not G.GAME.viewed_back.effect.center.unlocked then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.BLUE + e.config.button = 'start_setup_run' + end + end + + G.FUNCS.visible_blind = function(e) + if next(G.GAME.blind.config.blind) then + e.states.visible = true + else + e.states.visible = false + end + end + + G.FUNCS.can_reroll = function(e) + if ((G.GAME.dollars-G.GAME.bankrupt_at) - G.GAME.current_round.reroll_cost < 0) and G.GAME.current_round.reroll_cost ~= 0 then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + --e.children[1].children[1].config.shadow = false + --e.children[2].children[1].config.shadow = false + --e.children[2].children[2].config.shadow = false + else + e.config.colour = G.C.GREEN + e.config.button = 'reroll_shop' + --e.children[1].children[1].config.shadow = true + --e.children[2].children[1].config.shadow = true + --e.children[2].children[2].config.shadow = true + end + end + + G.FUNCS.can_discard = function(e) + if G.GAME.current_round.discards_left <= 0 or #G.hand.highlighted <= 0 then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.RED + e.config.button = 'discard_cards_from_highlighted' + end + end + + G.FUNCS.can_use_consumeable = function(e) + if e.config.ref_table:can_use_consumeable() then + e.config.colour = G.C.RED + e.config.button = 'use_card' + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + end + end + + G.FUNCS.can_select_card = function(e) + if e.config.ref_table.ability.set ~= 'Joker' or (e.config.ref_table.edition and e.config.ref_table.edition.negative) or #G.jokers.cards < G.jokers.config.card_limit then + e.config.colour = G.C.GREEN + e.config.button = 'use_card' + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + end + end + + G.FUNCS.can_sell_card = function(e) + if e.config.ref_table:can_sell_card() then + e.config.colour = G.C.GREEN + e.config.button = 'sell_card' + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + end + end + + G.FUNCS.can_skip_booster = function(e) + if G.pack_cards and (G.pack_cards.cards[1]) and + (G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.STANDARD_PACK or G.STATE == G.STATES.BUFFOON_PACK or (G.hand and (G.hand.cards[1] or (G.hand.config.card_limit <= 0)))) then + e.config.colour = G.C.GREY + e.config.button = 'skip_booster' + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + end + end + + G.FUNCS.show_infotip = function(e) + if e.config.ref_table then + e.children.info = UIBox{ + definition = {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, padding = 0.02}, nodes=e.config.ref_table}, + config = {offset = {x=-0.03,y=0}, align = 'cl', parent = e} + } + e.children.info:align_to_major() + e.config.ref_table = nil + end + end + + + G.FUNCS.use_card = function(e, mute, nosave) + e.config.button = nil + local card = e.config.ref_table + local area = card.area + local prev_state = G.STATE + local dont_dissolve = nil + local delay_fac = 1 + + if card:check_use() then + G.E_MANAGER:add_event(Event({func = function() + e.disable_button = nil + e.config.button = 'use_card' + return true end })) + return + end + + if card.ability.set == 'Booster' and not nosave and G.STATE == G.STATES.SHOP then + save_with_action({ + type = 'use_card', + card = card.sort_id, + }) + end + + G.TAROT_INTERRUPT = G.STATE + if card.ability.set == 'Booster' then G.GAME.PACK_INTERRUPT = G.STATE end + G.STATE = (G.STATE == G.STATES.TAROT_PACK and G.STATES.TAROT_PACK) or + (G.STATE == G.STATES.PLANET_PACK and G.STATES.PLANET_PACK) or + (G.STATE == G.STATES.SPECTRAL_PACK and G.STATES.SPECTRAL_PACK) or + (G.STATE == G.STATES.STANDARD_PACK and G.STATES.STANDARD_PACK) or + (G.STATE == G.STATES.BUFFOON_PACK and G.STATES.BUFFOON_PACK) or + G.STATES.PLAY_TAROT + + G.CONTROLLER.locks.use = true + if G.booster_pack and not G.booster_pack.alignment.offset.py and (card.ability.consumeable or not (G.GAME.pack_choices and G.GAME.pack_choices > 1)) then + G.booster_pack.alignment.offset.py = G.booster_pack.alignment.offset.y + G.booster_pack.alignment.offset.y = G.ROOM.T.y + 29 + end + if G.shop and not G.shop.alignment.offset.py then + G.shop.alignment.offset.py = G.shop.alignment.offset.y + G.shop.alignment.offset.y = G.ROOM.T.y + 29 + end + if G.blind_select and not G.blind_select.alignment.offset.py then + G.blind_select.alignment.offset.py = G.blind_select.alignment.offset.y + G.blind_select.alignment.offset.y = G.ROOM.T.y + 39 + end + if G.round_eval and not G.round_eval.alignment.offset.py then + G.round_eval.alignment.offset.py = G.round_eval.alignment.offset.y + G.round_eval.alignment.offset.y = G.ROOM.T.y + 29 + end + + if card.children.use_button then card.children.use_button:remove(); card.children.use_button = nil end + if card.children.sell_button then card.children.sell_button:remove(); card.children.sell_button = nil end + if card.children.price then card.children.price:remove(); card.children.price = nil end + + if card.area then card.area:remove_card(card) end + + if card.ability.consumeable then + if G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.SPECTRAL_PACK then + card.T.x = G.hand.T.x + G.hand.T.w/2 - card.T.w/2 + card.T.y = G.hand.T.y + G.hand.T.h/2 - card.T.h/2 - 0.5 + discover_card(card.config.center) + else draw_card(G.hand, G.play, 1, 'up', true, card, nil, mute) end + delay(0.2) + e.config.ref_table:use_consumeable(area) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({using_consumeable = true, consumeable = card}) + end + elseif card.ability.set == 'Enhanced' or card.ability.set == 'Default' then + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + G.deck:emplace(card) + play_sound('card1', 0.8, 0.6) + play_sound('generic1') + card.playing_card = G.playing_card + playing_card_joker_effects({card}) + card:add_to_deck() + table.insert(G.playing_cards, card) + dont_dissolve = true + delay_fac = 0.2 + elseif card.ability.set == 'Joker' then + card:add_to_deck() + G.jokers:emplace(card) + play_sound('card1', 0.8, 0.6) + play_sound('generic1') + dont_dissolve = true + delay_fac = 0.2 + elseif card.ability.set == 'Booster' then + delay(0.1) + if card.ability.booster_pos then G.GAME.current_round.used_packs[card.ability.booster_pos] = 'USED' end + draw_card(G.hand, G.play, 1, 'up', true, card, nil, true) + if not card.from_tag then + G.GAME.round_scores.cards_purchased.amt = G.GAME.round_scores.cards_purchased.amt + 1 + end + e.config.ref_table:open() + elseif card.ability.set == 'Voucher' then + delay(0.1) + draw_card(G.hand, G.play, 1, 'up', true, card, nil, true) + G.GAME.round_scores.cards_purchased.amt = G.GAME.round_scores.cards_purchased.amt + 1 + e.config.ref_table:redeem() + end + if card.ability.set == 'Booster' then + G.CONTROLLER.locks.use = false + G.TAROT_INTERRUPT = nil + else + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2, + func = function() + if not dont_dissolve then card:start_dissolve() end + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1, + func = function() + G.STATE = prev_state + G.TAROT_INTERRUPT=nil + G.CONTROLLER.locks.use = false + + if (prev_state == G.STATES.TAROT_PACK or prev_state == G.STATES.PLANET_PACK or + prev_state == G.STATES.SPECTRAL_PACK or prev_state == G.STATES.STANDARD_PACK or + prev_state == G.STATES.BUFFOON_PACK) and G.booster_pack then + if area == G.consumeables then + G.booster_pack.alignment.offset.y = G.booster_pack.alignment.offset.py + G.booster_pack.alignment.offset.py = nil + elseif G.GAME.pack_choices and G.GAME.pack_choices > 1 then + if G.booster_pack.alignment.offset.py then + G.booster_pack.alignment.offset.y = G.booster_pack.alignment.offset.py + G.booster_pack.alignment.offset.py = nil + end + G.GAME.pack_choices = G.GAME.pack_choices - 1 + else + G.CONTROLLER.interrupt.focus = true + if prev_state == G.STATES.TAROT_PACK then inc_career_stat('c_tarot_reading_used', 1) end + if prev_state == G.STATES.PLANET_PACK then inc_career_stat('c_planetarium_used', 1) end + G.FUNCS.end_consumeable(nil, delay_fac) + end + else + if G.shop then + G.shop.alignment.offset.y = G.shop.alignment.offset.py + G.shop.alignment.offset.py = nil + end + if G.blind_select then + G.blind_select.alignment.offset.y = G.blind_select.alignment.offset.py + G.blind_select.alignment.offset.py = nil + end + if G.round_eval then + G.round_eval.alignment.offset.y = G.round_eval.alignment.offset.py + G.round_eval.alignment.offset.py = nil + end + if area and area.cards[1] then + G.E_MANAGER:add_event(Event({func = function() + G.E_MANAGER:add_event(Event({func = function() + G.CONTROLLER.interrupt.focus = nil + if card.ability.set == 'Voucher' then + G.CONTROLLER:snap_to({node = G.shop:get_UIE_by_ID('next_round_button')}) + elseif area then + G.CONTROLLER:recall_cardarea_focus(area) + end + return true end })) + return true end })) + end + end + return true + end})) + return true + end})) + end + end + + G.FUNCS.sell_card = function(e) + local card = e.config.ref_table + card:sell_card() + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] ~= card then + G.jokers.cards[i]:calculate_joker({selling_card = true, card = card}) + end + end + end + + G.FUNCS.can_confirm_contest_name = function(e) + if G.SETTINGS.COMP and G.SETTINGS.COMP.name ~= '' then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.PALE_GREEN + e.config.button = 'confirm_contest_name' + end + end + + G.FUNCS.confirm_contest_name = function(e) + G.SETTINGS.COMP.submission_name = true + if G.MAIN_MENU_UI then G.MAIN_MENU_UI:remove() end + if G.PROFILE_BUTTON then G.PROFILE_BUTTON:remove() end + set_main_menu_UI() + G:save_progress() + G.FILE_HANDLER.force = true + end + + G.FUNCS.change_contest_name = function(e) + G.SETTINGS.COMP.name = '' + if G.MAIN_MENU_UI then G.MAIN_MENU_UI:remove() end + if G.PROFILE_BUTTON then G.PROFILE_BUTTON:remove() end + set_main_menu_UI() + end + + G.FUNCS.skip_tutorial_section = function(e) + G.OVERLAY_TUTORIAL.skip_steps = true + + if G.OVERLAY_TUTORIAL.Jimbo then G.OVERLAY_TUTORIAL.Jimbo:remove() end + if G.OVERLAY_TUTORIAL.content then G.OVERLAY_TUTORIAL.content:remove() end + G.OVERLAY_TUTORIAL:remove() + G.OVERLAY_TUTORIAL = nil + G.E_MANAGER:clear_queue('tutorial') + if G.SETTINGS.tutorial_progress.section == 'small_blind' then + G.SETTINGS.tutorial_progress.completed_parts['small_blind'] = true + elseif G.SETTINGS.tutorial_progress.section == 'big_blind' then + G.SETTINGS.tutorial_progress.completed_parts['big_blind'] = true + G.SETTINGS.tutorial_progress.forced_tags = nil + elseif G.SETTINGS.tutorial_progress.section == 'second_hand' then + G.SETTINGS.tutorial_progress.completed_parts['second_hand'] = true + G.SETTINGS.tutorial_progress.hold_parts['second_hand'] = true + elseif G.SETTINGS.tutorial_progress.section == 'first_hand' then + G.SETTINGS.tutorial_progress.completed_parts['first_hand'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_2'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_3'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_4'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_section'] = true + elseif G.SETTINGS.tutorial_progress.section == 'shop' then + G.SETTINGS.tutorial_progress.completed_parts['shop_1'] = true + G.SETTINGS.tutorial_progress.forced_voucher = nil + end + end + +G.FUNCS.shop_voucher_empty = function(e) + if (G.shop_vouchers and G.shop_vouchers.cards and (G.shop_vouchers.cards[1] or G.GAME.current_round.voucher)) then + e.states.visible = false + elseif G.SETTINGS.language ~= 'en-us' then + e.states.visible = false + else + e.states.visible = true + end +end + +G.FUNCS.check_for_buy_space = function(card) + if card.ability.set ~= 'Voucher' and + card.ability.set ~= 'Enhanced' and + card.ability.set ~= 'Default' and + not (card.ability.set == 'Joker' and #G.jokers.cards < G.jokers.config.card_limit + ((card.edition and card.edition.negative) and 1 or 0)) and + not (card.ability.consumeable and #G.consumeables.cards < G.consumeables.config.card_limit + ((card.edition and card.edition.negative) and 1 or 0)) then + alert_no_space(card, card.ability.consumeable and G.consumeables or G.jokers) + return false + end + return true +end + +G.FUNCS.buy_from_shop = function(e) + local c1 = e.config.ref_table + if c1 and c1:is(Card) then + if e.config.id ~= 'buy_and_use' then + if not G.FUNCS.check_for_buy_space(c1) then + e.disable_button = nil + return false + end + end + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + c1.area:remove_card(c1) + c1:add_to_deck() + if c1.children.price then c1.children.price:remove() end + c1.children.price = nil + if c1.children.buy_button then c1.children.buy_button:remove() end + c1.children.buy_button = nil + remove_nils(c1.children) + if c1.ability.set == 'Default' or c1.ability.set == 'Enhanced' then + inc_career_stat('c_playing_cards_bought', 1) + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + G.deck:emplace(c1) + c1.playing_card = G.playing_card + playing_card_joker_effects({c1}) + table.insert(G.playing_cards, c1) + elseif e.config.id ~= 'buy_and_use' then + if c1.ability.consumeable then + G.consumeables:emplace(c1) + else + G.jokers:emplace(c1) + end + G.E_MANAGER:add_event(Event({func = function() c1:calculate_joker({buying_card = true, card = c1}) return true end})) + end + --Tallies for unlocks + G.GAME.round_scores.cards_purchased.amt = G.GAME.round_scores.cards_purchased.amt + 1 + if c1.ability.consumeable then + if c1.config.center.set == 'Planet' then + inc_career_stat('c_planets_bought', 1) + elseif c1.config.center.set == 'Tarot' then + inc_career_stat('c_tarots_bought', 1) + end + elseif c1.ability.set == 'Joker' then + G.GAME.current_round.jokers_purchased = G.GAME.current_round.jokers_purchased + 1 + end + + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({buying_card = true, card = c1}) + end + + if G.GAME.modifiers.inflation then + G.GAME.inflation = G.GAME.inflation + 1 + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + + play_sound('card1') + inc_career_stat('c_shop_dollars_spent', c1.cost) + if c1.cost ~= 0 then + ease_dollars(-c1.cost) + end + G.CONTROLLER:save_cardarea_focus('jokers') + G.CONTROLLER:recall_cardarea_focus('jokers') + + if e.config.id == 'buy_and_use' then + G.FUNCS.use_card(e, true) + end + return true + end + })) + end +end + + G.FUNCS.toggle_shop = function(e) + stop_use() + G.CONTROLLER.locks.toggle_shop = true + if G.shop then + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({ending_shop = true}) + end + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.shop.alignment.offset.y = G.ROOM.T.y + 29 + G.SHOP_SIGN.alignment.offset.y = -15 + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.shop:remove() + G.shop = nil + G.SHOP_SIGN:remove() + G.SHOP_SIGN = nil + G.STATE_COMPLETE = false + G.STATE = G.STATES.BLIND_SELECT + G.CONTROLLER.locks.toggle_shop = nil + return true + end + })) + end + end + + G.FUNCS.select_blind = function(e) + stop_use() + if G.blind_select then + G.GAME.facing_blind = true + G.blind_prompt_box:get_UIE_by_ID('prompt_dynatext1').config.object.pop_delay = 0 + G.blind_prompt_box:get_UIE_by_ID('prompt_dynatext1').config.object:pop_out(5) + G.blind_prompt_box:get_UIE_by_ID('prompt_dynatext2').config.object.pop_delay = 0 + G.blind_prompt_box:get_UIE_by_ID('prompt_dynatext2').config.object:pop_out(5) + + G.E_MANAGER:add_event(Event({ + trigger = 'before', delay = 0.2, + func = function() + G.blind_prompt_box.alignment.offset.y = -10 + G.blind_select.alignment.offset.y = 40 + G.blind_select.alignment.offset.x = 0 + return true + end})) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + ease_round(1) + inc_career_stat('c_rounds', 1) + if _DEMO then + G.SETTINGS.DEMO_ROUNDS = (G.SETTINGS.DEMO_ROUNDS or 0) + 1 + inc_steam_stat('demo_rounds') + G:save_settings() + end + G.GAME.round_resets.blind = e.config.ref_table + G.GAME.round_resets.blind_states[G.GAME.blind_on_deck] = 'Current' + G.blind_select:remove() + G.blind_prompt_box:remove() + G.blind_select = nil + delay(0.2) + return true + end})) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + new_round() + return true + end + })) + end + end + + G.FUNCS.skip_booster = function(e) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({skipping_booster = true}) + end + G.FUNCS.end_consumeable(e) + end + + G.FUNCS.end_consumeable = function(e, delayfac) + delayfac = delayfac or 1 + stop_use() + if G.booster_pack then + if G.booster_pack_sparkles then G.booster_pack_sparkles:fade(1*delayfac) end + if G.booster_pack_stars then G.booster_pack_stars:fade(1*delayfac) end + if G.booster_pack_meteors then G.booster_pack_meteors:fade(1*delayfac) end + G.booster_pack.alignment.offset.y = G.ROOM.T.y + 9 + + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac,blocking = false, blockable = false, + func = function() + G.booster_pack:remove() + G.booster_pack = nil + return true + end})) + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 1*delayfac,blocking = false, blockable = false, + func = function() + if G.booster_pack_sparkles then G.booster_pack_sparkles:remove(); G.booster_pack_sparkles = nil end + if G.booster_pack_stars then G.booster_pack_stars:remove(); G.booster_pack_stars = nil end + if G.booster_pack_meteors then G.booster_pack_meteors:remove(); G.booster_pack_meteors = nil end + return true + end})) + end + + delay(0.2*delayfac) + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac, + func = function() + G.FUNCS.draw_from_hand_to_deck() + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac, + func = function() + if G.shop and G.shop.alignment.offset.py then + G.shop.alignment.offset.y = G.shop.alignment.offset.py + G.shop.alignment.offset.py = nil + end + if G.blind_select and G.blind_select.alignment.offset.py then + G.blind_select.alignment.offset.y = G.blind_select.alignment.offset.py + G.blind_select.alignment.offset.py = nil + end + if G.round_eval and G.round_eval.alignment.offset.py then + G.round_eval.alignment.offset.y = G.round_eval.alignment.offset.py + G.round_eval.alignment.offset.py = nil + end + G.CONTROLLER.interrupt.focus = true + + G.E_MANAGER:add_event(Event({func = function() + if G.shop then G.CONTROLLER:snap_to({node = G.shop:get_UIE_by_ID('next_round_button')}) end + return true end })) + G.STATE = G.GAME.PACK_INTERRUPT + ease_background_colour_blind(G.GAME.PACK_INTERRUPT) + G.GAME.PACK_INTERRUPT = nil + return true + end})) + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac, + func = function() + save_run() + return true + end})) + + return true + end})) + end + + G.FUNCS.blind_choice_handler = function(e) + if not e.config.ref_table.run_info and G.blind_select and G.blind_select.VT.y < 10 and e.config.id and G.blind_select_opts[string.lower(e.config.id)] then + if e.UIBox.role.xy_bond ~= 'Weak' then e.UIBox:set_role({xy_bond = 'Weak'}) end + if (e.config.ref_table.deck ~= 'on' and e.config.id == G.GAME.blind_on_deck) or + (e.config.ref_table.deck ~= 'off' and e.config.id ~= G.GAME.blind_on_deck) then + + local _blind_choice = G.blind_select_opts[string.lower(e.config.id)] + local _top_button = e.UIBox:get_UIE_by_ID('select_blind_button') + local _border = e.UIBox.UIRoot.children[1].children[1] + local _tag = e.UIBox:get_UIE_by_ID('tag_'..e.config.id) + local _tag_container = e.UIBox:get_UIE_by_ID('tag_container') + if _tag_container and not G.SETTINGS.tutorial_complete and not G.SETTINGS.tutorial_progress.completed_parts['shop_1'] then _tag_container.states.visible = false + elseif _tag_container then _tag_container.states.visible = true end + if e.config.id == G.GAME.blind_on_deck then + e.config.ref_table.deck = 'on' + e.config.draw_after = false + e.config.colour = G.C.CLEAR + _border.parent.config.outline = 2 + _border.parent.config.outline_colour = G.C.UI.TRANSPARENT_DARK + _border.config.outline_colour = _border.config.outline and _border.config.outline_colour or get_blind_main_colour(e.config.id) + _border.config.outline = 1.5 + _blind_choice.alignment.offset.y = -0.9 + if _tag and _tag_container then + _tag_container.children[2].config.draw_after = false + _tag_container.children[2].config.colour = G.C.BLACK + _tag.children[2].config.button = 'skip_blind' + _tag.config.outline_colour = adjust_alpha(G.C.BLUE, 0.5) + _tag.children[2].config.hover = true + _tag.children[2].config.colour = G.C.RED + _tag.children[2].children[1].config.colour = G.C.UI.TEXT_LIGHT + local _sprite = _tag.config.ref_table + _sprite.config.force_focus = nil + end + if _top_button then + G.E_MANAGER:add_event(Event({func = function() + G.CONTROLLER:snap_to({node = _top_button}) + return true end })) + _top_button.config.button = 'select_blind' + _top_button.config.colour = G.C.FILTER + _top_button.config.hover = true + _top_button.children[1].config.colour = G.C.WHITE + end + elseif e.config.id ~= G.GAME.blind_on_deck then + e.config.ref_table.deck = 'off' + e.config.draw_after = true + e.config.colour = adjust_alpha(G.GAME.round_resets.blind_states[e.config.id] == 'Skipped' and mix_colours(G.C.BLUE, G.C.L_BLACK, 0.1) or G.C.L_BLACK, 0.5) + _border.parent.config.outline = nil + _border.parent.config.outline_colour = nil + _border.config.outline_colour = nil + _border.config.outline = nil + _blind_choice.alignment.offset.y = -0.2 + if _tag and _tag_container then + if G.GAME.round_resets.blind_states[e.config.id] == 'Skipped' or + G.GAME.round_resets.blind_states[e.config.id] == 'Defeated' then + _tag_container.children[2]:set_role({xy_bond = 'Weak'}) + _tag_container.children[2]:align(0, 10) + _tag_container.children[1]:set_role({xy_bond = 'Weak'}) + _tag_container.children[1]:align(0, 10) + end + if G.GAME.round_resets.blind_states[e.config.id] == 'Skipped' then + _blind_choice.children.alert = UIBox{ + definition = create_UIBox_card_alert({text_rot = -0.35, no_bg = true,text = localize('k_skipped_cap'), bump_amount = 1, scale = 0.9, maxw = 3.4}), + config = { + align="tmi", + offset = {x = 0, y = 2.2}, + major = _blind_choice, parent = _blind_choice} + } + end + _tag.children[2].config.button = nil + _tag.config.outline_colour = G.C.UI.BACKGROUND_INACTIVE + _tag.children[2].config.hover = false + _tag.children[2].config.colour = G.C.UI.BACKGROUND_INACTIVE + _tag.children[2].children[1].config.colour = G.C.UI.TEXT_INACTIVE + local _sprite = _tag.config.ref_table + _sprite.config.force_focus = true + end + if _top_button then + _top_button.config.colour = G.C.UI.BACKGROUND_INACTIVE + _top_button.config.button = nil + _top_button.config.hover = false + _top_button.children[1].config.colour = G.C.UI.TEXT_INACTIVE + end + end + end + end + end + + G.FUNCS.hover_tag_proxy = function(e) + if not e.parent or not e.parent.states then return end + if (e.states.hover.is or e.parent.states.hover.is) and (e.created_on_pause == G.SETTINGS.paused) and + not e.parent.children.alert then + local _sprite = e.config.ref_table:get_uibox_table() + e.parent.children.alert = UIBox{ + definition = G.UIDEF.card_h_popup(_sprite), + config = {align="tm", offset = {x = 0, y = -0.1}, + major = e.parent, + instance_type = 'POPUP'}, + } + _sprite:juice_up(0.05, 0.02) + play_sound('paper1', math.random()*0.1 + 0.55, 0.42) + play_sound('tarot2', math.random()*0.1 + 0.55, 0.09) + e.parent.children.alert.states.collide.can = false + elseif e.parent.children.alert and + ((not e.states.collide.is and not e.parent.states.collide.is) or (e.created_on_pause ~= G.SETTINGS.paused)) then + e.parent.children.alert:remove() + e.parent.children.alert = nil + end + end + + G.FUNCS.skip_blind = function(e) + stop_use() + G.CONTROLLER.locks.skip_blind = true + G.E_MANAGER:add_event(Event({ + no_delete = true, + trigger = 'after', + blocking = false,blockable = false, + delay = 2.5, + timer = 'TOTAL', + func = function() + G.CONTROLLER.locks.skip_blind = nil + return true + end + })) + local _tag = e.UIBox:get_UIE_by_ID('tag_container') + G.GAME.skips = (G.GAME.skips or 0) + 1 + if _tag then + add_tag(_tag.config.ref_table) + local skipped, skip_to = G.GAME.blind_on_deck or 'Small', + G.GAME.blind_on_deck == 'Small' and 'Big' or G.GAME.blind_on_deck == 'Big' and 'Boss' or 'Boss' + G.GAME.round_resets.blind_states[skipped] = 'Skipped' + G.GAME.round_resets.blind_states[skip_to] = 'Select' + G.GAME.blind_on_deck = skip_to + play_sound('generic1') + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + delay(0.3) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({skip_blind = true}) + end + save_run() + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'immediate'}) + end + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + return true + end + })) + end + end + + G.FUNCS.reroll_boss_button = function(e) + if ((G.GAME.dollars-G.GAME.bankrupt_at) - 10 >= 0) and + (G.GAME.used_vouchers["v_retcon"] or + (G.GAME.used_vouchers["v_directors_cut"] and not G.GAME.round_resets.boss_rerolled)) then + e.config.colour = G.C.RED + e.config.button = 'reroll_boss' + e.children[1].children[1].config.shadow = true + if e.children[2] then e.children[2].children[1].config.shadow = true end + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + e.children[1].children[1].config.shadow = false + if e.children[2] then e.children[2].children[1].config.shadow = false end + end + end + + G.FUNCS.reroll_boss = function(e) + stop_use() + G.GAME.round_resets.boss_rerolled = true + if not G.from_boss_tag then ease_dollars(-10) end + G.from_boss_tag = nil + G.CONTROLLER.locks.boss_reroll = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + play_sound('other1') + G.blind_select_opts.boss:set_role({xy_bond = 'Weak'}) + G.blind_select_opts.boss.alignment.offset.y = 20 + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = (function() + local par = G.blind_select_opts.boss.parent + G.GAME.round_resets.blind_choices.Boss = get_new_boss() + + G.blind_select_opts.boss:remove() + G.blind_select_opts.boss = UIBox{ + T = {par.T.x, 0, 0, 0, }, + definition = + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + UIBox_dyn_container({create_UIBox_blind_choice('Boss')},false,get_blind_main_colour('Boss'), mix_colours(G.C.BLACK, get_blind_main_colour('Boss'), 0.8)) + }}, + config = {align="bmi", + offset = {x=0,y=G.ROOM.T.y + 9}, + major = par, + xy_bond = 'Weak' + } + } + par.config.object = G.blind_select_opts.boss + par.config.object:recalculate() + G.blind_select_opts.boss.parent = par + G.blind_select_opts.boss.alignment.offset.y = 0 + + G.E_MANAGER:add_event(Event({blocking = false, trigger = 'after', delay = 0.5,func = function() + G.CONTROLLER.locks.boss_reroll = nil + return true + end + })) + + save_run() + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + return true + end) + })) + end + + G.FUNCS.reroll_shop = function(e) + stop_use() + G.CONTROLLER.locks.shop_reroll = true + if G.CONTROLLER:save_cardarea_focus('shop_jokers') then G.CONTROLLER.interrupt.focus = true end + if G.GAME.current_round.reroll_cost > 0 then + inc_career_stat('c_shop_dollars_spent', G.GAME.current_round.reroll_cost) + inc_career_stat('c_shop_rerolls', 1) + ease_dollars(-G.GAME.current_round.reroll_cost) + end + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local final_free = G.GAME.current_round.free_rerolls > 0 + G.GAME.current_round.free_rerolls = math.max(G.GAME.current_round.free_rerolls - 1, 0) + G.GAME.round_scores.times_rerolled.amt = G.GAME.round_scores.times_rerolled.amt + 1 + + calculate_reroll_cost(final_free) + for i = #G.shop_jokers.cards,1, -1 do + local c = G.shop_jokers:remove_card(G.shop_jokers.cards[i]) + c:remove() + c = nil + end + + --save_run() + + play_sound('coin2') + play_sound('other1') + + for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do + local new_shop_card = create_card_for_shop(G.shop_jokers) + G.shop_jokers:emplace(new_shop_card) + new_shop_card:juice_up() + end + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + G.CONTROLLER.interrupt.focus = false + G.CONTROLLER.locks.shop_reroll = false + G.CONTROLLER:recall_cardarea_focus('shop_jokers') + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({reroll_shop = true}) + end + return true + end + })) + return true + end + })) + G.E_MANAGER:add_event(Event({ func = function() save_run(); return true end})) + end + +G.FUNCS.cash_out = function(e) + stop_use() + if G.round_eval then + e.config.button = nil + G.round_eval.alignment.offset.y = G.ROOM.T.y + 15 + G.round_eval.alignment.offset.x = 0 + G.deck:shuffle('cashout'..G.GAME.round_resets.ante) + G.deck:hard_set_T() + delay(0.3) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if G.round_eval then + G.round_eval:remove() + G.round_eval = nil + end + G.GAME.current_round.jokers_purchased = 0 + G.GAME.current_round.discards_left = math.max(0, G.GAME.round_resets.discards + G.GAME.round_bonus.discards) + G.GAME.current_round.hands_left = (math.max(1, G.GAME.round_resets.hands + G.GAME.round_bonus.next_hands)) + G.STATE = G.STATES.SHOP + G.GAME.shop_free = nil + G.GAME.shop_d6ed = nil + G.STATE_COMPLETE = false + return true + end + })) + ease_dollars(G.GAME.current_round.dollars) + G.E_MANAGER:add_event(Event({ + func = function() + G.GAME.previous_round.dollars = G.GAME.dollars + return true + end + })) + play_sound("coin7") + G.VIBRATION = G.VIBRATION + 1 + end + ease_chips(0) + if G.GAME.round_resets.blind_states.Boss == 'Defeated' then + G.GAME.round_resets.blind_ante = G.GAME.round_resets.ante + G.GAME.round_resets.blind_tags.Small = get_next_tag_key() + G.GAME.round_resets.blind_tags.Big = get_next_tag_key() + end + reset_blinds() + delay(0.6) +end + +G.FUNCS.start_run = function(e, args) + G.SETTINGS.paused = true + if e and e.config.id == 'restart_button' then G.GAME.viewed_back = nil end + G.E_MANAGER:clear_queue() + G.FUNCS.wipe_on() + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + G:delete_run() + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + no_delete = true, + func = function() + G:start_run(args) + return true + end + })) + G.FUNCS.wipe_off() +end + +G.FUNCS.go_to_menu = function(e) + G.SETTINGS.paused = true + G.E_MANAGER:clear_queue() + G.FUNCS.wipe_on() + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + G:delete_run() + return true + end + })) + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = true, + blocking = false, + func = function() + G:main_menu('game') + return true + end + })) + G.FUNCS.wipe_off() +end + +G.FUNCS.go_to_demo_cta = function(e) + G.SETTINGS.paused = true + G.E_MANAGER:clear_queue(nil, G.exception_queue) + play_sound('explosion_buildup1', nil, 0.3) + play_sound('whoosh1', 0.7, 0.8) + play_sound('introPad1', 0.704, 0.8) + G.video_organ = 0.6 + G.FUNCS.wipe_on(nil, true, nil, G.C.WHITE) + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + G:delete_run() + return true + end + })) + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = true, + blocking = false, + func = function() + G:demo_cta() + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, + no_delete = true, + blockable = false, + blocking = false, + func = function() + G.video_organ = nil + G.normal_music_speed = nil + return true + end })) + return true + end + })) + G.FUNCS.wipe_off() +end + +G.FUNCS.show_main_cta = function(e) + if e then + if e.config.id == 'lose_cta' and not G.SETTINGS.DEMO.lose_CTA_shown then + G.SETTINGS.DEMO.lose_CTA_shown = true + end + if e.config.id == 'win_cta' and not G.SETTINGS.DEMO.win_CTA_shown then + G.SETTINGS.DEMO.win_CTA_shown = true + end + end + + G:save_progress() + + G.SETTINGS.paused = true + G.normal_music_speed = true + + G.FUNCS.overlay_menu{ + definition = create_UIBox_demo_video_CTA(), + config = {no_esc = true} + } +end + +G.FUNCS.wipe_on = function(message, no_card, timefac, alt_colour) + timefac = timefac or 1 + if G.screenwipe then return end + G.CONTROLLER.locks.wipe = true + G.STAGE_OBJECT_INTERRUPT = true + local colours = { + black = HEX("4f6367FF"), + white = {1, 1, 1, 1} + } + if not no_card then + G.screenwipecard = Card(1, 1, G.CARD_W, G.CARD_H, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base) + G.screenwipecard.sprite_facing = 'back' + G.screenwipecard.facing = 'back' + G.screenwipecard.states.hover.can = false + G.screenwipecard:juice_up(0.5, 1) + end + local message_t = nil + if message then + message_t = {} + for k, v in ipairs(message) do + table.insert(message_t, {n=G.UIT.R, config={align = "cm"}, nodes={{n=G.UIT.O, config={object = DynaText({string = v or '', colours = {math.min(G.C.BACKGROUND.C[1], G.C.BACKGROUND.C[2]) > 0.5 and G.C.BLACK or G.C.WHITE},shadow = true, silent = k ~= 1, float = true, scale = 1.3, pop_in = 0, pop_in_rate = 2, rotate = 1})}}}}) + end + end + + G.screenwipe = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = "cm", minw =0, minh =0 ,padding = 0.15, r = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + message and {n=G.UIT.R, config={id = 'text', align = "cm", padding = 0.7}, nodes=message_t} or nil, + not no_card and {n=G.UIT.O, config={object = G.screenwipecard, role = {role_type = 'Major'}}} or nil + }}, + }}, + config = {align="cm", offset = {x=0,y=0}, major = G.ROOM_ATTACH} + } + G.screenwipe.colours = colours + G.screenwipe.children.particles = Particles(0, 0, 0,0, { + timer = 0, + max = 1, + scale = 40, + speed = 0, + lifespan = 1.7*timefac, + attach = G.screenwipe, + colours = {alt_colour or G.C.BACKGROUND.C} + }) + G.STAGE_OBJECT_INTERRUPT = nil + G.screenwipe.alignment.offset.y = 0 + if message then + for k, v in ipairs(G.screenwipe:get_UIE_by_ID('text').children) do + v.children[1].config.object:pulse() + end + end + + + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.7, + no_delete = true, + blockable = false, + func = function() + if not no_card then + G.screenwipecard:flip() + play_sound('cardFan2') + end + return true + end + })) +end + +G.FUNCS.wipe_off = function() + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + delay(0.3) + G.screenwipe.children.particles.max = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + no_delete = true, + blockable = false, + blocking = false, + timer = 'REAL', + ref_table = G.screenwipe.colours.black, + ref_value = 4, + ease_to = 0, + delay = 0.3, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + no_delete = true, + blockable = false, + blocking = false, + timer = 'REAL', + ref_table = G.screenwipe.colours.white, + ref_value = 4, + ease_to = 0, + delay = 0.3, + func = (function(t) return t end) + })) + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.55, + no_delete = true, + blocking = false, + timer = 'REAL', + func = function() + if G.screenwipecard then G.screenwipecard:start_dissolve({G.C.BLACK, G.C.ORANGE,G.C.GOLD, G.C.RED}) end + if G.screenwipe:get_UIE_by_ID('text') then + for k, v in ipairs(G.screenwipe:get_UIE_by_ID('text').children) do + v.children[1].config.object:pop_out(4) + end + end + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.1, + no_delete = true, + blocking = false, + timer = 'REAL', + func = function() + G.screenwipe.children.particles:remove() + G.screenwipe:remove() + G.screenwipe.children.particles = nil + G.screenwipe = nil + G.screenwipecard = nil + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.2, + no_delete = true, + blocking = true, + timer = 'REAL', + func = function() + return true + end + })) +end diff --git a/src/functions/common_events.lua b/src/functions/common_events.lua new file mode 100644 index 0000000..daf4539 --- /dev/null +++ b/src/functions/common_events.lua @@ -0,0 +1,2745 @@ +function set_screen_positions() + if G.STAGE == G.STAGES.RUN then + G.hand.T.x = G.TILE_W - G.hand.T.w - 2.85 + G.hand.T.y = G.TILE_H - G.hand.T.h + + G.play.T.x = G.hand.T.x + (G.hand.T.w - G.play.T.w)/2 + G.play.T.y = G.hand.T.y - 3.6 + + G.jokers.T.x = G.hand.T.x - 0.1 + G.jokers.T.y = 0 + + G.consumeables.T.x = G.jokers.T.x + G.jokers.T.w + 0.2 + G.consumeables.T.y = 0 + + G.deck.T.x = G.TILE_W - G.deck.T.w - 0.5 + G.deck.T.y = G.TILE_H - G.deck.T.h + + G.discard.T.x = G.jokers.T.x + G.jokers.T.w/2 + 0.3 + 15 + G.discard.T.y = 4.2 + + G.hand:hard_set_VT() + G.play:hard_set_VT() + G.jokers:hard_set_VT() + G.consumeables:hard_set_VT() + G.deck:hard_set_VT() + G.discard:hard_set_VT() + end + if G.STAGE == G.STAGES.MAIN_MENU then + if G.STATE == G.STATES.DEMO_CTA then + G.title_top.T.x = G.TILE_W/2 - G.title_top.T.w/2 + G.title_top.T.y = G.TILE_H/2 - G.title_top.T.h/2 - 2 + else + G.title_top.T.x = G.TILE_W/2 - G.title_top.T.w/2 + G.title_top.T.y = G.TILE_H/2 - G.title_top.T.h/2 -(G.debug_splash_size_toggle and 2 or 1.2)--||||||||||||||||| + end + + G.title_top:hard_set_VT() + end +end + +function ease_chips(mod) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local chip_UI = G.HUD:get_UIE_by_ID('chip_UI_count') + + mod = mod or 0 + + --Ease from current chips to the new number of chips + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = G.GAME, + ref_value = 'chips', + ease_to = mod, + delay = 0.3, + func = (function(t) return math.floor(t) end) + })) + --Popup text next to the chips in UI showing number of chips gained/lost + chip_UI:juice_up() + --Play a chip sound + play_sound('chips2') + return true + end + })) +end + +function ease_dollars(mod, instant) + local function _mod(mod) + local dollar_UI = G.HUD:get_UIE_by_ID('dollar_text_UI') + mod = mod or 0 + local text = '+'..localize('$') + local col = G.C.MONEY + if mod < 0 then + text = '-'..localize('$') + col = G.C.RED + else + inc_career_stat('c_dollars_earned', mod) + end + --Ease from current chips to the new number of chips + G.GAME.dollars = G.GAME.dollars + mod + check_and_set_high_score('most_money', G.GAME.dollars) + check_for_unlock({type = 'money'}) + dollar_UI.config.object:update() + G.HUD:recalculate() + --Popup text next to the chips in UI showing number of chips gained/lost + attention_text({ + text = text..tostring(math.abs(mod)), + scale = 0.8, + hold = 0.7, + cover = dollar_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + play_sound('coin1') + end + if instant then + _mod(mod) + else + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + _mod(mod) + return true + end + })) + end +end + +function ease_discard(mod, instant, silent) + local _mod = function(mod) + if math.abs(math.max(G.GAME.current_round.discards_left, mod)) == 0 then return end + local discard_UI = G.HUD:get_UIE_by_ID('discard_UI_count') + mod = mod or 0 + mod = math.max(-G.GAME.current_round.discards_left, mod) + local text = '+' + local col = G.C.GREEN + if mod < 0 then + text = '' + col = G.C.RED + end + --Ease from current chips to the new number of chips + G.GAME.current_round.discards_left = G.GAME.current_round.discards_left + mod + --Popup text next to the chips in UI showing number of chips gained/lost + discard_UI.config.object:update() + G.HUD:recalculate() + attention_text({ + text = text..mod, + scale = 0.8, + hold = 0.7, + cover = discard_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + if not silent then play_sound('chips2') end + end + if instant then + _mod(mod) + else + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + _mod(mod) + return true + end + })) + end +end + +function ease_hands_played(mod, instant) + local _mod = function(mod) + local hand_UI = G.HUD:get_UIE_by_ID('hand_UI_count') + mod = mod or 0 + local text = '+' + local col = G.C.GREEN + if mod < 0 then + text = '' + col = G.C.RED + end + --Ease from current chips to the new number of chips + G.GAME.current_round.hands_left = G.GAME.current_round.hands_left + mod + hand_UI.config.object:update() + G.HUD:recalculate() + --Popup text next to the chips in UI showing number of chips gained/lost + attention_text({ + text = text..mod, + scale = 0.8, + hold = 0.7, + cover = hand_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + play_sound('chips2') + end + if instant then + _mod(mod) + else + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + _mod(mod) + return true + end + })) + end +end + +function ease_ante(mod) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local ante_UI = G.hand_text_area.ante + mod = mod or 0 + local text = '+' + local col = G.C.IMPORTANT + if mod < 0 then + text = '-' + col = G.C.RED + end + G.GAME.round_resets.ante = G.GAME.round_resets.ante + mod + check_and_set_high_score('furthest_ante', G.GAME.round_resets.ante) + ante_UI.config.object:update() + G.HUD:recalculate() + --Popup text next to the chips in UI showing number of chips gained/lost + attention_text({ + text = text..tostring(math.abs(mod)), + scale = 1, + hold = 0.7, + cover = ante_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + play_sound('highlight2', 0.685, 0.2) + play_sound('generic1') + return true + end + })) +end + +function ease_round(mod) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local round_UI = G.hand_text_area.round + mod = mod or 0 + local text = '+' + local col = G.C.IMPORTANT + if mod < 0 then + text = '' + col = G.C.RED + end + G.GAME.round = G.GAME.round + mod + check_and_set_high_score('furthest_round', G.GAME.round) + check_and_set_high_score('furthest_ante', G.GAME.round_resets.ante) + round_UI.config.object:update() + G.HUD:recalculate() + --Popup text next to the chips in UI showing number of chips gained/lost + attention_text({ + text = text..tostring(math.abs(mod)), + scale = 1, + hold = 0.7, + cover = round_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + play_sound('timpani', 0.8) + play_sound('generic1') + return true + end + })) +end + +function ease_value(ref_table, ref_value, mod, floored, timer_type, not_blockable, delay, ease_type) + mod = mod or 0 + + --Ease from current chips to the new number of chips + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = (not_blockable == false), + blocking = false, + ref_table = ref_table, + ref_value = ref_value, + ease_to = ref_table[ref_value] + mod, + timer = timer_type, + delay = delay or 0.3, + type = ease_type or nil, + func = (function(t) if floored then return math.floor(t) else return t end end) + })) +end + +function ease_background_colour(args) + for k, v in pairs(G.C.BACKGROUND) do + if args.new_colour and (k == 'C' or k == 'L' or k == 'D') then + if args.special_colour and args.tertiary_colour then + local col_key = k == 'L' and 'new_colour' or k == 'C' and 'special_colour' or k == 'D' and 'tertiary_colour' + ease_value(v, 1, args[col_key][1] - v[1], false, nil, true, 0.6) + ease_value(v, 2, args[col_key][2] - v[2], false, nil, true, 0.6) + ease_value(v, 3, args[col_key][3] - v[3], false, nil, true, 0.6) + else + local brightness = k == 'L' and 1.3 or k == 'D' and (args.special_colour and 0.4 or 0.7) or 0.9 + if k == 'C' and args.special_colour then + ease_value(v, 1, args.special_colour[1] - v[1], false, nil, true, 0.6) + ease_value(v, 2, args.special_colour[2] - v[2], false, nil, true, 0.6) + ease_value(v, 3, args.special_colour[3] - v[3], false, nil, true, 0.6) + else + ease_value(v, 1, args.new_colour[1]*brightness - v[1], false, nil, true, 0.6) + ease_value(v, 2, args.new_colour[2]*brightness - v[2], false, nil, true, 0.6) + ease_value(v, 3, args.new_colour[3]*brightness - v[3], false, nil, true, 0.6) + end + end + end + end + if args.contrast then + ease_value(G.C.BACKGROUND, 'contrast', args.contrast - G.C.BACKGROUND.contrast, false, nil, true, 0.6) + end +end + +function ease_colour(old_colour, new_colour, delay) + ease_value(old_colour, 1, new_colour[1] - old_colour[1], false, 'REAL', nil, delay) + ease_value(old_colour, 2, new_colour[2] - old_colour[2], false, 'REAL', nil, delay) + ease_value(old_colour, 3, new_colour[3] - old_colour[3], false, 'REAL', nil, delay) + ease_value(old_colour, 4, new_colour[4] - old_colour[4], false, 'REAL', nil, delay) +end + + +function ease_background_colour_blind(state, blind_override) + local blindname = ((blind_override or (G.GAME.blind and G.GAME.blind.name ~= '' and G.GAME.blind.name)) or 'Small Blind') + local blindname = (blindname == '' and 'Small Blind' or blindname) + + --For the blind related colours + if state == G.STATES.SHOP then + ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.RED, G.C.BLACK, 0.9)) + elseif state == G.STATES.TAROT_PACK then + ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.WHITE, G.C.BLACK, 0.9)) + elseif state == G.STATES.SPECTRAL_PACK then + ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.SECONDARY_SET.Spectral, G.C.BLACK, 0.9)) + elseif state == G.STATES.STANDARD_PACK then + ease_colour(G.C.DYN_UI.MAIN, G.C.RED) + elseif state == G.STATES.BUFFOON_PACK then + ease_colour(G.C.DYN_UI.MAIN, G.C.FILTER) + elseif state == G.STATES.PLANET_PACK then + ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.SECONDARY_SET.Planet, G.C.BLACK, 0.9)) + elseif G.GAME.blind then + G.GAME.blind:change_colour() + end + --For the actual background colour + if state == G.STATES.TAROT_PACK then + ease_background_colour{new_colour = G.C.PURPLE, special_colour = darken(G.C.BLACK, 0.2), contrast = 1.5} + elseif state == G.STATES.SPECTRAL_PACK then + ease_background_colour{new_colour = G.C.SECONDARY_SET.Spectral, special_colour = darken(G.C.BLACK, 0.2), contrast = 2} + elseif state == G.STATES.STANDARD_PACK then + ease_background_colour{new_colour = darken(G.C.BLACK, 0.2), special_colour = G.C.RED, contrast = 3} + elseif state == G.STATES.BUFFOON_PACK then + ease_background_colour{new_colour = G.C.FILTER, special_colour = G.C.BLACK, contrast = 2} + elseif state == G.STATES.PLANET_PACK then + ease_background_colour{new_colour = G.C.BLACK, contrast = 3} + elseif G.GAME.won then + ease_background_colour{new_colour = G.C.BLIND.won, contrast = 1} + elseif blindname == 'Small Blind' or blindname == 'Big Blind' or blindname == '' then + ease_background_colour{new_colour = G.C.BLIND['Small'], contrast = 1} + else + + local boss_col = G.C.BLACK + for k, v in pairs(G.P_BLINDS) do + if v.name == blindname then + if v.boss.showdown then + ease_background_colour{new_colour = G.C.BLUE, special_colour = G.C.RED, tertiary_colour = darken(G.C.BLACK, 0.4), contrast = 3} + return + end + boss_col = v.boss_colour or G.C.BLACK + end + end + ease_background_colour{new_colour = lighten(mix_colours(boss_col, G.C.BLACK, 0.3), 0.1), special_colour = boss_col, contrast = 2} + end +end + +function delay(time, queue) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = time or 1, + func = function() + return true + end + }), queue) +end + +function add_joker(joker, edition, silent, eternal) + local _area = G.P_CENTERS[joker].consumeable and G.consumeables or G.jokers + local _T = _area and _area.T or {x = G.ROOM.T.w/2 - G.CARD_W/2, y = G.ROOM.T.h/2 - G.CARD_H/2} + local card = Card(_T.x, _T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[joker],{discover = true, bypass_discovery_center = true, bypass_discovery_ui = true, bypass_back = G.GAME.selected_back.pos }) + card:start_materialize(nil, silent) + if _area then card:add_to_deck() end + if edition then card:set_edition{[edition] = true} end + if eternal then card:set_eternal(true) end + if _area and card.ability.set == 'Joker' then _area:emplace(card) + elseif G.consumeables then G.consumeables:emplace(card) end + card.created_on_pause = nil + return card +end + +function draw_card(from, to, percent, dir, sort, card, delay, mute, stay_flipped, vol, discarded_only) + percent = percent or 50 + delay = delay or 0.1 + if dir == 'down' then + percent = 1-percent + end + sort = sort or false + local drawn = nil + + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = delay, + func = function() + if card then + if from then card = from:remove_card(card) end + if card then drawn = true end + local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(to, card) + if G.GAME.modifiers.flipped_cards and to == G.hand then + if pseudorandom(pseudoseed('flipped_card')) < 1/G.GAME.modifiers.flipped_cards then + stay_flipped = true + end + end + to:emplace(card, nil, stay_flipped) + else + if to:draw_card_from(from, stay_flipped, discarded_only) then drawn = true end + end + if not mute and drawn then + if from == G.deck or from == G.hand or from == G.play or from == G.jokers or from == G.consumeables or from == G.discard then + G.VIBRATION = G.VIBRATION + 0.6 + end + play_sound('card1', 0.85 + percent*0.2/100, 0.6*(vol or 1)) + end + if sort then + to:sort() + end + return true + end + })) +end + +function highlight_card(card, percent, dir) + percent = percent or 0.5 + local highlight = true + if dir == 'down' then + percent = 1-percent + highlight = false + end + + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.1, + func = function() + card:highlight(highlight) + play_sound('cardSlide1', 0.85 + percent*0.2) + return true + end + })) +end + +function play_area_status_text(text, silent, delay) + local delay = delay or 0.6 + G.E_MANAGER:add_event(Event({ + trigger = (delay==0 and 'immediate' or 'before'), + delay = delay, + func = function() + attention_text({ + scale = 0.9, text = text, hold = 0.9, align = 'tm', + major = G.play, offset = {x = 0, y = -1} + }) + if not silent then + G.ROOM.jiggle = G.ROOM.jiggle + 2 + play_sound('cardFan2') + end + return true + end + })) +end + +function level_up_hand(card, hand, instant, amount) + amount = amount or 1 + G.GAME.hands[hand].level = math.max(0, G.GAME.hands[hand].level + amount) + G.GAME.hands[hand].mult = math.max(G.GAME.hands[hand].s_mult + G.GAME.hands[hand].l_mult*(G.GAME.hands[hand].level - 1), 1) + G.GAME.hands[hand].chips = math.max(G.GAME.hands[hand].s_chips + G.GAME.hands[hand].l_chips*(G.GAME.hands[hand].level - 1), 0) + if not instant then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() + play_sound('tarot1') + if card then card:juice_up(0.8, 0.5) end + G.TAROT_INTERRUPT_PULSE = true + return true end })) + update_hand_text({delay = 0}, {mult = G.GAME.hands[hand].mult, StatusText = true}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.9, func = function() + play_sound('tarot1') + if card then card:juice_up(0.8, 0.5) end + return true end })) + update_hand_text({delay = 0}, {chips = G.GAME.hands[hand].chips, StatusText = true}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.9, func = function() + play_sound('tarot1') + if card then card:juice_up(0.8, 0.5) end + G.TAROT_INTERRUPT_PULSE = nil + return true end })) + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.9, delay = 0}, {level=G.GAME.hands[hand].level}) + delay(1.3) + end + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() check_for_unlock{type = 'upgrade_hand', hand = hand, level = G.GAME.hands[hand].level} return true end) + })) +end + +function update_hand_text(config, vals) + G.E_MANAGER:add_event(Event({--This is the Hand name text for the poker hand + trigger = 'before', + blockable = not config.immediate, + delay = config.delay or 0.8, + func = function() + local col = G.C.GREEN + if vals.chips and G.GAME.current_round.current_hand.chips ~= vals.chips then + local delta = (type(vals.chips) == 'number' and type(G.GAME.current_round.current_hand.chips) == 'number') and (vals.chips - G.GAME.current_round.current_hand.chips) or 0 + if delta < 0 then delta = ''..delta; col = G.C.RED + elseif delta > 0 then delta = '+'..delta + else delta = ''..delta + end + if type(vals.chips) == 'string' then delta = vals.chips end + G.GAME.current_round.current_hand.chips = vals.chips + G.hand_text_area.chips:update(0) + if vals.StatusText then + attention_text({ + text =delta, + scale = 0.8, + hold = 1, + cover = G.hand_text_area.chips.parent, + cover_colour = mix_colours(G.C.CHIPS, col, 0.1), + emboss = 0.05, + align = 'cm', + cover_align = 'cr' + }) + end + end + if vals.mult and G.GAME.current_round.current_hand.mult ~= vals.mult then + local delta = (type(vals.mult) == 'number' and type(G.GAME.current_round.current_hand.mult) == 'number')and (vals.mult - G.GAME.current_round.current_hand.mult) or 0 + if delta < 0 then delta = ''..delta; col = G.C.RED + elseif delta > 0 then delta = '+'..delta + else delta = ''..delta + end + if type(vals.mult) == 'string' then delta = vals.mult end + G.GAME.current_round.current_hand.mult = vals.mult + G.hand_text_area.mult:update(0) + if vals.StatusText then + attention_text({ + text =delta, + scale = 0.8, + hold = 1, + cover = G.hand_text_area.mult.parent, + cover_colour = mix_colours(G.C.MULT, col, 0.1), + emboss = 0.05, + align = 'cm', + cover_align = 'cl' + }) + end + if not G.TAROT_INTERRUPT then G.hand_text_area.mult:juice_up() end + end + if vals.handname and G.GAME.current_round.current_hand.handname ~= vals.handname then + G.GAME.current_round.current_hand.handname = vals.handname + if not config.nopulse then + G.hand_text_area.handname.config.object:pulse(0.2) + end + end + if vals.chip_total then G.GAME.current_round.current_hand.chip_total = vals.chip_total;G.hand_text_area.chip_total.config.object:pulse(0.5) end + if vals.level and G.GAME.current_round.current_hand.hand_level ~= ' '..localize('k_lvl')..tostring(vals.level) then + if vals.level == '' then + G.GAME.current_round.current_hand.hand_level = vals.level + else + G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level) + if type(vals.level) == 'number' then + G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[math.min(vals.level, 7)] + else + G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1] + end + G.hand_text_area.hand_level:juice_up() + end + end + if config.sound and not config.modded then play_sound(config.sound, config.pitch or 1, config.volume or 1) end + if config.modded then + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_1'):juice_up(0.3, 0) + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_2'):juice_up(0.3, 0) + G.GAME.blind:juice_up() + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + end + return true + end})) +end + +function eval_card(card, context) + context = context or {} + local ret = {} + + if context.repetition_only then + local seals = card:calculate_seal(context) + if seals then + ret.seals = seals + end + return ret + end + + if context.cardarea == G.play then + local chips = card:get_chip_bonus() + if chips > 0 then + ret.chips = chips + end + + local mult = card:get_chip_mult() + if mult > 0 then + ret.mult = mult + end + + local x_mult = card:get_chip_x_mult(context) + if x_mult > 0 then + ret.x_mult = x_mult + end + + local p_dollars = card:get_p_dollars() + if p_dollars > 0 then + ret.p_dollars = p_dollars + end + + local jokers = card:calculate_joker(context) + if jokers then + ret.jokers = jokers + end + + local edition = card:get_edition(context) + if edition then + ret.edition = edition + end + end + + if context.cardarea == G.hand then + local h_mult = card:get_chip_h_mult() + if h_mult > 0 then + ret.h_mult = h_mult + end + + local h_x_mult = card:get_chip_h_x_mult() + if h_x_mult > 0 then + ret.x_mult = h_x_mult + end + + local jokers = card:calculate_joker(context) + if jokers then + ret.jokers = jokers + end + end + + if context.cardarea == G.jokers or context.card == G.consumeables then + local jokers = nil + if context.edition then + jokers = card:get_edition(context) + elseif context.other_joker then + jokers = context.other_joker:calculate_joker(context) + else + jokers = card:calculate_joker(context) + end + if jokers then + ret.jokers = jokers + end + end + + return ret +end + +function set_alerts() + if G.REFRESH_ALERTS then + G.REFRESH_ALERTS = nil + local alert_joker, alert_voucher, alert_tarot, alert_planet, alert_spectral, alert_blind, alert_edition, alert_tag, alert_seal, alert_booster = false,false,false,false,false,false,false,false,false,false + for k, v in pairs(G.P_CENTERS) do + if v.discovered and not v.alerted then + if v.set == 'Voucher' then alert_voucher = true end + if v.set == 'Tarot' then alert_tarot = true end + if v.set == 'Planet' then alert_planet = true end + if v.set == 'Spectral' then alert_spectral = true end + if v.set == 'Joker' then alert_joker = true end + if v.set == 'Edition' then alert_edition = true end + if v.set == 'Booster' then alert_booster = true end + end + end + for k, v in pairs(G.P_BLINDS) do + if v.discovered and not v.alerted then + alert_blind = true + end + end + for k, v in pairs(G.P_TAGS) do + if v.discovered and not v.alerted then + alert_tag = true + end + end + for k, v in pairs(G.P_SEALS) do + if v.discovered and not v.alerted then + alert_seal = true + end + end + + local alert_any = alert_voucher or alert_joker or alert_tarot or alert_planet or alert_spectral or alert_blind or alert_edition or alert_seal or alert_tag + + G.ARGS.set_alerts_alertables = G.ARGS.set_alerts_alertables or { + {id = 'your_collection', alert_uibox_name = 'your_collection_alert'}, + {id = 'your_collection_jokers', alert_uibox_name = 'your_collection_jokers_alert'}, + {id = 'your_collection_tarots', alert_uibox_name = 'your_collection_tarots_alert'}, + {id = 'your_collection_planets', alert_uibox_name = 'your_collection_planets_alert'}, + {id = 'your_collection_spectrals', alert_uibox_name = 'your_collection_spectrals_alert'}, + {id = 'your_collection_vouchers', alert_uibox_name = 'your_collection_vouchers_alert'}, + {id = 'your_collection_editions', alert_uibox_name = 'your_collection_editions_alert'}, + {id = 'your_collection_blinds', alert_uibox_name = 'your_collection_blinds_alert'}, + {id = 'your_collection_tags', alert_uibox_name = 'your_collection_tags_alert'}, + {id = 'your_collection_seals', alert_uibox_name = 'your_collection_seals_alert'}, + {id = 'your_collection_boosters', alert_uibox_name = 'your_collection_boosters_alert'}, + } + G.ARGS.set_alerts_alertables[1].should_alert = alert_any + G.ARGS.set_alerts_alertables[2].should_alert = alert_joker + G.ARGS.set_alerts_alertables[3].should_alert = alert_tarot + G.ARGS.set_alerts_alertables[4].should_alert = alert_planet + G.ARGS.set_alerts_alertables[5].should_alert = alert_spectral + G.ARGS.set_alerts_alertables[6].should_alert = alert_voucher + G.ARGS.set_alerts_alertables[7].should_alert = alert_edition + G.ARGS.set_alerts_alertables[8].should_alert = alert_blind + G.ARGS.set_alerts_alertables[9].should_alert = alert_tag + G.ARGS.set_alerts_alertables[10].should_alert = alert_seal + G.ARGS.set_alerts_alertables[11].should_alert = alert_booster + + for k, v in ipairs(G.ARGS.set_alerts_alertables) do + if G.OVERLAY_MENU and G.OVERLAY_MENU:get_UIE_by_ID(v.id) then + if v.should_alert then + if not G[v.alert_uibox_name] then + G[v.alert_uibox_name] = UIBox{ + definition = create_UIBox_card_alert({red_bad = true}), + config = {align="tri", offset = {x = 0.05, y = -0.05}, major = G.OVERLAY_MENU:get_UIE_by_ID(v.id), instance_type = 'ALERT'} + } + G[v.alert_uibox_name].states.collide.can = false + end + elseif G[v.alert_uibox_name] then + G[v.alert_uibox_name]:remove() + G[v.alert_uibox_name] = nil + end + elseif G[v.alert_uibox_name] then + G[v.alert_uibox_name]:remove() + G[v.alert_uibox_name] = nil + end + end + + if G.MAIN_MENU_UI then + if alert_any then + if not G.collection_alert then + G.collection_alert = UIBox{definition = create_UIBox_card_alert(), config = {align="tri", offset = {x = 0.05, y = -0.05}, major = G.MAIN_MENU_UI:get_UIE_by_ID('collection_button')}} + G.collection_alert.states.collide.can = false + end + elseif G.collection_alert then + G.collection_alert:remove() + G.collection_alert = nil + end + elseif G.collection_alert then + G.collection_alert:remove() + G.collection_alert = nil + end + end +end + +function set_main_menu_UI() + G.MAIN_MENU_UI = UIBox{ + definition = create_UIBox_main_menu_buttons(), + config = {align="bmi", offset = {x=0,y=10}, major = G.ROOM_ATTACH, bond = 'Weak'} + } + G.MAIN_MENU_UI.alignment.offset.y = 0 + G.MAIN_MENU_UI:align_to_major() + G.E_MANAGER:add_event(Event({ + blockable = false, + blocking = false, + func = (function() + if (not G.F_DISP_USERNAME) or (type(G.F_DISP_USERNAME) == 'string') then + G.PROFILE_BUTTON = UIBox{ + definition = create_UIBox_profile_button(), + config = {align="bli", offset = {x=-10,y=0}, major = G.ROOM_ATTACH, bond = 'Weak'}} + G.PROFILE_BUTTON.alignment.offset.x = 0 + G.PROFILE_BUTTON:align_to_major() + return true + end + end) + })) + + + G.CONTROLLER:snap_to{node = G.MAIN_MENU_UI:get_UIE_by_ID('main_menu_play')} +end + +function card_eval_status_text(card, eval_type, amt, percent, dir, extra) + percent = percent or (0.9 + 0.2*math.random()) + if dir == 'down' then + percent = 1-percent + end + + if extra and extra.focus then card = extra.focus end + + local text = '' + local sound = nil + local volume = 1 + local card_aligned = 'bm' + local y_off = 0.15*G.CARD_H + if card.area == G.jokers or card.area == G.consumeables then + y_off = 0.05*card.T.h + elseif card.area == G.hand then + y_off = -0.05*G.CARD_H + card_aligned = 'tm' + elseif card.area == G.play then + y_off = -0.05*G.CARD_H + card_aligned = 'tm' + elseif card.jimbo then + y_off = -0.05*G.CARD_H + card_aligned = 'tm' + end + local config = {} + local delay = 0.65 + local colour = config.colour or (extra and extra.colour) or ( G.C.FILTER ) + local extrafunc = nil + + if eval_type == 'debuff' then + sound = 'cancel' + amt = 1 + colour = G.C.RED + config.scale = 0.6 + text = localize('k_debuffed') + elseif eval_type == 'chips' then + sound = 'chips1' + amt = amt + colour = G.C.CHIPS + text = localize{type='variable',key='a_chips',vars={amt}} + delay = 0.6 + elseif eval_type == 'mult' then + sound = 'multhit1'--'other1' + amt = amt + text = localize{type='variable',key='a_mult',vars={amt}} + colour = G.C.MULT + config.type = 'fade' + config.scale = 0.7 + elseif (eval_type == 'x_mult') or (eval_type == 'h_x_mult') then + sound = 'multhit2' + volume = 0.7 + amt = amt + text = localize{type='variable',key='a_xmult',vars={amt}} + colour = G.C.XMULT + config.type = 'fade' + config.scale = 0.7 + elseif eval_type == 'h_mult' then + sound = 'multhit1' + amt = amt + text = localize{type='variable',key='a_mult',vars={amt}} + colour = G.C.MULT + config.type = 'fade' + config.scale = 0.7 + elseif eval_type == 'dollars' then + sound = 'coin3' + amt = amt + text = (amt <-0.01 and '-' or '')..localize("$")..tostring(math.abs(amt)) + colour = amt <-0.01 and G.C.RED or G.C.MONEY + elseif eval_type == 'swap' then + sound = 'generic1' + amt = amt + text = localize('k_swapped_ex') + colour = G.C.PURPLE + elseif eval_type == 'extra' or eval_type == 'jokers' then + sound = extra.edition and 'foil2' or extra.mult_mod and 'multhit1' or extra.Xmult_mod and 'multhit2' or 'generic1' + if extra.edition then + colour = G.C.DARK_EDITION + end + volume = extra.edition and 0.3 or sound == 'multhit2' and 0.7 or 1 + delay = extra.delay or 0.75 + amt = 1 + text = extra.message or text + if not extra.edition and (extra.mult_mod or extra.Xmult_mod) then + colour = G.C.MULT + end + if extra.chip_mod then + config.type = 'fall' + colour = G.C.CHIPS + config.scale = 0.7 + elseif extra.swap then + config.type = 'fall' + colour = G.C.PURPLE + config.scale = 0.7 + else + config.type = 'fall' + config.scale = 0.7 + end + end + delay = delay*1.25 + + if amt > 0 or amt < 0 then + if extra and extra.instant then + if extrafunc then extrafunc() end + attention_text({ + text = text, + scale = config.scale or 1, + hold = delay - 0.2, + backdrop_colour = colour, + align = card_aligned, + major = card, + offset = {x = 0, y = y_off} + }) + play_sound(sound, 0.8+percent*0.2, volume) + if not extra or not extra.no_juice then + card:juice_up(0.6, 0.1) + G.ROOM.jiggle = G.ROOM.jiggle + 0.7 + end + else + G.E_MANAGER:add_event(Event({ --Add bonus chips from this card + trigger = 'before', + delay = delay, + func = function() + if extrafunc then extrafunc() end + attention_text({ + text = text, + scale = config.scale or 1, + hold = delay - 0.2, + backdrop_colour = colour, + align = card_aligned, + major = card, + offset = {x = 0, y = y_off} + }) + play_sound(sound, 0.8+percent*0.2, volume) + if not extra or not extra.no_juice then + card:juice_up(0.6, 0.1) + G.ROOM.jiggle = G.ROOM.jiggle + 0.7 + end + return true + end + })) + end + end + if extra and extra.playing_cards_created then + playing_card_joker_effects(extra.playing_cards_created) + end +end + +function add_round_eval_row(config) + local config = config or {} + local width = G.round_eval.T.w - 0.51 + local num_dollars = config.dollars or 1 + local scale = 0.9 + + if config.name ~= 'bottom' then + if config.name ~= 'blind1' then + if not G.round_eval.divider_added then + G.E_MANAGER:add_event(Event({ + trigger = 'after',delay = 0.25, + func = function() + local spacer = {n=G.UIT.R, config={align = "cm", minw = width}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {'......................................'}, colours = {G.C.WHITE},shadow = true, float = true, y_offset = -30, scale = 0.45, spacing = 13.5, font = G.LANGUAGES['en-us'].font, pop_in = 0})}} + }} + G.round_eval:add_child(spacer,G.round_eval:get_UIE_by_ID(config.bonus and 'bonus_round_eval' or 'base_round_eval')) + return true + end + })) + delay(0.6) + G.round_eval.divider_added = true + end + else + delay(0.2) + end + + delay(0.2) + + G.E_MANAGER:add_event(Event({ + trigger = 'before',delay = 0.5, + func = function() + --Add the far left text and context first: + local left_text = {} + if config.name == 'blind1' then + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5) + local blind_sprite = AnimatedSprite(0, 0, 1.2,1.2, G.ANIMATION_ATLAS['blind_chips'], copy_table(G.GAME.blind.pos)) + blind_sprite:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + table.insert(left_text, {n=G.UIT.O, config={w=1.2,h=1.2 , object = blind_sprite, hover = true, can_collide = false}}) + + table.insert(left_text, + config.saved and + {n=G.UIT.C, config={padding = 0.05, align = 'cm'}, nodes={ + {n=G.UIT.R, config={align = 'cm'}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {' '..localize('ph_mr_bones')..' '}, colours = {G.C.FILTER}, shadow = true, pop_in = 0, scale = 0.5*scale, silent = true})}} + }} + }} + or {n=G.UIT.C, config={padding = 0.05, align = 'cm'}, nodes={ + {n=G.UIT.R, config={align = 'cm'}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {' '..localize('ph_score_at_least')..' '}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}} + }}, + {n=G.UIT.R, config={align = 'cm', minh = 0.8}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5 , object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.T, config={text = G.GAME.blind.chip_text, scale = scale_number(G.GAME.blind.chips, scale, 100000), colour = G.C.RED, shadow = true}} + }} + }}) + elseif string.find(config.name, 'tag') then + local blind_sprite = Sprite(0, 0, 0.7,0.7, G.ASSET_ATLAS['tags'], copy_table(config.pos)) + blind_sprite:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + blind_sprite:juice_up() + table.insert(left_text, {n=G.UIT.O, config={w=0.7,h=0.7 , object = blind_sprite, hover = true, can_collide = false}}) + table.insert(left_text, {n=G.UIT.O, config={object = DynaText({string = {config.condition}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}}) + elseif config.name == 'hands' then + table.insert(left_text, {n=G.UIT.T, config={text = config.disp or config.dollars, scale = 0.8*scale, colour = G.C.BLUE, shadow = true, juice = true}}) + table.insert(left_text, {n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'remaining_hand_money', vars = {G.GAME.modifiers.money_per_hand or 1}}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}}) + elseif config.name == 'discards' then + table.insert(left_text, {n=G.UIT.T, config={text = config.disp or config.dollars, scale = 0.8*scale, colour = G.C.RED, shadow = true, juice = true}}) + table.insert(left_text, {n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'remaining_discard_money', vars = {G.GAME.modifiers.money_per_discard or 0}}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}}) + elseif string.find(config.name, 'joker') then + table.insert(left_text, {n=G.UIT.O, config={object = DynaText({string = localize{type = 'name_text', set = config.card.config.center.set, key = config.card.config.center.key}, colours = {G.C.FILTER}, shadow = true, pop_in = 0, scale = 0.6*scale, silent = true})}}) + elseif config.name == 'interest' then + table.insert(left_text, {n=G.UIT.T, config={text = num_dollars, scale = 0.8*scale, colour = G.C.MONEY, shadow = true, juice = true}}) + table.insert(left_text,{n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'interest', vars = {G.GAME.interest_amount, 5, G.GAME.interest_amount*G.GAME.interest_cap/5}}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}}) + end + local full_row = {n=G.UIT.R, config={align = "cm", minw = 5}, nodes={ + {n=G.UIT.C, config={padding = 0.05, minw = width*0.55, minh = 0.61, align = "cl"}, nodes=left_text}, + {n=G.UIT.C, config={padding = 0.05,minw = width*0.45, align = "cr"}, nodes={{n=G.UIT.C, config={align = "cm", id = 'dollar_'..config.name},nodes={}}}} + }} + + if config.name == 'blind1' then + G.GAME.blind:juice_up() + end + G.round_eval:add_child(full_row,G.round_eval:get_UIE_by_ID(config.bonus and 'bonus_round_eval' or 'base_round_eval')) + play_sound('cancel', config.pitch or 1) + play_sound('highlight1',( 1.5*config.pitch) or 1, 0.2) + if config.card then config.card:juice_up(0.7, 0.46) end + return true + end + })) + local dollar_row = 0 + if num_dollars > 60 then + local dollar_string = localize('$')..num_dollars + G.E_MANAGER:add_event(Event({ + trigger = 'before',delay = 0.38, + func = function() + G.round_eval:add_child( + {n=G.UIT.R, config={align = "cm", id = 'dollar_row_'..(dollar_row+1)..'_'..config.name}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('$')..num_dollars}, colours = {G.C.MONEY}, shadow = true, pop_in = 0, scale = 0.65, float = true})}} + }}, + G.round_eval:get_UIE_by_ID('dollar_'..config.name)) + + play_sound('coin3', 0.9+0.2*math.random(), 0.7) + play_sound('coin6', 1.3, 0.8) + return true + end + })) + else + for i = 1, num_dollars or 1 do + G.E_MANAGER:add_event(Event({ + trigger = 'before',delay = 0.18 - ((num_dollars > 20 and 0.13) or (num_dollars > 9 and 0.1) or 0), + func = function() + if i%30 == 1 then + G.round_eval:add_child( + {n=G.UIT.R, config={align = "cm", id = 'dollar_row_'..(dollar_row+1)..'_'..config.name}, nodes={}}, + G.round_eval:get_UIE_by_ID('dollar_'..config.name)) + dollar_row = dollar_row+1 + end + + local r = {n=G.UIT.T, config={text = localize('$'), colour = G.C.MONEY, scale = ((num_dollars > 20 and 0.28) or (num_dollars > 9 and 0.43) or 0.58), shadow = true, hover = true, can_collide = false, juice = true}} + play_sound('coin3', 0.9+0.2*math.random(), 0.7 - (num_dollars > 20 and 0.2 or 0)) + + if config.name == 'blind1' then + G.GAME.current_round.dollars_to_be_earned = G.GAME.current_round.dollars_to_be_earned:sub(2) + end + + G.round_eval:add_child(r,G.round_eval:get_UIE_by_ID('dollar_row_'..(dollar_row)..'_'..config.name)) + G.VIBRATION = G.VIBRATION + 0.4 + return true + end + })) + end + end + else + delay(0.4) + G.E_MANAGER:add_event(Event({ + trigger = 'before',delay = 0.5, + func = function() + UIBox{ + definition = {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={id = 'cash_out_button', align = "cm", padding = 0.1, minw = 7, r = 0.15, colour = G.C.ORANGE, shadow = true, hover = true, one_press = true, button = 'cash_out', focus_args = {snap_to = true}}, nodes={ + {n=G.UIT.T, config={text = localize('b_cash_out')..": ", scale = 1, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = localize('$')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}} + }},}}, + config = { + align = 'tmi', + offset ={x=0,y=0.4}, + major = G.round_eval} + } + + --local left_text = {n=G.UIT.R, config={id = 'cash_out_button', align = "cm", padding = 0.1, minw = 2, r = 0.15, colour = G.C.ORANGE, shadow = true, hover = true, one_press = true, button = 'cash_out', focus_args = {snap_to = true}}, nodes={ + -- {n=G.UIT.T, config={text = localize('b_cash_out')..": ", scale = 1, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + -- {n=G.UIT.T, config={text = localize('$')..config.dollars, scale = 1.3*scale, colour = G.C.WHITE, shadow = true, juice = true}} + --}} + --G.round_eval:add_child(left_text,G.round_eval:get_UIE_by_ID('eval_bottom')) + + G.GAME.current_round.dollars = config.dollars + + play_sound('coin6', config.pitch or 1) + G.VIBRATION = G.VIBRATION + 1 + return true + end + })) + end +end + +function change_shop_size(mod) + if not G.GAME.shop then return end + G.GAME.shop.joker_max = G.GAME.shop.joker_max + mod + if G.shop_jokers and G.shop_jokers.cards then + if mod < 0 then + --Remove jokers in shop + for i = #G.shop_jokers.cards, G.GAME.shop.joker_max+1, -1 do + if G.shop_jokers.cards[i] then + G.shop_jokers.cards[i]:remove() + end + end + end + G.shop_jokers.config.card_limit = G.GAME.shop.joker_max + G.shop_jokers.T.w = G.GAME.shop.joker_max*1.01*G.CARD_W + G.shop:recalculate() + if mod > 0 then + for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do + G.shop_jokers:emplace(create_card_for_shop(G.shop_jokers)) + end + end + end +end + +function juice_card(card) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() card:juice_up(0.7);return true end) + })) +end + +function update_canvas_juice(dt) + G.JIGGLE_VIBRATION = G.ROOM.jiggle or 0 + if not G.SETTINGS.screenshake or (type(G.SETTINGS.screenshake) ~= 'number') then + G.SETTINGS.screenshake = G.SETTINGS.reduced_motion and 0 or 50 + end + local shake_amt = (G.SETTINGS.reduced_motion and 0 or 1)*math.max(0,G.SETTINGS.screenshake-30)/100 + G.ARGS.eased_cursor_pos = G.ARGS.eased_cursor_pos or {x=G.CURSOR.T.x,y=G.CURSOR.T.y, sx = G.CONTROLLER.cursor_position.x, sy = G.CONTROLLER.cursor_position.y} + G.ARGS.eased_cursor_pos.x = G.ARGS.eased_cursor_pos.x*(1-3*dt) + 3*dt*(shake_amt*G.CURSOR.T.x + (1-shake_amt)*G.ROOM.T.w/2) + G.ARGS.eased_cursor_pos.y = G.ARGS.eased_cursor_pos.y*(1-3*dt) + 3*dt*(shake_amt*G.CURSOR.T.y + (1-shake_amt)*G.ROOM.T.h/2) + G.ARGS.eased_cursor_pos.sx = G.ARGS.eased_cursor_pos.sx*(1-3*dt) + 3*dt*(shake_amt*G.CONTROLLER.cursor_position.x + (1-shake_amt)*G.WINDOWTRANS.real_window_w/2) + G.ARGS.eased_cursor_pos.sy = G.ARGS.eased_cursor_pos.sy*(1-3*dt) + 3*dt*(shake_amt*G.CONTROLLER.cursor_position.y + (1-shake_amt)*G.WINDOWTRANS.real_window_h/2) + + shake_amt = (G.SETTINGS.reduced_motion and 0 or 1)*G.SETTINGS.screenshake/100*3 + if shake_amt < 0.05 then shake_amt = 0 end + + G.ROOM.jiggle = (G.ROOM.jiggle or 0)*(1-5*dt)*(shake_amt > 0.05 and 1 or 0) + G.ROOM.T.r = (0.001*math.sin(0.3*G.TIMERS.REAL)+ 0.002*(G.ROOM.jiggle)*math.sin(39.913*G.TIMERS.REAL))*shake_amt + G.ROOM.T.x = G.ROOM_ORIG.x + (shake_amt)*(0.015*math.sin(0.913*G.TIMERS.REAL) + 0.01*(G.ROOM.jiggle*shake_amt)*math.sin(19.913*G.TIMERS.REAL) + (G.ARGS.eased_cursor_pos.x - 0.5*(G.ROOM.T.w + G.ROOM_ORIG.x))*0.01) + G.ROOM.T.y = G.ROOM_ORIG.y + (shake_amt)*(0.015*math.sin(0.952*G.TIMERS.REAL) + 0.01*(G.ROOM.jiggle*shake_amt)*math.sin(21.913*G.TIMERS.REAL) + (G.ARGS.eased_cursor_pos.y - 0.5*(G.ROOM.T.h + G.ROOM_ORIG.y))*0.01) + + G.JIGGLE_VIBRATION = G.JIGGLE_VIBRATION*(1-5*dt) + G.CURR_VIBRATION = G.CURR_VIBRATION or 0 + G.CURR_VIBRATION = math.min(1, G.CURR_VIBRATION + G.VIBRATION + G.JIGGLE_VIBRATION*0.2) + G.VIBRATION = 0 + G.CURR_VIBRATION = (1-15*dt)*G.CURR_VIBRATION + if not G.SETTINGS.rumble then G.CURR_VIBRATION = 0 end + if G.CONTROLLER.GAMEPAD.object and G.F_RUMBLE then G.CONTROLLER.GAMEPAD.object:setVibration(G.CURR_VIBRATION*0.4*G.F_RUMBLE, G.CURR_VIBRATION*0.4*G.F_RUMBLE) end +end + +function juice_card_until(card, eval_func, first, delay) + G.E_MANAGER:add_event(Event({ + trigger = 'after',delay = delay or 0.1, blocking = false, blockable = false, timer = 'REAL', + func = (function() if eval_func(card) then if not first or first then card:juice_up(0.1, 0.1) end;juice_card_until(card, eval_func, nil, 0.8) end return true end) + })) +end + +function check_for_unlock(args) + if not next(args) then return end + if G.GAME.seeded then return end + if args.type == 'win_challenge' then + unlock_achievement('rule_bender') + local _c = true + for k, v in pairs(G.CHALLENGES) do + if not G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id] then + _c = false + end + end + if _c then + unlock_achievement('rule_breaker') + end + end + if G.GAME.challenge then return end + + --|-------------------------------------------- + --|Achievements + --|-------------------------------------------- + if args.type == 'career_stat' then + if args.statname == 'c_cards_played' and G.PROFILES[G.SETTINGS.profile].career_stats[args.statname] >= 2500 then + unlock_achievement('card_player') + end + if args.statname == 'c_cards_discarded' and G.PROFILES[G.SETTINGS.profile].career_stats[args.statname] >= 2500 then + unlock_achievement('card_discarder') + end + end + if args.type == 'ante_up' then + if args.ante >= 4 then + unlock_achievement('ante_up') + end + if args.ante >= 8 then + unlock_achievement('ante_upper') + end + end + if args.type == 'win' then + unlock_achievement('heads_up') + if G.GAME.round <= 12 then + unlock_achievement('speedrunner') + end + if G.GAME.round_scores.times_rerolled.amt <= 0 then + unlock_achievement('you_get_what_you_get') + end + end + if args.type == 'win_stake' then + local highest_win, lowest_win = get_deck_win_stake(nil) + if highest_win >= 2 then + unlock_achievement('low_stakes') + end + if highest_win >= 4 then + unlock_achievement('mid_stakes') + end + if highest_win >= 8 then + unlock_achievement('high_stakes') + end + if G.PROGRESS and G.PROGRESS.deck_stakes.tally/G.PROGRESS.deck_stakes.of >=1 then + unlock_achievement('completionist_plus') + end + if G.PROGRESS and G.PROGRESS.joker_stickers.tally/G.PROGRESS.joker_stickers.of >=1 then + unlock_achievement('completionist_plus_plus') + end + end + if args.type == 'money' then + if G.GAME.dollars >= 400 then + unlock_achievement('nest_egg') + end + end + if args.type == 'hand' then + if args.handname == 'Flush' and args.scoring_hand then + local _w = 0 + for k, v in ipairs(args.scoring_hand) do + if v.ability.name == 'Wild Card' then + _w = _w + 1 + end + end + if _w == #args.scoring_hand then + unlock_achievement('flushed') + end + end + + if args.disp_text == 'Royal Flush' then + unlock_achievement('royale') + end + end + if args.type == 'shatter' then + if #args.shattered >= 2 then + unlock_achievement('shattered') + end + end + if args.type == 'run_redeem' then + local _v = 0 + _v = _v - (G.GAME.starting_voucher_count or 0) + for k, v in pairs(G.GAME.used_vouchers) do + _v = _v + 1 + end + if _v >= 5 and G.GAME.round_resets.ante <= 4 then + unlock_achievement('roi') + end + end + if args.type == 'upgrade_hand' then + if args.level >= 10 then + unlock_achievement('retrograde') + end + end + if args.type == 'chip_score' then + if args.chips >= 10000 then + unlock_achievement('_10k') + end + if args.chips >= 1000000 then + unlock_achievement('_1000k') + end + if args.chips >= 100000000 then + unlock_achievement('_100000k') + end + end + if args.type == 'modify_deck' then + if G.deck and G.deck.config.card_limit <= 20 then + unlock_achievement('tiny_hands') + end + if G.deck and G.deck.config.card_limit >= 80 then + unlock_achievement('big_hands') + end + end + if args.type == 'spawn_legendary' then + unlock_achievement('legendary') + end + if args.type == 'discover_amount' then + if G.DISCOVER_TALLIES.vouchers.tally/G.DISCOVER_TALLIES.vouchers.of >=1 then + unlock_achievement('extreme_couponer') + end + if G.DISCOVER_TALLIES.spectrals.tally/G.DISCOVER_TALLIES.spectrals.of >=1 then + unlock_achievement('clairvoyance') + end + if G.DISCOVER_TALLIES.tarots.tally/G.DISCOVER_TALLIES.tarots.of >=1 then + unlock_achievement('cartomancy') + end + if G.DISCOVER_TALLIES.planets.tally/G.DISCOVER_TALLIES.planets.of >=1 then + unlock_achievement('astronomy') + end + if G.DISCOVER_TALLIES.total.tally/G.DISCOVER_TALLIES.total.of >=1 then + unlock_achievement('completionist') + end + end + --------------------------------------------- + + local i=1 + while i <= #G.P_LOCKED do + local ret = false + local card = G.P_LOCKED[i] + if not card.unlocked and card.unlock_condition and args.type == 'career_stat' then + if args.statname == card.unlock_condition.type and G.PROFILES[G.SETTINGS.profile].career_stats[args.statname] >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + + if not card.unlocked and card.unlock_condition and card.unlock_condition.type == args.type then + if args.type == 'hand' and args.handname == card.unlock_condition.extra then + ret = true + unlock_card(card) + end + if args.type == 'min_hand_size' and G.hand and G.hand.config.card_limit <= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + if args.type == 'interest_streak' and card.unlock_condition.extra <= G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak then + ret = true + unlock_card(card) + end + if args.type == 'run_card_replays' then + for k, v in ipairs(G.playing_cards) do + if v.base.times_played >= card.unlock_condition.extra then + ret = true + unlock_card(card) + break + end + end + end + if args.type == 'play_all_hearts' then + local played = true + for k, v in ipairs(G.deck.cards) do + if v.ability.name ~= 'Stone Card' and v.base.suit == 'Hearts' then + played = false + end + end + for k, v in ipairs(G.hand.cards) do + if v.ability.name ~= 'Stone Card' and v.base.suit == 'Hearts' then + played = false + end + end + if played then + ret = true + unlock_card(card) + end + end + if args.type == 'run_redeem' then + local vouchers_redeemed = 0 + for k, v in pairs(G.GAME.used_vouchers) do + vouchers_redeemed = vouchers_redeemed + 1 + end + if vouchers_redeemed >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + if args.type == 'have_edition' then + local shiny_jokers = 0 + for k, v in ipairs(G.jokers.cards) do + if v.edition then shiny_jokers = shiny_jokers + 1 end + end + if shiny_jokers >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + if args.type == 'double_gold' then + ret = true + unlock_card(card) + end + if args.type == 'continue_game' then + ret = true + unlock_card(card) + end + if args.type == 'blank_redeems' then + if G.PROFILES[G.SETTINGS.profile].voucher_usage['v_blank'] and G.PROFILES[G.SETTINGS.profile].voucher_usage['v_blank'].count >= card.unlock_condition.extra then + unlock_card(card) + end + end + if args.type == 'modify_deck' then + if card.unlock_condition.extra and card.unlock_condition.extra.suit then + local count = 0 + for _, v in pairs(G.playing_cards) do + if v.base.suit == card.unlock_condition.extra.suit then count = count + 1 end + end + if count >= card.unlock_condition.extra.count then + ret = true + unlock_card(card) + end + end + if card.unlock_condition.extra and card.unlock_condition.extra.enhancement then + local count = 0 + for _, v in pairs(G.playing_cards) do + if v.ability.name == card.unlock_condition.extra.enhancement then count = count + 1 end + end + if count >= card.unlock_condition.extra.count then + ret = true + unlock_card(card) + end + end + if card.unlock_condition.extra and card.unlock_condition.extra.tally then + local count = 0 + for _, v in pairs(G.playing_cards) do + if v.ability.set == 'Enhanced' then count = count + 1 end + end + if count >= card.unlock_condition.extra.count then + ret = true + unlock_card(card) + end + end + end + if args.type == 'discover_amount' then + if card.unlock_condition.amount then + if card.unlock_condition.amount <= args.amount then + ret = true + unlock_card(card) + end + end + if card.unlock_condition.tarot_count then + if card.unlock_condition.tarot_count <= args.tarot_count then + ret = true + unlock_card(card) + end + end + if card.unlock_condition.planet_count then + if card.unlock_condition.planet_count <= args.planet_count then + ret = true + unlock_card(card) + end + end + end + if args.type == 'win_deck' then + if card.unlock_condition.deck then + if get_deck_win_stake(card.unlock_condition.deck) > 0 then + ret = true + unlock_card(card) + end + end + end + if args.type == 'win_stake' then + if card.unlock_condition.stake then + if get_deck_win_stake() >= card.unlock_condition.stake then + ret = true + unlock_card(card) + end + end + end + if args.type == 'discover_planets' then + local count = 0 + for k, v in pairs(G.P_CENTERS) do + if v.set == 'Planet' and v.discovered then count = count + 1 end + end + if count >= 9 then + ret = true + unlock_card(card) + end + end + if args.type == 'blind_discoveries' then + local discovered_blinds = 0 + for k, v in pairs(G.P_BLINDS) do + if v.discovered then + discovered_blinds = discovered_blinds + 1 + end + end + if discovered_blinds >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + if args.type == 'modify_jokers' and G.jokers then + if card.unlock_condition.extra.count then + local count = 0 + for _, v in pairs(G.jokers.cards) do + if v.ability.set == 'Joker' and v.edition and v.edition.polychrome and card.unlock_condition.extra.polychrome then count = count + 1 end + end + if count >= card.unlock_condition.extra.count then + ret = true + unlock_card(card) + end + end + end + if args.type == 'money' then + if card.unlock_condition.extra <= G.GAME.dollars then + ret = true + unlock_card(card) + end + end + if args.type == 'round_win' then + if card.name == 'Matador' then + if G.GAME.current_round.hands_played == 1 and + G.GAME.current_round.discards_left == G.GAME.round_resets.discards and + G.GAME.blind:get_type() == 'Boss' then + ret = true + unlock_card(card) + end + end + if card.name == 'Troubadour' then + if G.PROFILES[G.SETTINGS.profile].career_stats.c_single_hand_round_streak >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + if card.name == 'Hanging Chad' then + if G.GAME.last_hand_played == card.unlock_condition.extra and G.GAME.blind:get_type() == 'Boss' then + ret = true + unlock_card(card) + end + end + end + if args.type == 'ante_up' then + if card.unlock_condition.ante then + if args.ante == card.unlock_condition.ante then + ret = true + unlock_card(card) + end + end + end + if args.type == 'hand_contents' then + if card.name == 'Seeing Double' then + local tally = 0 + for j = 1, #args.cards do + if args.cards[j]:get_id() == 7 and args.cards[j]:is_suit('Clubs') then + tally = tally+1 + end + end + if tally >= 4 then + ret = true + unlock_card(card) + end + end + + if card.name == 'Golden Ticket' then + local tally = 0 + for j = 1, #args.cards do + if args.cards[j].ability.name == 'Gold Card' then + tally = tally+1 + end + end + if tally >= 5 then + ret = true + unlock_card(card) + end + end + end + if args.type == 'discard_custom' then + if card.name == 'Hit the Road' then + local tally = 0 + for j = 1, #args.cards do + if args.cards[j]:get_id() == 11 then + tally = tally+1 + end + end + if tally >= 5 then + ret = true + unlock_card(card) + end + end + if card.name == 'Brainstorm' then + local eval = evaluate_poker_hand(args.cards) + if next(eval['Straight Flush']) then + local min = 10 + for j = 1, #args.cards do + if args.cards[j]:get_id() < min then min = args.cards[j]:get_id() end + end + if min == 10 then + ret = true + unlock_card(card) + end + end + end + end + if args.type == 'win_no_hand' and G.GAME.hands[card.unlock_condition.extra].played == 0 then + ret = true + unlock_card(card) + end + if args.type == 'win_custom' then + if card.name == 'Invisible Joker' and + G.GAME.max_jokers <= 4 then + ret = true + unlock_card(card) + end + if card.name == 'Blueprint' then + ret = true + unlock_card(card) + end + end + if args.type == 'win' then + if card.unlock_condition.n_rounds >= G.GAME.round then + ret = true + unlock_card(card) + end + end + if args.type == 'chip_score' then + if card.unlock_condition.chips <= args.chips then + ret = true + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + unlock_card(card) + return true end + })) + return true end + })) + end + end + end + if ret == true then + table.remove(G.P_LOCKED, i) + else + i = i + 1 + end + end +end + +function unlock_card(card) + if card.unlocked == false then + if G.GAME.seeded or G.GAME.challenge then return end + if card.unlocked or card.wip then return end + G:save_notify(card) + card.unlocked = true + if card.set == 'Back' then discover_card(card) end + table.sort(G.P_CENTER_POOLS["Back"], function (a, b) return (a.order - (a.unlocked and 100 or 0)) < (b.order - (b.unlocked and 100 or 0)) end) + G:save_progress() + G.FILE_HANDLER.force = true + notify_alert(card.key, card.set) + end +end + +function fetch_achievements() + G.ACHIEVEMENTS = G.ACHIEVEMENTS or { + ante_up = {order = 1, tier = 3, earned = false, steamid = "BAL_01"}, + ante_upper = {order = 2, tier = 3, earned = false, steamid = "BAL_02"}, + heads_up = {order = 3, tier = 2, earned = false, steamid = "BAL_03"}, + low_stakes = {order = 4, tier = 2, earned = false, steamid = "BAL_04"}, + mid_stakes = {order = 5, tier = 2, earned = false, steamid = "BAL_05"}, + high_stakes = {order = 6, tier = 2, earned = false, steamid = "BAL_06"}, + card_player = {order = 7, tier = 3, earned = false, steamid = "BAL_07"}, + card_discarder = {order = 8, tier = 3, earned = false, steamid = "BAL_08"}, + nest_egg = {order = 9, tier = 2, earned = false, steamid = "BAL_09"}, + flushed = {order = 10, tier = 3, earned = false, steamid = "BAL_10"}, + speedrunner = {order = 11, tier = 2, earned = false, steamid = "BAL_11"}, + roi = {order = 12, tier = 3, earned = false, steamid = "BAL_12"}, + shattered = {order = 13, tier = 3, earned = false, steamid = "BAL_13"}, + royale = {order = 14, tier = 3, earned = false, steamid = "BAL_14"}, + retrograde = {order = 15, tier = 2, earned = false, steamid = "BAL_15"}, + _10k = {order = 16, tier = 3, earned = false, steamid = "BAL_16"}, + _1000k = {order = 17, tier = 2, earned = false, steamid = "BAL_17"}, + _100000k = {order = 18, tier = 1, earned = false, steamid = "BAL_18"}, + tiny_hands = {order = 19, tier = 2, earned = false, steamid = "BAL_19"}, + big_hands = {order = 20, tier = 2, earned = false, steamid = "BAL_20"}, + you_get_what_you_get = {order = 21, tier = 3, earned = false, steamid = "BAL_21"}, + rule_bender = {order = 22, tier = 3, earned = false, steamid = "BAL_22"}, + rule_breaker = {order = 23, tier = 1, earned = false, steamid = "BAL_23"}, + legendary = {order = 24, tier = 3, earned = false, steamid = "BAL_24"}, + astronomy = {order = 25, tier = 3, earned = false, steamid = "BAL_25"}, + cartomancy = {order = 26, tier = 3, earned = false, steamid = "BAL_26"}, + clairvoyance = {order = 27, tier = 2, earned = false, steamid = "BAL_27"}, + extreme_couponer = {order = 28, tier = 1, earned = false, steamid = "BAL_28"}, + completionist = {order = 29, tier = 1, earned = false, steamid = "BAL_29"}, + completionist_plus = {order = 30, tier = 1, earned = false, steamid = "BAL_30"}, + completionist_plus_plus={order = 31, tier = 1, earned = false, steamid = "BAL_31"}, + } + + if G.F_NO_ACHIEVEMENTS then return end + + --|FROM LOCAL SETTINGS FILE + --|------------------------------------------------------- + if not G.STEAM then --|set this to false if you get this information from elsewhere + G.SETTINGS.ACHIEVEMENTS_EARNED = G.SETTINGS.ACHIEVEMENTS_EARNED or {} + for k, v in pairs(G.SETTINGS.ACHIEVEMENTS_EARNED) do + if G.ACHIEVEMENTS[k] then + G.ACHIEVEMENTS[k].earned = true + end + end + end + --|------------------------------------------------------- + + --|STEAM ACHIEVEMENTS + --|------------------------------------------------------- + if G.STEAM and not G.STEAM.initial_fetch then + for k, v in pairs(G.ACHIEVEMENTS) do + local achievement_name = v.steamid + local success, achieved = G.STEAM.userStats.getAchievement(achievement_name) + if success then + v.earned = not not achieved + end + end + G.STEAM.initial_fetch = true + end + --|------------------------------------------------------- + + --|Other platforms + --|------------------------------------------------------- + + --|------------------------------------------------------- +end + +function unlock_achievement(achievement_name) + if G.PROFILES[G.SETTINGS.profile].all_unlocked then return end + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = false, + blocking = false, + func = function() + if G.STATE ~= G.STATES.HAND_PLAYED then + if G.PROFILES[G.SETTINGS.profile].all_unlocked then return end + local achievement_set = false + if G.F_NO_ACHIEVEMENTS then return end + + --|LOCAL SETTINGS FILE + --|------------------------------------------------------- + if not G.ACHIEVEMENTS then fetch_achievements() end + + G.SETTINGS.ACHIEVEMENTS_EARNED[achievement_name] = true + G:save_progress() + if G.ACHIEVEMENTS[achievement_name] and not G.STEAM then + if not G.ACHIEVEMENTS[achievement_name].earned then + --|THIS IS THE FIRST TIME THIS ACHIEVEMENT HAS BEEN EARNED + achievement_set = true + G.FILE_HANDLER.force = true + end + G.ACHIEVEMENTS[achievement_name].earned = true + end + --|------------------------------------------------------- + + + --|STEAM ACHIEVEMENTS + --|------------------------------------------------------- + if G.STEAM then + if G.ACHIEVEMENTS[achievement_name] then + if not G.ACHIEVEMENTS[achievement_name].earned then + --|THIS IS THE FIRST TIME THIS ACHIEVEMENT HAS BEEN EARNED + achievement_set = true + G.FILE_HANDLER.force = true + local achievement_code = G.ACHIEVEMENTS[achievement_name].steamid + local success, achieved = G.STEAM.userStats.getAchievement(achievement_code) + if not success or not achieved then + G.STEAM.send_control.update_queued = true + G.STEAM.userStats.setAchievement(achievement_code) + end + end + G.ACHIEVEMENTS[achievement_name].earned = true + end + end + --|------------------------------------------------------- + + --|Other platforms + --|------------------------------------------------------- + + --|------------------------------------------------------- + + if achievement_set then notify_alert(achievement_name) end + return true + end + end + }), 'achievement') +end + +function notify_alert(_achievement, _type) + _type = _type or 'achievement' + G.E_MANAGER:add_event(Event({ + no_delete = true, + pause_force = true, + timer = 'UPTIME', + func = function() + if G.achievement_notification then + G.achievement_notification:remove() + G.achievement_notification = nil + end + G.achievement_notification = G.achievement_notification or UIBox{ + definition = create_UIBox_notify_alert(_achievement, _type), + config = {align='cr', offset = {x=20,y=0},major = G.ROOM_ATTACH, bond = 'Weak'} + } + return true + end + }), 'achievement') + G.E_MANAGER:add_event(Event({ + no_delete = true, + trigger = 'after', + pause_force = true, + timer = 'UPTIME', + delay = 0.1, + func = function() + G.achievement_notification.alignment.offset.x = G.ROOM.T.x - G.achievement_notification.UIRoot.children[1].children[1].T.w - 0.8 + return true + end + }), 'achievement') + G.E_MANAGER:add_event(Event({ + no_delete = true, + pause_force = true, + trigger = 'after', + timer = 'UPTIME', + delay = 0.1, + func = function() + play_sound('highlight1', nil, 0.5) + play_sound('foil2', 0.5, 0.4) + return true + end + }), 'achievement') + G.E_MANAGER:add_event(Event({ + no_delete = true, + pause_force = true, + trigger = 'after', + delay = 3, + timer = 'UPTIME', + func = function() + G.achievement_notification.alignment.offset.x = 20 + return true + end + }), 'achievement') + G.E_MANAGER:add_event(Event({ + no_delete = true, + pause_force = true, + trigger = 'after', + delay = 0.5, + timer = 'UPTIME', + func = function() + if G.achievement_notification then + G.achievement_notification:remove() + G.achievement_notification = nil + end + return true + end + }), 'achievement') +end + +function inc_steam_stat(stat_name) + if not G.STEAM then return end + local success, current_stat = G.STEAM.userStats.getStatInt(stat_name) + if success then + G.STEAM.userStats.setStatInt(stat_name, current_stat+1) + G.STEAM.send_control.update_queued = true + end +end + +function unlock_notify() + local _UN = get_compressed(G.SETTINGS.profile..'/'..'unlock_notify.jkr') + if _UN then + for key in string.gmatch(_UN .. "\n", "(.-)\n") do + create_unlock_overlay(key) + end + love.filesystem.remove(G.SETTINGS.profile..'/'..'unlock_notify.jkr') + end +end + +function create_unlock_overlay(key) + if G.P_CENTERS[key] then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + no_delete = true, + func = (function() + if not G.OVERLAY_MENU then + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.P_CENTERS[key].set == 'Back' and create_UIBox_deck_unlock(G.P_CENTERS[key]) or create_UIBox_card_unlock(G.P_CENTERS[key]), + } + play_sound('foil1', 0.7, 0.3) + play_sound('gong', 1.4, 0.15) + return true + end + end) + }), 'unlock') + end +end + +function discover_card(card) + if G.GAME.seeded or G.GAME.challenge then return end + card = card or {} + if card.discovered or card.wip then return end + if card and not card.discovered then + card.alert = true + G.GAME.round_scores.new_collection.amt = G.GAME.round_scores.new_collection.amt+1 + end + card.discovered = true + set_discover_tallies() + G.E_MANAGER:add_event(Event({ + func = (function() + G:save_progress() + return true end)})) +end + +function get_deck_from_name(_name) + for k, v in pairs(G.P_CENTERS) do + if v.name == _name then return v end + end +end + +function get_next_voucher_key(_from_tag) + local _pool, _pool_key = get_current_pool('Voucher') + if _from_tag then _pool_key = 'Voucher_fromtag' end + local center = pseudorandom_element(_pool, pseudoseed(_pool_key)) + local it = 1 + while center == 'UNAVAILABLE' do + it = it + 1 + center = pseudorandom_element(_pool, pseudoseed(_pool_key..'_resample'..it)) + end + + return center +end + +function get_next_tag_key(append) + if G.FORCE_TAG then return G.FORCE_TAG end + local _pool, _pool_key = get_current_pool('Tag', nil, nil, append) + local _tag = pseudorandom_element(_pool, pseudoseed(_pool_key)) + local it = 1 + while _tag == 'UNAVAILABLE' do + it = it + 1 + _tag = pseudorandom_element(_pool, pseudoseed(_pool_key..'_resample'..it)) + end + + return _tag +end + +function create_playing_card(card_init, area, skip_materialize, silent, colours) + card_init = card_init or {} + card_init.front = card_init.front or pseudorandom_element(G.P_CARDS, pseudoseed('front')) + card_init.center = card_init.center or G.P_CENTERS.c_base + + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local _area = area or G.hand + local card = Card(_area.T.x, _area.T.y, G.CARD_W, G.CARD_H, card_init.front, card_init.center, {playing_card = G.playing_card}) + table.insert(G.playing_cards, card) + card.playing_card = G.playing_card + + if area then area:emplace(card) end + if not skip_materialize then card:start_materialize(colours, silent) end + + return card +end + +function get_pack(_key, _type) + if not G.GAME.first_shop_buffoon and not G.GAME.banned_keys['p_buffoon_normal_1'] then + G.GAME.first_shop_buffoon = true + return G.P_CENTERS['p_buffoon_normal_'..(math.random(1, 2))] + end + local cume, it, center = 0, 0, nil + for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do + if (not _type or _type == v.kind) and not G.GAME.banned_keys[v.key] then cume = cume + (v.weight or 1 ) end + end + local poll = pseudorandom(pseudoseed((_key or 'pack_generic')..G.GAME.round_resets.ante))*cume + for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do + if not G.GAME.banned_keys[v.key] then + if not _type or _type == v.kind then it = it + (v.weight or 1) end + if it >= poll and it - (v.weight or 1) <= poll then center = v; break end + end + end + return center +end + +function get_current_pool(_type, _rarity, _legendary, _append) + --create the pool + G.ARGS.TEMP_POOL = EMPTY(G.ARGS.TEMP_POOL) + local _pool, _starting_pool, _pool_key, _pool_size = G.ARGS.TEMP_POOL, nil, '', 0 + + if _type == 'Joker' then + local rarity = _rarity or pseudorandom('rarity'..G.GAME.round_resets.ante..(_append or '')) + rarity = (_legendary and 4) or (rarity > 0.95 and 3) or (rarity > 0.7 and 2) or 1 + _starting_pool, _pool_key = G.P_JOKER_RARITY_POOLS[rarity], 'Joker'..rarity..((not _legendary and _append) or '') + else _starting_pool, _pool_key = G.P_CENTER_POOLS[_type], _type..(_append or '') + end + + --cull the pool + for k, v in ipairs(_starting_pool) do + local add = nil + if _type == 'Enhanced' then + add = true + elseif _type == 'Demo' then + if v.pos and v.config then add = true end + elseif _type == 'Tag' then + if (not v.requires or (G.P_CENTERS[v.requires] and G.P_CENTERS[v.requires].discovered)) and + (not v.min_ante or v.min_ante <= G.GAME.round_resets.ante) then + add = true + end + elseif not (G.GAME.used_jokers[v.key] and not next(find_joker("Showman"))) and + (v.unlocked ~= false or v.rarity == 4) then + if v.set == 'Voucher' then + if not G.GAME.used_vouchers[v.key] then + local include = true + if v.requires then + for kk, vv in pairs(v.requires) do + if not G.GAME.used_vouchers[vv] then + include = false + end + end + end + if G.shop_vouchers and G.shop_vouchers.cards then + for kk, vv in ipairs(G.shop_vouchers.cards) do + if vv.config.center.key == v.key then include = false end + end + end + if include then + add = true + end + end + elseif v.set == 'Planet' then + if (not v.config.softlock or G.GAME.hands[v.config.hand_type].played > 0) then + add = true + end + elseif v.enhancement_gate then + add = nil + for kk, vv in pairs(G.playing_cards) do + if vv.config.center.key == v.enhancement_gate then + add = true + end + end + else + add = true + end + if v.name == 'Black Hole' or v.name == 'The Soul' then + add = false + end + end + + if v.no_pool_flag and G.GAME.pool_flags[v.no_pool_flag] then add = nil end + if v.yes_pool_flag and not G.GAME.pool_flags[v.yes_pool_flag] then add = nil end + + if add and not G.GAME.banned_keys[v.key] then + _pool[#_pool + 1] = v.key + _pool_size = _pool_size + 1 + else + _pool[#_pool + 1] = 'UNAVAILABLE' + end + end + + --if pool is empty + if _pool_size == 0 then + _pool = EMPTY(G.ARGS.TEMP_POOL) + if _type == 'Tarot' or _type == 'Tarot_Planet' then _pool[#_pool + 1] = "c_strength" + elseif _type == 'Planet' then _pool[#_pool + 1] = "c_pluto" + elseif _type == 'Spectral' then _pool[#_pool + 1] = "c_incantation" + elseif _type == 'Joker' then _pool[#_pool + 1] = "j_joker" + elseif _type == 'Demo' then _pool[#_pool + 1] = "j_joker" + elseif _type == 'Voucher' then _pool[#_pool + 1] = "v_blank" + elseif _type == 'Tag' then _pool[#_pool + 1] = "tag_handy" + else _pool[#_pool + 1] = "j_joker" + end + end + + return _pool, _pool_key..(not _legendary and G.GAME.round_resets.ante or '') +end + +function poll_edition(_key, _mod, _no_neg, _guaranteed) + _mod = _mod or 1 + local edition_poll = pseudorandom(pseudoseed(_key or 'edition_generic')) + if _guaranteed then + if edition_poll > 1 - 0.003*25 and not _no_neg then + return {negative = true} + elseif edition_poll > 1 - 0.006*25 then + return {polychrome = true} + elseif edition_poll > 1 - 0.02*25 then + return {holo = true} + elseif edition_poll > 1 - 0.04*25 then + return {foil = true} + end + else + if edition_poll > 1 - 0.003*_mod and not _no_neg then + return {negative = true} + elseif edition_poll > 1 - 0.006*G.GAME.edition_rate*_mod then + return {polychrome = true} + elseif edition_poll > 1 - 0.02*G.GAME.edition_rate*_mod then + return {holo = true} + elseif edition_poll > 1 - 0.04*G.GAME.edition_rate*_mod then + return {foil = true} + end + end + return nil +end + +function create_card(_type, area, legendary, _rarity, skip_materialize, soulable, forced_key, key_append) + local area = area or G.jokers + local center = G.P_CENTERS.b_red + + + --should pool be skipped with a forced key + if not forced_key and soulable and (not G.GAME.banned_keys['c_soul']) then + if (_type == 'Tarot' or _type == 'Spectral' or _type == 'Tarot_Planet') and + not (G.GAME.used_jokers['c_soul'] and not next(find_joker("Showman"))) then + if pseudorandom('soul_'.._type..G.GAME.round_resets.ante) > 0.997 then + forced_key = 'c_soul' + end + end + if (_type == 'Planet' or _type == 'Spectral') and + not (G.GAME.used_jokers['c_black_hole'] and not next(find_joker("Showman"))) then + if pseudorandom('soul_'.._type..G.GAME.round_resets.ante) > 0.997 then + forced_key = 'c_black_hole' + end + end + end + + if _type == 'Base' then + forced_key = 'c_base' + end + + + + if forced_key and not G.GAME.banned_keys[forced_key] then + center = G.P_CENTERS[forced_key] + _type = (center.set ~= 'Default' and center.set or _type) + else + local _pool, _pool_key = get_current_pool(_type, _rarity, legendary, key_append) + center = pseudorandom_element(_pool, pseudoseed(_pool_key)) + local it = 1 + while center == 'UNAVAILABLE' do + it = it + 1 + center = pseudorandom_element(_pool, pseudoseed(_pool_key..'_resample'..it)) + end + + center = G.P_CENTERS[center] + end + + local front = ((_type=='Base' or _type == 'Enhanced') and pseudorandom_element(G.P_CARDS, pseudoseed('front'..(key_append or '')..G.GAME.round_resets.ante))) or nil + + local card = Card(area.T.x + area.T.w/2, area.T.y, G.CARD_W, G.CARD_H, front, center, + {bypass_discovery_center = area==G.shop_jokers or area == G.pack_cards or area == G.shop_vouchers or (G.shop_demo and area==G.shop_demo) or area==G.jokers or area==G.consumeables, + bypass_discovery_ui = area==G.shop_jokers or area == G.pack_cards or area==G.shop_vouchers or (G.shop_demo and area==G.shop_demo), + discover = area==G.jokers or area==G.consumeables, + bypass_back = G.GAME.selected_back.pos}) + if card.ability.consumeable and not skip_materialize then card:start_materialize() end + + if _type == 'Joker' then + if G.GAME.modifiers.all_eternal then + card:set_eternal(true) + end + if (area == G.shop_jokers) or (area == G.pack_cards) then + local eternal_perishable_poll = pseudorandom((area == G.pack_cards and 'packetper' or 'etperpoll')..G.GAME.round_resets.ante) + if G.GAME.modifiers.enable_eternals_in_shop and eternal_perishable_poll > 0.7 then + card:set_eternal(true) + elseif G.GAME.modifiers.enable_perishables_in_shop and ((eternal_perishable_poll > 0.4) and (eternal_perishable_poll <= 0.7)) then + card:set_perishable(true) + end + if G.GAME.modifiers.enable_rentals_in_shop and pseudorandom((area == G.pack_cards and 'packssjr' or 'ssjr')..G.GAME.round_resets.ante) > 0.7 then + card:set_rental(true) + end + end + + local edition = poll_edition('edi'..(key_append or '')..G.GAME.round_resets.ante) + card:set_edition(edition) + check_for_unlock({type = 'have_edition'}) + end + return card +end + +function copy_card(other, new_card, card_scale, playing_card, strip_edition) + local new_card = new_card or Card(other.T.x, other.T.y, G.CARD_W*(card_scale or 1), G.CARD_H*(card_scale or 1), G.P_CARDS.empty, G.P_CENTERS.c_base, {playing_card = playing_card}) + new_card:set_ability(other.config.center) + new_card.ability.type = other.ability.type + new_card:set_base(other.config.card) + for k, v in pairs(other.ability) do + if type(v) == 'table' then + new_card.ability[k] = copy_table(v) + else + new_card.ability[k] = v + end + end + + if not strip_edition then + new_card:set_edition(other.edition or {}, nil, true) + end + check_for_unlock({type = 'have_edition'}) + new_card:set_seal(other.seal, true) + if other.params then + new_card.params = other.params + new_card.params.playing_card = playing_card + end + new_card.debuff = other.debuff + new_card.pinned = other.pinned + return new_card +end + +function tutorial_info(args) + local overlay_colour = {0.32,0.36,0.41,0} + ease_value(overlay_colour, 4, 0.6, nil, 'REAL', true,0.4) + G.OVERLAY_TUTORIAL = G.OVERLAY_TUTORIAL or UIBox{ + definition = {n=G.UIT.ROOT, config = {align = "cm", padding = 32.05, r=0.1, colour = overlay_colour, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "tr", minh = G.ROOM.T.h, minw = G.ROOM.T.w}, nodes={ + UIBox_button{label = {localize('b_skip').." >"}, button = "skip_tutorial_section", minw = 1.3, scale = 0.45, colour = G.C.JOKER_GREY} + }} + }}, + config = { + align = "cm", + offset = {x=0,y=3.2}, + major = G.ROOM_ATTACH, + bond = 'Weak' + } + } + G.OVERLAY_TUTORIAL.step = G.OVERLAY_TUTORIAL.step or 1 + G.OVERLAY_TUTORIAL.step_complete = false + local row_dollars_chips = G.HUD:get_UIE_by_ID('row_dollars_chips') + local align = args.align or "tm" + local step = args.step or 1 + local attach = args.attach or {major = row_dollars_chips, type = 'tm', offset = {x=0, y=-0.5}} + local pos = args.pos or {x=attach.major.T.x + attach.major.T.w/2, y=attach.major.T.y + attach.major.T.h/2} + local button = args.button or {button = localize('b_next'), func = 'tut_next'} + args.highlight = args.highlight or {} + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = function() + if G.OVERLAY_TUTORIAL and G.OVERLAY_TUTORIAL.step == step and + not G.OVERLAY_TUTORIAL.step_complete then + G.CONTROLLER.interrupt.focus = true + G.OVERLAY_TUTORIAL.Jimbo = G.OVERLAY_TUTORIAL.Jimbo or Card_Character(pos) + if type(args.highlight) == 'function' then args.highlight = args.highlight() end + args.highlight[#args.highlight+1] = G.OVERLAY_TUTORIAL.Jimbo + G.OVERLAY_TUTORIAL.Jimbo:add_speech_bubble(args.text_key, align, args.loc_vars) + G.OVERLAY_TUTORIAL.Jimbo:set_alignment(attach) + if args.hard_set then G.OVERLAY_TUTORIAL.Jimbo:hard_set_VT() end + G.OVERLAY_TUTORIAL.button_listen = nil + if G.OVERLAY_TUTORIAL.content then G.OVERLAY_TUTORIAL.content:remove() end + if args.content then + G.OVERLAY_TUTORIAL.content = UIBox{ + definition = args.content(), + config = { + align = args.content_config and args.content_config.align or "cm", + offset = args.content_config and args.content_config.offset or {x=0,y=0}, + major = args.content_config and args.content_config.major or G.OVERLAY_TUTORIAL.Jimbo, + bond = 'Weak' + } + } + args.highlight[#args.highlight+1] = G.OVERLAY_TUTORIAL.content + end + if args.button_listen then G.OVERLAY_TUTORIAL.button_listen = args.button_listen end + if not args.no_button then G.OVERLAY_TUTORIAL.Jimbo:add_button(button.button, button.func, button.colour, button.update_func, true) end + G.OVERLAY_TUTORIAL.Jimbo:say_stuff(2*(#(G.localization.misc.tutorial[args.text_key] or {}))+1) + if args.snap_to then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + blocking = false, blockable = false, + func = function() + if G.OVERLAY_TUTORIAL and G.OVERLAY_TUTORIAL.Jimbo and not G.OVERLAY_TUTORIAL.Jimbo.talking then + local _snap_to = args.snap_to() + if _snap_to then + G.CONTROLLER.interrupt.focus = false + G.CONTROLLER:snap_to({node = args.snap_to()}) + end + return true + end + end + }), 'tutorial') + end + if args.highlight then G.OVERLAY_TUTORIAL.highlights = args.highlight end + G.OVERLAY_TUTORIAL.step_complete = true + end + return not G.OVERLAY_TUTORIAL or G.OVERLAY_TUTORIAL.step > step or G.OVERLAY_TUTORIAL.skip_steps + end + }), 'tutorial') + return step+1 +end + +function calculate_reroll_cost(skip_increment) + if G.GAME.current_round.free_rerolls < 0 then G.GAME.current_round.free_rerolls = 0 end + if G.GAME.current_round.free_rerolls > 0 then G.GAME.current_round.reroll_cost = 0; return end + G.GAME.current_round.reroll_cost_increase = G.GAME.current_round.reroll_cost_increase or 0 + if not skip_increment then G.GAME.current_round.reroll_cost_increase = G.GAME.current_round.reroll_cost_increase + 1 end + G.GAME.current_round.reroll_cost = (G.GAME.round_resets.temp_reroll_cost or G.GAME.round_resets.reroll_cost) + G.GAME.current_round.reroll_cost_increase +end + +function reset_idol_card() + G.GAME.current_round.idol_card.rank = 'Ace' + G.GAME.current_round.idol_card.suit = 'Spades' + local valid_idol_cards = {} + for k, v in ipairs(G.playing_cards) do + if v.ability.effect ~= 'Stone Card' then + valid_idol_cards[#valid_idol_cards+1] = v + end + end + if valid_idol_cards[1] then + local idol_card = pseudorandom_element(valid_idol_cards, pseudoseed('idol'..G.GAME.round_resets.ante)) + G.GAME.current_round.idol_card.rank = idol_card.base.value + G.GAME.current_round.idol_card.suit = idol_card.base.suit + G.GAME.current_round.idol_card.id = idol_card.base.id + end +end + +function reset_mail_rank() + G.GAME.current_round.mail_card.rank = 'Ace' + local valid_mail_cards = {} + for k, v in ipairs(G.playing_cards) do + if v.ability.effect ~= 'Stone Card' then + valid_mail_cards[#valid_mail_cards+1] = v + end + end + if valid_mail_cards[1] then + local mail_card = pseudorandom_element(valid_mail_cards, pseudoseed('mail'..G.GAME.round_resets.ante)) + G.GAME.current_round.mail_card.rank = mail_card.base.value + G.GAME.current_round.mail_card.id = mail_card.base.id + end +end + +function reset_ancient_card() + local ancient_suits = {} + for k, v in ipairs({'Spades','Hearts','Clubs','Diamonds'}) do + if v ~= G.GAME.current_round.ancient_card.suit then ancient_suits[#ancient_suits + 1] = v end + end + local ancient_card = pseudorandom_element(ancient_suits, pseudoseed('anc'..G.GAME.round_resets.ante)) + G.GAME.current_round.ancient_card.suit = ancient_card +end + +function reset_castle_card() + G.GAME.current_round.castle_card.suit = 'Spades' + local valid_castle_cards = {} + for k, v in ipairs(G.playing_cards) do + if v.ability.effect ~= 'Stone Card' then + valid_castle_cards[#valid_castle_cards+1] = v + end + end + if valid_castle_cards[1] then + local castle_card = pseudorandom_element(valid_castle_cards, pseudoseed('cas'..G.GAME.round_resets.ante)) + G.GAME.current_round.castle_card.suit = castle_card.base.suit + end +end + +function reset_blinds() + G.GAME.round_resets.blind_states = G.GAME.round_resets.blind_states or {Small = 'Select', Big = 'Upcoming', Boss = 'Upcoming'} + if G.GAME.round_resets.blind_states.Boss == 'Defeated' then + G.GAME.round_resets.blind_states.Small = 'Upcoming' + G.GAME.round_resets.blind_states.Big = 'Upcoming' + G.GAME.round_resets.blind_states.Boss = 'Upcoming' + G.GAME.blind_on_deck = 'Small' + G.GAME.round_resets.blind_choices.Boss = get_new_boss() + G.GAME.round_resets.boss_rerolled = false + end +end + +function get_new_boss() + G.GAME.perscribed_bosses = G.GAME.perscribed_bosses or { + } + if G.GAME.perscribed_bosses and G.GAME.perscribed_bosses[G.GAME.round_resets.ante] then + local ret_boss = G.GAME.perscribed_bosses[G.GAME.round_resets.ante] + G.GAME.perscribed_bosses[G.GAME.round_resets.ante] = nil + G.GAME.bosses_used[ret_boss] = G.GAME.bosses_used[ret_boss] + 1 + return ret_boss + end + if G.FORCE_BOSS then return G.FORCE_BOSS end + + local eligible_bosses = {} + for k, v in pairs(G.P_BLINDS) do + if not v.boss then + + elseif not v.boss.showdown and (v.boss.min <= math.max(1, G.GAME.round_resets.ante) and ((math.max(1, G.GAME.round_resets.ante))%G.GAME.win_ante ~= 0 or G.GAME.round_resets.ante < 2)) then + eligible_bosses[k] = true + elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then + eligible_bosses[k] = true + end + end + for k, v in pairs(G.GAME.banned_keys) do + if eligible_bosses[k] then eligible_bosses[k] = nil end + end + + local min_use = 100 + for k, v in pairs(G.GAME.bosses_used) do + if eligible_bosses[k] then + eligible_bosses[k] = v + if eligible_bosses[k] <= min_use then + min_use = eligible_bosses[k] + end + end + end + for k, v in pairs(eligible_bosses) do + if eligible_bosses[k] then + if eligible_bosses[k] > min_use then + eligible_bosses[k] = nil + end + end + end + local _, boss = pseudorandom_element(eligible_bosses, pseudoseed('boss')) + G.GAME.bosses_used[boss] = G.GAME.bosses_used[boss] + 1 + + return boss +end + +function get_type_colour(_c, card) + return + ((_c.unlocked == false and not (card and card.bypass_lock)) and G.C.BLACK) or + ((_c.unlocked ~= false and (_c.set == 'Joker' or _c.consumeable or _c.set == 'Voucher') and not _c.discoveredand and not ((_c.area ~= G.jokers and _c.area ~= G.consumeables and _c.area) or not _c.area)) and G.C.JOKER_GREY) or + (card and card.debuff and mix_colours(G.C.RED, G.C.GREY, 0.7)) or + (_c.set == 'Joker' and G.C.RARITY[_c.rarity]) or + (_c.set == 'Edition' and G.C.DARK_EDITION) or + (_c.set == 'Booster' and G.C.BOOSTER) or + G.C.SECONDARY_SET[_c.set] or + {0, 1, 1, 1} +end + +function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end) + local first_pass = nil + if not full_UI_table then + first_pass = true + full_UI_table = { + main = {}, + info = {}, + type = {}, + name = nil, + badges = badges or {} + } + end + + local desc_nodes = (not full_UI_table.name and full_UI_table.main) or full_UI_table.info + local name_override = nil + local info_queue = {} + + if full_UI_table.name then + full_UI_table.info[#full_UI_table.info+1] = {} + desc_nodes = full_UI_table.info[#full_UI_table.info] + end + + if not full_UI_table.name then + if specific_vars and specific_vars.no_name then + full_UI_table.name = true + elseif card_type == 'Locked' then + full_UI_table.name = localize{type = 'name', set = 'Other', key = 'locked', nodes = {}} + elseif card_type == 'Undiscovered' then + full_UI_table.name = localize{type = 'name', set = 'Other', key = 'undiscovered_'..(string.lower(_c.set)), name_nodes = {}} + elseif specific_vars and (card_type == 'Default' or card_type == 'Enhanced') then + if (_c.name == 'Stone Card') then full_UI_table.name = true end + if (specific_vars.playing_card and (_c.name ~= 'Stone Card')) then + full_UI_table.name = {} + localize{type = 'other', key = 'playing_card', set = 'Other', nodes = full_UI_table.name, vars = {localize(specific_vars.value, 'ranks'), localize(specific_vars.suit, 'suits_plural'), colours = {specific_vars.colour}}} + full_UI_table.name = full_UI_table.name[1] + end + elseif card_type == 'Booster' then + + else + full_UI_table.name = localize{type = 'name', set = _c.set, key = _c.key, nodes = full_UI_table.name} + end + full_UI_table.card_type = card_type or _c.set + end + + local loc_vars = {} + if main_start then + desc_nodes[#desc_nodes+1] = main_start + end + + if _c.set == 'Other' then + localize{type = 'other', key = _c.key, nodes = desc_nodes, vars = specific_vars or _c.vars} + elseif card_type == 'Locked' then + if _c.wip then localize{type = 'other', key = 'wip_locked', set = 'Other', nodes = desc_nodes, vars = loc_vars} + elseif _c.demo and specific_vars then localize{type = 'other', key = 'demo_shop_locked', nodes = desc_nodes, vars = loc_vars} + elseif _c.demo then localize{type = 'other', key = 'demo_locked', nodes = desc_nodes, vars = loc_vars} + else + if _c.name == 'Golden Ticket' then + elseif _c.name == 'Mr. Bones' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_losses} + elseif _c.name == 'Acrobat' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_hands_played} + elseif _c.name == 'Sock and Buskin' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_face_cards_played} + elseif _c.name == 'Swashbuckler' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_jokers_sold} + elseif _c.name == 'Troubadour' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Certificate' then + elseif _c.name == 'Smeared Joker' then loc_vars = {_c.unlock_condition.extra.count,localize{type = 'name_text', key = _c.unlock_condition.extra.e_key, set = 'Enhanced'}} + elseif _c.name == 'Throwback' then + elseif _c.name == 'Hanging Chad' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'Rough Gem' then loc_vars = {_c.unlock_condition.extra.count, localize(_c.unlock_condition.extra.suit, 'suits_singular')} + elseif _c.name == 'Bloodstone' then loc_vars = {_c.unlock_condition.extra.count, localize(_c.unlock_condition.extra.suit, 'suits_singular')} + elseif _c.name == 'Arrowhead' then loc_vars = {_c.unlock_condition.extra.count, localize(_c.unlock_condition.extra.suit, 'suits_singular')} + elseif _c.name == 'Onyx Agate' then loc_vars = {_c.unlock_condition.extra.count, localize(_c.unlock_condition.extra.suit, 'suits_singular')} + elseif _c.name == 'Glass Joker' then loc_vars = {_c.unlock_condition.extra.count, localize{type = 'name_text', key = _c.unlock_condition.extra.e_key, set = 'Enhanced'}} + elseif _c.name == 'Showman' then loc_vars = {_c.unlock_condition.ante} + elseif _c.name == 'Flower Pot' then loc_vars = {_c.unlock_condition.ante} + elseif _c.name == 'Blueprint' then + elseif _c.name == 'Wee Joker' then loc_vars = {_c.unlock_condition.n_rounds} + elseif _c.name == 'Merry Andy' then loc_vars = {_c.unlock_condition.n_rounds} + elseif _c.name == 'Oops! All 6s' then loc_vars = {number_format(_c.unlock_condition.chips)} + elseif _c.name == 'The Idol' then loc_vars = {number_format(_c.unlock_condition.chips)} + elseif _c.name == 'Seeing Double' then loc_vars = {localize("ph_4_7_of_clubs")} + elseif _c.name == 'Matador' then + elseif _c.name == 'Hit the Road' then + elseif _c.name == 'The Duo' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'The Trio' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'The Family' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'The Order' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'The Tribe' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'Stuntman' then loc_vars = {number_format(_c.unlock_condition.chips)} + elseif _c.name == 'Invisible Joker' then + elseif _c.name == 'Brainstorm' then + elseif _c.name == 'Satellite' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Shoot the Moon' then + elseif _c.name == "Driver's License" then loc_vars = {_c.unlock_condition.extra.count} + elseif _c.name == 'Cartomancer' then loc_vars = {_c.unlock_condition.tarot_count} + elseif _c.name == 'Astronomer' then + elseif _c.name == 'Burnt Joker' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_cards_sold} + elseif _c.name == 'Bootstraps' then loc_vars = {_c.unlock_condition.extra.count} + --Vouchers + elseif _c.name == 'Overstock Plus' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_shop_dollars_spent} + elseif _c.name == 'Liquidation' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Tarot Tycoon' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_tarots_bought} + elseif _c.name == 'Planet Tycoon' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_planets_bought} + elseif _c.name == 'Glow Up' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Reroll Glut' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_shop_rerolls} + elseif _c.name == 'Omen Globe' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_tarot_reading_used} + elseif _c.name == 'Observatory' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_planetarium_used} + elseif _c.name == 'Nacho Tong' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_cards_played} + elseif _c.name == 'Recyclomancy' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_cards_discarded} + elseif _c.name == 'Money Tree' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak} + elseif _c.name == 'Antimatter' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].voucher_usage.v_blank and G.PROFILES[G.SETTINGS.profile].voucher_usage.v_blank.count or 0} + elseif _c.name == 'Illusion' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_playing_cards_bought} + elseif _c.name == 'Petroglyph' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Retcon' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Palette' then loc_vars = {_c.unlock_condition.extra} + end + + if _c.rarity and _c.rarity == 4 and specific_vars and not specific_vars.not_hidden then + localize{type = 'unlocks', key = 'joker_locked_legendary', set = 'Other', nodes = desc_nodes, vars = loc_vars} + else + + localize{type = 'unlocks', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + end + end + elseif hide_desc then + localize{type = 'other', key = 'undiscovered_'..(string.lower(_c.set)), set = _c.set, nodes = desc_nodes} + elseif specific_vars and specific_vars.debuffed then + localize{type = 'other', key = 'debuffed_'..(specific_vars.playing_card and 'playing_card' or 'default'), nodes = desc_nodes} + elseif _c.set == 'Joker' then + if _c.name == 'Stone Joker' or _c.name == 'Marble Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_stone + elseif _c.name == 'Steel Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_steel + elseif _c.name == 'Glass Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_glass + elseif _c.name == 'Golden Ticket' then info_queue[#info_queue+1] = G.P_CENTERS.m_gold + elseif _c.name == 'Lucky Cat' then info_queue[#info_queue+1] = G.P_CENTERS.m_lucky + elseif _c.name == 'Midas Mask' then info_queue[#info_queue+1] = G.P_CENTERS.m_gold + elseif _c.name == 'Invisible Joker' then + if G.jokers and G.jokers.cards then + for k, v in ipairs(G.jokers.cards) do + if (v.edition and v.edition.negative) and (G.localization.descriptions.Other.remove_negative)then + main_end = {} + localize{type = 'other', key = 'remove_negative', nodes = main_end, vars = {}} + main_end = main_end[1] + break + end + end + end + elseif _c.name == 'Diet Cola' then info_queue[#info_queue+1] = {key = 'tag_double', set = 'Tag'} + elseif _c.name == 'Perkeo' then info_queue[#info_queue+1] = {key = 'e_negative_consumable', set = 'Edition', config = {extra = 1}} + end + if specific_vars and specific_vars.pinned then info_queue[#info_queue+1] = {key = 'pinned_left', set = 'Other'} end + if specific_vars and specific_vars.sticker then info_queue[#info_queue+1] = {key = string.lower(specific_vars.sticker)..'_sticker', set = 'Other'} end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = specific_vars or {}} + elseif _c.set == 'Tag' then + if _c.name == 'Negative Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_negative + elseif _c.name == 'Foil Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_foil + elseif _c.name == 'Holographic Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_holo + elseif _c.name == 'Polychrome Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome + elseif _c.name == 'Charm Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_arcana_mega_1 + elseif _c.name == 'Meteor Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_celestial_mega_1 + elseif _c.name == 'Ethereal Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_spectral_normal_1 + elseif _c.name == 'Standard Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_standard_mega_1 + elseif _c.name == 'Buffoon Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_buffoon_mega_1 + end + localize{type = 'descriptions', key = _c.key, set = 'Tag', nodes = desc_nodes, vars = specific_vars or {}} + elseif _c.set == 'Voucher' then + if _c.name == "Overstock" or _c.name == 'Overstock Plus' then + elseif _c.name == "Tarot Merchant" or _c.name == "Tarot Tycoon" then loc_vars = {_c.config.extra_disp} + elseif _c.name == "Planet Merchant" or _c.name == "Planet Tycoon" then loc_vars = {_c.config.extra_disp} + elseif _c.name == "Hone" or _c.name == "Glow Up" then loc_vars = {_c.config.extra} + elseif _c.name == "Reroll Surplus" or _c.name == "Reroll Glut" then loc_vars = {_c.config.extra} + elseif _c.name == "Grabber" or _c.name == "Nacho Tong" then loc_vars = {_c.config.extra} + elseif _c.name == "Wasteful" or _c.name == "Recyclomancy" then loc_vars = {_c.config.extra} + elseif _c.name == "Seed Money" or _c.name == "Money Tree" then loc_vars = {_c.config.extra/5} + elseif _c.name == "Blank" or _c.name == "Antimatter" then + elseif _c.name == "Hieroglyph" or _c.name == "Petroglyph" then loc_vars = {_c.config.extra} + elseif _c.name == "Director's Cut" or _c.name == "Retcon" then loc_vars = {_c.config.extra} + elseif _c.name == "Paint Brush" or _c.name == "Palette" then loc_vars = {_c.config.extra} + elseif _c.name == "Telescope" or _c.name == "Observatory" then loc_vars = {_c.config.extra} + elseif _c.name == "Clearance Sale" or _c.name == "Liquidation" then loc_vars = {_c.config.extra} + end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Edition' then + loc_vars = {_c.config.extra} + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Default' and specific_vars then + if specific_vars.nominal_chips then + localize{type = 'other', key = 'card_chips', nodes = desc_nodes, vars = {specific_vars.nominal_chips}} + end + if specific_vars.bonus_chips then + localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {specific_vars.bonus_chips}} + end + elseif _c.set == 'Enhanced' then + if specific_vars and _c.name ~= 'Stone Card' and specific_vars.nominal_chips then + localize{type = 'other', key = 'card_chips', nodes = desc_nodes, vars = {specific_vars.nominal_chips}} + end + if _c.effect == 'Mult Card' then loc_vars = {_c.config.mult} + elseif _c.effect == 'Wild Card' then + elseif _c.effect == 'Glass Card' then loc_vars = {_c.config.Xmult, G.GAME.probabilities.normal, _c.config.extra} + elseif _c.effect == 'Steel Card' then loc_vars = {_c.config.h_x_mult} + elseif _c.effect == 'Stone Card' then loc_vars = {((specific_vars and specific_vars.bonus_chips) or _c.config.bonus)} + elseif _c.effect == 'Gold Card' then loc_vars = {_c.config.h_dollars} + elseif _c.effect == 'Lucky Card' then loc_vars = {G.GAME.probabilities.normal, _c.config.mult, 5, _c.config.p_dollars, 15} + end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + if _c.name ~= 'Stone Card' and ((specific_vars and specific_vars.bonus_chips) or _c.config.bonus) then + localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {((specific_vars and specific_vars.bonus_chips) or _c.config.bonus)}} + end + elseif _c.set == 'Booster' then + local desc_override = 'p_arcana_normal' + if _c.name == 'Arcana Pack' then desc_override = 'p_arcana_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Arcana Pack' then desc_override = 'p_arcana_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Arcana Pack' then desc_override = 'p_arcana_mega'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Celestial Pack' then desc_override = 'p_celestial_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Celestial Pack' then desc_override = 'p_celestial_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Celestial Pack' then desc_override = 'p_celestial_mega'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Spectral Pack' then desc_override = 'p_spectral_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Spectral Pack' then desc_override = 'p_spectral_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Spectral Pack' then desc_override = 'p_spectral_mega'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Standard Pack' then desc_override = 'p_standard_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Standard Pack' then desc_override = 'p_standard_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Standard Pack' then desc_override = 'p_standard_mega'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Buffoon Pack' then desc_override = 'p_buffoon_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Buffoon Pack' then desc_override = 'p_buffoon_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Buffoon Pack' then desc_override = 'p_buffoon_mega'; loc_vars = {_c.config.choose, _c.config.extra} + end + name_override = desc_override + if not full_UI_table.name then full_UI_table.name = localize{type = 'name', set = 'Other', key = name_override, nodes = full_UI_table.name} end + localize{type = 'other', key = desc_override, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Spectral' then + if _c.name == 'Familiar' or _c.name == 'Grim' or _c.name == 'Incantation' then loc_vars = {_c.config.extra} + elseif _c.name == 'Immolate' then loc_vars = {_c.config.extra.destroy, _c.config.extra.dollars} + elseif _c.name == 'Hex' then info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome + elseif _c.name == 'Talisman' then info_queue[#info_queue+1] = {key = 'gold_seal', set = 'Other'} + elseif _c.name == 'Deja Vu' then info_queue[#info_queue+1] = {key = 'red_seal', set = 'Other'} + elseif _c.name == 'Trance' then info_queue[#info_queue+1] = {key = 'blue_seal', set = 'Other'} + elseif _c.name == 'Medium' then info_queue[#info_queue+1] = {key = 'purple_seal', set = 'Other'} + elseif _c.name == 'Ankh' then + if G.jokers and G.jokers.cards then + for k, v in ipairs(G.jokers.cards) do + if (v.edition and v.edition.negative) and (G.localization.descriptions.Other.remove_negative)then + info_queue[#info_queue+1] = G.P_CENTERS.e_negative + main_end = {} + localize{type = 'other', key = 'remove_negative', nodes = main_end, vars = {}} + main_end = main_end[1] + break + end + end + end + elseif _c.name == 'Cryptid' then loc_vars = {_c.config.extra} + end + if _c.name == 'Ectoplasm' then info_queue[#info_queue+1] = G.P_CENTERS.e_negative; loc_vars = {G.GAME.ecto_minus or 1} end + if _c.name == 'Aura' then + info_queue[#info_queue+1] = G.P_CENTERS.e_foil + info_queue[#info_queue+1] = G.P_CENTERS.e_holo + info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome + end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Planet' then + loc_vars = { + G.GAME.hands[_c.config.hand_type].level,localize(_c.config.hand_type, 'poker_hands'), G.GAME.hands[_c.config.hand_type].l_mult, G.GAME.hands[_c.config.hand_type].l_chips, + colours = {(G.GAME.hands[_c.config.hand_type].level==1 and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[math.min(7, G.GAME.hands[_c.config.hand_type].level)])} + } + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Tarot' then + if _c.name == "The Fool" then + local fool_c = G.GAME.last_tarot_planet and G.P_CENTERS[G.GAME.last_tarot_planet] or nil + local last_tarot_planet = fool_c and localize{type = 'name_text', key = fool_c.key, set = fool_c.set} or localize('k_none') + local colour = (not fool_c or fool_c.name == 'The Fool') and G.C.RED or G.C.GREEN + main_end = { + {n=G.UIT.C, config={align = "bm", padding = 0.02}, nodes={ + {n=G.UIT.C, config={align = "m", colour = colour, r = 0.05, padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = ' '..last_tarot_planet..' ', colour = G.C.UI.TEXT_LIGHT, scale = 0.3, shadow = true}}, + }} + }} + } + loc_vars = {last_tarot_planet} + if not (not fool_c or fool_c.name == 'The Fool') then + info_queue[#info_queue+1] = fool_c + end + elseif _c.name == "The Magician" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The High Priestess" then loc_vars = {_c.config.planets} + elseif _c.name == "The Empress" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Emperor" then loc_vars = {_c.config.tarots} + elseif _c.name == "The Hierophant" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Lovers" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Chariot" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "Justice" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Hermit" then loc_vars = {_c.config.extra} + elseif _c.name == "The Wheel of Fortune" then loc_vars = {G.GAME.probabilities.normal, _c.config.extra}; info_queue[#info_queue+1] = G.P_CENTERS.e_foil; info_queue[#info_queue+1] = G.P_CENTERS.e_holo; info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome; + elseif _c.name == "Strength" then loc_vars = {_c.config.max_highlighted} + elseif _c.name == "The Hanged Man" then loc_vars = {_c.config.max_highlighted} + elseif _c.name == "Death" then loc_vars = {_c.config.max_highlighted} + elseif _c.name == "Temperance" then + local _money = 0 + if G.jokers then + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.set == 'Joker' then + _money = _money + G.jokers.cards[i].sell_cost + end + end + end + loc_vars = {_c.config.extra, math.min(_c.config.extra, _money)} + elseif _c.name == "The Devil" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Tower" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Star" then loc_vars = {_c.config.max_highlighted, localize(_c.config.suit_conv, 'suits_plural'), colours = {G.C.SUITS[_c.config.suit_conv]}} + elseif _c.name == "The Moon" then loc_vars = {_c.config.max_highlighted, localize(_c.config.suit_conv, 'suits_plural'), colours = {G.C.SUITS[_c.config.suit_conv]}} + elseif _c.name == "The Sun" then loc_vars = {_c.config.max_highlighted, localize(_c.config.suit_conv, 'suits_plural'), colours = {G.C.SUITS[_c.config.suit_conv]}} + elseif _c.name == "Judgement" then + elseif _c.name == "The World" then loc_vars = {_c.config.max_highlighted, localize(_c.config.suit_conv, 'suits_plural'), colours = {G.C.SUITS[_c.config.suit_conv]}} + end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + end + + if main_end then + desc_nodes[#desc_nodes+1] = main_end + end + + --Fill all remaining info if this is the main desc + if not ((specific_vars and not specific_vars.sticker) and (card_type == 'Default' or card_type == 'Enhanced')) then + if desc_nodes == full_UI_table.main and not full_UI_table.name then + localize{type = 'name', key = _c.key, set = _c.set, nodes = full_UI_table.name} + if not full_UI_table.name then full_UI_table.name = {} end + elseif desc_nodes ~= full_UI_table.main then + desc_nodes.name = localize{type = 'name_text', key = name_override or _c.key, set = name_override and 'Other' or _c.set} + end + end + + if first_pass and not (_c.set == 'Edition') and badges then + for k, v in ipairs(badges) do + if v == 'foil' then info_queue[#info_queue+1] = G.P_CENTERS['e_foil'] end + if v == 'holographic' then info_queue[#info_queue+1] = G.P_CENTERS['e_holo'] end + if v == 'polychrome' then info_queue[#info_queue+1] = G.P_CENTERS['e_polychrome'] end + if v == 'negative' then info_queue[#info_queue+1] = G.P_CENTERS['e_negative'] end + if v == 'negative_consumable' then info_queue[#info_queue+1] = {key = 'e_negative_consumable', set = 'Edition', config = {extra = 1}} end + if v == 'gold_seal' then info_queue[#info_queue+1] = {key = 'gold_seal', set = 'Other'} end + if v == 'blue_seal' then info_queue[#info_queue+1] = {key = 'blue_seal', set = 'Other'} end + if v == 'red_seal' then info_queue[#info_queue+1] = {key = 'red_seal', set = 'Other'} end + if v == 'purple_seal' then info_queue[#info_queue+1] = {key = 'purple_seal', set = 'Other'} end + if v == 'eternal' then info_queue[#info_queue+1] = {key = 'eternal', set = 'Other'} end + if v == 'perishable' then info_queue[#info_queue+1] = {key = 'perishable', set = 'Other', vars = {G.GAME.perishable_rounds or 1, specific_vars.perish_tally or G.GAME.perishable_rounds}} end + if v == 'rental' then info_queue[#info_queue+1] = {key = 'rental', set = 'Other', vars = {G.GAME.rental_rate or 1}} end + if v == 'pinned_left' then info_queue[#info_queue+1] = {key = 'pinned_left', set = 'Other'} end + end + end + + for _, v in ipairs(info_queue) do + generate_card_ui(v, full_UI_table) + end + + return full_UI_table +end diff --git a/src/functions/misc_functions.lua b/src/functions/misc_functions.lua new file mode 100644 index 0000000..24c296e --- /dev/null +++ b/src/functions/misc_functions.lua @@ -0,0 +1,2022 @@ +--Updates all display information for all displays for a given screenmode. Returns the key for the resolution option cycle +-- +---@param screenmode string optional arg for one of 'Windowed', 'Fullscreen', or 'Borderless' +---@param display number optional arg to match fullscreen resolution with only the current display +function GET_DISPLAYINFO(screenmode, display) + --default the display to the current display, otherwise we need to return all available modes for the selected display + display = display or G.SETTINGS.WINDOW.selcted_display or 1 + + --default to current mode/'windowed', otherwise return all available options for specified mode + screenmode = screenmode or G.SETTINGS.WINDOW.screenmode or 'Windowed' + + --Get a count of the connected displays and iterate through them to update our window setting options accordingly + local display_count = love.window.getDisplayCount() + local res_option = 1 --This is the mode that the fullscreen option will default to for resolution, if we can find it in the list for the current monitor + local realw, realh = love.window.getMode() --the actual render resolution the window is currently using + local current_res_values = {w = realw, h = realh} + + --reset names to populate for displays + G.SETTINGS.WINDOW.display_names = {} + + for i = 1, display_count do + --reset the screen resolution table for this display and set the name + G.SETTINGS.WINDOW.DISPLAYS[i] = {} + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions = { + strings = {}, + values = {}, + } + G.SETTINGS.WINDOW.display_names[i] = ''..i + + --Get the render resolution and desktop resolution, this is a workaround to a known OpenGL issue where windows doesn't supply the correct DPI scaling factor + local render_w, render_h = love.window.getDesktopDimensions(i) + local unscaled_dims = love.window.getFullscreenModes(i)[1] + + --determine the DPI scale here, this can be used to determine the actual render resolution per display + G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale = 1--math.floor((0.5*unscaled_dims.width/render_w + 0.5*unscaled_dims.height/render_h)*500 + 0.5)/500 + G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS = unscaled_dims + + if screenmode == 'Fullscreen' then --Iterate through all possible screenmodes and populate the screen_resolutions table + --if the real resolution of the window is found, make sure we return that value + for _, v in ipairs(love.window.getFullscreenModes(i)) do + local _w, _h = v.width*G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale, v.height*G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale + if _w <= G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS.width and _h <= G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS.height then + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.strings[#G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.strings+1] = ''..v.width..' X '..v.height + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values[#G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values+1] = {w = v.width, h = v.height} + if i == G.SETTINGS.WINDOW.selected_display and i == display and current_res_values.w == v.width and current_res_values.h == v.height then + res_option = #G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values + end + end + end + elseif screenmode == 'Windowed' then + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.strings[1] = '-' + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values[1] = {w = 1280, h = 720} + elseif screenmode == 'Borderless' then + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.strings[1] = + ''..G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS.width/G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale..' X ' + ..G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS.height/G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values[1] = current_res_values + end + end + return res_option +end + +function timer_checkpoint(label, type, reset) + G.PREV_GARB = G.PREV_GARB or 0 + if not G.F_ENABLE_PERF_OVERLAY then return end + G.check = G.check or { + draw = { + checkpoint_list = {}, + checkpoints = 0, + last_time = 0, + }, + update = { + checkpoint_list = {}, + checkpoints = 0, + last_time = 0, + } + } + local cp = G.check[type] + if reset then + cp.last_time = love.timer.getTime() + cp.checkpoints = 0 + return + end + + cp.checkpoint_list[cp.checkpoints+1] = cp.checkpoint_list[cp.checkpoints+1] or {} + cp.checkpoints = cp.checkpoints+1 + cp.checkpoint_list[cp.checkpoints].label = label..': '..(collectgarbage( "count" ) - G.PREV_GARB) + cp.checkpoint_list[cp.checkpoints].time = love.timer.getTime() + cp.checkpoint_list[cp.checkpoints].TTC = cp.checkpoint_list[cp.checkpoints].time - cp.last_time + cp.checkpoint_list[cp.checkpoints].trend = cp.checkpoint_list[cp.checkpoints].trend or {} + cp.checkpoint_list[cp.checkpoints].states = cp.checkpoint_list[cp.checkpoints].states or {} + table.insert(cp.checkpoint_list[cp.checkpoints].trend, 1, cp.checkpoint_list[cp.checkpoints].TTC) + table.insert(cp.checkpoint_list[cp.checkpoints].states, 1, G.STATE) + cp.checkpoint_list[cp.checkpoints].trend[401] = nil + cp.checkpoint_list[cp.checkpoints].states[401] = nil + cp.last_time = cp.checkpoint_list[cp.checkpoints].time + G.PREV_GARB = collectgarbage( "count" ) + local av = 0 + for k, v in ipairs(cp.checkpoint_list[cp.checkpoints].trend) do + av = av + v/#cp.checkpoint_list[cp.checkpoints].trend + end + cp.checkpoint_list[cp.checkpoints].average = av +end + +function boot_timer(_label, _next, progress) + progress = progress or 0 + G.LOADING = G.LOADING or { + font = love.graphics.setNewFont("resources/fonts/m6x11plus.ttf", 20), + love.graphics.dis + } + local realw, realh = love.window.getMode() + love.graphics.setCanvas() + love.graphics.push() + love.graphics.setShader() + love.graphics.clear(0,0,0,1) + love.graphics.setColor(0.6, 0.8, 0.9,1) + if progress > 0 then love.graphics.rectangle('fill', realw/2 - 150, realh/2 - 15, progress*300, 30, 5) end + love.graphics.setColor(1, 1, 1,1) + love.graphics.setLineWidth(3) + love.graphics.rectangle('line', realw/2 - 150, realh/2 - 15, 300, 30, 5) + if G.F_VERBOSE and not _RELEASE_MODE then love.graphics.print("LOADING: ".._next, realw/2 - 150, realh/2 +40) end + love.graphics.pop() + love.graphics.present() + + G.ARGS.bt = G.ARGS.bt or love.timer.getTime() + G.ARGS.bt = love.timer.getTime() +end + +function EMPTY(t) + if not t then return {} end + for k, v in pairs(t) do + t[k] = nil + end + return t +end + +function interp(per, max, min) +min = min or 0 + if per and max then + return per*(max - min) + min + end +end + +function remove_all(t) + for i=#t, 1, -1 do + local v=t[i] + table.remove(t, i) + if v and v.children then + remove_all(v.children) + end + if v then v:remove() end + v = nil + end + for _, v in pairs(t) do + if v.children then remove_all(v.children) end + v:remove() + v = nil + end +end + +function Vector_Dist(trans1, trans2, mid) + local x = trans1.x - trans2.x + (mid and 0.5*(trans1.w-trans2.w) or 0) + local y = trans1.y - trans2.y + (mid and 0.5*(trans1.h-trans2.h) or 0) + return math.sqrt((x)*(x) + (y)*(y)) +end + +function Vector_Len(trans1) + return math.sqrt((trans1.x)*(trans1.x) + (trans1.y)*(trans1.y)) +end + +function Vector_Sub(trans1, trans2) + return {x = trans1.x - trans2.x, y = trans1.y - trans2.y} +end + +function get_index(t, val) + local index = nil + for i, v in pairs(t) do + if v == val then + index = i + end + end + return index +end + +function table_length(t) + local count = 0 + for _ in pairs(t) do count = count + 1 end + return count +end + +function remove_nils(t) + local ans = {} + for _,v in pairs(t) do + ans[ #ans+1 ] = v + end + return ans + end + +function SWAP(t, i, j) + if not t or not i or not j then return end + local temp = t[i] + t[i] = t[j] + t[j] = temp +end + +function pseudoshuffle(list, seed) + if seed then math.randomseed(seed) end + + if list[1] and list[1].sort_id then + table.sort(list, function (a, b) return (a.sort_id or 1) < (b.sort_id or 2) end) + end + + for i = #list, 2, -1 do + local j = math.random(i) + list[i], list[j] = list[j], list[i] + end +end + +function generate_starting_seed() + if G.GAME.stake >= 8 then + local r_leg, r_tally = {}, 0 + local g_leg, g_tally = {}, 0 + for k, v in pairs(G.P_JOKER_RARITY_POOLS[4]) do + local win_ante = get_joker_win_sticker(v, true) + if win_ante and (win_ante >= 8) then + g_leg[v.key] = true + g_tally = g_tally + 1 + else + r_leg[v.key] = true + r_tally = r_tally + 1 + end + end + if r_tally > 0 and g_tally > 0 then + local seed_found = nil + local extra_num = 0 + while not seed_found do + extra_num = extra_num + 0.561892350821 + seed_found = random_string(8, extra_num + G.CONTROLLER.cursor_hover.T.x*0.33411983 + G.CONTROLLER.cursor_hover.T.y*0.874146 + 0.412311010*G.CONTROLLER.cursor_hover.time) + if not r_leg[get_first_legendary(seed_found)] then seed_found = nil end + end + return seed_found + end + end + + return random_string(8, G.CONTROLLER.cursor_hover.T.x*0.33411983 + G.CONTROLLER.cursor_hover.T.y*0.874146 + 0.412311010*G.CONTROLLER.cursor_hover.time) +end + +function get_first_legendary(_key) + local _t, key = pseudorandom_element(G.P_JOKER_RARITY_POOLS[4], pseudoseed('Joker4', _key)) + return _t.key +end + +function pseudorandom_element(_t, seed) + if seed then math.randomseed(seed) end + local keys = {} + for k, v in pairs(_t) do + keys[#keys+1] = {k = k,v = v} + end + + if keys[1] and keys[1].v and type(keys[1].v) == 'table' and keys[1].v.sort_id then + table.sort(keys, function (a, b) return a.v.sort_id < b.v.sort_id end) + else + table.sort(keys, function (a, b) return a.k < b.k end) + end + + local key = keys[math.random(#keys)].k + return _t[key], key +end + +function random_string(length, seed) + if seed then math.randomseed(seed) end + local ret = '' + for i = 1, length do + ret = ret..string.char(math.random() > 0.7 and math.random(string.byte('1'),string.byte('9')) or (math.random() > 0.45 and math.random(string.byte('A'),string.byte('N')) or math.random(string.byte('P'),string.byte('Z')))) + end + return string.upper(ret) +end + +function pseudohash(str) + if true then + local num = 1 + for i=#str, 1, -1 do + num = ((1.1239285023/num)*string.byte(str, i)*math.pi + math.pi*i)%1 + end + return num + else + str = string.sub(string.format("%-16s",str), 1, 24) + + local h = 0 + + for i=#str, 1, -1 do + h = bit.bxor(h, bit.lshift(h, 7) + bit.rshift(h, 3) + string.byte(str, i)) + end + return tonumber(string.format("%.13f",math.sqrt(math.abs(h))%1)) + end +end + +function pseudoseed(key, predict_seed) + if key == 'seed' then return math.random() end + + if predict_seed then + local _pseed = pseudohash(key..(predict_seed or '')) + _pseed = math.abs(tonumber(string.format("%.13f", (2.134453429141+_pseed*1.72431234)%1))) + return (_pseed + (pseudohash(predict_seed) or 0))/2 + end + + if not G.GAME.pseudorandom[key] then + G.GAME.pseudorandom[key] = pseudohash(key..(G.GAME.pseudorandom.seed or '')) + end + + G.GAME.pseudorandom[key] = math.abs(tonumber(string.format("%.13f", (2.134453429141+G.GAME.pseudorandom[key]*1.72431234)%1))) + return (G.GAME.pseudorandom[key] + (G.GAME.pseudorandom.hashed_seed or 0))/2 +end + +function pseudorandom(seed, min, max) + if type(seed) == 'string' then seed = pseudoseed(seed) end + math.randomseed(seed) + if min and max then return math.random(min, max) + else return math.random() end +end + +function tprint(tbl, indent) + if not indent then indent = 0 end + local toprint = string.rep(" ", indent) .. "{\r\n" + indent = indent + 2 + for k, v in pairs(tbl) do + toprint = toprint .. string.rep(" ", indent) + if (type(k) == "number") then + toprint = toprint .. "[" .. k .. "] = " + elseif (type(k) == "string") then + toprint = toprint .. k .. "= " + end + if (type(v) == "number") then + toprint = toprint .. v .. ",\r\n" + elseif (type(v) == "string") then + toprint = toprint .. "\"" .. v .. "\",\r\n" + elseif (type(v) == "table") then + if indent>=10 then + toprint = toprint .. tostring(v) .. ",\r\n" + else + toprint = toprint .. tostring(v) .. tprint(v, indent + 1) .. ",\r\n" + end + else + toprint = toprint .. "\"" .. tostring(v) .. "\",\r\n" + end + end + toprint = toprint .. string.rep(" ", indent-2) .. "}" + return toprint +end + +function sortingFunction(e1, e2) + return e1.order < e2.order +end + +function HEX(hex) + if #hex <= 6 then hex = hex.."FF" end + local _,_,r,g,b,a = hex:find('(%x%x)(%x%x)(%x%x)(%x%x)') + local color = {tonumber(r,16)/255,tonumber(g,16)/255,tonumber(b,16)/255,tonumber(a,16)/255 or 255} + return color +end + +function get_blind_main_colour(blind) --either in the form of the blind key for the P_BLINDS table or type + local disabled = false + blind = blind or '' + if blind == 'Boss' or blind == 'Small' or blind == 'Big' then + G.GAME.round_resets.blind_states = G.GAME.round_resets.blind_states or {} + if G.GAME.round_resets.blind_states[blind] == 'Defeated' or G.GAME.round_resets.blind_states[blind] == 'Skipped' then disabled = true end + blind = G.GAME.round_resets.blind_choices[blind] + end + return (disabled or not G.P_BLINDS[blind]) and G.C.BLACK or + G.P_BLINDS[blind].boss_colour or + (blind == 'bl_small' and mix_colours(G.C.BLUE, G.C.BLACK, 0.6) or + blind == 'bl_big' and mix_colours(G.C.ORANGE, G.C.BLACK, 0.6)) or G.C.BLACK +end + +function evaluate_poker_hand(hand) + + local results = { + ["Flush Five"] = {}, + ["Flush House"] = {}, + ["Five of a Kind"] = {}, + ["Straight Flush"] = {}, + ["Four of a Kind"] = {}, + ["Full House"] = {}, + ["Flush"] = {}, + ["Straight"] = {}, + ["Three of a Kind"] = {}, + ["Two Pair"] = {}, + ["Pair"] = {}, + ["High Card"] = {}, + top = nil + } + + local parts = { + _5 = get_X_same(5,hand), + _4 = get_X_same(4,hand), + _3 = get_X_same(3,hand), + _2 = get_X_same(2,hand), + _flush = get_flush(hand), + _straight = get_straight(hand), + _highest = get_highest(hand) + } + + if next(parts._5) and next(parts._flush) then + results["Flush Five"] = parts._5 + if not results.top then results.top = results["Flush Five"] end + end + + if next(parts._3) and next(parts._2) and next(parts._flush) then + local fh_hand = {} + local fh_3 = parts._3[1] + local fh_2 = parts._2[1] + for i=1, #fh_3 do + fh_hand[#fh_hand+1] = fh_3[i] + end + for i=1, #fh_2 do + fh_hand[#fh_hand+1] = fh_2[i] + end + table.insert(results["Flush House"], fh_hand) + if not results.top then results.top = results["Flush House"] end + end + + if next(parts._5) then + results["Five of a Kind"] = parts._5 + if not results.top then results.top = results["Five of a Kind"] end + end + + if next(parts._flush) and next(parts._straight) then + local _s, _f, ret = parts._straight, parts._flush, {} + for _, v in ipairs(_f[1]) do + ret[#ret+1] = v + end + for _, v in ipairs(_s[1]) do + local in_straight = nil + for _, vv in ipairs(_f[1]) do + if vv == v then in_straight = true end + end + if not in_straight then ret[#ret+1] = v end + end + + results["Straight Flush"] = {ret} + if not results.top then results.top = results["Straight Flush"] end + end + + if next(parts._4) then + results["Four of a Kind"] = parts._4 + if not results.top then results.top = results["Four of a Kind"] end + end + + if next(parts._3) and next(parts._2) then + local fh_hand = {} + local fh_3 = parts._3[1] + local fh_2 = parts._2[1] + for i=1, #fh_3 do + fh_hand[#fh_hand+1] = fh_3[i] + end + for i=1, #fh_2 do + fh_hand[#fh_hand+1] = fh_2[i] + end + table.insert(results["Full House"], fh_hand) + if not results.top then results.top = results["Full House"] end + end + + if next(parts._flush) then + results["Flush"] = parts._flush + if not results.top then results.top = results["Flush"] end + end + + if next(parts._straight) then + results["Straight"] = parts._straight + if not results.top then results.top = results["Straight"] end + end + + if next(parts._3) then + results["Three of a Kind"] = parts._3 + if not results.top then results.top = results["Three of a Kind"] end + end + + if (#parts._2 == 2) or (#parts._3 == 1 and #parts._2 == 1) then + local fh_hand = {} + local r = parts._2 + local fh_2a = r[1] + local fh_2b = r[2] + if not fh_2b then + fh_2b = parts._3[1] + end + for i=1, #fh_2a do + fh_hand[#fh_hand+1] = fh_2a[i] + end + for i=1, #fh_2b do + fh_hand[#fh_hand+1] = fh_2b[i] + end + table.insert(results["Two Pair"], fh_hand) + if not results.top then results.top = results["Two Pair"] end + end + + if next(parts._2) then + results["Pair"] = parts._2 + if not results.top then results.top = results["Pair"] end + end + + if next(parts._highest) then + results["High Card"] = parts._highest + if not results.top then results.top = results["High Card"] end + end + + if results["Five of a Kind"][1] then + results["Four of a Kind"] = {results["Five of a Kind"][1], results["Five of a Kind"][2], results["Five of a Kind"][3], results["Five of a Kind"][4]} + end + + if results["Four of a Kind"][1] then + results["Three of a Kind"] = {results["Four of a Kind"][1], results["Four of a Kind"][2], results["Four of a Kind"][3]} + end + + if results["Three of a Kind"][1] then + results["Pair"] = {results["Three of a Kind"][1], results["Three of a Kind"][2]} + end + + return results +end + +function get_flush(hand) + local ret = {} + local four_fingers = next(find_joker('Four Fingers')) + local suits = { + "Spades", + "Hearts", + "Clubs", + "Diamonds" + } + if #hand > 5 or #hand < (5 - (four_fingers and 1 or 0)) then return ret else + for j = 1, #suits do + local t = {} + local suit = suits[j] + local flush_count = 0 + for i=1, #hand do + if hand[i]:is_suit(suit, nil, true) then flush_count = flush_count + 1; t[#t+1] = hand[i] end + end + if flush_count >= (5 - (four_fingers and 1 or 0)) then + table.insert(ret, t) + return ret + end + end + return {} + end +end + +function get_straight(hand) + local ret = {} + local four_fingers = next(find_joker('Four Fingers')) + if #hand > 5 or #hand < (5 - (four_fingers and 1 or 0)) then return ret else + local t = {} + local IDS = {} + for i=1, #hand do + local id = hand[i]:get_id() + if id > 1 and id < 15 then + if IDS[id] then + IDS[id][#IDS[id]+1] = hand[i] + else + IDS[id] = {hand[i]} + end + end + end + + local straight_length = 0 + local straight = false + local can_skip = next(find_joker('Shortcut')) + local skipped_rank = false + for j = 1, 14 do + if IDS[j == 1 and 14 or j] then + straight_length = straight_length + 1 + skipped_rank = false + for k, v in ipairs(IDS[j == 1 and 14 or j]) do + t[#t+1] = v + end + elseif can_skip and not skipped_rank and j ~= 14 then + skipped_rank = true + else + straight_length = 0 + skipped_rank = false + if not straight then t = {} end + if straight then break end + end + if straight_length >= (5 - (four_fingers and 1 or 0)) then straight = true end + end + if not straight then return ret end + table.insert(ret, t) + return ret + end +end + +function get_X_same(num, hand) + local vals = {{},{},{},{},{},{},{},{},{},{},{},{},{},{}} + for i=#hand, 1, -1 do + local curr = {} + table.insert(curr, hand[i]) + for j=1, #hand do + if hand[i]:get_id() == hand[j]:get_id() and i ~= j then + table.insert(curr, hand[j]) + end + end + if #curr == num then + vals[curr[1]:get_id()] = curr + end + end + local ret = {} + for i=#vals, 1, -1 do + if next(vals[i]) then table.insert(ret, vals[i]) end + end + return ret +end + +function get_highest(hand) + local highest = nil + for k, v in ipairs(hand) do + if not highest or v:get_nominal() > highest:get_nominal() then + highest = v + end + end + if #hand > 0 then return {{highest}} else return {} end +end + +function reset_drawhash() + G.DRAW_HASH = EMPTY(G.DRAW_HASH) +end + +--Copyright 2021 Max Cahill (Zlib license) +-- +--This software is provided 'as-is', without any express or implied +--warranty. In no event will the authors be held liable for any damages +--arising from the use of this software. +-- +--Permission is granted to anyone to use this software for any purpose, +--including commercial applications, and to alter it and redistribute it +--freely, subject to the following restrictions: +-- +--1. The origin of this software must not be misrepresented; you must not +-- claim that you wrote the original software. If you use this software +-- in a product, an acknowledgment in the product documentation would be +-- appreciated but is not required. +--2. Altered source versions must be plainly marked as such, and must not be +-- misrepresented as being the original software. +--3. This notice may not be removed or altered from any source distribution. +--This function was slightly modified from it's original state +function nuGC(time_budget, memory_ceiling, disable_otherwise) + time_budget = time_budget or 3e-4 + memory_ceiling = memory_ceiling or 300 + local max_steps = 1000 + local steps = 0 + local start_time = love.timer.getTime() + while + love.timer.getTime() - start_time < time_budget and + steps < max_steps + do + collectgarbage("step", 1) + steps = steps + 1 + end + --safety net + if collectgarbage("count") / 1024 > memory_ceiling then + collectgarbage("collect") + end + --don't collect gc outside this margin + if disable_otherwise then + collectgarbage("stop") + end +end + +--The drawhash is a hash table of all drawn nodes and all nodes that may be invisible but still collide with the cursor +function add_to_drawhash(obj) + if obj then + G.DRAW_HASH[#G.DRAW_HASH+1] = obj + end +end + +function mix_colours(C1, C2, proportionC1) + return { + (C1[1] or 0.5)*proportionC1 + (C2[1] or 0.5)*(1-proportionC1), + (C1[2] or 0.5)*proportionC1 + (C2[2] or 0.5)*(1-proportionC1), + (C1[3] or 0.5)*proportionC1 + (C2[3] or 0.5)*(1-proportionC1), + (C1[4] or 1)*proportionC1 + (C2[4] or 1)*(1-proportionC1), + } +end + +function mod_chips(_chips) + if G.GAME.modifiers.chips_dollar_cap then + _chips = math.min(_chips, math.max(G.GAME.dollars, 0)) + end + return _chips +end + +function mod_mult(_mult) + return _mult +end + +function play_sound(sound_code, per, vol) + if G.F_MUTE then return end + if sound_code and G.SETTINGS.SOUND.volume > 0.001 then + G.ARGS.play_sound = G.ARGS.play_sound or {} + G.ARGS.play_sound.type = 'sound' + G.ARGS.play_sound.time = G.TIMERS.REAL + G.ARGS.play_sound.crt = G.SETTINGS.GRAPHICS.crt + G.ARGS.play_sound.sound_code = sound_code + G.ARGS.play_sound.per = per + G.ARGS.play_sound.vol = vol + G.ARGS.play_sound.pitch_mod = G.PITCH_MOD + G.ARGS.play_sound.state = G.STATE + G.ARGS.play_sound.music_control = G.SETTINGS.music_control + G.ARGS.play_sound.sound_settings = G.SETTINGS.SOUND + G.ARGS.play_sound.splash_vol = G.SPLASH_VOL + G.ARGS.play_sound.overlay_menu = not (not G.OVERLAY_MENU) + if G.F_SOUND_THREAD then + G.SOUND_MANAGER.channel:push(G.ARGS.play_sound) + else + PLAY_SOUND(G.ARGS.play_sound) + end + end +end + +function modulate_sound(dt) + --volume of the splash screen is set here + G.SPLASH_VOL = 2*dt*(G.STATE == G.STATES.SPLASH and 1 or 0) + (G.SPLASH_VOL or 1)*(1-2*dt) + + --Control the music here + local desired_track = + G.video_soundtrack or + (G.STATE == G.STATES.SPLASH and '') or + (G.booster_pack_sparkles and not G.booster_pack_sparkles.REMOVED and 'music2') or + (G.booster_pack_meteors and not G.booster_pack_meteors.REMOVED and 'music3') or + (G.booster_pack and not G.booster_pack.REMOVED and 'music2') or + (G.shop and not G.shop.REMOVED and 'music4') or + (G.GAME.blind and G.GAME.blind.boss and 'music5') or + ('music1') + + G.PITCH_MOD = (G.PITCH_MOD or 1)*(1 - dt) + dt*((not G.normal_music_speed and G.STATE == G.STATES.GAME_OVER) and 0.5 or 1) + + --For ambient sound control + G.SETTINGS.ambient_control = G.SETTINGS.ambient_control or {} + G.ARGS.score_intensity = G.ARGS.score_intensity or {} + if type(G.GAME.current_round.current_hand.chips) ~= 'number' or type(G.GAME.current_round.current_hand.mult) ~= 'number' then + G.ARGS.score_intensity.earned_score = 0 + else + G.ARGS.score_intensity.earned_score = G.GAME.current_round.current_hand.chips*G.GAME.current_round.current_hand.mult + end + G.ARGS.score_intensity.required_score = G.GAME.blind and G.GAME.blind.chips or 0 + G.ARGS.score_intensity.flames = math.min(1, (G.STAGE == G.STAGES.RUN and 1 or 0)*( + (G.ARGS.chip_flames and (G.ARGS.chip_flames.real_intensity + G.ARGS.chip_flames.change) or 0))/10) + G.ARGS.score_intensity.organ = G.video_organ or G.ARGS.score_intensity.required_score > 0 and math.max(math.min(0.4, 0.1*math.log(G.ARGS.score_intensity.earned_score/(G.ARGS.score_intensity.required_score+1), 5)),0.) or 0 + + local AC = G.SETTINGS.ambient_control + G.ARGS.ambient_sounds = G.ARGS.ambient_sounds or { + ambientFire2 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.9*((G.ARGS.score_intensity.flames > 0.3) and 1 or G.ARGS.score_intensity.flames/0.3) end}, + ambientFire1 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.8*((G.ARGS.score_intensity.flames > 0.3) and (G.ARGS.score_intensity.flames-0.3)/0.7 or 0) end}, + ambientFire3 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.4*((G.ARGS.chip_flames and G.ARGS.chip_flames.change or 0) + (G.ARGS.mult_flames and G.ARGS.mult_flames.change or 0)) end}, + ambientOrgan1 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.6*(G.SETTINGS.SOUND.music_volume + 100)/200*(G.ARGS.score_intensity.organ) end}, + } + + for k, v in pairs(G.ARGS.ambient_sounds) do + AC[k] = AC[k] or {} + AC[k].per = (k == 'ambientOrgan1') and 0.7 or (k == 'ambientFire1' and 1.1) or (k == 'ambientFire2' and 1.05) or 1 + AC[k].vol = (not G.video_organ and G.STATE == G.STATES.SPLASH) and 0 or AC[k].vol and v.volfunc(AC[k].vol) or 0 + end + + G.ARGS.push = G.ARGS.push or {} + G.ARGS.push.type = 'modulate' + G.ARGS.push.pitch_mod = G.PITCH_MOD + G.ARGS.push.state = G.STATE + G.ARGS.push.time = G.TIMERS.REAL + G.ARGS.push.dt = dt + G.ARGS.push.desired_track = desired_track + G.ARGS.push.sound_settings = G.SETTINGS.SOUND + G.ARGS.push.splash_vol = G.SPLASH_VOL + G.ARGS.push.overlay_menu = not (not G.OVERLAY_MENU) + G.ARGS.push.ambient_control = G.SETTINGS.ambient_control + + if G.F_SOUND_THREAD then + G.SOUND_MANAGER.channel:push(G.ARGS.push) + else + MODULATE(G.ARGS.push) + end +end + +function count_of_suit(area, suit) + local num = 0 + for _,c in pairs(area.cards) do + if c.base.suit == suit then + num = num +1 + end + end + return num +end + +function prep_draw(moveable, scale, rotate, offset) + love.graphics.push() + love.graphics.scale(G.TILESCALE*G.TILESIZE) + love.graphics.translate( + moveable.VT.x+moveable.VT.w/2 + (offset and offset.x or 0) + ((moveable.layered_parallax and moveable.layered_parallax.x) or ((moveable.parent and moveable.parent.layered_parallax and moveable.parent.layered_parallax.x)) or 0), + moveable.VT.y+moveable.VT.h/2 + (offset and offset.y or 0) + ((moveable.layered_parallax and moveable.layered_parallax.y) or ((moveable.parent and moveable.parent.layered_parallax and moveable.parent.layered_parallax.y)) or 0)) + if moveable.VT.r ~= 0 or moveable.juice or rotate then love.graphics.rotate(moveable.VT.r + (rotate or 0)) end + love.graphics.translate( + -scale*moveable.VT.w*(moveable.VT.scale)/2, + -scale*moveable.VT.h*(moveable.VT.scale)/2) + love.graphics.scale(moveable.VT.scale*scale) +end + +function get_chosen_triangle_from_rect(x, y, w, h, vert) + local scale = 2 + if vert then + x = x + math.min(0.6*math.sin(G.TIMERS.REAL*9)*scale+0.2, 0) + return { + x-3.5*scale, y+h/2 - 1.5*scale, + x-0.5*scale, y+h/2 + 0, + x-3.5*scale,y+h/2 + 1.5*scale + } + else + y = y + math.min(0.6*math.sin(G.TIMERS.REAL*9)*scale+0.2, 0) + return { + x+w/2 - 1.5*scale, y-4*scale, + x+w/2 + 0, y-1.1*scale, + x+w/2 + 1.5*scale, y-4*scale + } + end +end + +function point_translate(_T, delta) + _T.x = (_T.x + delta.x) or 0 + _T.y = (_T.y + delta.y) or 0 +end + +function point_rotate(_T, angle) + local _cos, _sin, _ox, _oy = math.cos(angle+math.pi/2), math.sin(angle+math.pi/2), _T.x , _T.y + _T.x = -_oy*_cos + _ox*_sin + _T.y = _oy*_sin + _ox*_cos +end + +function lighten(colour, percent, no_tab) + if no_tab then + return + colour[1]*(1-percent)+percent, + colour[2]*(1-percent)+percent, + colour[3]*(1-percent)+percent, + colour[4] + end + return { + colour[1]*(1-percent)+percent, + colour[2]*(1-percent)+percent, + colour[3]*(1-percent)+percent, + colour[4] + } +end + +function darken(colour, percent, no_tab) + if no_tab then + return + colour[1]*(1-percent), + colour[2]*(1-percent), + colour[3]*(1-percent), + colour[4] + end + return { + colour[1]*(1-percent), + colour[2]*(1-percent), + colour[3]*(1-percent), + colour[4] + } +end + +function adjust_alpha(colour, new_alpha, no_tab) + if no_tab then + return + colour[1], + colour[2], + colour[3], + new_alpha + end + return { + colour[1], + colour[2], + colour[3], + new_alpha + } +end + +function alert_no_space(card, area) + G.CONTROLLER.locks.no_space = true + attention_text({ + scale = 0.9, text = localize('k_no_space_ex'), hold = 0.9, align = 'cm', + cover = area, cover_padding = 0.1, cover_colour = adjust_alpha(G.C.BLACK, 0.7) + }) + card:juice_up(0.3, 0.2) + for i = 1, #area.cards do + area.cards[i]:juice_up(0.15) + end + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.5*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, + func = function() + G.CONTROLLER.locks.no_space = nil + return true end})) +end + +function find_joker(name, non_debuff) + local jokers = {} + if not G.jokers or not G.jokers.cards then return {} end + for k, v in pairs(G.jokers.cards) do + if v and type(v) == 'table' and v.ability.name == name and (non_debuff or not v.debuff) then + table.insert(jokers, v) + end + end + for k, v in pairs(G.consumeables.cards) do + if v and type(v) == 'table' and v.ability.name == name and (non_debuff or not v.debuff) then + table.insert(jokers, v) + end + end + return jokers +end + +function get_blind_amount(ante) + local k = 0.75 + if not G.GAME.modifiers.scaling or G.GAME.modifiers.scaling == 1 then + local amounts = { + 300, 800, 2000, 5000, 11000, 20000, 35000, 50000 + } + if ante < 1 then return 100 end + if ante <= 8 then return amounts[ante] end + local a, b, c, d = amounts[8],1.6,ante-8, 1 + 0.2*(ante-8) + local amount = math.floor(a*(b+(k*c)^d)^c) + amount = amount - amount%(10^math.floor(math.log10(amount)-1)) + return amount + elseif G.GAME.modifiers.scaling == 2 then + local amounts = { + 300, 900, 2600, 8000, 20000, 36000, 60000, 100000 + --300, 900, 2400, 7000, 18000, 32000, 56000, 90000 + } + if ante < 1 then return 100 end + if ante <= 8 then return amounts[ante] end + local a, b, c, d = amounts[8],1.6,ante-8, 1 + 0.2*(ante-8) + local amount = math.floor(a*(b+(k*c)^d)^c) + amount = amount - amount%(10^math.floor(math.log10(amount)-1)) + return amount + elseif G.GAME.modifiers.scaling == 3 then + local amounts = { + 300, 1000, 3200, 9000, 25000, 60000, 110000, 200000 + --300, 1000, 3000, 8000, 22000, 50000, 90000, 180000 + } + if ante < 1 then return 100 end + if ante <= 8 then return amounts[ante] end + local a, b, c, d = amounts[8],1.6,ante-8, 1 + 0.2*(ante-8) + local amount = math.floor(a*(b+(k*c)^d)^c) + amount = amount - amount%(10^math.floor(math.log10(amount)-1)) + return amount + end +end + +function number_format(num) + G.E_SWITCH_POINT = G.E_SWITCH_POINT or 100000000000 + if not num or type(num) ~= 'number' then return num or '' end + if num >= G.E_SWITCH_POINT then + local x = string.format("%.4g",num) + local fac = math.floor(math.log(tonumber(x), 10)) + return string.format("%.3f",x/(10^fac))..'e'..fac + end + return string.format(num ~= math.floor(num) and (num >= 100 and "%.0f" or num >= 10 and "%.1f" or "%.2f") or "%.0f", num):reverse():gsub("(%d%d%d)", "%1,"):gsub(",$", ""):reverse() +end + +function score_number_scale(scale, amt) + G.E_SWITCH_POINT = G.E_SWITCH_POINT or 100000000000 + if type(amt) ~= 'number' then return 0.7*(scale or 1) end + if amt >= G.E_SWITCH_POINT then + return 0.7*(scale or 1) + elseif amt >= 1000000 then + return 14*0.75/(math.floor(math.log(amt))+4)*(scale or 1) + else + return 0.75*(scale or 1) + end +end + +function copy_table(O) + local O_type = type(O) + local copy + if O_type == 'table' then + copy = {} + for k, v in next, O, nil do + copy[copy_table(k)] = copy_table(v) + end + setmetatable(copy, copy_table(getmetatable(O))) + else + copy = O + end + return copy +end + +function send_score(_score) + if G.F_HTTP_SCORES and G.SETTINGS.COMP and G.F_STREAMER_EVENT then + G.HTTP_MANAGER.out_channel:push({ + set_score = true, + score = _score, + username = G.SETTINGS.COMP.name, + uid = tostring(G.STEAM.user.getSteamID()), + version = G.VERSION + }) + end +end + +function send_name() + if G.F_HTTP_SCORES and G.SETTINGS.COMP and G.F_STREAMER_EVENT then + G.HTTP_MANAGER.out_channel:push({ + set_name = true, + username = G.SETTINGS.COMP.name, + uid = tostring(G.STEAM.user.getSteamID()), + version = G.VERSION + }) + end +end + +function check_and_set_high_score(score, amt) + if not amt or type(amt) ~= 'number' then return end + if G.GAME.round_scores[score] and math.floor(amt) > G.GAME.round_scores[score].amt then + G.GAME.round_scores[score].amt = math.floor(amt) + end + if G.GAME.seeded then return end + if score == 'hand' and G.SETTINGS.COMP and ((not G.SETTINGS.COMP.score) or (G.SETTINGS.COMP.score < math.floor(amt))) then + G.SETTINGS.COMP.score = amt + send_score(math.floor(amt)) + end + if G.PROFILES[G.SETTINGS.profile].high_scores[score] and math.floor(amt) > G.PROFILES[G.SETTINGS.profile].high_scores[score].amt then + if G.GAME.round_scores[score] then G.GAME.round_scores[score].high_score = true end + G.PROFILES[G.SETTINGS.profile].high_scores[score].amt = math.floor(amt) + G:save_settings() + end +end + +function set_joker_usage() + for k, v in pairs(G.jokers.cards) do + if v.config.center_key and v.ability.set == 'Joker' then + if G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] then + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].count = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].count + 1 + else + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] = {count = 1, order = v.config.center.order, wins = {}, losses = {}} + end + end + end + G:save_settings() +end + +function set_joker_win() + for k, v in pairs(G.jokers.cards) do + if v.config.center_key and v.ability.set == 'Joker' then + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] or {count = 1, order = v.config.center.order, wins = {}, losses = {}} + if G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] then + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins or {} + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins[G.GAME.stake] or 0) + 1 + end + end + end + G:save_settings() +end + +function get_joker_win_sticker(_center, index) + if G.PROFILES[G.SETTINGS.profile].joker_usage[_center.key] and + G.PROFILES[G.SETTINGS.profile].joker_usage[_center.key].wins then + local _w = 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].joker_usage[_center.key].wins) do + _w = math.max(k, _w) + end + if index then return _w end + if _w > 0 then return G.sticker_map[_w] end + end + if index then return 0 end +end + +function set_joker_loss() + for k, v in pairs(G.jokers.cards) do + if v.config.center_key and v.ability.set == 'Joker' then + if G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] then + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses or {} + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses[G.GAME.stake] or 0) + 1 + end + end + end + G:save_settings() +end + +function set_deck_usage() + if G.GAME.selected_back and G.GAME.selected_back.effect and G.GAME.selected_back.effect.center and G.GAME.selected_back.effect.center.key then + local deck_key = G.GAME.selected_back.effect.center.key + if G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].count = G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].count + 1 + else + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}} + end + G:save_settings() + end +end + +function set_deck_win() + if G.GAME.selected_back and G.GAME.selected_back.effect and G.GAME.selected_back.effect.center and G.GAME.selected_back.effect.center.key then + local deck_key = G.GAME.selected_back.effect.center.key + if not G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}} end + if G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].wins[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].wins[G.GAME.stake] or 0) + 1 + for i = 1, G.GAME.stake do + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].wins[i] = (G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].wins[i] or 1) + end + end + set_challenge_unlock() + G:save_settings() + end +end + +function set_challenge_unlock() + if G.PROFILES[G.SETTINGS.profile].all_unlocked then return end + if G.PROFILES[G.SETTINGS.profile].challenges_unlocked then + local _ch_comp, _ch_tot = 0,#G.CHALLENGES + for k, v in ipairs(G.CHALLENGES) do + if v.id and G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or ''] then + _ch_comp = _ch_comp + 1 + end + end + G.PROFILES[G.SETTINGS.profile].challenges_unlocked = math.min(_ch_tot, _ch_comp+5) + else + local deck_wins = 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage) do + if v.wins and v.wins[1] then + deck_wins = deck_wins + 1 + end + end + if deck_wins >= G.CHALLENGE_WINS and not G.PROFILES[G.SETTINGS.profile].challenges_unlocked then + G.PROFILES[G.SETTINGS.profile].challenges_unlocked = 5 + notify_alert('b_challenge', "Back") + end + end +end + +function get_deck_win_stake(_deck_key) + if not _deck_key then + local _w, _w_low = 0, nil + local deck_count = 0 + for _, deck in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage) do + local deck_won_with = nil + for k, v in pairs(deck.wins) do + deck_won_with = true + _w = math.max(k, _w) + end + if deck_won_with then deck_count = deck_count + 1 end + _w_low = _w_low and (math.min(_w_low, _w)) or _w + end + return _w, ((deck_count >= #G.P_CENTER_POOLS.Back) and _w_low or 0) + end + if G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key] and + G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key].wins then + local _w = 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key].wins) do + _w = math.max(k, _w) + end + return _w + end + return 0 +end + +function get_deck_win_sticker(_center) + if G.PROFILES[G.SETTINGS.profile].deck_usage[_center.key] and + G.PROFILES[G.SETTINGS.profile].deck_usage[_center.key].wins then + local _w = -1 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage[_center.key].wins) do + _w = math.max(k, _w) + end + if _w > 0 then return G.sticker_map[_w] end + end +end + +function set_deck_loss() + if G.GAME.selected_back and G.GAME.selected_back.effect and G.GAME.selected_back.effect.center and G.GAME.selected_back.effect.center.key then + local deck_key = G.GAME.selected_back.effect.center.key + if not G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}} end + if G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].losses[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].losses[G.GAME.stake] or 0) + 1 + end + G:save_settings() + end +end + +function set_consumeable_usage(card) + if card.config.center_key and card.ability.consumeable then + if G.PROFILES[G.SETTINGS.profile].consumeable_usage[card.config.center_key] then + G.PROFILES[G.SETTINGS.profile].consumeable_usage[card.config.center_key].count = G.PROFILES[G.SETTINGS.profile].consumeable_usage[card.config.center_key].count + 1 + else + G.PROFILES[G.SETTINGS.profile].consumeable_usage[card.config.center_key] = {count = 1, order = card.config.center.order} + end + if G.GAME.consumeable_usage[card.config.center_key] then + G.GAME.consumeable_usage[card.config.center_key].count = G.GAME.consumeable_usage[card.config.center_key].count + 1 + else + G.GAME.consumeable_usage[card.config.center_key] = {count = 1, order = card.config.center.order, set = card.ability.set} + end + G.GAME.consumeable_usage_total = G.GAME.consumeable_usage_total or {tarot = 0, planet = 0, spectral = 0, tarot_planet = 0, all = 0} + if card.config.center.set == 'Tarot' then + G.GAME.consumeable_usage_total.tarot = G.GAME.consumeable_usage_total.tarot + 1 + G.GAME.consumeable_usage_total.tarot_planet = G.GAME.consumeable_usage_total.tarot_planet + 1 + elseif card.config.center.set == 'Planet' then + G.GAME.consumeable_usage_total.planet = G.GAME.consumeable_usage_total.planet + 1 + G.GAME.consumeable_usage_total.tarot_planet = G.GAME.consumeable_usage_total.tarot_planet + 1 + elseif card.config.center.set == 'Spectral' then G.GAME.consumeable_usage_total.spectral = G.GAME.consumeable_usage_total.spectral + 1 + end + + G.GAME.consumeable_usage_total.all = G.GAME.consumeable_usage_total.all + 1 + + if not card.config.center.discovered then + discover_card(card) + end + + if card.config.center.set == 'Tarot' or card.config.center.set == 'Planet' then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.GAME.last_tarot_planet = card.config.center_key + return true + end + })) + return true + end + })) + end + + end + G:save_settings() +end + +function set_voucher_usage(card) + if card.config.center_key and card.ability.set == 'Voucher' then + if G.PROFILES[G.SETTINGS.profile].voucher_usage[card.config.center_key] then + G.PROFILES[G.SETTINGS.profile].voucher_usage[card.config.center_key].count = G.PROFILES[G.SETTINGS.profile].voucher_usage[card.config.center_key].count + 1 + else + G.PROFILES[G.SETTINGS.profile].voucher_usage[card.config.center_key] = {count = 1, order = card.config.center.order} + end + end + G:save_settings() +end + +function set_hand_usage(hand) + local hand_label = hand + hand = hand:gsub("%s+", "") + if G.PROFILES[G.SETTINGS.profile].hand_usage[hand] then + G.PROFILES[G.SETTINGS.profile].hand_usage[hand].count = G.PROFILES[G.SETTINGS.profile].hand_usage[hand].count + 1 + else + G.PROFILES[G.SETTINGS.profile].hand_usage[hand] = {count = 1, order = hand_label} + end + if G.GAME.hand_usage[hand] then + G.GAME.hand_usage[hand].count = G.GAME.hand_usage[hand].count + 1 + else + G.GAME.hand_usage[hand] = {count = 1, order = hand_label} + end + G:save_settings() +end + +function set_profile_progress() + G.PROGRESS = G.PROGRESS or { + joker_stickers = {tally = 0, of = 0}, + deck_stakes = {tally = 0, of = 0}, + challenges = {tally = 0, of = 0}, + } + for _, v in pairs(G.PROGRESS) do + if type(v) == 'table' then + v.tally = 0 + v.of = 0 + end + end + + for _, v in pairs(G.P_CENTERS) do + if v.set == 'Back' and not v.omit then + G.PROGRESS.deck_stakes.of = G.PROGRESS.deck_stakes.of + #G.P_CENTER_POOLS.Stake + G.PROGRESS.deck_stakes.tally = G.PROGRESS.deck_stakes.tally + get_deck_win_stake(v.key) + end + if v.set == 'Joker' then + G.PROGRESS.joker_stickers.of = G.PROGRESS.joker_stickers.of + #G.P_CENTER_POOLS.Stake + G.PROGRESS.joker_stickers.tally = G.PROGRESS.joker_stickers.tally + get_joker_win_sticker(v, true) + end + end + + for _, v in pairs(G.CHALLENGES) do + G.PROGRESS.challenges.of = G.PROGRESS.challenges.of + 1 + if G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id] then + G.PROGRESS.challenges.tally = G.PROGRESS.challenges.tally + 1 + end + end + + G.PROFILES[G.SETTINGS.profile].progress.joker_stickers = copy_table(G.PROGRESS.joker_stickers) + G.PROFILES[G.SETTINGS.profile].progress.deck_stakes = copy_table(G.PROGRESS.deck_stakes) + G.PROFILES[G.SETTINGS.profile].progress.challenges = copy_table(G.PROGRESS.challenges) +end + +function set_discover_tallies() + G.DISCOVER_TALLIES = G.DISCOVER_TALLIES or { + blinds = {tally = 0, of = 0}, + tags = {tally = 0, of = 0}, + jokers = {tally = 0, of = 0}, + consumeables = {tally = 0, of = 0}, + tarots = {tally = 0, of = 0}, + planets = {tally = 0, of = 0}, + spectrals = {tally = 0, of = 0}, + vouchers = {tally = 0, of = 0}, + boosters = {tally = 0, of = 0}, + editions = {tally = 0, of = 0}, + backs = {tally = 0, of = 0}, + total = {tally = 0, of = 0}, + } + for _, v in pairs(G.DISCOVER_TALLIES) do + v.tally = 0 + v.of = 0 + end + + for _, v in pairs(G.P_CENTERS) do + if not v.omit then + if v.set and ((v.set == 'Joker') or v.consumeable or (v.set == 'Edition') or (v.set == 'Voucher') or (v.set == 'Back') or (v.set == 'Booster')) then + G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 + if v.discovered then + G.DISCOVER_TALLIES.total.tally = G.DISCOVER_TALLIES.total.tally+1 + end + end + if v.set and v.set == 'Joker' then + G.DISCOVER_TALLIES.jokers.of = G.DISCOVER_TALLIES.jokers.of+1 + if v.discovered then + G.DISCOVER_TALLIES.jokers.tally = G.DISCOVER_TALLIES.jokers.tally+1 + end + end + if v.set and v.set == 'Back' then + G.DISCOVER_TALLIES.backs.of = G.DISCOVER_TALLIES.backs.of+1 + if v.unlocked then + G.DISCOVER_TALLIES.backs.tally = G.DISCOVER_TALLIES.backs.tally+1 + end + end + if v.set and v.consumeable then + G.DISCOVER_TALLIES.consumeables.of = G.DISCOVER_TALLIES.consumeables.of+1 + if v.discovered then + G.DISCOVER_TALLIES.consumeables.tally = G.DISCOVER_TALLIES.consumeables.tally+1 + end + if v.set == 'Planet' then + G.DISCOVER_TALLIES.planets.of = G.DISCOVER_TALLIES.planets.of+1 + if v.discovered then + G.DISCOVER_TALLIES.planets.tally = G.DISCOVER_TALLIES.planets.tally+1 + end + elseif v.set == 'Spectral' then + G.DISCOVER_TALLIES.spectrals.of = G.DISCOVER_TALLIES.spectrals.of+1 + if v.discovered then + G.DISCOVER_TALLIES.spectrals.tally = G.DISCOVER_TALLIES.spectrals.tally+1 + end + elseif v.set == 'Tarot' then + G.DISCOVER_TALLIES.tarots.of = G.DISCOVER_TALLIES.tarots.of+1 + if v.discovered then + G.DISCOVER_TALLIES.tarots.tally = G.DISCOVER_TALLIES.tarots.tally+1 + end + end + end + if v.set and v.set == 'Voucher' then + G.DISCOVER_TALLIES.vouchers.of = G.DISCOVER_TALLIES.vouchers.of+1 + if v.discovered then + G.DISCOVER_TALLIES.vouchers.tally = G.DISCOVER_TALLIES.vouchers.tally+1 + end + end + if v.set and v.set == 'Booster' then + G.DISCOVER_TALLIES.boosters.of = G.DISCOVER_TALLIES.boosters.of+1 + if v.discovered then + G.DISCOVER_TALLIES.boosters.tally = G.DISCOVER_TALLIES.boosters.tally+1 + end + end + if v.set and v.set == 'Edition' then + G.DISCOVER_TALLIES.editions.of = G.DISCOVER_TALLIES.editions.of+1 + if v.discovered then + G.DISCOVER_TALLIES.editions.tally = G.DISCOVER_TALLIES.editions.tally+1 + end + end + end + end + for _, v in pairs(G.P_BLINDS) do + G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 + G.DISCOVER_TALLIES.blinds.of = G.DISCOVER_TALLIES.blinds.of+1 + if v.discovered then + G.DISCOVER_TALLIES.blinds.tally = G.DISCOVER_TALLIES.blinds.tally+1 + G.DISCOVER_TALLIES.total.tally = G.DISCOVER_TALLIES.total.tally+1 + end + end + for _, v in pairs(G.P_TAGS) do + G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 + G.DISCOVER_TALLIES.tags.of = G.DISCOVER_TALLIES.tags.of+1 + if v.discovered then + G.DISCOVER_TALLIES.tags.tally = G.DISCOVER_TALLIES.tags.tally+1 + G.DISCOVER_TALLIES.total.tally = G.DISCOVER_TALLIES.total.tally+1 + end + end + G.PROFILES[G.SETTINGS.profile].high_scores.collection.amt = G.DISCOVER_TALLIES.total.tally + G.PROFILES[G.SETTINGS.profile].high_scores.collection.tot = G.DISCOVER_TALLIES.total.of + G.PROFILES[G.SETTINGS.profile].progress.discovered = copy_table(G.DISCOVER_TALLIES.total) + + if check_for_unlock then check_for_unlock({type = 'discover_amount', + amount = G.DISCOVER_TALLIES.total.tally, + planet_count = G.DISCOVER_TALLIES.planets.tally, + tarot_count = G.DISCOVER_TALLIES.tarots.tally}) + end +end + +function stop_use() + G.GAME.STOP_USE = (G.GAME.STOP_USE or 0) + 1 + dec_stop_use(6) +end + +function dec_stop_use(_depth) + if _depth > 0 then + G.E_MANAGER:add_event(Event({ + blocking = false, + no_delete = true, + func = (function() + dec_stop_use(_depth - 1) + return true end)})) + else + G.E_MANAGER:add_event(Event({ + blocking = false, + no_delete = true, + func = (function() + G.GAME.STOP_USE = math.max(G.GAME.STOP_USE - 1, 0) + return true end)})) + end +end + +function inc_career_stat(stat, mod) + if G.GAME.seeded or G.GAME.challenge then return end + if not G.PROFILES[G.SETTINGS.profile].career_stats[stat] then G.PROFILES[G.SETTINGS.profile].career_stats[stat] = 0 end + G.PROFILES[G.SETTINGS.profile].career_stats[stat] = G.PROFILES[G.SETTINGS.profile].career_stats[stat] + (mod or 0) + G:save_settings() +end + +function recursive_table_cull(t) + local ret_t = {} + for k, v in pairs(t) do + if type(v) == 'table' then + if v.is and v:is(Object) then ret_t[k] = [["]].."MANUAL_REPLACE"..[["]] + else ret_t[k] = recursive_table_cull(v) + end + else ret_t[k] = v end + end + return ret_t +end + +function save_with_action(action) + G.action = action + save_run() + G.action = nil +end + +function save_run() + if G.F_NO_SAVING == true then return end + local cardAreas = {} + for k, v in pairs(G) do + if (type(v) == "table") and v.is and v:is(CardArea) then + local cardAreaSer = v:save() + if cardAreaSer then cardAreas[k] = cardAreaSer end + end + end + + local tags = {} + for k, v in ipairs(G.GAME.tags) do + if (type(v) == "table") and v.is and v:is(Tag) then + local tagSer = v:save() + if tagSer then tags[k] = tagSer end + end + end + + G.culled_table = recursive_table_cull{ + cardAreas = cardAreas, + tags = tags, + GAME = G.GAME, + STATE = G.STATE, + ACTION = G.action or nil, + BLIND = G.GAME.blind:save(), + BACK = G.GAME.selected_back:save(), + VERSION = G.VERSION + } + G.ARGS.save_run = G.culled_table + + G.FILE_HANDLER = G.FILE_HANDLER or {} + G.FILE_HANDLER.run = true + G.FILE_HANDLER.update_queued = true +end + +function remove_save() + love.filesystem.remove(G.SETTINGS.profile..'/save.jkr') + G.SAVED_GAME = nil + G.FILE_HANDLER.run = nil +end + +function loc_colour(_c, _default) + G.ARGS.LOC_COLOURS = G.ARGS.LOC_COLOURS or { + red = G.C.RED, + mult = G.C.MULT, + blue = G.C.BLUE, + chips = G.C.CHIPS, + green = G.C.GREEN, + money = G.C.MONEY, + gold = G.C.GOLD, + attention = G.C.FILTER, + purple = G.C.PURPLE, + white = G.C.WHITE, + inactive = G.C.UI.TEXT_INACTIVE, + spades = G.C.SUITS.Spades, + hearts = G.C.SUITS.Hearts, + clubs = G.C.SUITS.Clubs, + diamonds = G.C.SUITS.Diamonds, + tarot = G.C.SECONDARY_SET.Tarot, + planet = G.C.SECONDARY_SET.Planet, + spectral = G.C.SECONDARY_SET.Spectral, + edition = G.C.EDITION, + dark_edition = G.C.DARK_EDITION, + legendary = G.C.RARITY[4], + enhanced = G.C.SECONDARY_SET.Enhanced + } + return G.ARGS.LOC_COLOURS[_c] or _default or G.C.UI.TEXT_DARK +end + +function init_localization() + G.localization.misc.v_dictionary_parsed = {} + for k, v in pairs(G.localization.misc.v_dictionary) do + if type(v) == 'table' then + G.localization.misc.v_dictionary_parsed[k] = {multi_line = true} + for kk, vv in ipairs(v) do + G.localization.misc.v_dictionary_parsed[k][kk] = loc_parse_string(vv) + end + else + G.localization.misc.v_dictionary_parsed[k] = loc_parse_string(v) + end + end + G.localization.misc.v_text_parsed = {} + for k, v in pairs(G.localization.misc.v_text) do + G.localization.misc.v_text_parsed[k] = {} + for kk, vv in ipairs(v) do + G.localization.misc.v_text_parsed[k][kk] = loc_parse_string(vv) + end + end + G.localization.tutorial_parsed = {} + for k, v in pairs(G.localization.misc.tutorial) do + G.localization.tutorial_parsed[k] = {multi_line = true} + for kk, vv in ipairs(v) do + G.localization.tutorial_parsed[k][kk] = loc_parse_string(vv) + end + end + G.localization.quips_parsed = {} + for k, v in pairs(G.localization.misc.quips or {}) do + G.localization.quips_parsed[k] = {multi_line = true} + for kk, vv in ipairs(v) do + G.localization.quips_parsed[k][kk] = loc_parse_string(vv) + end + end + for g_k, group in pairs(G.localization) do + if g_k == 'descriptions' then + for _, set in pairs(group) do + for _, center in pairs(set) do + center.text_parsed = {} + if not center.text then else + for _, line in ipairs(center.text) do + center.text_parsed[#center.text_parsed+1] = loc_parse_string(line) + end + center.name_parsed = {} + for _, line in ipairs(type(center.name) == 'table' and center.name or {center.name}) do + center.name_parsed[#center.name_parsed+1] = loc_parse_string(line) + end + if center.unlock then + center.unlock_parsed = {} + for _, line in ipairs(center.unlock) do + center.unlock_parsed[#center.unlock_parsed+1] = loc_parse_string(line) + end + end + end + end + end + end + end +end + +function playing_card_joker_effects(cards) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({playing_card_added = true, cards = cards}) + end +end + +function convert_save_to_meta() + if love.filesystem.getInfo(G.SETTINGS.profile..'/'..'unlocked_jokers.jkr') then + local _meta = { + unlocked = {}, + alerted = {}, + discovered = {} + } + if love.filesystem.getInfo(G.SETTINGS.profile..'/'..'unlocked_jokers.jkr') then + for line in string.gmatch( (get_compressed(G.SETTINGS.profile..'/'..'unlocked_jokers.jkr') or '').. "\n", "([^\n]*)\n") do + local key = line:gsub("%s+", "") + if key and (key ~= '') then + _meta.unlocked[key] = true + end + end + end + if love.filesystem.getInfo(G.SETTINGS.profile..'/'..'discovered_jokers.jkr') then + for line in string.gmatch( (get_compressed(G.SETTINGS.profile..'/'..'discovered_jokers.jkr') or '').. "\n", "([^\n]*)\n") do + local key = line:gsub("%s+", "") + if key and (key ~= '') then + _meta.discovered[key] = true + end + end + end + if love.filesystem.getInfo(G.SETTINGS.profile..'/'..'alerted_jokers.jkr') then + for line in string.gmatch( (get_compressed(G.SETTINGS.profile..'/'..'alerted_jokers.jkr') or '').. "\n", "([^\n]*)\n") do + local key = line:gsub("%s+", "") + if key and (key ~= '') then + _meta.alerted[key] = true + end + end + end + love.filesystem.remove(G.SETTINGS.profile..'/'..'unlocked_jokers.jkr') + love.filesystem.remove(G.SETTINGS.profile..'/'..'discovered_jokers.jkr') + love.filesystem.remove(G.SETTINGS.profile..'/'..'alerted_jokers.jkr') + + compress_and_save( G.SETTINGS.profile..'/'..'meta.jkr', STR_PACK(_meta)) + end +end + +function card_from_control(control) + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local _card = Card(G.deck.T.x, G.deck.T.y, G.CARD_W, G.CARD_H, G.P_CARDS[control.s..'_'..control.r], G.P_CENTERS[control.e or 'c_base'], {playing_card = G.playing_card}) + if control.d then _card:set_edition({[control.d] = true}, true, true) end + if control.g then _card:set_seal(control.g, true, true) end + G.deck:emplace(_card) + table.insert(G.playing_cards, _card) +end + +function loc_parse_string(line) + local parsed_line = {} + local control = {} + local _c, _c_name, _c_val, _c_gather = nil, nil, nil, nil + local _s_gather, _s_ref = nil, nil + local str_parts, str_it = {}, 1 + for i = 1, #line do + local char = line:sub(i,i) + if char == '{' then --Start of a control section, extract all controls + if str_parts[1] then parsed_line[#parsed_line+1] = {strings = str_parts, control = control or {}} end + str_parts, str_it = {}, 1 + control, _c, _c_name, _c_val, _c_gather = {}, nil, nil, nil, nil + _s_gather, _s_ref = nil, nil + _c = true + elseif _c and not (char == ':' or char == '}') and not _c_gather then _c_name = (_c_name or '')..char + elseif _c and char == ':' then _c_gather = true + elseif _c and not (char == ',' or char == '}') and _c_gather then _c_val = (_c_val or '')..char + elseif _c and (char == ',' or char == '}') then _c_gather = nil; if _c_name then control[_c_name] = _c_val end; _c_name = nil; _c_val = nil; if char == '}' then _c = nil end + + elseif not _c and char ~= '#' and not _s_gather then str_parts[str_it] = (str_parts[str_it] or '')..(control['X'] and char:gsub("%s+", "") or char) + elseif not _c and char == '#' and not _s_gather then _s_gather = true; if str_parts[str_it] then str_it = str_it + 1 end + elseif not _c and char == '#' and _s_gather then _s_gather = nil; if _s_ref then str_parts[str_it] = {_s_ref}; str_it = str_it + 1; _s_ref = nil end + elseif not _c and _s_gather then _s_ref = (_s_ref or '')..char + end + if i == #line then + if str_parts[1] then parsed_line[#parsed_line+1] = {strings = str_parts, control = control or {}} end + return parsed_line + end + end +end + +--UTF8 handler for special characters, from https://github.com/blitmap/lua-utf8-simple +utf8 = {pattern = '[%z\1-\127\194-\244][\128-\191]*'} +utf8.map = + function (s, f, no_subs) + local i = 0 + + if no_subs then + for b, e in s:gmatch('()' .. utf8.pattern .. '()') do + i = i + 1 + local c = e - b + f(i, c, b) + end + else + for b, c in s:gmatch('()(' .. utf8.pattern .. ')') do + i = i + 1 + f(i, c, b) + end + end + end +utf8.chars = + function (s, no_subs) + return coroutine.wrap(function () return utf8.map(s, coroutine.yield, no_subs) end) + end + +function localize(args, misc_cat) + if args and not (type(args) == 'table') then + if misc_cat and G.localization.misc[misc_cat] then return G.localization.misc[misc_cat][args] or 'ERROR' end + return G.localization.misc.dictionary[args] or 'ERROR' + end + + local loc_target = nil + local ret_string = nil + if args.type == 'other' then + loc_target = G.localization.descriptions.Other[args.key] + elseif args.type == 'descriptions' or args.type == 'unlocks' then + loc_target = G.localization.descriptions[args.set][args.key] + elseif args.type == 'tutorial' then + loc_target = G.localization.tutorial_parsed[args.key] + elseif args.type == 'quips' then + loc_target = G.localization.quips_parsed[args.key] + elseif args.type == 'raw_descriptions' then + loc_target = G.localization.descriptions[args.set][args.key] + local multi_line = {} + if loc_target then + for _, lines in ipairs(args.type == 'unlocks' and loc_target.unlock_parsed or args.type == 'name' and loc_target.name_parsed or args.type == 'text' and loc_target or loc_target.text_parsed) do + local final_line = '' + for _, part in ipairs(lines) do + local assembled_string = '' + for _, subpart in ipairs(part.strings) do + assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])] or 'ERROR') + end + final_line = final_line..assembled_string + end + multi_line[#multi_line+1] = final_line + end + end + return multi_line + elseif args.type == 'text' then + loc_target = G.localization.misc.v_text_parsed[args.key] + elseif args.type == 'variable' then + loc_target = G.localization.misc.v_dictionary_parsed[args.key] + if not loc_target then return 'ERROR' end + if loc_target.multi_line then + local assembled_strings = {} + for k, v in ipairs(loc_target) do + local assembled_string = '' + for _, subpart in ipairs(v[1].strings) do + assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])]) + end + assembled_strings[k] = assembled_string + end + return assembled_strings or {'ERROR'} + else + local assembled_string = '' + for _, subpart in ipairs(loc_target[1].strings) do + assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])]) + end + ret_string = assembled_string or 'ERROR' + end + elseif args.type == 'name_text' then + if pcall(function() ret_string = G.localization.descriptions[(args.set or args.node.config.center.set)][args.key or args.node.config.center.key].name end) then + else ret_string = "ERROR" end + elseif args.type == 'name' then + loc_target = G.localization.descriptions[(args.set or args.node.config.center.set)][args.key or args.node.config.center.key] + end + + if ret_string then return ret_string end + + if loc_target then + for _, lines in ipairs(args.type == 'unlocks' and loc_target.unlock_parsed or args.type == 'name' and loc_target.name_parsed or (args.type == 'text' or args.type == 'tutorial' or args.type == 'quips') and loc_target or loc_target.text_parsed) do + local final_line = {} + for _, part in ipairs(lines) do + local assembled_string = '' + for _, subpart in ipairs(part.strings) do + assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])] or 'ERROR') + end + local desc_scale = G.LANG.font.DESCSCALE + if G.F_MOBILE_UI then desc_scale = desc_scale*1.5 end + if args.type == 'name' then + final_line[#final_line+1] = {n=G.UIT.O, config={ + object = DynaText({string = {assembled_string}, + colours = {(part.control.V and args.vars.colours[tonumber(part.control.V)]) or (part.control.C and loc_colour(part.control.C)) or G.C.UI.TEXT_LIGHT}, + bump = true, + silent = true, + pop_in = 0, + pop_in_rate = 4, + maxw = 5, + shadow = true, + y_offset = -0.6, + spacing = math.max(0, 0.32*(17 - #assembled_string)), + scale = (0.55 - 0.004*#assembled_string)*(part.control.s and tonumber(part.control.s) or 1) + }) + }} + elseif part.control.E then + local _float, _silent, _pop_in, _bump, _spacing = nil, true, nil, nil, nil + if part.control.E == '1' then + _float = true; _silent = true; _pop_in = 0 + elseif part.control.E == '2' then + _bump = true; _spacing = 1 + end + final_line[#final_line+1] = {n=G.UIT.O, config={ + object = DynaText({string = {assembled_string}, colours = {part.control.V and args.vars.colours[tonumber(part.control.V)] or loc_colour(part.control.C or nil)}, + float = _float, + silent = _silent, + pop_in = _pop_in, + bump = _bump, + spacing = _spacing, + scale = 0.32*(part.control.s and tonumber(part.control.s) or 1)*desc_scale}) + }} + elseif part.control.X then + final_line[#final_line+1] = {n=G.UIT.C, config={align = "m", colour = loc_colour(part.control.X), r = 0.05, padding = 0.03, res = 0.15}, nodes={ + {n=G.UIT.T, config={ + text = assembled_string, + colour = loc_colour(part.control.C or nil), + scale = 0.32*(part.control.s and tonumber(part.control.s) or 1)*desc_scale}}, + }} + else + final_line[#final_line+1] = {n=G.UIT.T, config={ + detailed_tooltip = part.control.T and (G.P_CENTERS[part.control.T] or G.P_TAGS[part.control.T]) or nil, + text = assembled_string, + shadow = args.shadow, + colour = part.control.V and args.vars.colours[tonumber(part.control.V)] or loc_colour(part.control.C or nil, args.default_col), + scale = 0.32*(part.control.s and tonumber(part.control.s) or 1)*desc_scale},} + end + end + if args.type == 'name' or args.type == 'text' then return final_line end + args.nodes[#args.nodes+1] = final_line + end + end +end + +function get_stake_sprite(_stake, _scale) + _stake = _stake or 1 + _scale = _scale or 1 + local stake_sprite = Sprite(0,0,_scale*1,_scale*1,G.ASSET_ATLAS["chips"], G.P_CENTER_POOLS.Stake[_stake].pos) + stake_sprite.states.drag.can = false + if _stake == 8 then + stake_sprite.draw = function(_sprite) + _sprite.ARGS.send_to_shader = _sprite.ARGS.send_to_shader or {} + _sprite.ARGS.send_to_shader[1] = math.min(_sprite.VT.r*3, 1) + G.TIMERS.REAL/(18) + (_sprite.juice and _sprite.juice.r*20 or 0) + 1 + _sprite.ARGS.send_to_shader[2] = G.TIMERS.REAL + + Sprite.draw_shader(_sprite, 'dissolve') + Sprite.draw_shader(_sprite, 'voucher', nil, _sprite.ARGS.send_to_shader) + end + end + return stake_sprite +end + +function get_front_spriteinfo(_front) + if _front and _front.suit and (_front.value == 'Jack' or _front.value == 'Queen' or _front.value == 'King') then + if G.SETTINGS.CUSTOM_DECK and G.SETTINGS.CUSTOM_DECK.Collabs[_front.suit] then + local _collab = G.SETTINGS.CUSTOM_DECK.Collabs[_front.suit] + if (_collab == 'default') or (not G.ASSET_ATLAS[_collab..'_'..(G.SETTINGS.colourblind_option and 2 or 1)]) then + else + return G.ASSET_ATLAS[_collab..'_'..(G.SETTINGS.colourblind_option and 2 or 1)], G.COLLABS.pos[_front.value] + end + end + end + return G.ASSET_ATLAS[_front.atlas] or G.ASSET_ATLAS["cards_"..(G.SETTINGS.colourblind_option and 2 or 1)], _front.pos +end + +function get_stake_col(_stake) + G.C.STAKES = G.C.STAKES or { + G.C.WHITE, + G.C.RED, + G.C.GREEN, + G.C.BLACK, + G.C.BLUE, + G.C.PURPLE, + G.C.ORANGE, + G.C.GOLD + } + return G.C.STAKES[_stake] +end + +function get_challenge_int_from_id(_id) + for k, v in pairs(G.CHALLENGES) do + if v.id == _id then return k end + end + return 0 +end + +function get_starting_params() +return { + dollars = 4, + hand_size = 8, + discards = 3, + hands = 4, + reroll_cost = 5, + joker_slots = 5, + ante_scaling = 1, + consumable_slots = 2, + no_faces = false, + erratic_suits_and_ranks = false, + } +end + +function get_challenge_rule(_challenge, _type, _id) + if _challenge and _challenge.rules and _challenge.rules[_type] then + for k, v in ipairs(_challenge.rules[_type]) do + if _id == v.id then return v.value end + end + end +end + +--SOUND +function PLAY_SOUND(args) + args.per = args.per or 1 + args.vol = args.vol or 1 + SOURCES[args.sound_code] = SOURCES[args.sound_code] or {} + + local should_stream = (string.find(args.sound_code,'music') or string.find(args.sound_code,'ambient')) + local s = {sound = love.audio.newSource("resources/sounds/"..args.sound_code..'.ogg', should_stream and "stream" or 'static')} + table.insert(SOURCES[args.sound_code], s) + s.sound_code = args.sound_code + s.original_pitch = args.per or 1 + s.original_volume = args.vol or 1 + s.created_on_pause = (args.overlay_menu and true or false) + s.created_on_state = args.state + s.sfx_handled = 0 + s.transition_timer = 0 + SET_SFX(s, args) + love.audio.play(s.sound) + return s +end + +function STOP_AUDIO() + for _, source in pairs(SOURCES) do + for _, s in pairs(source) do + if s.sound:isPlaying() then + s.sound:stop() + end + end + end +end + +function SET_SFX(s, args) + if string.find(s.sound_code,'music') then + if s.sound_code == args.desired_track then + s.current_volume = s.current_volume or 1 + s.current_volume = 1*(args.dt*3) + (1-(args.dt*3))*s.current_volume + else + s.current_volume = s.current_volume or 0 + s.current_volume = 0*(args.dt*3) + (1-(args.dt*3))*s.current_volume + end + s.sound:setVolume(s.current_volume*s.original_volume*(args.sound_settings.volume/100.0)*(args.sound_settings.music_volume/100.0)) + s.sound:setPitch(s.original_pitch*args.pitch_mod) + else + if s.temp_pitch ~= s.original_pitch then + s.sound:setPitch(s.original_pitch) + s.temp_pitch = s.original_pitch + end + local sound_vol = s.original_volume*(args.sound_settings.volume/100.0)*(args.sound_settings.game_sounds_volume/100.0) + if s.created_on_state == 13 then sound_vol = sound_vol*args.splash_vol end + if sound_vol <= 0 then + s.sound:stop() + else + s.sound:setVolume(sound_vol) + end + end +end + +function MODULATE(args) + for k, v in pairs(SOURCES) do + if (string.find(k,'music') and (args.desired_track ~= '')) then + if v[1] and v[1].sound and v[1].sound:isPlaying() then + else + RESTART_MUSIC(args) + break; + end + end + end + + for k, v in pairs(SOURCES) do + local i=1 + while i <= #v do + if not v[i].sound:isPlaying() then + table.remove(v, i) + else + i = i + 1 + end + end + + for i, s in ipairs(v) do + if s.sound and s.sound:isPlaying() and s.original_volume then + SET_SFX(s, args) + end + end + end +end + +function RESTART_MUSIC(args) + for k, v in pairs(SOURCES) do + if string.find(k,'music') then + for i, s in ipairs(v) do + s.sound:stop() + end + SOURCES[k] = {} + args.per = 0.7 + args.vol = 0.6 + args.sound_code = k + local s = PLAY_SOUND(args) + s.initialized = true + end + end +end + +function AMBIENT(args) + for k, v in pairs(SOURCES) do + if args.ambient_control[k] then + local start_ambient = args.ambient_control[k].vol > 0 + + for i, s in ipairs(v) do + if s.sound and s.sound:isPlaying() and s.original_volume then + s.original_volume = args.ambient_control[k].vol + SET_SFX(s, args) + start_ambient = false + end + end + + if start_ambient then + args.sound_code = k + args.vol = args.ambient_control[k].vol + args.per = args.ambient_control[k].per + PLAY_SOUND(args) + end + end + end +end + +function RESET_STATES(state) + for k, v in pairs(SOURCES) do + for i, s in ipairs(v) do + s.created_on_state = state + end + end +end diff --git a/src/functions/state_events.lua b/src/functions/state_events.lua new file mode 100644 index 0000000..8ea37f4 --- /dev/null +++ b/src/functions/state_events.lua @@ -0,0 +1,1642 @@ +function win_game() + if not G.GAME.seeded and not G.GAME.challenge then + set_joker_win() + set_deck_win() + + check_and_set_high_score('win_streak', G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt+1) + check_and_set_high_score('current_streak', G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt+1) + check_for_unlock({type = 'win_no_hand'}) + check_for_unlock({type = 'win_no'}) + check_for_unlock({type = 'win_custom'}) + check_for_unlock({type = 'win_deck'}) + check_for_unlock({type = 'win_stake'}) + check_for_unlock({type = 'win'}) + inc_career_stat('c_wins', 1) + end + + set_profile_progress() + + if G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[G.GAME.challenge] = true + set_challenge_unlock() + check_for_unlock({type = 'win_challenge'}) + G:save_settings() + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + for k, v in pairs(G.I.CARD) do + v.sticker_run = nil + end + + play_sound('win') + G.SETTINGS.paused = true + + G.FUNCS.overlay_menu{ + definition = create_UIBox_win(), + config = {no_esc = true} + } + local Jimbo = nil + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 2.5, + blocking = false, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') then + Jimbo = Card_Character({x = 0, y = 5}) + local spot = G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') + spot.config.object:remove() + spot.config.object = Jimbo + Jimbo.ui_object_updated = true + Jimbo:add_speech_bubble('wq_'..math.random(1,7), nil, {quip = true}) + Jimbo:say_stuff(5) + if G.F_JAN_CTA then + G.E_MANAGER:add_event(Event({ + func = function() + Jimbo:add_button(localize('b_wishlist'), 'wishlist_steam', G.C.DARK_EDITION, nil, true, 1.6) + return true + end})) + end + end + return true + end) + })) + + return true + end) + })) + + if not G.GAME.seeded and not G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].stake = math.max(G.PROFILES[G.SETTINGS.profile].stake or 1, (G.GAME.stake or 1)+1) + end + G:save_progress() + G.FILE_HANDLER.force = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + if not G.SETTINGS.paused then + G.GAME.current_round.round_text = 'Endless Round ' + return true + end + end) + })) +end + +function end_round() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.2, + func = function() + local game_over = true + local game_won = false + G.RESET_BLIND_STATES = true + G.RESET_JIGGLES = true + if G.GAME.chips - G.GAME.blind.chips >= 0 then + game_over = false + end + for i = 1, #G.jokers.cards do + local eval = nil + eval = G.jokers.cards[i]:calculate_joker({end_of_round = true, game_over = game_over}) + if eval then + if eval.saved then + game_over = false + end + card_eval_status_text(G.jokers.cards[i], 'jokers', nil, nil, nil, eval) + end + G.jokers.cards[i]:calculate_rental() + G.jokers.cards[i]:calculate_perishable() + end + if G.GAME.round_resets.ante == G.GAME.win_ante and G.GAME.blind:get_type() == 'Boss' then + game_won = true + G.GAME.won = true + end + if game_over then + G.STATE = G.STATES.GAME_OVER + if not G.GAME.won and not G.GAME.seeded and not G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt = 0 + end + G:save_settings() + G.FILE_HANDLER.force = true + G.STATE_COMPLETE = false + else + G.GAME.unused_discards = (G.GAME.unused_discards or 0) + G.GAME.current_round.discards_left + if G.GAME.blind and G.GAME.blind.config.blind then + discover_card(G.GAME.blind.config.blind) + end + + if G.GAME.blind:get_type() == 'Boss' then + local _handname, _played, _order = 'High Card', -1, 100 + for k, v in pairs(G.GAME.hands) do + if v.played > _played or (v.played == _played and _order > v.order) then + _played = v.played + _handname = k + end + end + G.GAME.current_round.most_played_poker_hand = _handname + end + + if G.GAME.blind:get_type() == 'Boss' and not G.GAME.seeded and not G.GAME.challenge then + G.GAME.current_boss_streak = G.GAME.current_boss_streak + 1 + check_and_set_high_score('boss_streak', G.GAME.current_boss_streak) + end + + if G.GAME.current_round.hands_played == 1 then + inc_career_stat('c_single_hand_round_streak', 1) + else + if not G.GAME.seeded and not G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].career_stats.c_single_hand_round_streak = 0 + G:save_settings() + end + end + + check_for_unlock({type = 'round_win'}) + set_joker_usage() + if game_won and not G.GAME.win_notified then + G.GAME.win_notified = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + blocking = false, + blockable = false, + func = (function() + if G.STATE == G.STATES.ROUND_EVAL then + win_game() + G.GAME.won = true + return true + end + end) + })) + end + for i=1, #G.hand.cards do + --Check for hand doubling + local reps = {1} + local j = 1 + while j <= #reps do + local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1 + if reps[j] ~= 1 then card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) end + + --calculate the hand effects + local effects = {G.hand.cards[i]:get_end_of_round_effect()} + for k=1, #G.jokers.cards do + --calculate the joker individual card effects + local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.hand, other_card = G.hand.cards[i], individual = true, end_of_round = true}) + if eval then + table.insert(effects, eval) + end + end + + if reps[j] == 1 then + --Check for hand doubling + --From Red seal + local eval = eval_card(G.hand.cards[i], {end_of_round = true,cardarea = G.hand, repetition = true, repetition_only = true}) + if next(eval) and (next(effects[1]) or #effects > 1) then + for h = 1, eval.seals.repetitions do + reps[#reps+1] = eval + end + end + + --from Jokers + for j=1, #G.jokers.cards do + --calculate the joker effects + local eval = eval_card(G.jokers.cards[j], {cardarea = G.hand, other_card = G.hand.cards[i], repetition = true, end_of_round = true, card_effects = effects}) + if next(eval) then + for h = 1, eval.jokers.repetitions do + reps[#reps+1] = eval + end + end + end + end + + for ii = 1, #effects do + --if this effect came from a joker + if effects[ii].card then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() effects[ii].card:juice_up(0.7);return true end) + })) + end + + --If dollars + if effects[ii].h_dollars then + ease_dollars(effects[ii].h_dollars) + card_eval_status_text(G.hand.cards[i], 'dollars', effects[ii].h_dollars, percent) + end + + --Any extras + if effects[ii].extra then + card_eval_status_text(G.hand.cards[i], 'extra', nil, percent, nil, effects[ii].extra) + end + end + j = j + 1 + end + end + delay(0.3) + + + G.FUNCS.draw_from_hand_to_discard() + if G.GAME.blind:get_type() == 'Boss' then + G.GAME.voucher_restock = nil + if G.GAME.modifiers.set_eternal_ante and (G.GAME.round_resets.ante == G.GAME.modifiers.set_eternal_ante) then + for k, v in ipairs(G.jokers.cards) do + v:set_eternal(true) + end + end + if G.GAME.modifiers.set_joker_slots_ante and (G.GAME.round_resets.ante == G.GAME.modifiers.set_joker_slots_ante) then + G.jokers.config.card_limit = 0 + end + delay(0.4); ease_ante(1); delay(0.4); check_for_unlock({type = 'ante_up', ante = G.GAME.round_resets.ante + 1}) + end + G.FUNCS.draw_from_discard_to_deck() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = function() + G.STATE = G.STATES.ROUND_EVAL + G.STATE_COMPLETE = false + + if G.GAME.round_resets.blind == G.P_BLINDS.bl_small then + G.GAME.round_resets.blind_states.Small = 'Defeated' + elseif G.GAME.round_resets.blind == G.P_BLINDS.bl_big then + G.GAME.round_resets.blind_states.Big = 'Defeated' + else + G.GAME.current_round.voucher = get_next_voucher_key() + G.GAME.round_resets.blind_states.Boss = 'Defeated' + for k, v in ipairs(G.playing_cards) do + v.ability.played_this_ante = nil + end + end + + if G.GAME.round_resets.temp_handsize then G.hand:change_size(-G.GAME.round_resets.temp_handsize); G.GAME.round_resets.temp_handsize = nil end + if G.GAME.round_resets.temp_reroll_cost then G.GAME.round_resets.temp_reroll_cost = nil; calculate_reroll_cost(true) end + + reset_idol_card() + reset_mail_rank() + reset_ancient_card() + reset_castle_card() + for k, v in ipairs(G.playing_cards) do + v.ability.discarded = nil + v.ability.forced_selection = nil + end + return true + end + })) + end + return true + end + })) + end + +function new_round() + G.RESET_JIGGLES = nil + delay(0.4) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.GAME.current_round.discards_left = math.max(0, G.GAME.round_resets.discards + G.GAME.round_bonus.discards) + G.GAME.current_round.hands_left = (math.max(1, G.GAME.round_resets.hands + G.GAME.round_bonus.next_hands)) + G.GAME.current_round.hands_played = 0 + G.GAME.current_round.discards_used = 0 + G.GAME.current_round.reroll_cost_increase = 0 + G.GAME.current_round.used_packs = {} + + for k, v in pairs(G.GAME.hands) do + v.played_this_round = 0 + end + + for k, v in pairs(G.playing_cards) do + v.ability.wheel_flipped = nil + end + + local chaos = find_joker('Chaos the Clown') + G.GAME.current_round.free_rerolls = #chaos + calculate_reroll_cost(true) + + G.GAME.round_bonus.next_hands = 0 + G.GAME.round_bonus.discards = 0 + + local blhash = '' + if G.GAME.round_resets.blind == G.P_BLINDS.bl_small then + G.GAME.round_resets.blind_states.Small = 'Current' + G.GAME.current_boss_streak = 0 + blhash = 'S' + elseif G.GAME.round_resets.blind == G.P_BLINDS.bl_big then + G.GAME.round_resets.blind_states.Big = 'Current' + G.GAME.current_boss_streak = 0 + blhash = 'B' + else + G.GAME.round_resets.blind_states.Boss = 'Current' + blhash = 'L' + end + G.GAME.subhash = (G.GAME.round_resets.ante)..(blhash) + + G.GAME.blind:set_blind(G.GAME.round_resets.blind) + + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({setting_blind = true, blind = G.GAME.round_resets.blind}) + end + delay(0.4) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE = G.STATES.DRAW_TO_HAND + G.deck:shuffle('nr'..G.GAME.round_resets.ante) + G.deck:hard_set_T() + G.STATE_COMPLETE = false + return true + end + })) + return true + end + })) +end + +G.FUNCS.draw_from_deck_to_hand = function(e) + if not (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and + G.hand.config.card_limit <= 0 and #G.hand.cards == 0 then + G.STATE = G.STATES.GAME_OVER; G.STATE_COMPLETE = false + return true + end + + local hand_space = e or math.min(#G.deck.cards, G.hand.config.card_limit - #G.hand.cards) + if G.GAME.blind.name == 'The Serpent' and + not G.GAME.blind.disabled and + (G.GAME.current_round.hands_played > 0 or + G.GAME.current_round.discards_used > 0) then + hand_space = math.min(#G.deck.cards, 3) + end + delay(0.3) + for i=1, hand_space do --draw cards from deckL + if G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK then + draw_card(G.deck,G.hand, i*100/hand_space,'up', true) + else + draw_card(G.deck,G.hand, i*100/hand_space,'up', true) + end + end +end + +G.FUNCS.discard_cards_from_highlighted = function(e, hook) + stop_use() + G.CONTROLLER.interrupt.focus = true + G.CONTROLLER:save_cardarea_focus('hand') + + for k, v in ipairs(G.playing_cards) do + v.ability.forced_selection = nil + end + + if G.CONTROLLER.focused.target and G.CONTROLLER.focused.target.area == G.hand then G.card_area_focus_reset = {area = G.hand, rank = G.CONTROLLER.focused.target.rank} end + local highlighted_count = math.min(#G.hand.highlighted, G.discard.config.card_limit - #G.play.cards) + if highlighted_count > 0 then + update_hand_text({immediate = true, nopulse = true, delay = 0}, {mult = 0, chips = 0, level = '', handname = ''}) + table.sort(G.hand.highlighted, function(a,b) return a.T.x < b.T.x end) + inc_career_stat('c_cards_discarded', highlighted_count) + for j = 1, #G.jokers.cards do + G.jokers.cards[j]:calculate_joker({pre_discard = true, full_hand = G.hand.highlighted, hook = hook}) + end + local cards = {} + local destroyed_cards = {} + for i=1, highlighted_count do + G.hand.highlighted[i]:calculate_seal({discard = true}) + local removed = false + for j = 1, #G.jokers.cards do + local eval = nil + eval = G.jokers.cards[j]:calculate_joker({discard = true, other_card = G.hand.highlighted[i], full_hand = G.hand.highlighted}) + if eval then + if eval.remove then removed = true end + card_eval_status_text(G.jokers.cards[j], 'jokers', nil, 1, nil, eval) + end + end + table.insert(cards, G.hand.highlighted[i]) + if removed then + destroyed_cards[#destroyed_cards + 1] = G.hand.highlighted[i] + if G.hand.highlighted[i].ability.name == 'Glass Card' then + G.hand.highlighted[i]:shatter() + else + G.hand.highlighted[i]:start_dissolve() + end + else + G.hand.highlighted[i].ability.discarded = true + draw_card(G.hand, G.discard, i*100/highlighted_count, 'down', false, G.hand.highlighted[i]) + end + end + + if destroyed_cards[1] then + for j=1, #G.jokers.cards do + eval_card(G.jokers.cards[j], {cardarea = G.jokers, remove_playing_cards = true, removed = destroyed_cards}) + end + end + + G.GAME.round_scores.cards_discarded.amt = G.GAME.round_scores.cards_discarded.amt + #cards + check_for_unlock({type = 'discard_custom', cards = cards}) + if not hook then + if G.GAME.modifiers.discard_cost then + ease_dollars(-G.GAME.modifiers.discard_cost) + end + ease_discard(-1) + G.GAME.current_round.discards_used = G.GAME.current_round.discards_used + 1 + G.STATE = G.STATES.DRAW_TO_HAND + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE_COMPLETE = false + return true + end + })) + end + end +end + +G.FUNCS.play_cards_from_highlighted = function(e) + if G.play and G.play.cards[1] then return end + --check the hand first + + stop_use() + G.GAME.blind.triggered = false + G.CONTROLLER.interrupt.focus = true + G.CONTROLLER:save_cardarea_focus('hand') + + for k, v in ipairs(G.playing_cards) do + v.ability.forced_selection = nil + end + + table.sort(G.hand.highlighted, function(a,b) return a.T.x < b.T.x end) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE = G.STATES.HAND_PLAYED + G.STATE_COMPLETE = true + return true + end + })) + inc_career_stat('c_cards_played', #G.hand.highlighted) + inc_career_stat('c_hands_played', 1) + ease_hands_played(-1) + delay(0.4) + + for i=1, #G.hand.highlighted do + if G.hand.highlighted[i]:is_face() then inc_career_stat('c_face_cards_played', 1) end + G.hand.highlighted[i].base.times_played = G.hand.highlighted[i].base.times_played + 1 + G.hand.highlighted[i].ability.played_this_ante = true + G.GAME.round_scores.cards_played.amt = G.GAME.round_scores.cards_played.amt + 1 + draw_card(G.hand, G.play, i*100/#G.hand.highlighted, 'up', nil, G.hand.highlighted[i]) + end + + check_for_unlock({type = 'run_card_replays'}) + + if G.GAME.blind:press_play() then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_1'):juice_up(0.3, 0) + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_2'):juice_up(0.3, 0) + G.GAME.blind:juice_up() + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + return true + end) + })) + delay(0.4) + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + check_for_unlock({type = 'hand_contents', cards = G.play.cards}) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.FUNCS.evaluate_play() + return true + end + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + check_for_unlock({type = 'play_all_hearts'}) + G.FUNCS.draw_from_play_to_discard() + G.GAME.hands_played = G.GAME.hands_played + 1 + G.GAME.current_round.hands_played = G.GAME.current_round.hands_played + 1 + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE_COMPLETE = false + return true + end + })) + return true + end) + })) +end + +G.FUNCS.get_poker_hand_info = function(_cards) + local poker_hands = evaluate_poker_hand(_cards) + local scoring_hand = {} + local text,disp_text,loc_disp_text = 'NULL','NULL', 'NULL' + if next(poker_hands["Flush Five"]) then text = "Flush Five"; scoring_hand = poker_hands["Flush Five"][1] + elseif next(poker_hands["Flush House"]) then text = "Flush House"; scoring_hand = poker_hands["Flush House"][1] + elseif next(poker_hands["Five of a Kind"]) then text = "Five of a Kind"; scoring_hand = poker_hands["Five of a Kind"][1] + elseif next(poker_hands["Straight Flush"]) then text = "Straight Flush"; scoring_hand = poker_hands["Straight Flush"][1] + elseif next(poker_hands["Four of a Kind"]) then text = "Four of a Kind"; scoring_hand = poker_hands["Four of a Kind"][1] + elseif next(poker_hands["Full House"]) then text = "Full House"; scoring_hand = poker_hands["Full House"][1] + elseif next(poker_hands["Flush"]) then text = "Flush"; scoring_hand = poker_hands["Flush"][1] + elseif next(poker_hands["Straight"]) then text = "Straight"; scoring_hand = poker_hands["Straight"][1] + elseif next(poker_hands["Three of a Kind"]) then text = "Three of a Kind"; scoring_hand = poker_hands["Three of a Kind"][1] + elseif next(poker_hands["Two Pair"]) then text = "Two Pair"; scoring_hand = poker_hands["Two Pair"][1] + elseif next(poker_hands["Pair"]) then text = "Pair"; scoring_hand = poker_hands["Pair"][1] + elseif next(poker_hands["High Card"]) then text = "High Card"; scoring_hand = poker_hands["High Card"][1] end + + disp_text = text + if text =='Straight Flush' then + local min = 10 + for j = 1, #scoring_hand do + if scoring_hand[j]:get_id() < min then min =scoring_hand[j]:get_id() end + end + if min >= 10 then + disp_text = 'Royal Flush' + end + end + loc_disp_text = localize(disp_text, 'poker_hands') + return text, loc_disp_text, poker_hands, scoring_hand, disp_text +end + +G.FUNCS.evaluate_play = function(e) + local text,disp_text,poker_hands,scoring_hand,non_loc_disp_text = G.FUNCS.get_poker_hand_info(G.play.cards) + + G.GAME.hands[text].played = G.GAME.hands[text].played + 1 + G.GAME.hands[text].played_this_round = G.GAME.hands[text].played_this_round + 1 + G.GAME.last_hand_played = text + set_hand_usage(text) + G.GAME.hands[text].visible = true + + --Add all the pure bonus cards to the scoring hand + local pures = {} + for i=1, #G.play.cards do + if next(find_joker('Splash')) then + scoring_hand[i] = G.play.cards[i] + else + if G.play.cards[i].ability.effect == 'Stone Card' then + local inside = false + for j=1, #scoring_hand do + if scoring_hand[j] == G.play.cards[i] then + inside = true + end + end + if not inside then table.insert(pures, G.play.cards[i]) end + end + end + end + for i=1, #pures do + table.insert(scoring_hand, pures[i]) + end + table.sort(scoring_hand, function (a, b) return a.T.x < b.T.x end ) + delay(0.2) + for i=1, #scoring_hand do + --Highlight all the cards used in scoring and play a sound indicating highlight + highlight_card(scoring_hand[i],(i-0.999)/5,'up') + end + + local percent = 0.3 + local percent_delta = 0.08 + + if G.GAME.current_round.current_hand.handname ~= disp_text then delay(0.3) end + update_hand_text({sound = G.GAME.current_round.current_hand.handname ~= disp_text and 'button' or nil, volume = 0.4, immediate = true, nopulse = nil, + delay = G.GAME.current_round.current_hand.handname ~= disp_text and 0.4 or 0}, {handname=disp_text, level=G.GAME.hands[text].level, mult = G.GAME.hands[text].mult, chips = G.GAME.hands[text].chips}) + + if not G.GAME.blind:debuff_hand(G.play.cards, poker_hands, text) then + mult = mod_mult(G.GAME.hands[text].mult) + hand_chips = mod_chips(G.GAME.hands[text].chips) + + check_for_unlock({type = 'hand', handname = text, disp_text = non_loc_disp_text, scoring_hand = scoring_hand, full_hand = G.play.cards}) + + delay(0.4) + + if G.GAME.first_used_hand_level and G.GAME.first_used_hand_level > 0 then + level_up_hand(G.deck.cards[1], text, nil, G.GAME.first_used_hand_level) + G.GAME.first_used_hand_level = nil + end + + local hand_text_set = false + for i=1, #G.jokers.cards do + --calculate the joker effects + local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, before = true}) + if effects.jokers then + card_eval_status_text(G.jokers.cards[i], 'jokers', nil, percent, nil, effects.jokers) + percent = percent + percent_delta + if effects.jokers.level_up then + level_up_hand(G.jokers.cards[i], text) + end + end + end + + mult = mod_mult(G.GAME.hands[text].mult) + hand_chips = mod_chips(G.GAME.hands[text].chips) + + local modded = false + + mult, hand_chips, modded = G.GAME.blind:modify_hand(G.play.cards, poker_hands, text, mult, hand_chips) + mult, hand_chips = mod_mult(mult), mod_chips(hand_chips) + if modded then update_hand_text({sound = 'chips2', modded = modded}, {chips = hand_chips, mult = mult}) end + for i=1, #scoring_hand do + --add cards played to list + if scoring_hand[i].ability.effect ~= 'Stone Card' then + G.GAME.cards_played[scoring_hand[i].base.value].total = G.GAME.cards_played[scoring_hand[i].base.value].total + 1 + G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true + end + --if card is debuffed + if scoring_hand[i].debuff then + G.GAME.blind.triggered = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_1'):juice_up(0.3, 0) + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_2'):juice_up(0.3, 0) + G.GAME.blind:juice_up();return true end) + })) + card_eval_status_text(scoring_hand[i], 'debuff') + else + --Check for play doubling + local reps = {1} + + --From Red seal + local eval = eval_card(scoring_hand[i], {repetition_only = true,cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, repetition = true}) + if next(eval) then + for h = 1, eval.seals.repetitions do + reps[#reps+1] = eval + end + end + --From jokers + for j=1, #G.jokers.cards do + --calculate the joker effects + local eval = eval_card(G.jokers.cards[j], {cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = scoring_hand[i], repetition = true}) + if next(eval) and eval.jokers then + for h = 1, eval.jokers.repetitions do + reps[#reps+1] = eval + end + end + end + for j=1,#reps do + percent = percent + percent_delta + if reps[j] ~= 1 then + card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) + end + + --calculate the hand effects + local effects = {eval_card(scoring_hand[i], {cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, poker_hand = text})} + for k=1, #G.jokers.cards do + --calculate the joker individual card effects + local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = scoring_hand[i], individual = true}) + if eval then + table.insert(effects, eval) + end + end + scoring_hand[i].lucky_trigger = nil + + for ii = 1, #effects do + --If chips added, do chip add event and add the chips to the total + if effects[ii].chips then + if effects[ii].card then juice_card(effects[ii].card) end + hand_chips = mod_chips(hand_chips + effects[ii].chips) + update_hand_text({delay = 0}, {chips = hand_chips}) + card_eval_status_text(scoring_hand[i], 'chips', effects[ii].chips, percent) + end + + --If mult added, do mult add event and add the mult to the total + if effects[ii].mult then + if effects[ii].card then juice_card(effects[ii].card) end + mult = mod_mult(mult + effects[ii].mult) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(scoring_hand[i], 'mult', effects[ii].mult, percent) + end + + --If play dollars added, add dollars to total + if effects[ii].p_dollars then + if effects[ii].card then juice_card(effects[ii].card) end + ease_dollars(effects[ii].p_dollars) + card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].p_dollars, percent) + end + + --If dollars added, add dollars to total + if effects[ii].dollars then + if effects[ii].card then juice_card(effects[ii].card) end + ease_dollars(effects[ii].dollars) + card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].dollars, percent) + end + + --Any extra effects + if effects[ii].extra then + if effects[ii].card then juice_card(effects[ii].card) end + local extras = {mult = false, hand_chips = false} + if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end + if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end + if effects[ii].extra.swap then + local old_mult = mult + mult = mod_mult(hand_chips) + hand_chips = mod_chips(old_mult) + extras.hand_chips = true; extras.mult = true + end + if effects[ii].extra.func then effects[ii].extra.func() end + update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) + card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, effects[ii].extra) + end + + --If x_mult added, do mult add event and mult the mult to the total + if effects[ii].x_mult then + if effects[ii].card then juice_card(effects[ii].card) end + mult = mod_mult(mult*effects[ii].x_mult) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(scoring_hand[i], 'x_mult', effects[ii].x_mult, percent) + end + + --calculate the card edition effects + if effects[ii].edition then + hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0)) + mult = mult + (effects[ii].edition.mult_mod or 0) + mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1)) + update_hand_text({delay = 0}, { + chips = effects[ii].edition.chip_mod and hand_chips or nil, + mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil, + }) + card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, { + message = (effects[ii].edition.chip_mod and localize{type='variable',key='a_chips',vars={effects[ii].edition.chip_mod}}) or + (effects[ii].edition.mult_mod and localize{type='variable',key='a_mult',vars={effects[ii].edition.mult_mod}}) or + (effects[ii].edition.x_mult_mod and localize{type='variable',key='a_xmult',vars={effects[ii].edition.x_mult_mod}}), + chip_mod = effects[ii].edition.chip_mod, + mult_mod = effects[ii].edition.mult_mod, + x_mult_mod = effects[ii].edition.x_mult_mod, + colour = G.C.DARK_EDITION, + edition = true}) + end + end + end + end + end + + delay(0.3) + local mod_percent = false + for i=1, #G.hand.cards do + if mod_percent then percent = percent + percent_delta end + mod_percent = false + + --Check for hand doubling + local reps = {1} + local j = 1 + while j <= #reps do + if reps[j] ~= 1 then + card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) + percent = percent + percent_delta + end + + --calculate the hand effects + local effects = {eval_card(G.hand.cards[i], {cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands})} + + for k=1, #G.jokers.cards do + --calculate the joker individual card effects + local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = G.hand.cards[i], individual = true}) + if eval then + mod_percent = true + table.insert(effects, eval) + end + end + + if reps[j] == 1 then + --Check for hand doubling + + --From Red seal + local eval = eval_card(G.hand.cards[i], {repetition_only = true,cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, repetition = true, card_effects = effects}) + if next(eval) and (next(effects[1]) or #effects > 1) then + for h = 1, eval.seals.repetitions do + reps[#reps+1] = eval + end + end + + --From Joker + for j=1, #G.jokers.cards do + --calculate the joker effects + local eval = eval_card(G.jokers.cards[j], {cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = G.hand.cards[i], repetition = true, card_effects = effects}) + if next(eval) then + for h = 1, eval.jokers.repetitions do + reps[#reps+1] = eval + end + end + end + end + + for ii = 1, #effects do + --if this effect came from a joker + if effects[ii].card then + mod_percent = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() effects[ii].card:juice_up(0.7);return true end) + })) + end + + --If hold mult added, do hold mult add event and add the mult to the total + + --If dollars added, add dollars to total + if effects[ii].dollars then + ease_dollars(effects[ii].dollars) + card_eval_status_text(G.hand.cards[i], 'dollars', effects[ii].dollars, percent) + end + + if effects[ii].h_mult then + mod_percent = true + mult = mod_mult(mult + effects[ii].h_mult) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(G.hand.cards[i], 'h_mult', effects[ii].h_mult, percent) + end + + if effects[ii].x_mult then + mod_percent = true + mult = mod_mult(mult*effects[ii].x_mult) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(G.hand.cards[i], 'x_mult', effects[ii].x_mult, percent) + end + + if effects[ii].message then + mod_percent = true + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(G.hand.cards[i], 'extra', nil, percent, nil, effects[ii]) + end + end + j = j +1 + end + end + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + --Joker Effects + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + percent = percent + percent_delta + for i=1, #G.jokers.cards + #G.consumeables.cards do + local _card = G.jokers.cards[i] or G.consumeables.cards[i - #G.jokers.cards] + --calculate the joker edition effects + local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true}) + if edition_effects.jokers then + edition_effects.jokers.edition = true + if edition_effects.jokers.chip_mod then + hand_chips = mod_chips(hand_chips + edition_effects.jokers.chip_mod) + update_hand_text({delay = 0}, {chips = hand_chips}) + card_eval_status_text(_card, 'jokers', nil, percent, nil, { + message = localize{type='variable',key='a_chips',vars={edition_effects.jokers.chip_mod}}, + chip_mod = edition_effects.jokers.chip_mod, + colour = G.C.EDITION, + edition = true}) + end + if edition_effects.jokers.mult_mod then + mult = mod_mult(mult + edition_effects.jokers.mult_mod) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(_card, 'jokers', nil, percent, nil, { + message = localize{type='variable',key='a_mult',vars={edition_effects.jokers.mult_mod}}, + mult_mod = edition_effects.jokers.mult_mod, + colour = G.C.DARK_EDITION, + edition = true}) + end + percent = percent+percent_delta + end + + --calculate the joker effects + local effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, joker_main = true}) + + --Any Joker effects + if effects.jokers then + local extras = {mult = false, hand_chips = false} + if effects.jokers.mult_mod then mult = mod_mult(mult + effects.jokers.mult_mod);extras.mult = true end + if effects.jokers.chip_mod then hand_chips = mod_chips(hand_chips + effects.jokers.chip_mod);extras.hand_chips = true end + if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end + update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) + card_eval_status_text(_card, 'jokers', nil, percent, nil, effects.jokers) + percent = percent+percent_delta + end + + --Joker on Joker effects + for _, v in ipairs(G.jokers.cards) do + local effect = v:calculate_joker{full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_joker = _card} + if effect then + local extras = {mult = false, hand_chips = false} + if effect.mult_mod then mult = mod_mult(mult + effect.mult_mod);extras.mult = true end + if effect.chip_mod then hand_chips = mod_chips(hand_chips + effect.chip_mod);extras.hand_chips = true end + if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end + if extras.mult or extras.hand_chips then update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) end + if extras.mult or extras.hand_chips then card_eval_status_text(v, 'jokers', nil, percent, nil, effect) end + percent = percent+percent_delta + end + end + + if edition_effects.jokers then + if edition_effects.jokers.x_mult_mod then + mult = mod_mult(mult*edition_effects.jokers.x_mult_mod) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(_card, 'jokers', nil, percent, nil, { + message = localize{type='variable',key='a_xmult',vars={edition_effects.jokers.x_mult_mod}}, + x_mult_mod = edition_effects.jokers.x_mult_mod, + colour = G.C.EDITION, + edition = true}) + end + percent = percent+percent_delta + end + end + + local nu_chip, nu_mult = G.GAME.selected_back:trigger_effect{context = 'final_scoring_step', chips = hand_chips, mult = mult} + mult = mod_mult(nu_mult or mult) + hand_chips = mod_chips(nu_chip or hand_chips) + + local cards_destroyed = {} + for i=1, #scoring_hand do + local destroyed = nil + --un-highlight all cards + highlight_card(scoring_hand[i],(i-0.999)/(#scoring_hand-0.998),'down') + + for j = 1, #G.jokers.cards do + destroyed = G.jokers.cards[j]:calculate_joker({destroying_card = scoring_hand[i], full_hand = G.play.cards}) + if destroyed then break end + end + + if scoring_hand[i].ability.name == 'Glass Card' and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/scoring_hand[i].ability.extra then + destroyed = true + end + + if destroyed then + if scoring_hand[i].ability.name == 'Glass Card' then + scoring_hand[i].shattered = true + else + scoring_hand[i].destroyed = true + end + cards_destroyed[#cards_destroyed+1] = scoring_hand[i] + end + end + for j=1, #G.jokers.cards do + eval_card(G.jokers.cards[j], {cardarea = G.jokers, remove_playing_cards = true, removed = cards_destroyed}) + end + + local glass_shattered = {} + for k, v in ipairs(cards_destroyed) do + if v.shattered then glass_shattered[#glass_shattered+1] = v end + end + + check_for_unlock{type = 'shatter', shattered = glass_shattered} + + for i=1, #cards_destroyed do + G.E_MANAGER:add_event(Event({ + func = function() + if cards_destroyed[i].ability.name == 'Glass Card' then + cards_destroyed[i]:shatter() + else + cards_destroyed[i]:start_dissolve() + end + return true + end + })) + end + else + mult = mod_mult(0) + hand_chips = mod_chips(0) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_1'):juice_up(0.3, 0) + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_2'):juice_up(0.3, 0) + G.GAME.blind:juice_up() + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + return true + end) + })) + + play_area_status_text("Not Allowed!")--localize('k_not_allowed_ex'), true) + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + --Joker Debuff Effects + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + for i=1, #G.jokers.cards do + + --calculate the joker effects + local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, debuffed_hand = true}) + + --Any Joker effects + if effects.jokers then + card_eval_status_text(G.jokers.cards[i], 'jokers', nil, percent, nil, effects.jokers) + percent = percent+percent_delta + end + end + end + G.E_MANAGER:add_event(Event({ + trigger = 'after',delay = 0.4, + func = (function() update_hand_text({delay = 0, immediate = true}, {mult = 0, chips = 0, chip_total = math.floor(hand_chips*mult), level = '', handname = ''});play_sound('button', 0.9, 0.6);return true end) + })) + check_and_set_high_score('hand', hand_chips*mult) + + check_for_unlock({type = 'chip_score', chips = math.floor(hand_chips*mult)}) + + if hand_chips*mult > 0 then + delay(0.8) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() play_sound('chips2');return true end) + })) + end + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blocking = false, + ref_table = G.GAME, + ref_value = 'chips', + ease_to = G.GAME.chips + math.floor(hand_chips*mult), + delay = 0.5, + func = (function(t) return math.floor(t) end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blocking = true, + ref_table = G.GAME.current_round.current_hand, + ref_value = 'chip_total', + ease_to = 0, + delay = 0.5, + func = (function(t) return math.floor(t) end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() G.GAME.current_round.current_hand.handname = '';return true end) + })) + delay(0.3) + + for i=1, #G.jokers.cards do + --calculate the joker after hand played effects + local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, after = true}) + if effects.jokers then + card_eval_status_text(G.jokers.cards[i], 'jokers', nil, percent, nil, effects.jokers) + percent = percent + percent_delta + end + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + if G.GAME.modifiers.debuff_played_cards then + for k, v in ipairs(scoring_hand) do v.ability.perma_debuff = true end + end + return true end) + })) + + end + + G.FUNCS.draw_from_play_to_discard = function(e) + local play_count = #G.play.cards + local it = 1 + for k, v in ipairs(G.play.cards) do + if (not v.shattered) and (not v.destroyed) then + draw_card(G.play,G.discard, it*100/play_count,'down', false, v) + it = it + 1 + end + end + end + + G.FUNCS.draw_from_play_to_hand = function(cards) + local gold_count = #cards + for i=1, gold_count do --draw cards from play + if not cards[i].shattered and not cards[i].destroyed then + draw_card(G.play,G.hand, i*100/gold_count,'up', true, cards[i]) + end + end + end + + G.FUNCS.draw_from_discard_to_deck = function(e) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local discard_count = #G.discard.cards + for i=1, discard_count do --draw cards from deck + draw_card(G.discard, G.deck, i*100/discard_count,'up', nil ,nil, 0.005, i%2==0, nil, math.max((21-i)/20,0.7)) + end + return true + end + })) + end + + G.FUNCS.draw_from_hand_to_deck = function(e) + local hand_count = #G.hand.cards + for i=1, hand_count do --draw cards from deck + draw_card(G.hand, G.deck, i*100/hand_count,'down', nil, nil, 0.08) + end + end + + G.FUNCS.draw_from_hand_to_discard = function(e) + local hand_count = #G.hand.cards + for i=1, hand_count do + draw_card(G.hand,G.discard, i*100/hand_count,'down', nil, nil, 0.07) + end +end + +G.FUNCS.evaluate_round = function() + local pitch = 0.95 + local dollars = 0 + + if G.GAME.chips - G.GAME.blind.chips >= 0 then + add_round_eval_row({dollars = G.GAME.blind.dollars, name='blind1', pitch = pitch}) + pitch = pitch + 0.06 + dollars = dollars + G.GAME.blind.dollars + else + add_round_eval_row({dollars = 0, name='blind1', pitch = pitch, saved = true}) + pitch = pitch + 0.06 + end + + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 1.3*math.min(G.GAME.blind.dollars+2, 7)/2*0.15 + 0.5, + func = function() + G.GAME.blind:defeat() + return true + end + })) + delay(0.2) + G.E_MANAGER:add_event(Event({ + func = function() + ease_background_colour_blind(G.STATES.ROUND_EVAL, '') + return true + end + })) + G.GAME.selected_back:trigger_effect({context = 'eval'}) + + if G.GAME.current_round.hands_left > 0 and not G.GAME.modifiers.no_extra_hand_money then + add_round_eval_row({dollars = G.GAME.current_round.hands_left*(G.GAME.modifiers.money_per_hand or 1), disp = G.GAME.current_round.hands_left, bonus = true, name='hands', pitch = pitch}) + pitch = pitch + 0.06 + dollars = dollars + G.GAME.current_round.hands_left*(G.GAME.modifiers.money_per_hand or 1) + end + if G.GAME.current_round.discards_left > 0 and G.GAME.modifiers.money_per_discard then + add_round_eval_row({dollars = G.GAME.current_round.discards_left*(G.GAME.modifiers.money_per_discard), disp = G.GAME.current_round.discards_left, bonus = true, name='discards', pitch = pitch}) + pitch = pitch + 0.06 + dollars = dollars + G.GAME.current_round.discards_left*(G.GAME.modifiers.money_per_discard) + end + for i = 1, #G.jokers.cards do + local ret = G.jokers.cards[i]:calculate_dollar_bonus() + if ret then + add_round_eval_row({dollars = ret, bonus = true, name='joker'..i, pitch = pitch, card = G.jokers.cards[i]}) + pitch = pitch + 0.06 + dollars = dollars + ret + end + end + for i = 1, #G.GAME.tags do + local ret = G.GAME.tags[i]:apply_to_run({type = 'eval'}) + if ret then + add_round_eval_row({dollars = ret.dollars, bonus = true, name='tag'..i, pitch = pitch, condition = ret.condition, pos = ret.pos, tag = ret.tag}) + pitch = pitch + 0.06 + dollars = dollars + ret.dollars + end + end + if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then + add_round_eval_row({bonus = true, name='interest', pitch = pitch, dollars = G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)}) + pitch = pitch + 0.06 + if not G.GAME.seeded and not G.GAME.challenge then + if G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) == G.GAME.interest_amount*G.GAME.interest_cap/5 then + G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak + 1 + else + G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = 0 + end + end + check_for_unlock({type = 'interest_streak'}) + dollars = dollars + G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) + end + + pitch = pitch + 0.06 + + add_round_eval_row({name = 'bottom', dollars = dollars}) +end + +G.FUNCS.tutorial_controller = function() + if G.F_SKIP_TUTORIAL then + G.SETTINGS.tutorial_complete = true + G.SETTINGS.tutorial_progress = nil + return + end + G.SETTINGS.tutorial_progress = G.SETTINGS.tutorial_progress or + { + forced_shop = {'j_joker', 'c_empress'}, + forced_voucher = 'v_grabber', + forced_tags = {'tag_handy', 'tag_garbage'}, + hold_parts = {}, + completed_parts = {}, + } + if not G.SETTINGS.paused and (not G.SETTINGS.tutorial_complete) then + if G.STATE == G.STATES.BLIND_SELECT and G.blind_select and not G.SETTINGS.tutorial_progress.completed_parts['small_blind'] then + G.SETTINGS.tutorial_progress.section = 'small_blind' + G.FUNCS.tutorial_part('small_blind') + G.SETTINGS.tutorial_progress.completed_parts['small_blind'] = true + G:save_progress() + end + if G.STATE == G.STATES.BLIND_SELECT and G.blind_select and not G.SETTINGS.tutorial_progress.completed_parts['big_blind'] and G.GAME.round > 0 then + G.SETTINGS.tutorial_progress.section = 'big_blind' + G.FUNCS.tutorial_part('big_blind') + G.SETTINGS.tutorial_progress.completed_parts['big_blind'] = true + G.SETTINGS.tutorial_progress.forced_tags = nil + G:save_progress() + end + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['second_hand'] and G.SETTINGS.tutorial_progress.hold_parts['big_blind'] then + G.SETTINGS.tutorial_progress.section = 'second_hand' + G.FUNCS.tutorial_part('second_hand') + G.SETTINGS.tutorial_progress.completed_parts['second_hand'] = true + G:save_progress() + end + if G.SETTINGS.tutorial_progress.hold_parts['second_hand'] then + G.SETTINGS.tutorial_complete = true + end + if not G.SETTINGS.tutorial_progress.completed_parts['first_hand_section'] then + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['first_hand'] then + G.SETTINGS.tutorial_progress.section = 'first_hand' + G.FUNCS.tutorial_part('first_hand') + G.SETTINGS.tutorial_progress.completed_parts['first_hand'] = true + G:save_progress() + end + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['first_hand_2'] and G.SETTINGS.tutorial_progress.hold_parts['first_hand'] then + G.FUNCS.tutorial_part('first_hand_2') + G.SETTINGS.tutorial_progress.completed_parts['first_hand_2'] = true + G:save_progress() + end + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['first_hand_3'] and G.SETTINGS.tutorial_progress.hold_parts['first_hand_2'] then + G.FUNCS.tutorial_part('first_hand_3') + G.SETTINGS.tutorial_progress.completed_parts['first_hand_3'] = true + G:save_progress() + end + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['first_hand_4'] and G.SETTINGS.tutorial_progress.hold_parts['first_hand_3'] then + G.FUNCS.tutorial_part('first_hand_4') + G.SETTINGS.tutorial_progress.completed_parts['first_hand_4'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_section'] = true + G:save_progress() + end + end + if G.STATE == G.STATES.SHOP and G.shop and G.shop.VT.y < 5 and not G.SETTINGS.tutorial_progress.completed_parts['shop_1'] then + G.SETTINGS.tutorial_progress.section = 'shop' + G.FUNCS.tutorial_part('shop_1') + G.SETTINGS.tutorial_progress.completed_parts['shop_1'] = true + G.SETTINGS.tutorial_progress.forced_voucher = nil + G:save_progress() + end + end +end + +G.FUNCS.tutorial_part = function(_part) + local step = 1 + G.SETTINGS.paused = true + if _part == 'small_blind' then + step = tutorial_info({ + text_key = 'sb_1', + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'sb_2', + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'sb_3', + highlight = { + G.blind_select.UIRoot.children[1].children[1].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[1].config.object:get_UIE_by_ID('blind_desc'), + }, + attach = {major = G.blind_select.UIRoot.children[1].children[1], type = 'tr', offset = {x = 2, y = 4}}, + step = step, + }) + step = tutorial_info({ + text_key = 'sb_4', + highlight = { + G.blind_select.UIRoot.children[1].children[1] + }, + snap_to = function() + if G.blind_select and G.blind_select.UIRoot and G.blind_select.UIRoot.children[1] and G.blind_select.UIRoot.children[1].children[1] and G.blind_select.UIRoot.children[1].children[1].config.object then + return G.blind_select.UIRoot.children[1].children[1].config.object:get_UIE_by_ID('select_blind_button') end + end, + attach = {major = G.blind_select.UIRoot.children[1].children[1], type = 'tr', offset = {x = 2, y = 4}}, + step = step, + no_button = true, + button_listen = 'select_blind' + }) + elseif _part == 'big_blind' then + step = tutorial_info({ + text_key = 'bb_1', + highlight = { + G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('blind_desc'), + }, + hard_set = true, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'bb_2', + highlight = { + G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('tag_desc'), + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'bb_3', + highlight = { + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_desc'), + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'bb_4', + highlight = { + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_desc'), + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_extras'), + G.HUD:get_UIE_by_ID('hud_ante') + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'bb_5', + loc_vars = {G.GAME.win_ante}, + highlight = { + G.blind_select, + G.HUD:get_UIE_by_ID('hud_ante') + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + no_button = true, + snap_to = function() + if G.blind_select and G.blind_select.UIRoot and G.blind_select.UIRoot.children[1] and G.blind_select.UIRoot.children[1].children[2] and + G.blind_select.UIRoot.children[1].children[2].config.object then + return G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('select_blind_button') end + end, + button_listen = 'select_blind' + }) + elseif _part == 'first_hand' then + step = tutorial_info({ + text_key = 'fh_1', + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'fh_2', + highlight = { + G.HUD:get_UIE_by_ID('hand_text_area') + }, + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'fh_3', + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + highlight = { + G.HUD:get_UIE_by_ID('run_info_button') + }, + no_button = true, + button_listen = 'run_info', + snap_to = function() return G.HUD:get_UIE_by_ID('run_info_button') end, + step = step, + }) + elseif _part == 'first_hand_2' then + step = tutorial_info({ + hard_set = true, + text_key = 'fh_4', + highlight = { + G.hand, + G.HUD:get_UIE_by_ID('run_info_button') + }, + attach = {major = G.hand, type = 'cl', offset = {x = -1.5, y = 0}}, + snap_to = function() return G.hand.cards[1] end, + step = step, + }) + step = tutorial_info({ + text_key = 'fh_5', + highlight = { + G.hand, + G.buttons:get_UIE_by_ID('play_button'), + G.HUD:get_UIE_by_ID('run_info_button') + }, + attach = {major = G.hand, type = 'cl', offset = {x = -1.5, y = 0}}, + no_button = true, + button_listen = 'play_cards_from_highlighted', + step = step, + }) + elseif _part == 'first_hand_3' then + step = tutorial_info({ + hard_set = true, + text_key = 'fh_6', + highlight = { + G.hand, + G.buttons:get_UIE_by_ID('discard_button'), + G.HUD:get_UIE_by_ID('run_info_button') + }, + attach = {major = G.hand, type = 'cl', offset = {x = -1.5, y = 0}}, + no_button = true, + button_listen = 'discard_cards_from_highlighted', + step = step, + }) + elseif _part == 'first_hand_4' then + step = tutorial_info({ + hard_set = true, + text_key = 'fh_7', + highlight = { + G.HUD:get_UIE_by_ID('hud_hands').parent, + }, + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'fh_8', + highlight = { + G.HUD:get_UIE_by_ID('hud_hands').parent, + G.HUD:get_UIE_by_ID('row_dollars_chips'), + G.HUD_blind + }, + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + elseif _part == 'second_hand' then + step = tutorial_info({ + text_key = 'sh_1', + hard_set = true, + highlight = { + G.jokers + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + local empress = find_joker('The Empress')[1] + if empress then + step = tutorial_info({ + text_key = 'sh_2', + highlight = { + empress + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'sh_3', + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + highlight = { + empress, + G.hand + }, + no_button = true, + button_listen = 'use_card', + snap_to = function() return G.hand.cards[1] end, + step = step, + }) + end + elseif _part == 'shop_1' then + step = tutorial_info({ + hard_set = true, + text_key = 's_1', + highlight = { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent + }, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 4}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_2', + highlight = { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_jokers.cards[2], + }, + snap_to = function() return G.shop_jokers.cards[2] end, + attach = {major = G.shop, type = 'tr', offset = {x = -0.5, y = 6}}, + no_button = true, + button_listen = 'buy_from_shop', + step = step, + }) + step = tutorial_info({ + text_key = 's_3', + loc_vars = {#G.P_CENTER_POOLS.Joker}, + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.jokers.cards[1], + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_4', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.jokers.cards[1], + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_5', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.jokers, + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_6', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_jokers.cards[1], + } end, + snap_to = function() return G.shop_jokers.cards[1] end, + no_button = true, + button_listen = 'buy_from_shop', + attach = {major = G.shop, type = 'tr', offset = {x = -0.5, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_7', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.consumeables.cards[#G.consumeables.cards], + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_8', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.consumeables + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_9', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_vouchers, + } end, + snap_to = function() return G.shop_vouchers.cards[1] end, + attach = {major = G.shop, type = 'tr', offset = {x = -4, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_10', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_vouchers, + } end, + attach = {major = G.shop, type = 'tr', offset = {x = -4, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_11', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_booster, + } end, + snap_to = function() return G.shop_booster.cards[1] end, + attach = {major = G.shop, type = 'tl', offset = {x = 3, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_12', + highlight = function() return { + G.shop:get_UIE_by_ID('next_round_button'), + } end, + snap_to = function() if G.shop then return G.shop:get_UIE_by_ID('next_round_button') end end, + no_button = true, + button_listen = 'toggle_shop', + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + end + + + G.E_MANAGER:add_event(Event({ + blockable = false, + timer = 'REAL', + func = function() + if (G.OVERLAY_TUTORIAL.step == step and + not G.OVERLAY_TUTORIAL.step_complete) or G.OVERLAY_TUTORIAL.skip_steps then + if G.OVERLAY_TUTORIAL.Jimbo then G.OVERLAY_TUTORIAL.Jimbo:remove() end + if G.OVERLAY_TUTORIAL.content then G.OVERLAY_TUTORIAL.content:remove() end + G.OVERLAY_TUTORIAL:remove() + G.OVERLAY_TUTORIAL = nil + G.SETTINGS.tutorial_progress.hold_parts[_part]=true + return true + end + return G.OVERLAY_TUTORIAL.step > step or G.OVERLAY_TUTORIAL.skip_steps + end + }), 'tutorial') + G.SETTINGS.paused = false +end diff --git a/src/functions/test_functions.lua b/src/functions/test_functions.lua new file mode 100644 index 0000000..68af2f9 --- /dev/null +++ b/src/functions/test_functions.lua @@ -0,0 +1,237 @@ +function live_test() + +end + +function do_action(action) + local action = { + type = 'use_card', + target_area = "shop_booster", + target_card = 1, + } + + do_action(action) + + if action.type == 'use_card' then + G.FUNCS.use_card({config = {ref_table = G[action.target_area].cards[action.target_card]}}) + end +end + +function graphics_stress() + local _r = {} + for i = 1,50 do + local _c = {} + for j =1,50 do + _c[#_c+1] = {n=G.UIT.C, config={align = "cm", minw = 0.05,minh = 0.05,colour = G.C.BLUE}, nodes={ + {n=G.UIT.T, config={text = "A", scale = 0.15, colour = G.C.WHITE}} + }} + end + _r[#_r+1] = {n=G.UIT.R, config={align = "cm", minw = 0.05,minh = 0.05,colour = G.C.BLUE, padding = 0.05}, nodes=_c} + end + local uidef = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes=_r} + + G.STRESS = UIBox{ + definition = uidef, + config = {align="cm", offset = {x=0,y=0},major = G.ROOM_ATTACH} + } +end + +function aprint(text) + if _RELEASE_MODE then return end + attention_text({ + text = text, + scale = 0.8, + hold = 5.7, + cover = G.deck or G.MAIN_MENU_UI, + cover_colour = G.C.RED, + align = 'cm', + }) +end + +function play_video() + G.video_control = G.video_control or { + {video = 'A3', _s = 0.1, _e = 4.65, track = 'music1'}, + {video = 'E1', _s = 3.69, _e = 6.55}, + {video = 'C3', _s = 1.9, _e = 4.3, track = 'music3'}, + {video = 'E5', _s = 5.9, _e = 9.2, track = 'music1'}, + {video = 'C4a', _s = 1.3, _e = 4.5, track = 'music2'}, + {video = 'E4', _s = 4, _e = 7.2, track = 'music1'}, + {video = 'D4', _s = 0.3, _e = 3.2, track = 'music4'}, + {video = 'C2', _s = 2.0, _e = 4.4, track = 'music1'}, + {video = 'B3', _s = 2.7, _e = 5.3}, + {video = 'B4', _s = 21.5, _e = 24.8}, + {video = 'D5', _s = 1.2, _e = 3.8, track = 'music1'}, + {video_organ = 0.1,video = 'E2', _s = 1.5, _e = 4.1}, + {video_organ = 0.2,video = 'E3', _s = 3.5, _e = 7.5}, + {video_organ = 0.4, video = 'D3', _s = 1.9, _e = 4.3, track = 'music1'}, + --[[ old one + {video = 'A1', _s = 2.5, _e = 13.9, track = 'music1'}, + {video = '_A2', _s = 0.4, _e = 3.15}, + {video = 'A3', _s = 0.2, _e = 2.25}, + {video = 'A4', _s = 3.4, _e = 8.2}, + {video = '_B1', _s = 0.15, _e = 4.4}, + {video = 'B3', _s = 2.7, _e = 5.3}, + {video = 'B4', _s = 21.5, _e = 27.6}, + {video = '_C1', _s = 0.25, _e = 3.2, track = 'music4'}, + {video = 'C2', _s = 1.4, _e = 4.4}, + {video = 'C3', _s = 1.9, _e = 4.3, track = 'music3'}, + {video = 'C4a', _s = 1.3, _e = 4.5, track = 'music2'}, + {video = '_C5', _s = 0.1, _e = 3.4, track = 'music1'}, + {video = 'C4b', _s = 0.15, _e = 3.5}, + {video = 'D4', _s = 0.3, _e = 3.7, track = 'music4'}, + {video = 'D3', _s = 1.6, _e = 4.8, track = 'music1'}, + {video = 'D1', _s = 1.4, _e = 3.5, track = 'music4'}, + {video = 'D5', _s = 1.0, _e = 3.8, track = 'music1'}, + {video = 'E1', _s = 3, _e = 6.55}, + {video = 'E2', _s = 0., _e = 4.1}, + {video = 'E3', _s = 3.5, _e = 7.5}, + {video = 'E4', _s = 4, _e = 7.2}, + {video = 'E5', _s = 5.9, _e = 9.2, track = 'music1'}, + {video = 'F1', _s = 4.2, _e = 8.1}, + {video_organ = 0.1, video = 'F5', _s = 2.25, _e = 5.4}, + {video_organ = 0.05, video = 'F6', _s = 0, _e = 2.3}, + {video_organ = 0.2, video = 'F2', _s = 0.2, _e = 1.6}, + {video_organ = 0.4, video = 'F3', _s = 2.6, _e = 4.2}, ]]-- + } + + G.video_volume = 1 + G.video_volume_real = 0 + + G.E_MANAGER:add_event(Event({ + blocking = false, blockable = false, + func = function() + G.video_volume_real = G.video_volume_real*(1 - 4*G.real_dt) + 4*G.real_dt*G.video_volume + if G.video then G.video:getSource( ):setVolume(G.video_volume_real) end + end + })) + + local trailer_time = 0 + + for k, v in pairs(G.video_control) do + if v.start then + local nu_vc = {} + for i = k, #G.video_control do + nu_vc[#nu_vc+1] = G.video_control[i] + end + G.video_control = nu_vc + break + end + end + + + --prep clips because keyframes + for k, v in pairs(G.video_control) do + trailer_time = trailer_time + (v._e - v._s) + v.video_file = love.graphics.newVideo('resources/videos/'..v.video..'.ogv') + v.video_file:seek(math.max(v._s or 0.3, 0.3) - 0.29) + G.E_MANAGER:add_event(Event({ + func = function() + v.video_file:play() + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.29, + func = function() + v.video_file:pause() + v.video_file:seek(v._s or 0) + return true + end + })) + end + delay(1.5) + + for k, v in pairs(G.video_control) do + if v.text then + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 1.4, + func = function() + G.FUNCS.wipe_on(v.text, true, 1.4) + G.video_volume = 0 + return true + end + })) + G.E_MANAGER:add_event(Event({ + func = function() + if G.video then G.video:pause() end + G.video = v.video_file + if v.track then G.video_soundtrack = v.track end + if v.video_organ then G.video_organ = v.video_organ end + G.video:play() + G.video_volume = 1 + return true + end + })) + G.FUNCS.wipe_off() + else + G.E_MANAGER:add_event(Event({ + func = function() + if G.video then G.video:pause() end + G.video = v.video_file + if v.track then G.video_soundtrack = v.track end + if v.video_organ then G.video_organ = v.video_organ end + G.video:play() + return true + end + })) + end + local _delay = v._e - (v._s or 0) - (v.text and 1.5 or 0) + delay(_delay - 0.15) + G.E_MANAGER:add_event(Event({ + func = function() + G.screenglitch = true + G.screenwipe_amt = 1 + return true + end + })) + delay(0.15) + G.E_MANAGER:add_event(Event({ + blocking = false, + trigger = 'after', + delay = 0.3, + func = function() + G.screenglitch = false + return true + end + })) + end + local flash_col = copy_table(G.C.WHITE) + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.6, + func = function() + G.FUNCS.wipe_on(nil, true, 2, flash_col) + return true + end + })) + G.E_MANAGER:add_event(Event({ + func = function() + + G.E_MANAGER:add_event(Event({ + trigger = 'after', delay = 0.9, blockable = false, + func = function() + G.video:pause() + G.video = nil + G.video_soundtrack = 'music1' + G.video_organ = 0 + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', delay = 0.9, blockable = false, + func = function() + G.screenglitch = false + G.TIMERS.REAL = 4 + G.TIMERS.TOTAL = 4 + flash_col[4] = 0 + G:main_menu('splash') + return true + end + })) + + return true + end + })) + G.FUNCS.wipe_off() +end diff --git a/src/game.lua b/src/game.lua new file mode 100644 index 0000000..3d40695 --- /dev/null +++ b/src/game.lua @@ -0,0 +1,3629 @@ +--Class +Game = Object:extend() + +--Class Methods +function Game:init() + G = self + + self:set_globals() +end + +function Game:start_up() + --Load the settings file + local settings = get_compressed('settings.jkr') + local settings_ver = nil + if settings then + local settings_file = STR_UNPACK(settings) + if G.VERSION >= '1.0.0' and (love.system.getOS() == 'NOPE') and ((not settings_file.version) or (settings_file.version < '1.0.0')) then + for i = 1, 3 do + love.filesystem.remove(i..'/'..'profile.jkr') + love.filesystem.remove(i..'/'..'save.jkr') + love.filesystem.remove(i..'/'..'meta.jkr') + love.filesystem.remove(i..'/'..'unlock_notify.jkr') + love.filesystem.remove(i..'') + end + for k, v in pairs(settings_file) do + self.SETTINGS[k] = v + end + self.SETTINGS.profile = 1 + self.SETTINGS.tutorial_progress = nil + else + if G.VERSION < '1.0.0' then + settings_ver = settings_file.version + end + for k, v in pairs(settings_file) do + self.SETTINGS[k] = v + end + end + end + self.SETTINGS.version = settings_ver or G.VERSION + self.SETTINGS.paused = nil + + local new_colour_proto = self.C["SO_"..(self.SETTINGS.colourblind_option and 2 or 1)] + self.C.SUITS.Hearts = new_colour_proto.Hearts + self.C.SUITS.Diamonds = new_colour_proto.Diamonds + self.C.SUITS.Spades = new_colour_proto.Spades + self.C.SUITS.Clubs = new_colour_proto.Clubs + + boot_timer('start', 'settings', 0.1) + + if self.SETTINGS.GRAPHICS.texture_scaling then + self.SETTINGS.GRAPHICS.texture_scaling = self.SETTINGS.GRAPHICS.texture_scaling > 1 and 2 or 1 + end + + if self.SETTINGS.DEMO and not self.F_CTA then + self.SETTINGS.DEMO = { + total_uptime = 0, + timed_CTA_shown = true, + win_CTA_shown = true, + quit_CTA_shown = true + } + end + + --create all sounds from resources and play one each to load into mem + SOURCES = {} + local sound_files = love.filesystem.getDirectoryItems("resources/sounds") + + for _, filename in ipairs(sound_files) do + local extension = string.sub(filename, -4) + if extension == '.ogg' then + local sound_code = string.sub(filename, 1, -5) + SOURCES[sound_code] = {} + end + end + + self.SETTINGS.language = self.SETTINGS.language or 'en-us' + boot_timer('settings', 'window init', 0.2) + self:init_window() + + if G.F_SOUND_THREAD then + boot_timer('window init', 'soundmanager2') + --call the sound manager to prepare the thread to play sounds + self.SOUND_MANAGER = { + thread = love.thread.newThread('engine/sound_manager.lua'), + channel = love.thread.getChannel('sound_request'), + load_channel = love.thread.getChannel('load_channel') + } + self.SOUND_MANAGER.thread:start(1) + + local sound_loaded, prev_file = false, 'none' + while not sound_loaded and false do + --Monitor the channel for any new requests + local request = self.SOUND_MANAGER.load_channel:pop() -- Value from channel + if request then + --If the request is for an update to the music track, handle it here + if request == 'finished' then sound_loaded = true + else + boot_timer(request, prev_file) + prev_file = request + end + end + love.timer.sleep(0.001) + end + + boot_timer('soundmanager2', 'savemanager',0.22) + end + + boot_timer('window init', 'savemanager') + --call the save manager to wait for any save requests + G.SAVE_MANAGER = { + thread = love.thread.newThread('engine/save_manager.lua'), + channel = love.thread.getChannel('save_request') + } + G.SAVE_MANAGER.thread:start(2) + boot_timer('savemanager', 'shaders',0.4) + + --call the http manager + G.HTTP_MANAGER = { + thread = love.thread.newThread('engine/http_manager.lua'), + out_channel = love.thread.getChannel('http_request'), + in_channel = love.thread.getChannel('http_response') + } + if G.F_HTTP_SCORES then + G.HTTP_MANAGER.thread:start() + end + + --Load all shaders from resources + self.SHADERS = {} + local shader_files = love.filesystem.getDirectoryItems("resources/shaders") + for k, filename in ipairs(shader_files) do + local extension = string.sub(filename, -3) + if extension == '.fs' then + local shader_name = string.sub(filename, 1, -4) + self.SHADERS[shader_name] = love.graphics.newShader("resources/shaders/"..filename) + end + end + + boot_timer('shaders', 'controllers',0.7) + + --Input handler/controller for game objects + self.CONTROLLER = Controller() + love.joystick.loadGamepadMappings("resources/gamecontrollerdb.txt") + if self.F_RUMBLE then + local joysticks = love.joystick.getJoysticks() + if joysticks then + if joysticks[1] then + self.CONTROLLER:set_gamepad(joysticks[2] or joysticks[1]) + end + end + end + boot_timer('controllers', 'localization',0.8) + + if self.SETTINGS.GRAPHICS.texture_scaling then + self.SETTINGS.GRAPHICS.texture_scaling = self.SETTINGS.GRAPHICS.texture_scaling > 1 and 2 or 1 + end + + self:load_profile(G.SETTINGS.profile or 1) + + self.SETTINGS.QUEUED_CHANGE = {} + self.SETTINGS.music_control = {desired_track = '', current_track = '', lerp = 1} + + self:set_render_settings() + + self:set_language() + + self:init_item_prototypes() + boot_timer('protos', 'shared sprites',0.9) + + --For globally shared sprites + self.shared_debuff = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x=4, y = 0}) + + self.shared_soul = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], self.P_CENTERS.soul.pos) + self.shared_undiscovered_joker = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], self.P_CENTERS.undiscovered_joker.pos) + self.shared_undiscovered_tarot = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], self.P_CENTERS.undiscovered_tarot.pos) + + self.shared_sticker_eternal = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 0,y = 0}) + self.shared_sticker_perishable = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 0,y = 2}) + self.shared_sticker_rental = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 1,y = 2}) + + self.shared_stickers = { + White = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 1,y = 0}), + Red = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 2,y = 0}), + Green = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 3,y = 0}), + Black = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 0,y = 1}), + Blue = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 4,y = 0}), + Purple = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 1,y = 1}), + Orange = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 2,y = 1}), + Gold = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 3,y = 1}) + } + self.shared_seals = { + Gold = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x = 2,y = 0}), + Purple = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x = 4,y = 4}), + Red = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x = 5,y = 4}), + Blue = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x = 6,y = 4}), + } + self.sticker_map = { + 'White','Red','Green','Black','Blue','Purple','Orange','Gold' + } + boot_timer('shared sprites', 'prep stage',0.95) + + --For the visible cursor + G.STAGE_OBJECT_INTERRUPT =true + self.CURSOR = Sprite(0,0,0.3, 0.3, self.ASSET_ATLAS['gamepad_ui'], {x = 18, y = 0}) + self.CURSOR.states.collide.can = false + G.STAGE_OBJECT_INTERRUPT = false + + --Create the event manager for the game + self.E_MANAGER = EventManager() + self.SPEEDFACTOR = 1 + + set_profile_progress() + boot_timer('prep stage', 'splash prep',1) + self:splash_screen() + boot_timer('splash prep', 'end',1) +end + +function Game:init_item_prototypes() + --Initialize all prototypes for units/items + self.P_SEALS = { + Gold = {order = 1, discovered = false, set = "Seal"}, + Red = {order = 2, discovered = false, set = "Seal"}, + Blue = {order = 3, discovered = false, set = "Seal"}, + Purple = {order = 4, discovered = false, set = "Seal"}, + } + self.P_TAGS = { + tag_uncommon = {name = 'Uncommon Tag', set = 'Tag', discovered = false, min_ante = nil, order = 1, config = {type = 'store_joker_create'}, pos = {x = 0,y = 0}}, + tag_rare = {name = 'Rare Tag', set = 'Tag', discovered = false, min_ante = nil, order = 2, config = {type = 'store_joker_create', odds = 3}, requires = 'j_blueprint', pos = {x = 1,y = 0}}, + tag_negative = {name = 'Negative Tag', set = 'Tag', discovered = false, min_ante = 2, order = 3, config = {type = 'store_joker_modify', edition = 'negative', odds = 5}, requires = 'e_negative', pos = {x = 2, y = 0}}, + tag_foil = {name = 'Foil Tag', set = 'Tag', discovered = false, min_ante = nil, order = 4, config = {type = 'store_joker_modify', edition = 'foil', odds = 2}, requires = 'e_foil', pos = {x = 3,y = 0}}, + tag_holo = {name = 'Holographic Tag', set = 'Tag', discovered = false, min_ante = nil, order = 5, config = {type = 'store_joker_modify', edition = 'holo', odds = 3}, requires = 'e_holo', pos = {x = 0,y = 1}}, + tag_polychrome = {name = 'Polychrome Tag', set = 'Tag', discovered = false, min_ante = nil, order = 6, config = {type = 'store_joker_modify', edition = 'polychrome', odds = 4}, requires = 'e_polychrome', pos = {x = 1,y = 1}}, + tag_investment = {name = 'Investment Tag', set = 'Tag', discovered = false, min_ante = nil, order = 7, config = {type = 'eval', dollars = 25}, pos = {x = 2,y = 1}}, + tag_voucher = {name = 'Voucher Tag', set = 'Tag', discovered = false, min_ante = nil, order = 8, config = {type = 'voucher_add'}, pos = {x = 3,y = 1}}, + tag_boss = {name = 'Boss Tag', set = 'Tag', discovered = false, min_ante = nil, order = 9, config = {type = 'new_blind_choice', }, pos = {x = 0,y = 2}}, + tag_standard = {name = 'Standard Tag', set = 'Tag', discovered = false, min_ante = 2, order = 10, config = {type = 'new_blind_choice', }, pos = {x = 1,y = 2}}, + tag_charm = {name = 'Charm Tag', set = 'Tag', discovered = false, min_ante = nil, order = 11, config = {type = 'new_blind_choice', }, pos = {x = 2,y = 2}}, + tag_meteor = {name = 'Meteor Tag', set = 'Tag', discovered = false, min_ante = 2, order = 12, config = {type = 'new_blind_choice', }, pos = {x = 3,y = 2}}, + tag_buffoon = {name = 'Buffoon Tag', set = 'Tag', discovered = false, min_ante = 2, order = 13, config = {type = 'new_blind_choice', }, pos = {x = 4,y = 2}}, + tag_handy = {name = 'Handy Tag', set = 'Tag', discovered = false, min_ante = 2, order = 14, config = {type = 'immediate', dollars_per_hand = 1}, pos = {x = 1,y = 3}}, + tag_garbage = {name = 'Garbage Tag', set = 'Tag', discovered = false, min_ante = 2, order = 15, config = {type = 'immediate', dollars_per_discard = 1}, pos = {x = 2,y = 3}}, + tag_ethereal = {name = 'Ethereal Tag', set = 'Tag', discovered = false, min_ante = 2, order = 16, config = {type = 'new_blind_choice'}, pos = {x = 3,y = 3}}, + tag_coupon = {name = 'Coupon Tag', set = 'Tag', discovered = false, min_ante = nil, order = 17, config = {type = 'shop_final_pass', }, pos = {x = 4,y = 0}}, + tag_double = {name = 'Double Tag', set = 'Tag', discovered = false, min_ante = nil, order = 18, config = {type = 'tag_add', }, pos = {x = 5,y = 0}}, + tag_juggle = {name = 'Juggle Tag', set = 'Tag', discovered = false, min_ante = nil, order = 19, config = {type = 'round_start_bonus', h_size = 3}, pos = {x = 5,y = 1}}, + tag_d_six = {name = 'D6 Tag', set = 'Tag', discovered = false, min_ante = nil, order = 20, config = {type = 'shop_start', }, pos = {x = 5,y = 3}}, + tag_top_up = {name = 'Top-up Tag', set = 'Tag', discovered = false, min_ante = 2, order = 21, config = {type = 'immediate', spawn_jokers = 2}, pos = {x = 4,y = 1}}, + tag_skip = {name = 'Skip Tag', set = 'Tag', discovered = false, min_ante = nil, order = 22, config = {type = 'immediate', skip_bonus = 5}, pos = {x = 0,y = 3}}, + tag_orbital = {name = 'Orbital Tag', set = 'Tag', discovered = false, min_ante = 2, order = 23, config = {type = 'immediate', levels = 3}, pos = {x = 5,y = 2}}, + tag_economy = {name = 'Economy Tag', set = 'Tag', discovered = false, min_ante = nil, order = 24, config = {type = 'immediate', max = 40}, pos = {x = 4,y = 3}}, + } + self.tag_undiscovered = {name = 'Not Discovered', order = 1, config = {type = ''}, pos = {x=3,y=4}} + + self.P_STAKES = { + stake_white = {name = 'White Chip', unlocked = true, order = 1, pos = {x = 0,y = 0}, stake_level = 1, set = 'Stake'}, + stake_red = {name = 'Red Chip', unlocked = false, order = 2, pos = {x = 1,y = 0}, stake_level = 2, set = 'Stake'}, + stake_green = {name = 'Green Chip', unlocked = false, order = 3, pos = {x = 2,y = 0}, stake_level = 3, set = 'Stake'}, + stake_black = {name = 'Black Chip', unlocked = false, order = 4, pos = {x = 4,y = 0}, stake_level = 4, set = 'Stake'}, + stake_blue = {name = 'Blue Chip', unlocked = false, order = 5, pos = {x = 3,y = 0}, stake_level = 5, set = 'Stake'}, + stake_purple = {name = 'Purple Chip', unlocked = false, order = 6, pos = {x = 0,y = 1}, stake_level = 6, set = 'Stake'}, + stake_orange = {name = 'Orange Chip', unlocked = false, order = 7, pos = {x = 1,y = 1}, stake_level = 7, set = 'Stake'}, + stake_gold = {name = 'Gold Chip', unlocked = false, order = 8, pos = {x = 2,y = 1}, stake_level = 8, set = 'Stake'}, + } + + self.P_BLINDS = { + bl_small = {name = 'Small Blind', defeated = false, order = 1, dollars = 3, mult = 1, vars = {}, debuff_text = '', debuff = {}, pos = {x=0, y=0}}, + bl_big = {name = 'Big Blind', defeated = false, order = 2, dollars = 4, mult = 1.5,vars = {}, debuff_text = '', debuff = {}, pos = {x=0, y=1}}, + bl_ox = {name = 'The Ox', defeated = false, order = 4, dollars = 5, mult = 2, vars = {localize('ph_most_played')}, debuff = {}, pos = {x=0, y=2}, boss = {min = 6, max = 10}, boss_colour = HEX('b95b08')}, + bl_hook = {name = 'The Hook', defeated = false, order = 3, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=7}, boss = {min = 1, max = 10}, boss_colour = HEX('a84024')}, + bl_mouth = {name = 'The Mouth', defeated = false, order = 17, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=18}, boss = {min = 2, max = 10}, boss_colour = HEX('ae718e')}, + bl_fish = {name = 'The Fish', defeated = false, order = 10, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=5}, boss = {min = 2, max = 10}, boss_colour = HEX('3e85bd')}, + bl_club = {name = 'The Club', defeated = false, order = 9, dollars = 5, mult = 2, vars = {}, debuff = {suit = 'Clubs'}, pos = {x=0, y=4}, boss = {min = 1, max = 10}, boss_colour = HEX('b9cb92')}, + bl_manacle = {name = 'The Manacle', defeated = false, order = 15, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=8}, boss = {min = 1, max = 10}, boss_colour = HEX('575757')}, + bl_tooth = {name = 'The Tooth', defeated = false, order = 23, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=22}, boss = {min = 3, max = 10}, boss_colour = HEX('b52d2d')}, + bl_wall = {name = 'The Wall', defeated = false, order = 6, dollars = 5, mult = 4, vars = {}, debuff = {}, pos = {x=0, y=9}, boss = {min = 2, max = 10}, boss_colour = HEX('8a59a5')}, + bl_house = {name = 'The House', defeated = false, order = 5, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=3}, boss ={min = 2, max = 10}, boss_colour = HEX('5186a8')}, + bl_mark = {name = 'The Mark', defeated = false, order = 25, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=23}, boss = {min = 2, max = 10}, boss_colour = HEX('6a3847')}, + + bl_final_bell = {name = 'Cerulean Bell',defeated = false, order = 30, dollars = 8, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=26}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('009cfd')}, + bl_wheel = {name = 'The Wheel', defeated = false, order = 7, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=10}, boss = {min = 2, max = 10}, boss_colour = HEX('50bf7c')}, + bl_arm = {name = 'The Arm', defeated = false, order = 8, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=11}, boss = {min = 2, max = 10}, boss_colour = HEX('6865f3')}, + bl_psychic = {name = 'The Psychic', defeated = false, order = 11, dollars = 5, mult = 2, vars = {}, debuff = {h_size_ge = 5}, pos = {x=0, y=12}, boss = {min = 1, max = 10}, boss_colour = HEX('efc03c')}, + bl_goad = {name = 'The Goad', defeated = false, order = 12, dollars = 5, mult = 2, vars = {}, debuff = {suit = 'Spades'}, pos = {x=0, y=13}, boss = {min = 1, max = 10}, boss_colour = HEX('b95c96')}, + bl_water = {name = 'The Water', defeated = false, order = 13, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=14}, boss = {min = 2, max = 10}, boss_colour = HEX('c6e0eb')}, + bl_eye = {name = 'The Eye', defeated = false, order = 16, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=17}, boss = {min = 3, max = 10}, boss_colour = HEX('4b71e4')}, + bl_plant = {name = 'The Plant', defeated = false, order = 18, dollars = 5, mult = 2, vars = {}, debuff = {is_face = 'face'}, pos = {x=0, y=19}, boss = {min = 4, max = 10}, boss_colour = HEX('709284')}, + bl_needle = {name = 'The Needle', defeated = false, order = 21, dollars = 5, mult = 1, vars = {}, debuff = {}, pos = {x=0, y=20}, boss = {min = 2, max = 10}, boss_colour = HEX('5c6e31')}, + bl_head = {name = 'The Head', defeated = false, order = 22, dollars = 5, mult = 2, vars = {}, debuff = {suit = 'Hearts'}, pos = {x=0, y=21}, boss = {min = 1, max = 10}, boss_colour = HEX('ac9db4')}, + bl_final_leaf = {name = 'Verdant Leaf', defeated = false, order = 27, dollars = 8, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=28}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('56a786')}, + bl_final_vessel = {name = 'Violet Vessel',defeated = false, order = 28, dollars = 8, mult = 6, vars = {}, debuff = {}, pos = {x=0, y=29}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('8a71e1')}, + bl_window = {name = 'The Window', defeated = false, order = 14, dollars = 5, mult = 2, vars = {}, debuff = {suit = 'Diamonds'}, pos = {x=0, y=6}, boss = {min = 1, max = 10}, boss_colour = HEX('a9a295')}, + bl_serpent = {name = 'The Serpent', defeated = false, order = 19, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=15}, boss = {min = 5, max = 10}, boss_colour = HEX('439a4f')}, + bl_pillar = {name = 'The Pillar', defeated = false, order = 20, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=16}, boss = {min = 1, max = 10}, boss_colour = HEX('7e6752')}, + bl_flint = {name = 'The Flint', defeated = false, order = 24, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=24}, boss = {min = 2, max = 10}, boss_colour = HEX('e56a2f')}, + bl_final_acorn = {name = 'Amber Acorn', defeated = false, order = 26, dollars = 8, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=27}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('fda200')}, + bl_final_heart = {name = 'Crimson Heart',defeated = false, order = 29, dollars = 8, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=25}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('ac3232')}, + + } + self.b_undiscovered = {name = 'Undiscovered', debuff_text = 'Defeat this blind to discover', pos = {x=0,y=30}} + + self.P_CARDS = { + H_2={name = "2 of Hearts",value = '2', suit = 'Hearts', pos = {x=0,y=0}}, + H_3={name = "3 of Hearts",value = '3', suit = 'Hearts', pos = {x=1,y=0}}, + H_4={name = "4 of Hearts",value = '4', suit = 'Hearts', pos = {x=2,y=0}}, + H_5={name = "5 of Hearts",value = '5', suit = 'Hearts', pos = {x=3,y=0}}, + H_6={name = "6 of Hearts",value = '6', suit = 'Hearts', pos = {x=4,y=0}}, + H_7={name = "7 of Hearts",value = '7', suit = 'Hearts', pos = {x=5,y=0}}, + H_8={name = "8 of Hearts",value = '8', suit = 'Hearts', pos = {x=6,y=0}}, + H_9={name = "9 of Hearts",value = '9', suit = 'Hearts', pos = {x=7,y=0}}, + H_T={name = "10 of Hearts",value = '10', suit = 'Hearts', pos = {x=8,y=0}}, + H_J={name = "Jack of Hearts",value = 'Jack', suit = 'Hearts', pos = {x=9,y=0}}, + H_Q={name = "Queen of Hearts",value = 'Queen', suit = 'Hearts', pos = {x=10,y=0}}, + H_K={name = "King of Hearts",value = 'King', suit = 'Hearts', pos = {x=11,y=0}}, + H_A={name = "Ace of Hearts",value = 'Ace', suit = 'Hearts', pos = {x=12,y=0}}, + C_2={name = "2 of Clubs",value = '2', suit = 'Clubs', pos = {x=0,y=1}}, + C_3={name = "3 of Clubs",value = '3', suit = 'Clubs', pos = {x=1,y=1}}, + C_4={name = "4 of Clubs",value = '4', suit = 'Clubs', pos = {x=2,y=1}}, + C_5={name = "5 of Clubs",value = '5', suit = 'Clubs', pos = {x=3,y=1}}, + C_6={name = "6 of Clubs",value = '6', suit = 'Clubs', pos = {x=4,y=1}}, + C_7={name = "7 of Clubs",value = '7', suit = 'Clubs', pos = {x=5,y=1}}, + C_8={name = "8 of Clubs",value = '8', suit = 'Clubs', pos = {x=6,y=1}}, + C_9={name = "9 of Clubs",value = '9', suit = 'Clubs', pos = {x=7,y=1}}, + C_T={name = "10 of Clubs",value = '10', suit = 'Clubs', pos = {x=8,y=1}}, + C_J={name = "Jack of Clubs",value = 'Jack', suit = 'Clubs', pos = {x=9,y=1}}, + C_Q={name = "Queen of Clubs",value = 'Queen', suit = 'Clubs', pos = {x=10,y=1}}, + C_K={name = "King of Clubs",value = 'King', suit = 'Clubs', pos = {x=11,y=1}}, + C_A={name = "Ace of Clubs",value = 'Ace', suit = 'Clubs', pos = {x=12,y=1}}, + D_2={name = "2 of Diamonds",value = '2', suit = 'Diamonds', pos = {x=0,y=2}}, + D_3={name = "3 of Diamonds",value = '3', suit = 'Diamonds', pos = {x=1,y=2}}, + D_4={name = "4 of Diamonds",value = '4', suit = 'Diamonds', pos = {x=2,y=2}}, + D_5={name = "5 of Diamonds",value = '5', suit = 'Diamonds', pos = {x=3,y=2}}, + D_6={name = "6 of Diamonds",value = '6', suit = 'Diamonds', pos = {x=4,y=2}}, + D_7={name = "7 of Diamonds",value = '7', suit = 'Diamonds', pos = {x=5,y=2}}, + D_8={name = "8 of Diamonds",value = '8', suit = 'Diamonds', pos = {x=6,y=2}}, + D_9={name = "9 of Diamonds",value = '9', suit = 'Diamonds', pos = {x=7,y=2}}, + D_T={name = "10 of Diamonds",value = '10', suit = 'Diamonds', pos = {x=8,y=2}}, + D_J={name = "Jack of Diamonds",value = 'Jack', suit = 'Diamonds', pos = {x=9,y=2}}, + D_Q={name = "Queen of Diamonds",value = 'Queen', suit = 'Diamonds', pos = {x=10,y=2}}, + D_K={name = "King of Diamonds",value = 'King', suit = 'Diamonds', pos = {x=11,y=2}}, + D_A={name = "Ace of Diamonds",value = 'Ace', suit = 'Diamonds', pos = {x=12,y=2}}, + S_2={name = "2 of Spades",value = '2', suit = 'Spades', pos = {x=0,y=3}}, + S_3={name = "3 of Spades",value = '3', suit = 'Spades', pos = {x=1,y=3}}, + S_4={name = "4 of Spades",value = '4', suit = 'Spades', pos = {x=2,y=3}}, + S_5={name = "5 of Spades",value = '5', suit = 'Spades', pos = {x=3,y=3}}, + S_6={name = "6 of Spades",value = '6', suit = 'Spades', pos = {x=4,y=3}}, + S_7={name = "7 of Spades",value = '7', suit = 'Spades', pos = {x=5,y=3}}, + S_8={name = "8 of Spades",value = '8', suit = 'Spades', pos = {x=6,y=3}}, + S_9={name = "9 of Spades",value = '9', suit = 'Spades', pos = {x=7,y=3}}, + S_T={name = "10 of Spades",value = '10', suit = 'Spades', pos = {x=8,y=3}}, + S_J={name = "Jack of Spades",value = 'Jack', suit = 'Spades', pos = {x=9,y=3}}, + S_Q={name = "Queen of Spades",value = 'Queen', suit = 'Spades', pos = {x=10,y=3}}, + S_K={name = "King of Spades",value = 'King', suit = 'Spades', pos = {x=11,y=3}}, + S_A={name = "Ace of Spades",value = 'Ace', suit = 'Spades', pos = {x=12,y=3}}, + } + + self.j_locked = {unlocked = false, max = 1, name = "Locked", pos = {x=8,y=9}, set = "Joker", cost_mult = 1.0,config = {}} + self.v_locked = {unlocked = false, max = 1, name = "Locked", pos = {x=8,y=3}, set = "Voucher", cost_mult = 1.0,config = {}} + self.c_locked = {unlocked = false, max = 1, name = "Locked", pos = {x=4,y=2}, set = "Tarot", cost_mult = 1.0,config = {}} + self.j_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=9,y=9}, set = "Joker", cost_mult = 1.0,config = {}} + self.t_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=6,y=2}, set = "Tarot", cost_mult = 1.0,config = {}} + self.p_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=7,y=2}, set = "Planet", cost_mult = 1.0,config = {}} + self.s_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=5,y=2}, set = "Spectral", cost_mult = 1.0,config = {}} + self.v_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=8,y=2}, set = "Voucher", cost_mult = 1.0,config = {}} + self.booster_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=0,y=5}, set = "Booster", cost_mult = 1.0,config = {}} + + self.P_CENTERS = { + c_base={max = 500, freq = 1, line = 'base', name = "Default Base", pos = {x=1,y=0}, set = "Default", label = 'Base Card', effect = "Base", cost_mult = 1.0, config = {}}, + + --Jokers + j_joker= {order = 1, unlocked = true, start_alerted = true, discovered = true, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 2, name = "Joker", pos = {x=0,y=0}, set = "Joker", effect = "Mult", cost_mult = 1.0, config = {mult = 4}}, + j_greedy_joker= {order = 2, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Greedy Joker", pos = {x=6,y=1}, set = "Joker", effect = "Suit Mult", cost_mult = 1.0, config = {extra = {s_mult = 3, suit = 'Diamonds'}}}, + j_lusty_joker= {order = 3, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Lusty Joker", pos = {x=7,y=1}, set = "Joker", effect = "Suit Mult", cost_mult = 1.0, config = {extra = {s_mult = 3, suit = 'Hearts'}}}, + j_wrathful_joker= {order = 4, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Wrathful Joker", pos = {x=8,y=1}, set = "Joker", effect = "Suit Mult", cost_mult = 1.0, config = {extra = {s_mult = 3, suit = 'Spades'}}}, + j_gluttenous_joker= {order = 5, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Gluttonous Joker", pos = {x=9,y=1}, set = "Joker", effect = "Suit Mult", cost_mult = 1.0, config = {extra = {s_mult = 3, suit = 'Clubs'}}}, + j_jolly= {order = 6, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 3, name = "Jolly Joker", pos = {x=2,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 8, type = 'Pair'}}, + j_zany= {order = 7, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Zany Joker", pos = {x=3,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 12, type = 'Three of a Kind'}}, + j_mad= {order = 8, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Mad Joker", pos = {x=4,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 10, type = 'Two Pair'}}, + j_crazy= {order = 9, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Crazy Joker", pos = {x=5,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 12, type = 'Straight'}}, + j_droll= {order = 10, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Droll Joker", pos = {x=6,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 10, type = 'Flush'}}, + j_sly= {order = 11, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 3, name = "Sly Joker",set = "Joker", config = {t_chips = 50, type = 'Pair'}, pos = {x=0,y=14}}, + j_wily= {order = 12, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Wily Joker",set = "Joker", config = {t_chips = 100, type = 'Three of a Kind'}, pos = {x=1,y=14}}, + j_clever= {order = 13, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Clever Joker",set = "Joker", config = {t_chips = 80, type = 'Two Pair'}, pos = {x=2,y=14}}, + j_devious= {order = 14, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Devious Joker",set = "Joker", config = {t_chips = 100, type = 'Straight'}, pos = {x=3,y=14}}, + j_crafty= {order = 15, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Crafty Joker",set = "Joker", config = {t_chips = 80, type = 'Flush'}, pos = {x=4,y=14}}, + + j_half= {order = 16, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Half Joker", pos = {x=7,y=0}, set = "Joker", effect = "Hand Size Mult", cost_mult = 1.0, config = {extra = {mult = 20, size = 3}}}, + j_stencil= {order = 17, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 8, name = "Joker Stencil", pos = {x=2,y=5}, set = "Joker", effect = "Hand Size Mult", cost_mult = 1.0, config = {}}, + j_four_fingers= {order = 18, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Four Fingers", pos = {x=6,y=6}, set = "Joker", effect = "", config = {}}, + j_mime= {order = 19, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Mime", pos = {x=4,y=1}, set = "Joker", effect = "Hand card double", cost_mult = 1.0, config = {extra = 1}}, + j_credit_card= {order = 20, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 1, name = "Credit Card", pos = {x=5,y=1}, set = "Joker", effect = "Credit", cost_mult = 1.0, config = {extra = 20}}, + j_ceremonial= {order = 21, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Ceremonial Dagger", pos = {x=5,y=5}, set = "Joker", effect = "", config = {mult = 0}}, + j_banner= {order = 22, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Banner", pos = {x=1,y=2}, set = "Joker", effect = "Discard Chips", cost_mult = 1.0, config = {extra = 30}}, + j_mystic_summit= {order = 23, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Mystic Summit", pos = {x=2,y=2}, set = "Joker", effect = "No Discard Mult", cost_mult = 1.0, config = {extra = {mult = 15, d_remaining = 0}}}, + j_marble= {order = 24, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Marble Joker", pos = {x=3,y=2}, set = "Joker", effect = "Stone card hands", cost_mult = 1.0, config = {extra = 1}}, + j_loyalty_card= {order = 25, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Loyalty Card", pos = {x=4,y=2}, set = "Joker", effect = "1 in 10 mult", cost_mult = 1.0, config = {extra = {Xmult = 4, every = 5, remaining = "5 remaining"}}}, + j_8_ball= {order = 26, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "8 Ball", pos = {x=0,y=5}, set = "Joker", effect = "Spawn Tarot", cost_mult = 1.0, config = {extra=4}}, + j_misprint= {order = 27, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Misprint", pos = {x=6,y=2}, set = "Joker", effect = "Random Mult", cost_mult = 1.0, config = {extra = {max = 23, min = 0}}}, + j_dusk= {order = 28, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Dusk", pos = {x=4,y=7}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_raised_fist= {order = 29, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Raised Fist", pos = {x=8,y=2}, set = "Joker", effect = "Socialized Mult", cost_mult = 1.0, config = {}}, + j_chaos= {order = 30, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Chaos the Clown", pos = {x=1,y=0}, set = "Joker", effect = "Bonus Rerolls", cost_mult = 1.0, config = {extra = 1}}, + + j_fibonacci= {order = 31, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 8, name = "Fibonacci", pos = {x=1,y=5}, set = "Joker", effect = "Card Mult", cost_mult = 1.0, config = {extra = 8}}, + j_steel_joker= {order = 32, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Steel Joker", pos = {x=7,y=2}, set = "Joker", effect = "Steel Card Buff", cost_mult = 1.0, config = {extra = 0.2}, enhancement_gate = 'm_steel'}, + j_scary_face= {order = 33, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Scary Face", pos = {x=2,y=3}, set = "Joker", effect = "Scary Face Cards", cost_mult = 1.0, config = {extra = 30}}, + j_abstract= {order = 34, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Abstract Joker", pos = {x=3,y=3}, set = "Joker", effect = "Joker Mult", cost_mult = 1.0, config = {extra = 3}}, + j_delayed_grat= {order = 35, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Delayed Gratification", pos = {x=4,y=3}, set = "Joker", effect = "Discard dollars", cost_mult = 1.0, config = {extra = 2}}, + j_hack= {order = 36, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Hack", pos = {x=5,y=2}, set = "Joker", effect = "Low Card double", cost_mult = 1.0, config = {extra = 1}}, + j_pareidolia= {order = 37, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Pareidolia", pos = {x=6,y=3}, set = "Joker", effect = "All face cards", cost_mult = 1.0, config = {}}, + j_gros_michel= {order = 38, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, rarity = 1, cost = 5, name = "Gros Michel", pos = {x=7,y=6}, set = "Joker", effect = "", config = {extra = {odds = 6, mult = 15}}, no_pool_flag = 'gros_michel_extinct'}, + j_even_steven= {order = 39, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Even Steven", pos = {x=8,y=3}, set = "Joker", effect = "Even Card Buff", cost_mult = 1.0, config = {extra = 4}}, + j_odd_todd= {order = 40, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Odd Todd", pos = {x=9,y=3}, set = "Joker", effect = "Odd Card Buff", cost_mult = 1.0, config = {extra = 31}}, + j_scholar= {order = 41, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Scholar", pos = {x=0,y=4}, set = "Joker", effect = "Ace Buff", cost_mult = 1.0, config = {extra = {mult = 4, chips = 20}}}, + j_business= {order = 42, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Business Card", pos = {x=1,y=4}, set = "Joker", effect = "Face Card dollar Chance", cost_mult = 1.0, config = {extra = 2}}, + j_supernova= {order = 43, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Supernova", pos = {x=2,y=4}, set = "Joker", effect = "Hand played mult", cost_mult = 1.0, config = {extra = 1}}, + j_ride_the_bus= {order = 44, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 1, cost = 6, name = "Ride the Bus", pos = {x=1,y=6}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = 'discard_custom'}}, + j_space= {order = 45, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Space Joker", pos = {x=3,y=5}, set = "Joker", effect = "Upgrade Hand chance", cost_mult = 1.0, config = {extra = 4}}, + + j_egg= {order = 46, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'Egg', pos = {x = 0, y = 10}, set = 'Joker', config = {extra = 3}}, + j_burglar= {order = 47, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = 'Burglar', pos = {x = 1, y = 10}, set = 'Joker', config = {extra = 3}}, + j_blackboard= {order = 48, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = 'Blackboard', pos = {x = 2, y = 10}, set = 'Joker', config = {extra = 3}}, + j_runner= {order = 49, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 1, cost = 5, name = 'Runner', pos = {x = 3, y = 10}, set = 'Joker', config = {extra = {chips = 0, chip_mod = 15}}}, + j_ice_cream= {order = 50, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, rarity = 1, cost = 5, name = 'Ice Cream', pos = {x = 4, y = 10}, set = 'Joker', config = {extra = {chips = 100, chip_mod = 5}}}, + j_dna= {order = 51, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = 'DNA', pos = {x = 5, y = 10}, set = 'Joker', config = {}}, + j_splash= {order = 52, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 3, name = 'Splash', pos = {x = 6, y = 10}, set = 'Joker', config = {}}, + j_blue_joker= {order = 53, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = 'Blue Joker', pos = {x = 7, y = 10}, set = 'Joker', config = {extra = 2}}, + j_sixth_sense= {order = 54, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = 'Sixth Sense', pos = {x = 8, y = 10}, set = 'Joker', config = {}}, + j_constellation= {order = 55, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = 'Constellation', pos = {x = 9, y = 10}, set = 'Joker', config = {extra = 0.1, Xmult = 1}}, + j_hiker= {order = 56, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = 'Hiker', pos = {x = 0, y = 11}, set = 'Joker', config = {extra = 5}}, + j_faceless= {order = 57, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'Faceless Joker', pos = {x = 1, y = 11}, set = 'Joker', config = {extra = {dollars = 5, faces = 3}}}, + j_green_joker= {order = 58, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 1, cost = 4, name = 'Green Joker', pos = {x = 2, y = 11}, set = 'Joker', config = {extra = {hand_add = 1, discard_sub = 1}}}, + j_superposition= {order = 59, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'Superposition', pos = {x = 3, y = 11}, set = 'Joker', config = {}}, + j_todo_list= {order = 60, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'To Do List', pos = {x = 4, y = 11}, set = 'Joker', config = {extra = {dollars = 4, poker_hand = 'High Card'}}}, + + j_cavendish= {order = 61, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, rarity = 1, cost = 4, name = "Cavendish", pos = {x=5,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = {odds = 1000, Xmult = 3}}, yes_pool_flag = 'gros_michel_extinct'}, + j_card_sharp= {order = 62, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Card Sharp", pos = {x=6,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = {Xmult = 3}}}, + j_red_card= {order = 63, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 1, cost = 5, name = "Red Card", pos = {x=7,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = 3}}, + j_madness= {order = 64, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 7, name = "Madness", pos = {x=8,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = 0.5}}, + j_square= {order = 65, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 1, cost = 4, name = "Square Joker", pos = {x=9,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = {chips = 0, chip_mod = 4}}}, + j_seance= {order = 66, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Seance", pos = {x=0,y=12}, set = "Joker", cost_mult = 1.0, config = {extra = {poker_hand = 'Straight Flush'}}}, + j_riff_raff= {order = 67, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 6, name = "Riff-raff", pos = {x=1,y=12}, set = "Joker", cost_mult = 1.0, config = {extra = 2}}, + j_vampire= {order = 68, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 7, name = "Vampire",set = "Joker", config = {extra = 0.1, Xmult = 1}, pos = {x=2,y=12}}, + j_shortcut= {order = 69, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Shortcut",set = "Joker", config = {}, pos = {x=3,y=12}}, + j_hologram= {order = 70, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 7, name = "Hologram",set = "Joker", config = {extra = 0.25, Xmult = 1}, pos = {x=4,y=12}, soul_pos = {x=2, y=9},}, + j_vagabond= {order = 71, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Vagabond",set = "Joker", config = {extra = 4}, pos = {x=5,y=12}}, + j_baron= {order = 72, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Baron",set = "Joker", config = {extra = 1.5}, pos = {x=6,y=12}}, + j_cloud_9= {order = 73, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Cloud 9",set = "Joker", config = {extra = 1}, pos = {x=7,y=12}}, + j_rocket= {order = 74, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Rocket",set = "Joker", config = {extra = {dollars = 1, increase = 2}}, pos = {x=8,y=12}}, + j_obelisk= {order = 75, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 3, cost = 8, name = "Obelisk",set = "Joker", config = {extra = 0.2, Xmult = 1}, pos = {x=9,y=12}}, + + j_midas_mask= {order = 76, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Midas Mask",set = "Joker", config = {}, pos = {x=0,y=13}}, + j_luchador= {order = 77, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, rarity = 2, cost = 5, name = "Luchador",set = "Joker", config = {}, pos = {x=1,y=13}}, + j_photograph= {order = 78, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Photograph",set = "Joker", config = {extra = 2}, pos = {x=2,y=13}}, + j_gift= {order = 79, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Gift Card",set = "Joker", config = {extra = 1}, pos = {x=3,y=13}}, + j_turtle_bean= {order = 80, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = false, rarity = 2, cost = 6, name = "Turtle Bean",set = "Joker", config = {extra = {h_size = 5, h_mod = 1}}, pos = {x=4,y=13}}, + j_erosion= {order = 81, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Erosion",set = "Joker", config = {extra = 4}, pos = {x=5,y=13}}, + j_reserved_parking= {order = 82, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 6, name = "Reserved Parking",set = "Joker", config = {extra = {odds = 2, dollars = 1}}, pos = {x=6,y=13}}, + j_mail= {order = 83, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Mail-In Rebate",set = "Joker", config = {extra = 5}, pos = {x=7,y=13}}, + j_to_the_moon= {order = 84, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "To the Moon",set = "Joker", config = {extra = 1}, pos = {x=8,y=13}}, + j_hallucination= {order = 85, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Hallucination",set = "Joker", config = {extra = 2}, pos = {x=9,y=13}}, + j_fortune_teller= {order = 86, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 6, name = "Fortune Teller", pos = {x=7,y=5}, set = "Joker", effect = "", config = {extra = 1}}, + j_juggler= {order = 87, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Juggler", pos = {x=0,y=1}, set = "Joker", effect = "Hand Size", cost_mult = 1.0, config = {h_size = 1}}, + j_drunkard= {order = 88, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Drunkard", pos = {x=1,y=1}, set = "Joker", effect = "Discard Size", cost_mult = 1.0, config = {d_size = 1}}, + j_stone= {order = 89, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Stone Joker", pos = {x=9,y=0}, set = "Joker", effect = "Stone Card Buff", cost_mult = 1.0, config = {extra = 25}, enhancement_gate = 'm_stone'}, + j_golden= {order = 90, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 6, name = "Golden Joker", pos = {x=9,y=2}, set = "Joker", effect = "Bonus dollars", cost_mult = 1.0, config = {extra = 4}}, + + j_lucky_cat= {order = 91, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Lucky Cat",set = "Joker", config = {Xmult = 1, extra = 0.25}, pos = {x=5,y=14}, enhancement_gate = 'm_lucky'}, + j_baseball= {order = 92, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Baseball Card",set = "Joker", config = {extra = 1.5}, pos = {x=6,y=14}}, + j_bull= {order = 93, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Bull",set = "Joker", config = {extra = 2}, pos = {x=7,y=14}}, + j_diet_cola= {order = 94, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, rarity = 2, cost = 6, name = "Diet Cola",set = "Joker", config = {}, pos = {x=8,y=14}}, + j_trading= {order = 95, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Trading Card",set = "Joker", config = {extra = 3}, pos = {x=9,y=14}}, + j_flash= {order = 96, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 5, name = "Flash Card",set = "Joker", config = {extra = 2, mult = 0}, pos = {x=0,y=15}}, + j_popcorn= {order = 97, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, rarity = 1, cost = 5, name = "Popcorn",set = "Joker", config = {mult = 20, extra = 4}, pos = {x=1,y=15}}, + j_trousers= {order = 98, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Spare Trousers",set = "Joker", config = {extra = 2}, pos = {x=4,y=15}}, + j_ancient= {order = 99, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Ancient Joker",set = "Joker", config = {extra = 1.5}, pos = {x=7,y=15}}, + j_ramen= {order = 100, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, rarity = 2, cost = 6, name = "Ramen",set = "Joker", config = {Xmult = 2, extra = 0.01}, pos = {x=2,y=15}}, + j_walkie_talkie= {order = 101, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Walkie Talkie",set = "Joker", config = {extra = {chips = 10, mult = 4}}, pos = {x=8,y=15}}, + j_selzer= {order = 102, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, rarity = 2, cost = 6, name = "Seltzer",set = "Joker", config = {extra = 10}, pos = {x=3,y=15}}, + j_castle= {order = 103, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Castle",set = "Joker", config = {extra = {chips = 0, chip_mod = 3}}, pos = {x=9,y=15}}, + j_smiley= {order = 104, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Smiley Face",set = "Joker", config = {extra = 5}, pos = {x=6,y=15}}, + j_campfire= {order = 105, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 9, name = "Campfire",set = "Joker", config = {extra = 0.25}, pos = {x=5,y=15}}, + + j_ticket= {order = 106, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Golden Ticket", pos = {x=5,y=3}, set = "Joker", effect = "dollars for Gold cards", cost_mult = 1.0, config = {extra = 4},unlock_condition = {type = 'hand_contents', extra = 'Gold'}, enhancement_gate = 'm_gold'}, + j_mr_bones= {order = 107, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = false, rarity = 2, cost = 5, name = "Mr. Bones", pos = {x=3,y=4}, set = "Joker", effect = "Prevent Death", cost_mult = 1.0, config = {},unlock_condition = {type = 'c_losses', extra = 5}}, + j_acrobat= {order = 108, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Acrobat", pos = {x=2,y=1}, set = "Joker", effect = "Shop size", cost_mult = 1.0, config = {extra = 3},unlock_condition = {type = 'c_hands_played', extra = 200}}, + j_sock_and_buskin= {order = 109, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Sock and Buskin", pos = {x=3,y=1}, set = "Joker", effect = "Face card double", cost_mult = 1.0, config = {extra = 1},unlock_condition = {type = 'c_face_cards_played', extra = 300}}, + j_swashbuckler= {order = 110, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Swashbuckler", pos = {x=9,y=5}, set = "Joker", effect = "Set Mult", cost_mult = 1.0, config = {mult = 1},unlock_condition = {type = 'c_jokers_sold', extra = 20}}, + j_troubadour= {order = 111, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Troubadour", pos = {x=0,y=2}, set = "Joker", effect = "Hand Size, Plays", cost_mult = 1.0, config = {extra = {h_size = 2, h_plays = -1}}, unlock_condition = {type = 'round_win', extra = 5}}, + j_certificate= {order = 112, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Certificate", pos = {x=8,y=8}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'double_gold'}}, + j_smeared= {order = 113, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Smeared Joker", pos = {x=4,y=6}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'modify_deck', extra = {count = 3, enhancement = 'Wild Card', e_key = 'm_wild'}}}, + j_throwback= {order = 114, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Throwback", pos = {x=5,y=7}, set = "Joker", effect = "", config = {extra = 0.25}, unlock_condition = {type = 'continue_game'}}, + j_hanging_chad= {order = 115, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Hanging Chad", pos = {x=9,y=6}, set = "Joker", effect = "", config = {extra = 2}, unlock_condition = {type = 'round_win', extra = 'High Card'}}, + j_rough_gem= {order = 116, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Rough Gem", pos = {x=9,y=7}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Diamonds'}}}, + j_bloodstone= {order = 117, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Bloodstone", pos = {x=0,y=8}, set = "Joker", effect = "", config = {extra = {odds = 2, Xmult = 1.5}}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Hearts'}}}, + j_arrowhead= {order = 118, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Arrowhead", pos = {x=1,y=8}, set = "Joker", effect = "", config = {extra = 50}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Spades'}}}, + j_onyx_agate= {order = 119, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Onyx Agate", pos = {x=2,y=8}, set = "Joker", effect = "", config = {extra = 7}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Clubs'}}}, + j_glass= {order = 120, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Glass Joker", pos = {x=1,y=3}, set = "Joker", effect = "Glass Card", cost_mult = 1.0, config = {extra = 0.75, Xmult = 1}, unlock_condition = {type = 'modify_deck', extra = {count = 5, enhancement = 'Glass Card', e_key = 'm_glass'}}, enhancement_gate = 'm_glass'}, + + j_ring_master= {order = 121, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Showman", pos = {x=6,y=5}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'ante_up', ante = 4}}, + j_flower_pot= {order = 122, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Flower Pot", pos = {x=0,y=6}, set = "Joker", effect = "", config = {extra = 3}, unlock_condition = {type = 'ante_up', ante = 8}}, + j_blueprint= {order = 123, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 10,name = "Blueprint", pos = {x=0,y=3}, set = "Joker", effect = "Copycat", cost_mult = 1.0, config = {},unlock_condition = {type = 'win_custom'}}, + j_wee= {order = 124, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 3, cost = 8, name = "Wee Joker", pos = {x=0,y=0}, set = "Joker", effect = "", config = {extra = {chips = 0, chip_mod = 8}}, unlock_condition = {type = 'win', n_rounds = 18}}, + j_merry_andy= {order = 125, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Merry Andy", pos = {x=8,y=0}, set = "Joker", effect = "", cost_mult = 1.0, config = {d_size = 3, h_size = -1}, unlock_condition = {type = 'win', n_rounds = 12}}, + j_oops= {order = 126, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 4, name = "Oops! All 6s", pos = {x=5,y=6}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'chip_score', chips = 10000}}, + j_idol= {order = 127, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "The Idol", pos = {x=6,y=7}, set = "Joker", effect = "", config = {extra = 2}, unlock_condition = {type = 'chip_score', chips = 1000000}}, + j_seeing_double= {order = 128, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Seeing Double", pos = {x=4,y=4}, set = "Joker", effect = "X1.5 Mult club 7", cost_mult = 1.0, config = {extra = 2},unlock_condition = {type = 'hand_contents', extra = 'four 7 of Clubs'}}, + j_matador= {order = 129, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Matador", pos = {x=4,y=5}, set = "Joker", effect = "", config = {extra = 8}, unlock_condition = {type = 'round_win'}}, + j_hit_the_road= {order = 130, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Hit the Road", pos = {x=8,y=5}, set = "Joker", effect = "Jack Discard Effect", cost_mult = 1.0, config = {extra = 0.5}, unlock_condition = {type = 'discard_custom'}}, + j_duo= {order = 131, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Duo", pos = {x=5,y=4}, set = "Joker", effect = "X1.5 Mult", cost_mult = 1.0, config = {Xmult = 2, type = 'Pair'}, unlock_condition = {type = 'win_no_hand', extra = 'Pair'}}, + j_trio= {order = 132, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Trio", pos = {x=6,y=4}, set = "Joker", effect = "X2 Mult", cost_mult = 1.0, config = {Xmult = 3, type = 'Three of a Kind'}, unlock_condition = {type = 'win_no_hand', extra = 'Three of a Kind'}}, + j_family= {order = 133, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Family", pos = {x=7,y=4}, set = "Joker", effect = "X3 Mult", cost_mult = 1.0, config = {Xmult = 4, type = 'Four of a Kind'}, unlock_condition = {type = 'win_no_hand', extra = 'Four of a Kind'}}, + j_order= {order = 134, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Order", pos = {x=8,y=4}, set = "Joker", effect = "X3 Mult", cost_mult = 1.0, config = {Xmult = 3, type = 'Straight'}, unlock_condition = {type = 'win_no_hand', extra = 'Straight'}}, + j_tribe= {order = 135, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Tribe", pos = {x=9,y=4}, set = "Joker", effect = "X3 Mult", cost_mult = 1.0, config = {Xmult = 2, type = 'Flush'}, unlock_condition = {type = 'win_no_hand', extra = 'Flush'}}, + + j_stuntman= {order = 136, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 7, name = "Stuntman", pos = {x=8,y=6}, set = "Joker", effect = "", config = {extra = {h_size = 2, chip_mod = 250}}, unlock_condition = {type = 'chip_score', chips = 100000000}}, + j_invisible= {order = 137, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = false, rarity = 3, cost = 8, name = "Invisible Joker", pos = {x=1,y=7}, set = "Joker", effect = "", config = {extra = 2}, unlock_condition = {type = 'win_custom'}}, + j_brainstorm= {order = 138, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 10, name = "Brainstorm", pos = {x=7,y=7}, set = "Joker", effect = "Copycat", config = {}, unlock_condition = {type = 'discard_custom'}}, + j_satellite= {order = 139, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Satellite", pos = {x=8,y=7}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = 'money', extra = 400}}, + j_shoot_the_moon= {order = 140, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Shoot the Moon", pos = {x=2,y=6}, set = "Joker", effect = "", config = {extra = 13}, unlock_condition = {type = 'play_all_hearts'}}, + j_drivers_license= {order = 141, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 7, name = "Driver's License", pos = {x=0,y=7}, set = "Joker", effect = "", config = {extra = 3}, unlock_condition = {type = 'modify_deck', extra = {count = 16, tally = 'total'}}}, + j_cartomancer= {order = 142, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Cartomancer", pos = {x=7,y=3}, set = "Joker", effect = "Tarot Buff", cost_mult = 1.0, config = {}, unlock_condition = {type = 'discover_amount', tarot_count = 22}}, + j_astronomer= {order = 143, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 8, name = "Astronomer", pos = {x=2,y=7}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'discover_amount', planet_count = 12}}, + j_burnt= {order = 144, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Burnt Joker", pos = {x=3,y=7}, set = "Joker", effect = "", config = {h_size = 0, extra = 4}, unlock_condition = {type = 'c_cards_sold', extra = 50}}, + j_bootstraps= {order = 145, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Bootstraps", pos = {x=9,y=8}, set = "Joker", effect = "", config = {extra = {mult = 2, dollars = 5}}, unlock_condition = {type = 'modify_jokers', extra = {polychrome = true, count = 2}}}, + j_caino= {order = 146, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Caino", pos = {x=3,y=8}, soul_pos = {x=3, y=9}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_triboulet= {order = 147, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Triboulet", pos = {x=4,y=8}, soul_pos = {x=4, y=9}, set = "Joker", effect = "", config = {extra = 2}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_yorick= {order = 148, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Yorick", pos = {x=5,y=8}, soul_pos = {x=5, y=9}, set = "Joker", effect = "", config = {extra = {xmult = 1, discards = 23}}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_chicot= {order = 149, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Chicot", pos = {x=6,y=8}, soul_pos = {x=6, y=9}, set = "Joker", effect = "", config = {}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_perkeo= {order = 150, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Perkeo", pos = {x=7,y=8}, soul_pos = {x=7, y=9}, set = "Joker", effect = "", config = {}, unlock_condition = {type = '', extra = '', hidden = true}}, + + + + --All Consumeables + + --Tarots + c_fool= {order = 1, discovered = false, cost = 3, consumeable = true, name = "The Fool", pos = {x=0,y=0}, set = "Tarot", effect = "Disable Blind Effect", cost_mult = 1.0, config = {}}, + c_magician= {order = 2, discovered = false, cost = 3, consumeable = true, name = "The Magician", pos = {x=1,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_lucky', max_highlighted = 2}}, + c_high_priestess= {order = 3, discovered = false, cost = 3, consumeable = true, name = "The High Priestess", pos = {x=2,y=0}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {planets = 2}}, + c_empress= {order = 4, discovered = false, cost = 3, consumeable = true, name = "The Empress", pos = {x=3,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_mult', max_highlighted = 2}}, + c_emperor= {order = 5, discovered = false, cost = 3, consumeable = true, name = "The Emperor", pos = {x=4,y=0}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {tarots = 2}}, + c_heirophant= {order = 6, discovered = false, cost = 3, consumeable = true, name = "The Hierophant", pos = {x=5,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_bonus', max_highlighted = 2}}, + c_lovers= {order = 7, discovered = false, cost = 3, consumeable = true, name = "The Lovers", pos = {x=6,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_wild', max_highlighted = 1}}, + c_chariot= {order = 8, discovered = false, cost = 3, consumeable = true, name = "The Chariot", pos = {x=7,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_steel', max_highlighted = 1}}, + c_justice= {order = 9, discovered = false, cost = 3, consumeable = true, name = "Justice", pos = {x=8,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_glass', max_highlighted = 1}}, + c_hermit= {order = 10, discovered = false, cost = 3, consumeable = true, name = "The Hermit", pos = {x=9,y=0}, set = "Tarot", effect = "Dollar Doubler", cost_mult = 1.0, config = {extra = 20}}, + c_wheel_of_fortune= {order = 11, discovered = false, cost = 3, consumeable = true, name = "The Wheel of Fortune", pos = {x=0,y=1}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {extra = 4}}, + c_strength= {order = 12, discovered = false, cost = 3, consumeable = true, name = "Strength", pos = {x=1,y=1}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {mod_conv = 'up_rank', max_highlighted = 2}}, + c_hanged_man= {order = 13, discovered = false, cost = 3, consumeable = true, name = "The Hanged Man", pos = {x=2,y=1}, set = "Tarot", effect = "Card Removal", cost_mult = 1.0, config = {remove_card = true, max_highlighted = 2}}, + c_death= {order = 14, discovered = false, cost = 3, consumeable = true, name = "Death", pos = {x=3,y=1}, set = "Tarot", effect = "Card Conversion", cost_mult = 1.0, config = {mod_conv = 'card', max_highlighted = 2, min_highlighted = 2}}, + c_temperance= {order = 15, discovered = false, cost = 3, consumeable = true, name = "Temperance", pos = {x=4,y=1}, set = "Tarot", effect = "Joker Payout", cost_mult = 1.0, config = {extra = 50}}, + c_devil= {order = 16, discovered = false, cost = 3, consumeable = true, name = "The Devil", pos = {x=5,y=1}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_gold', max_highlighted = 1}}, + c_tower= {order = 17, discovered = false, cost = 3, consumeable = true, name = "The Tower", pos = {x=6,y=1}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_stone', max_highlighted = 1}}, + c_star= {order = 18, discovered = false, cost = 3, consumeable = true, name = "The Star", pos = {x=7,y=1}, set = "Tarot", effect = "Suit Conversion", cost_mult = 1.0, config = {suit_conv = 'Diamonds', max_highlighted = 3}}, + c_moon= {order = 19, discovered = false, cost = 3, consumeable = true, name = "The Moon", pos = {x=8,y=1}, set = "Tarot", effect = "Suit Conversion", cost_mult = 1.0, config = {suit_conv = 'Clubs', max_highlighted = 3}}, + c_sun= {order = 20, discovered = false, cost = 3, consumeable = true, name = "The Sun", pos = {x=9,y=1}, set = "Tarot", effect = "Suit Conversion", cost_mult = 1.0, config = {suit_conv = 'Hearts', max_highlighted = 3}}, + c_judgement= {order = 21, discovered = false, cost = 3, consumeable = true, name = "Judgement", pos = {x=0,y=2}, set = "Tarot", effect = "Random Joker", cost_mult = 1.0, config = {}}, + c_world= {order = 22, discovered = false, cost = 3, consumeable = true, name = "The World", pos = {x=1,y=2}, set = "Tarot", effect = "Suit Conversion", cost_mult = 1.0, config = {suit_conv = 'Spades', max_highlighted = 3}}, + + --Planets + c_mercury= {order = 1, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Mercury", pos = {x=0,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Pair'}}, + c_venus= {order = 2, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Venus", pos = {x=1,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Three of a Kind'}}, + c_earth= {order = 3, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Earth", pos = {x=2,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Full House'}}, + c_mars= {order = 4, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Mars", pos = {x=3,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Four of a Kind'}}, + c_jupiter= {order = 5, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Jupiter", pos = {x=4,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Flush'}}, + c_saturn= {order = 6, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Saturn", pos = {x=5,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Straight'}}, + c_uranus= {order = 7, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Uranus", pos = {x=6,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Two Pair'}}, + c_neptune= {order = 8, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Neptune", pos = {x=7,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Straight Flush'}}, + c_pluto= {order = 9, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Pluto", pos = {x=8,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'High Card'}}, + c_planet_x= {order = 10, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Planet X", pos = {x=9,y=2}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Five of a Kind', softlock = true}}, + c_ceres= {order = 11, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Ceres", pos = {x=8,y=2}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Flush House', softlock = true}}, + c_eris= {order = 12, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Eris", pos = {x=3,y=2}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Flush Five', softlock = true}}, + + --Spectral + c_familiar= {order = 1, discovered = false, cost = 4, consumeable = true, name = "Familiar", pos = {x=0,y=4}, set = "Spectral", config = {remove_card = true, extra = 3}}, + c_grim= {order = 2, discovered = false, cost = 4, consumeable = true, name = "Grim", pos = {x=1,y=4}, set = "Spectral", config = {remove_card = true, extra = 2}}, + c_incantation= {order = 3, discovered = false, cost = 4, consumeable = true, name = "Incantation", pos = {x=2,y=4}, set = "Spectral", config = {remove_card = true, extra = 4}}, + c_talisman= {order = 4, discovered = false, cost = 4, consumeable = true, name = "Talisman", pos = {x=3,y=4}, set = "Spectral", config = {extra = 'Gold', max_highlighted = 1}}, + c_aura= {order = 5, discovered = false, cost = 4, consumeable = true, name = "Aura", pos = {x=4,y=4}, set = "Spectral", config = {}}, + c_wraith= {order = 6, discovered = false, cost = 4, consumeable = true, name = "Wraith", pos = {x=5,y=4}, set = "Spectral", config = {}}, + c_sigil= {order = 7, discovered = false, cost = 4, consumeable = true, name = "Sigil", pos = {x=6,y=4}, set = "Spectral", config = {}}, + c_ouija= {order = 8, discovered = false, cost = 4, consumeable = true, name = "Ouija", pos = {x=7,y=4}, set = "Spectral", config = {}}, + c_ectoplasm= {order = 9, discovered = false, cost = 4, consumeable = true, name = "Ectoplasm", pos = {x=8,y=4}, set = "Spectral", config = {}}, + c_immolate= {order = 10, discovered = false, cost = 4, consumeable = true, name = "Immolate", pos = {x=9,y=4}, set = "Spectral", config = {remove_card = true, extra = {destroy = 5, dollars = 20}}}, + c_ankh= {order = 11, discovered = false, cost = 4, consumeable = true, name = "Ankh", pos = {x=0,y=5}, set = "Spectral", config = {extra = 2}}, + c_deja_vu= {order = 12, discovered = false, cost = 4, consumeable = true, name = "Deja Vu", pos = {x=1,y=5}, set = "Spectral", config = {extra = 'Red', max_highlighted = 1}}, + c_hex= {order = 13, discovered = false, cost = 4, consumeable = true, name = "Hex", pos = {x=2,y=5}, set = "Spectral", config = {extra = 2}}, + c_trance= {order = 14, discovered = false, cost = 4, consumeable = true, name = "Trance", pos = {x=3,y=5}, set = "Spectral", config = {extra = 'Blue', max_highlighted = 1}}, + c_medium= {order = 15, discovered = false, cost = 4, consumeable = true, name = "Medium", pos = {x=4,y=5}, set = "Spectral", config = {extra = 'Purple', max_highlighted = 1}}, + c_cryptid= {order = 16, discovered = false, cost = 4, consumeable = true, name = "Cryptid", pos = {x=5,y=5}, set = "Spectral", config = {extra = 2, max_highlighted = 1}}, + c_soul= {order = 17, discovered = false, cost = 4, consumeable = true, name = "The Soul", pos = {x=2,y=2}, set = "Spectral", effect = "Unlocker", config = {}, hidden = true}, + c_black_hole= {order = 18, discovered = false, cost = 4, consumeable = true, name = "Black Hole", pos = {x=9,y=3}, set = "Spectral", config = {}, hidden = true}, + + --Vouchers + + v_overstock_norm = {order = 1, discovered = false, unlocked = true , available = true, cost = 10, name = "Overstock", pos = {x=0,y=0}, set = "Voucher", config = {}}, + v_clearance_sale= {order = 3, discovered = false, unlocked = true , available = true, cost = 10, name = "Clearance Sale", pos = {x=3,y=0}, set = "Voucher", config = {extra = 25}}, + v_hone= {order = 5, discovered = false, unlocked = true , available = true, cost = 10, name = "Hone", pos = {x=4,y=0}, set = "Voucher", config = {extra = 2}}, + v_reroll_surplus= {order = 7, discovered = false, unlocked = true , available = true, cost = 10, name = "Reroll Surplus", pos = {x=0,y=2}, set = "Voucher", config = {extra = 2}}, + v_crystal_ball= {order = 9, discovered = false, unlocked = true , available = true, cost = 10, name = "Crystal Ball", pos = {x=2,y=2}, set = "Voucher", config = {extra = 3}}, + v_telescope= {order = 11, discovered = false, unlocked = true , available = true, cost = 10, name = "Telescope", pos = {x=3,y=2}, set = "Voucher", config = {extra = 3}}, + v_grabber= {order = 13, discovered = false, unlocked = true , available = true, cost = 10, name = "Grabber", pos = {x=5,y=0}, set = "Voucher", config = {extra = 1}}, + v_wasteful= {order = 15, discovered = false, unlocked = true , available = true, cost = 10, name = "Wasteful", pos = {x=6,y=0}, set = "Voucher", config = {extra = 1}}, + v_tarot_merchant= {order = 17, discovered = false, unlocked = true , available = true, cost = 10, name = "Tarot Merchant", pos = {x=1,y=0}, set = "Voucher", config = {extra = 9.6/4, extra_disp = 2}}, + v_planet_merchant= {order = 19, discovered = false, unlocked = true , available = true, cost = 10, name = "Planet Merchant", pos = {x=2,y=0}, set = "Voucher", config = {extra = 9.6/4, extra_disp = 2}}, + v_seed_money= {order = 21, discovered = false, unlocked = true , available = true, cost = 10, name = "Seed Money", pos = {x=1,y=2}, set = "Voucher", config = {extra = 50}}, + v_blank= {order = 23, discovered = false, unlocked = true , available = true, cost = 10, name = "Blank", pos = {x=7,y=0}, set = "Voucher", config = {extra = 5}}, + v_magic_trick= {order = 25, discovered = false, unlocked = true , available = true, cost = 10, name = "Magic Trick", pos = {x=4,y=2}, set = "Voucher", config = {extra = 4}}, + v_hieroglyph= {order = 27, discovered = false, unlocked = true , available = true, cost = 10, name = "Hieroglyph", pos = {x=5,y=2}, set = "Voucher", config = {extra = 1}}, + v_directors_cut= {order = 29, discovered = false, unlocked = true , available = true, cost = 10, name = "Director's Cut", pos = {x=6,y=2}, set = "Voucher", config = {extra = 10}}, + v_paint_brush= {order = 31, discovered = false, unlocked = true , available = true, cost = 10, name = "Paint Brush", pos = {x=7,y=2}, set = "Voucher", config = {extra = 1}}, + + v_overstock_plus= {order = 2, discovered = false, unlocked = false, available = true, cost = 10, name = "Overstock Plus", pos = {x=0,y=1}, set = "Voucher", config = {}, requires = {'v_overstock_norm'},unlock_condition = {type = 'c_shop_dollars_spent', extra = 2500}}, + v_liquidation= {order = 4, discovered = false, unlocked = false, available = true, cost = 10, name = "Liquidation", pos = {x=3,y=1}, set = "Voucher", config = {extra = 50}, requires = {'v_clearance_sale'},unlock_condition = {type = 'run_redeem', extra = 10}}, + v_glow_up= {order = 6, discovered = false, unlocked = false, available = true, cost = 10, name = "Glow Up", pos = {x=4,y=1}, set = "Voucher", config = {extra = 4}, requires = {'v_hone'},unlock_condition = {type = 'have_edition', extra = 5}}, + v_reroll_glut= {order = 8, discovered = false, unlocked = false, available = true, cost = 10, name = "Reroll Glut", pos = {x=0,y=3}, set = "Voucher", config = {extra = 2}, requires = {'v_reroll_surplus'},unlock_condition = {type = 'c_shop_rerolls', extra = 100}}, + v_omen_globe= {order = 10, discovered = false, unlocked = false, available = true, cost = 10, name = "Omen Globe", pos = {x=2,y=3}, set = "Voucher", config = {extra = 4}, requires = {'v_crystal_ball'},unlock_condition = {type = 'c_tarot_reading_used', extra = 25}}, + v_observatory= {order = 12, discovered = false, unlocked = false, available = true, cost = 10, name = "Observatory", pos = {x=3,y=3}, set = "Voucher", config = {extra = 1.5}, requires = {'v_telescope'},unlock_condition = {type = 'c_planetarium_used', extra = 25}}, + v_nacho_tong= {order = 14, discovered = false, unlocked = false, available = true, cost = 10, name = "Nacho Tong", pos = {x=5,y=1}, set = "Voucher", config = {extra = 1}, requires = {'v_grabber'},unlock_condition = {type = 'c_cards_played', extra = 2500}}, + v_recyclomancy= {order = 16, discovered = false, unlocked = false, available = true, cost = 10, name = "Recyclomancy", pos = {x=6,y=1}, set = "Voucher", config = {extra = 1}, requires = {'v_wasteful'},unlock_condition = {type = 'c_cards_discarded', extra = 2500}}, + v_tarot_tycoon= {order = 18, discovered = false, unlocked = false, available = true,cost = 10, name = "Tarot Tycoon", pos = {x=1,y=1}, set = "Voucher", config = {extra = 32/4, extra_disp = 4}, requires = {'v_tarot_merchant'},unlock_condition = {type = 'c_tarots_bought', extra = 50}}, + v_planet_tycoon= {order = 20, discovered = false, unlocked = false, available = true,cost = 10, name = "Planet Tycoon", pos = {x=2,y=1}, set = "Voucher", config = {extra = 32/4, extra_disp = 4}, requires = {'v_planet_merchant'},unlock_condition = {type = 'c_planets_bought', extra = 50}}, + v_money_tree= {order = 22, discovered = false, unlocked = false, available = true, cost = 10, name = "Money Tree", pos = {x=1,y=3}, set = "Voucher", config = {extra = 100}, requires = {'v_seed_money'},unlock_condition = {type = 'interest_streak', extra = 10}}, + v_antimatter= {order = 24, discovered = false, unlocked = false, available = true, cost = 10, name = "Antimatter", pos = {x=7,y=1}, set = "Voucher", config = {extra = 15}, requires = {'v_blank'},unlock_condition = {type = 'blank_redeems', extra = 10}}, + v_illusion= {order = 26, discovered = false, unlocked = false, available = true, cost = 10, name = "Illusion", pos = {x=4,y=3}, set = "Voucher", config = {extra = 4}, requires = {'v_magic_trick'},unlock_condition = {type = 'c_playing_cards_bought', extra = 20}}, + v_petroglyph= {order = 28, discovered = false, unlocked = false, available = true, cost = 10, name = "Petroglyph", pos = {x=5,y=3}, set = "Voucher", config = {extra = 1}, requires = {'v_hieroglyph'},unlock_condition = {type = 'ante_up', ante = 12, extra = 12}}, + v_retcon= {order = 30, discovered = false, unlocked = false, available = true, cost = 10, name = "Retcon", pos = {x=6,y=3}, set = "Voucher", config = {extra = 10}, requires = {'v_directors_cut'},unlock_condition = {type = 'blind_discoveries', extra = 25}}, + v_palette= {order = 32, discovered = false, unlocked = false, available = true, cost = 10, name = "Palette", pos = {x=7,y=3}, set = "Voucher", config = {extra = 1}, requires = {'v_paint_brush'},unlock_condition = {type = 'min_hand_size', extra = 5}}, + + --Backs + + b_red= {name = "Red Deck", stake = 1, unlocked = true,order = 1, pos = {x=0,y=0}, set = "Back", config = {discards = 1}, discovered = true}, + b_blue= {name = "Blue Deck", stake = 1, unlocked = false,order = 2, pos = {x=0,y=2}, set = "Back", config = {hands = 1}, unlock_condition = {type = 'discover_amount', amount = 20}}, + b_yellow= {name = "Yellow Deck", stake = 1, unlocked = false,order = 3, pos = {x=1,y=2}, set = "Back", config = {dollars = 10}, unlock_condition = {type = 'discover_amount', amount = 50}}, + b_green= {name = "Green Deck", stake = 1, unlocked = false,order = 4, pos = {x=2,y=2}, set = "Back", config = {extra_hand_bonus = 2, extra_discard_bonus = 1, no_interest = true}, unlock_condition = {type = 'discover_amount', amount = 75}}, + b_black= {name = "Black Deck", stake = 1, unlocked = false,order = 5, pos = {x=3,y=2}, set = "Back", config = {hands = -1, joker_slot = 1}, unlock_condition = {type = 'discover_amount', amount = 100}}, + b_magic= {name = "Magic Deck", stake = 1, unlocked = false,order = 6, pos = {x=0,y=3}, set = "Back", config = {voucher = 'v_crystal_ball', consumables = {'c_fool', 'c_fool'}}, unlock_condition = {type = 'win_deck', deck = 'b_red'}}, + b_nebula= {name = "Nebula Deck", stake = 1, unlocked = false,order = 7, pos = {x=3,y=0}, set = "Back", config = {voucher = 'v_telescope', consumable_slot = -1}, unlock_condition = {type = 'win_deck', deck = 'b_blue'}}, + b_ghost= {name = "Ghost Deck", stake = 1, unlocked = false,order = 8, pos = {x=6,y=2}, set = "Back", config = {spectral_rate = 2, consumables = {'c_hex'}}, unlock_condition = {type = 'win_deck', deck = 'b_yellow'}}, + b_abandoned= {name = "Abandoned Deck", stake = 1, unlocked = false,order = 9, pos = {x=3,y=3}, set = "Back", config = {remove_faces = true}, unlock_condition = {type = 'win_deck', deck = 'b_green'}}, + b_checkered= {name = "Checkered Deck", stake = 1, unlocked = false,order = 10,pos = {x=1,y=3}, set = "Back", config = {}, unlock_condition = {type = 'win_deck', deck = 'b_black'}}, + b_zodiac= {name = "Zodiac Deck", stake = 1, unlocked = false,order = 11, pos = {x=3,y=4}, set = "Back", config = {vouchers = {'v_tarot_merchant','v_planet_merchant', 'v_overstock_norm'}}, unlock_condition = {type = 'win_stake', stake = 2}}, + b_painted= {name = "Painted Deck", stake = 1, unlocked = false,order = 12, pos = {x=4,y=3}, set = "Back", config = {hand_size = 2, joker_slot = -1}, unlock_condition = {type = 'win_stake', stake=3}}, + b_anaglyph= {name = "Anaglyph Deck", stake = 1, unlocked = false,order = 13, pos = {x=2,y=4}, set = "Back", config = {}, unlock_condition = {type = 'win_stake', stake = 4}}, + b_plasma= {name = "Plasma Deck", stake = 1, unlocked = false,order = 14, pos = {x=4,y=2}, set = "Back", config = {ante_scaling = 2}, unlock_condition = {type = 'win_stake', stake=5}}, + b_erratic= {name = "Erratic Deck", stake = 1, unlocked = false,order = 15, pos = {x=2,y=3}, set = "Back", config = {randomize_rank_suit = true}, unlock_condition = {type = 'win_stake', stake=7}}, + + b_challenge= {name = "Challenge Deck", stake = 1, unlocked = true,order = 16, pos = {x=0,y=4}, set = "Back", config = {}, omit = true}, + + + --All enhanced card types here + m_bonus = {max = 500, order = 2, name = "Bonus", set = "Enhanced", pos = {x=1,y=1}, effect = "Bonus Card", label = "Bonus Card", config = {bonus=30}}, + m_mult = {max = 500, order = 3, name = "Mult", set = "Enhanced", pos = {x=2,y=1}, effect = "Mult Card", label = "Mult Card", config = {mult = 4}}, + m_wild = {max = 500, order = 4, name = "Wild Card", set = "Enhanced", pos = {x=3,y=1}, effect = "Wild Card", label = "Wild Card", config = {}}, + m_glass = {max = 500, order = 5, name = "Glass Card", set = "Enhanced", pos = {x=5,y=1}, effect = "Glass Card", label = "Glass Card", config = {Xmult = 2, extra = 4}}, + m_steel = {max = 500, order = 6, name = "Steel Card", set = "Enhanced", pos = {x=6,y=1}, effect = "Steel Card", label = "Steel Card", config = {h_x_mult = 1.5}}, + m_stone = {max = 500, order = 7, name = "Stone Card", set = "Enhanced", pos = {x=5,y=0}, effect = "Stone Card", label = "Stone Card", config = {bonus = 50}}, + m_gold = {max = 500, order = 8, name = "Gold Card", set = "Enhanced", pos = {x=6,y=0}, effect = "Gold Card", label = "Gold Card", config = {h_dollars = 3}}, + m_lucky = {max = 500, order = 9, name = "Lucky Card", set = "Enhanced", pos = {x=4,y=1}, effect = "Lucky Card", label = "Lucky Card", config = {mult=20, p_dollars = 20}}, + + --editions + e_base = {order = 1, unlocked = true, discovered = false, name = "Base", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {}}, + e_foil = {order = 2, unlocked = true, discovered = false, name = "Foil", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {extra = 50}}, + e_holo = {order = 3, unlocked = true, discovered = false, name = "Holographic", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {extra = 10}}, + e_polychrome = {order = 4, unlocked = true, discovered = false, name = "Polychrome", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {extra = 1.5}}, + e_negative = {order = 5, unlocked = true, discovered = false, name = "Negative", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {extra = 1}}, + + --booster packs + p_arcana_normal_1 = {order = 1, discovered = false, name = "Arcana Pack", weight = 1, kind = 'Arcana', cost = 4, pos = {x=0,y=0}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_arcana_normal_2 = {order = 2, discovered = false, name = "Arcana Pack", weight = 1, kind = 'Arcana', cost = 4, pos = {x=1,y=0}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_arcana_normal_3 = {order = 3, discovered = false, name = "Arcana Pack", weight = 1, kind = 'Arcana', cost = 4, pos = {x=2,y=0}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_arcana_normal_4 = {order = 4, discovered = false, name = "Arcana Pack", weight = 1, kind = 'Arcana', cost = 4, pos = {x=3,y=0}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_arcana_jumbo_1 = {order = 5, discovered = false, name = "Jumbo Arcana Pack", weight = 1, kind = 'Arcana', cost = 6, pos = {x=0,y=2}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_arcana_jumbo_2 = {order = 6, discovered = false, name = "Jumbo Arcana Pack", weight = 1, kind = 'Arcana', cost = 6, pos = {x=1,y=2}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_arcana_mega_1 = {order = 7, discovered = false, name = "Mega Arcana Pack", weight = 0.25, kind = 'Arcana', cost = 8, pos = {x=2,y=2}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_arcana_mega_2 = {order = 8, discovered = false, name = "Mega Arcana Pack", weight = 0.25, kind = 'Arcana', cost = 8, pos = {x=3,y=2}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_celestial_normal_1 = {order = 9, discovered = false, name = "Celestial Pack", weight = 1, kind = 'Celestial', cost = 4, pos = {x=0,y=1}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_celestial_normal_2 = {order = 10, discovered = false, name = "Celestial Pack", weight = 1, kind = 'Celestial', cost = 4, pos = {x=1,y=1}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_celestial_normal_3 = {order = 11, discovered = false, name = "Celestial Pack", weight = 1, kind = 'Celestial', cost = 4, pos = {x=2,y=1}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_celestial_normal_4 = {order = 12, discovered = false, name = "Celestial Pack", weight = 1, kind = 'Celestial', cost = 4, pos = {x=3,y=1}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_celestial_jumbo_1 = {order = 13, discovered = false, name = "Jumbo Celestial Pack", weight = 1, kind = 'Celestial', cost = 6, pos = {x=0,y=3}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_celestial_jumbo_2 = {order = 14, discovered = false, name = "Jumbo Celestial Pack", weight = 1, kind = 'Celestial', cost = 6, pos = {x=1,y=3}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_celestial_mega_1 = {order = 15, discovered = false, name = "Mega Celestial Pack", weight = 0.25, kind = 'Celestial', cost = 8, pos = {x=2,y=3}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_celestial_mega_2 = {order = 16, discovered = false, name = "Mega Celestial Pack", weight = 0.25, kind = 'Celestial', cost = 8, pos = {x=3,y=3}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_spectral_normal_1 = {order = 29, discovered = false, name = "Spectral Pack", weight = 0.3, kind = 'Spectral', cost = 4, pos = {x=0,y=4}, atlas = 'Booster', set = 'Booster', config = {extra = 2, choose = 1}}, + p_spectral_normal_2 = {order = 30, discovered = false, name = "Spectral Pack", weight = 0.3, kind = 'Spectral', cost = 4, pos = {x=1,y=4}, atlas = 'Booster', set = 'Booster', config = {extra = 2, choose = 1}}, + p_spectral_jumbo_1 = {order = 31, discovered = false, name = "Jumbo Spectral Pack", weight = 0.3, kind = 'Spectral', cost = 6, pos = {x=2,y=4}, atlas = 'Booster', set = 'Booster', config = {extra = 4, choose = 1}}, + p_spectral_mega_1 = {order = 32, discovered = false, name = "Mega Spectral Pack", weight = 0.07, kind = 'Spectral', cost = 8, pos = {x=3,y=4}, atlas = 'Booster', set = 'Booster', config = {extra = 4, choose = 2}}, + p_standard_normal_1 = {order = 17, discovered = false, name = "Standard Pack", weight = 1, kind = 'Standard', cost = 4, pos = {x=0,y=6}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_standard_normal_2 = {order = 18, discovered = false, name = "Standard Pack", weight = 1, kind = 'Standard', cost = 4, pos = {x=1,y=6}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_standard_normal_3 = {order = 19, discovered = false, name = "Standard Pack", weight = 1, kind = 'Standard', cost = 4, pos = {x=2,y=6}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_standard_normal_4 = {order = 20, discovered = false, name = "Standard Pack", weight = 1, kind = 'Standard', cost = 4, pos = {x=3,y=6}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_standard_jumbo_1 = {order = 21, discovered = false, name = "Jumbo Standard Pack", weight = 1, kind = 'Standard', cost = 6, pos = {x=0,y=7}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_standard_jumbo_2 = {order = 22, discovered = false, name = "Jumbo Standard Pack", weight = 1, kind = 'Standard', cost = 6, pos = {x=1,y=7}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_standard_mega_1 = {order = 23, discovered = false, name = "Mega Standard Pack", weight = 0.25, kind = 'Standard', cost = 8, pos = {x=2,y=7}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_standard_mega_2 = {order = 24, discovered = false, name = "Mega Standard Pack", weight = 0.25, kind = 'Standard', cost = 8, pos = {x=3,y=7}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_buffoon_normal_1 = {order = 25, discovered = false, name = "Buffoon Pack", weight = 0.6, kind = 'Buffoon', cost = 4, pos = {x=0,y=8}, atlas = 'Booster', set = 'Booster', config = {extra = 2, choose = 1}}, + p_buffoon_normal_2 = {order = 26, discovered = false, name = "Buffoon Pack", weight = 0.6, kind = 'Buffoon', cost = 4, pos = {x=1,y=8}, atlas = 'Booster', set = 'Booster', config = {extra = 2, choose = 1}}, + p_buffoon_jumbo_1 = {order = 27, discovered = false, name = "Jumbo Buffoon Pack", weight = 0.6, kind = 'Buffoon', cost = 6, pos = {x=2,y=8}, atlas = 'Booster', set = 'Booster', config = {extra = 4, choose = 1}}, + p_buffoon_mega_1 = {order = 28, discovered = false, name = "Mega Buffoon Pack", weight = 0.15, kind = 'Buffoon', cost = 8, pos = {x=3,y=8}, atlas = 'Booster', set = 'Booster', config = {extra = 4, choose = 2}}, + + --Extras + soul={pos = {x=0,y=1}}, + undiscovered_joker={pos = {x=5,y=3}}, + undiscovered_tarot={pos = {x=6,y=3}}, + } + + self.P_CENTER_POOLS = { + Booster = {}, + Default = {}, + Enhanced = {}, + Edition = {}, + Joker = {}, + Tarot = {}, + Planet = {}, + Tarot_Planet = {}, + Spectral = {}, + Consumeables = {}, + Voucher = {}, + Back = {}, + Tag = {}, + Seal = {}, + Stake = {}, + Demo = {} + } + + self.P_JOKER_RARITY_POOLS = { + {},{},{},{} + } + + self.P_LOCKED = {} + + self:save_progress() + + + ------------------------------------- + local TESTHELPER_unlocks = false and not _RELEASE_MODE + ------------------------------------- + if not love.filesystem.getInfo(G.SETTINGS.profile..'') then love.filesystem.createDirectory( G.SETTINGS.profile..'' ) end + if not love.filesystem.getInfo(G.SETTINGS.profile..'/'..'meta.jkr') then love.filesystem.append( G.SETTINGS.profile..'/'..'meta.jkr', 'return {}') end + + convert_save_to_meta() + + local meta = STR_UNPACK(get_compressed(G.SETTINGS.profile..'/'..'meta.jkr') or 'return {}') + meta.unlocked = meta.unlocked or {} + meta.discovered = meta.discovered or {} + meta.alerted = meta.alerted or {} + + for k, v in pairs(self.P_CENTERS) do + if not v.wip and not v.demo then + if TESTHELPER_unlocks then v.unlocked = true; v.discovered = true;v.alerted = true end --REMOVE THIS + if not v.unlocked and (string.find(k, '^j_') or string.find(k, '^b_') or string.find(k, '^v_')) and meta.unlocked[k] then + v.unlocked = true + end + if not v.unlocked and (string.find(k, '^j_') or string.find(k, '^b_') or string.find(k, '^v_')) then self.P_LOCKED[#self.P_LOCKED+1] = v end + if not v.discovered and (string.find(k, '^j_') or string.find(k, '^b_') or string.find(k, '^e_') or string.find(k, '^c_') or string.find(k, '^p_') or string.find(k, '^v_')) and meta.discovered[k] then + v.discovered = true + end + if v.discovered and meta.alerted[k] or v.set == 'Back' or v.start_alerted then + v.alerted = true + elseif v.discovered then + v.alerted = false + end + end + end + + table.sort(self.P_LOCKED, function (a, b) return not a.order or not b.order or a.order < b.order end) + + for k, v in pairs(self.P_BLINDS) do + v.key = k + if not v.wip and not v.demo then + if TESTHELPER_unlocks then v.discovered = true; v.alerted = true end --REMOVE THIS + if not v.discovered and meta.discovered[k] then + v.discovered = true + end + if v.discovered and meta.alerted[k] then + v.alerted = true + elseif v.discovered then + v.alerted = false + end + end + end + for k, v in pairs(self.P_TAGS) do + v.key = k + if not v.wip and not v.demo then + if TESTHELPER_unlocks then v.discovered = true; v.alerted = true end --REMOVE THIS + if not v.discovered and meta.discovered[k] then + v.discovered = true + end + if v.discovered and meta.alerted[k] then + v.alerted = true + elseif v.discovered then + v.alerted = false + end + table.insert(self.P_CENTER_POOLS['Tag'], v) + end + end + for k, v in pairs(self.P_SEALS) do + v.key = k + if not v.wip and not v.demo then + if TESTHELPER_unlocks then v.discovered = true; v.alerted = true end --REMOVE THIS + if not v.discovered and meta.discovered[k] then + v.discovered = true + end + if v.discovered and meta.alerted[k] then + v.alerted = true + elseif v.discovered then + v.alerted = false + end + table.insert(self.P_CENTER_POOLS['Seal'], v) + end + end + for k, v in pairs(self.P_STAKES) do + v.key = k + table.insert(self.P_CENTER_POOLS['Stake'], v) + end + + for k, v in pairs(self.P_CENTERS) do + v.key = k + if v.set == 'Joker' then table.insert(self.P_CENTER_POOLS['Joker'], v) end + if v.set and v.demo and v.pos then table.insert(self.P_CENTER_POOLS['Demo'], v) end + if not v.wip then + if v.set and v.set ~= 'Joker' and not v.skip_pool and not v.omit then table.insert(self.P_CENTER_POOLS[v.set], v) end + if v.set == 'Tarot' or v.set == 'Planet' then table.insert(self.P_CENTER_POOLS['Tarot_Planet'], v) end + if v.consumeable then table.insert(self.P_CENTER_POOLS['Consumeables'], v) end + if v.rarity and v.set == 'Joker' and not v.demo then table.insert(self.P_JOKER_RARITY_POOLS[v.rarity], v) end + end + end + + table.sort(self.P_CENTER_POOLS["Joker"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Tarot"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Planet"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Tarot_Planet"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Spectral"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Voucher"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Booster"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Consumeables"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Back"], function (a, b) return (a.order - (a.unlocked and 100 or 0)) < (b.order - (b.unlocked and 100 or 0)) end) + table.sort(self.P_CENTER_POOLS["Enhanced"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Stake"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Tag"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Seal"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Demo"], function (a, b) return a.order + (a.set == 'Joker' and 1000 or 0) < b.order + (b.set == 'Joker' and 1000 or 0) end) + for i = 1, 4 do + table.sort(self.P_JOKER_RARITY_POOLS[i], function (a, b) return a.order < b.order end) + end +end + +function Game:load_profile(_profile) + if not G.PROFILES[_profile] then _profile = 1 end + G.SETTINGS.profile = _profile + + --Load the settings file + local info = get_compressed(_profile..'/profile.jkr') + if info ~= nil then + for k, v in pairs(STR_UNPACK(info)) do + G.PROFILES[G.SETTINGS.profile][k] = v + end + end + + local temp_profile = { + MEMORY = { + deck = 'Red Deck', + stake = 1, + }, + stake = 1, + + high_scores = { + hand = {label = 'Best Hand', amt = 0}, + furthest_round = {label = 'Highest Round', amt = 0}, + furthest_ante = {label = 'Highest Ante', amt = 0}, + most_money = {label = 'Most Money', amt = 0}, + boss_streak = {label = 'Most Bosses in a Row', amt = 0}, + collection = {label = 'Collection', amt = 0, tot = 1}, + win_streak = {label = 'Best Win Streak', amt = 0}, + current_streak = {label = '', amt = 0}, + poker_hand = {label = 'Most Played Hand', amt = 0} + }, + + career_stats = { + c_round_interest_cap_streak = 0, + c_dollars_earned = 0, + c_shop_dollars_spent = 0, + c_tarots_bought = 0, + c_planets_bought = 0, + c_playing_cards_bought = 0, + c_vouchers_bought = 0, + c_tarot_reading_used = 0, + c_planetarium_used = 0, + c_shop_rerolls = 0, + c_cards_played = 0, + c_cards_discarded = 0, + c_losses = 0, + c_wins = 0, + c_rounds = 0, + c_hands_played = 0, + c_face_cards_played = 0, + c_jokers_sold = 0, + c_cards_sold = 0, + c_single_hand_round_streak = 0, + }, + progress = { + + }, + joker_usage = {}, + consumeable_usage = {}, + voucher_usage = {}, + hand_usage = {}, + deck_usage = {}, + deck_stakes = {}, + challenges_unlocked = nil, + challenge_progress = { + completed = {}, + unlocked = {} + } + } + local recursive_init + recursive_init = function(t1, t2) + for k, v in pairs(t1) do + if not t2[k] then + t2[k] = v + elseif type(t2[k]) == 'table' and type(v) == 'table' then + recursive_init(v, t2[k]) + end + end + end + + recursive_init(temp_profile, G.PROFILES[G.SETTINGS.profile]) +end + +function Game:set_language() + if not self.LANGUAGES then + if not (love.filesystem.read('localization/'..G.SETTINGS.language..'.lua')) or G.F_ENGLISH_ONLY then + ------------------------------------------ + --SET LANGUAGE FOR FIRST TIME STARTUP HERE + + ------------------------------------------ + + G.SETTINGS.language = 'en-us' + end + ------------------------------------------------------- + --IF LANGUAGE NEEDS TO BE SET ON EVERY REBOOT, SET HERE + + ------------------------------------------------------- + + self.LANGUAGES = { + ['en-us'] = {font = 1, label = "English", key = 'en-us', button = "Language Feedback", warning = {'This language is still in Beta. To help us','improve it, please click on the feedback button.', 'Click again to confirm'}}, + ['de'] = {font = 1, label = "Deutsch", key = 'de', beta = nil, button = "Feedback zur Übersetzung", warning = {'Diese Übersetzung ist noch im Beta-Stadium. Willst du uns helfen,','sie zu verbessern? Dann klicke bitte auf die Feedback-Taste.', "Zum Bestätigen erneut klicken"}}, + ['es_419'] = {font = 1, label = "Español (México)", key = 'es_419', beta = nil, button = "Sugerencias de idioma", warning = {'Este idioma todavía está en Beta. Pulsa el botón','de sugerencias para ayudarnos a mejorarlo.', "Haz clic de nuevo para confirmar"}}, + ['es_ES'] = {font = 1, label = "Español (España)", key = 'es_ES', beta = nil, button = "Sugerencias de idioma", warning = {'Este idioma todavía está en Beta. Pulsa el botón','de sugerencias para ayudarnos a mejorarlo.', "Haz clic de nuevo para confirmar"}}, + ['fr'] = {font = 1, label = "Français", key = 'fr', beta = nil, button = "Partager votre avis", warning = {'La traduction française est encore en version bêta. ','Veuillez cliquer sur le bouton pour nous donner votre avis.', "Cliquez à nouveau pour confirmer"}}, + ['id'] = {font = 1, label = "Bahasa Indonesia", key = 'id', beta = true, button = "Umpan Balik Bahasa", warning = {'Bahasa ini masih dalam tahap Beta. Untuk membantu','kami meningkatkannya, silakan klik tombol umpan balik.', "Klik lagi untuk mengonfirmasi"}}, + ['it'] = {font = 1, label = "Italiano", key = 'it', beta = nil, button = "Feedback traduzione", warning = {'Questa traduzione è ancora in Beta. Per','aiutarci a migliorarla, clicca il tasto feedback', "Fai clic di nuovo per confermare"}}, + ['ja'] = {font = 5, label = "日本語", key = 'ja', beta = nil, button = "提案する", warning = {'この翻訳は現在ベータ版です。提案があった場合、','ボタンをクリックしてください。', "もう一度クリックして確認"}}, + ['ko'] = {font = 4, label = "한국어", key = 'ko', beta = nil, button = "번역 피드백", warning = {'이 언어는 아직 베타 단계에 있습니다. ','번역을 도와주시려면 피드백 버튼을 눌러주세요.', "다시 클릭해서 확인하세요"}}, + ['nl'] = {font = 1, label = "Nederlands", key = 'nl', beta = nil, button = "Taal suggesties", warning = {'Deze taal is nog in de Beta fase. Help ons het te ','verbeteren door op de suggestie knop te klikken.', "Klik opnieuw om te bevestigen"}}, + ['pl'] = {font = 1, label = "Polski", key = 'pl', beta = nil, button = "Wyślij uwagi do tłumaczenia", warning = {'Polska wersja językowa jest w fazie Beta. By pomóc nam poprawić',' jakość tłumaczenia, kliknij przycisk i podziel się swoją opinią i uwagami.', "Kliknij ponownie, aby potwierdzić"}}, + ['pt_BR'] = {font = 1, label = "Português", key = 'pt_BR', beta = nil, button = "Feedback de Tradução", warning = {'Esta tradução ainda está em Beta. Se quiser nos ajudar','a melhorá-la, clique no botão de feedback por favor', "Clique novamente para confirmar"}}, + ['ru'] = {font = 6, label = "Русский", key = 'ru', beta = true, button = "Отзыв о языке", warning = {'Этот язык все еще находится в Бета-версии. Чтобы помочь','нам его улучшить, пожалуйста, нажмите на кнопку обратной связи.', "Щелкните снова, чтобы подтвердить"}}, + ['zh_CN'] = {font = 2, label = "简体中文", key = 'zh_CN', beta = nil, button = "意见反馈", warning = {'这个语言目前尚为Beta版本。 请帮助我们改善翻译品质,','点击”意见反馈” 来提供你的意见。', "再次点击确认"}}, + ['zh_TW'] = {font = 3, label = "繁體中文", key = 'zh_TW', beta = nil, button = "意見回饋", warning = {'這個語言目前尚為Beta版本。請幫助我們改善翻譯品質,','點擊”意見回饋” 來提供你的意見。', "再按一下即可確認"}}, + ['all1'] = {font = 8, label = "English", key = 'all', omit = true}, + ['all2'] = {font = 9, label = "English", key = 'all', omit = true}, + } + --if G.F_ENGLISH_ONLY then + -- self.LANGUAGES = { + -- ['en-us'] = self.LANGUAGES['en-us'] + -- } + --end + + --load the font and set filter + self.FONTS = { + {file = "resources/fonts/m6x11plus.ttf", render_scale = self.TILESIZE*10, TEXT_HEIGHT_SCALE = 0.83, TEXT_OFFSET = {x=10,y=-20}, FONTSCALE = 0.1, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/NotoSansSC-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.7, TEXT_OFFSET = {x=0,y=-35}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1.1}, + {file = "resources/fonts/NotoSansTC-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.7, TEXT_OFFSET = {x=0,y=-35}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1.1}, + {file = "resources/fonts/NotoSansKR-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.8, TEXT_OFFSET = {x=0,y=-20}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/NotoSansJP-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.8, TEXT_OFFSET = {x=0,y=-20}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/NotoSans-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.65, TEXT_OFFSET = {x=0,y=-40}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/m6x11plus.ttf", render_scale = self.TILESIZE*10, TEXT_HEIGHT_SCALE = 0.9, TEXT_OFFSET = {x=10,y=15}, FONTSCALE = 0.1, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/GoNotoCurrent-Bold.ttf", render_scale = self.TILESIZE*10, TEXT_HEIGHT_SCALE = 0.8, TEXT_OFFSET = {x=10,y=-20}, FONTSCALE = 0.1, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/GoNotoCJKCore.ttf", render_scale = self.TILESIZE*10, TEXT_HEIGHT_SCALE = 0.8, TEXT_OFFSET = {x=10,y=-20}, FONTSCALE = 0.1, squish = 1, DESCSCALE = 1}, + } + for _, v in ipairs(self.FONTS) do + if love.filesystem.getInfo(v.file) then + v.FONT = love.graphics.newFont( v.file, v.render_scale) + end + end + for _, v in pairs(self.LANGUAGES) do + v.font = self.FONTS[v.font] + end + end + + self.LANG = self.LANGUAGES[self.SETTINGS.language] or self.LANGUAGES['en-us'] + + local localization = love.filesystem.getInfo('localization/'..G.SETTINGS.language..'.lua') + if localization ~= nil then + self.localization = assert(loadstring(love.filesystem.read('localization/'..G.SETTINGS.language..'.lua')))() + init_localization() + end +end + +function Game:set_render_settings() + self.SETTINGS.GRAPHICS.texture_scaling = self.SETTINGS.GRAPHICS.texture_scaling or 2 + + --Set fiter to linear interpolation and nearest, best for pixel art + love.graphics.setDefaultFilter( + self.SETTINGS.GRAPHICS.texture_scaling == 1 and 'nearest' or 'linear', + self.SETTINGS.GRAPHICS.texture_scaling == 1 and 'nearest' or 'linear', 1) + + love.graphics.setLineStyle("rough") + + --spritesheets + self.animation_atli = { + {name = "blind_chips", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/BlindChips.png",px=34,py=34, frames = 21}, + {name = "shop_sign", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/ShopSignAnimation.png",px=113,py=57, frames = 4} + } + self.asset_atli = { + {name = "cards_1", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/8BitDeck.png",px=71,py=95}, + {name = "cards_2", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/8BitDeck_opt2.png",px=71,py=95}, + {name = "centers", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/Enhancers.png",px=71,py=95}, + {name = "Joker", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/Jokers.png",px=71,py=95}, + {name = "Tarot", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/Tarots.png",px=71,py=95}, + {name = "Voucher", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/Vouchers.png",px=71,py=95}, + {name = "Booster", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/boosters.png",px=71,py=95}, + {name = "ui_1", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/ui_assets.png",px=18,py=18}, + {name = "ui_2", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/ui_assets_opt2.png",px=18,py=18}, + {name = "balatro", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/balatro.png",px=333,py=216}, + {name = 'gamepad_ui', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/gamepad_ui.png",px=32,py=32}, + {name = 'icons', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/icons.png",px=66,py=66}, + {name = 'tags', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/tags.png",px=34,py=34}, + {name = 'stickers', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/stickers.png",px=71,py=95}, + {name = 'chips', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/chips.png",px=29,py=29}, + + {name = 'collab_AU_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_AU_1.png",px=71,py=95}, + {name = 'collab_AU_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_AU_2.png",px=71,py=95}, + {name = 'collab_TW_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_TW_1.png",px=71,py=95}, + {name = 'collab_TW_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_TW_2.png",px=71,py=95}, + {name = 'collab_VS_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_VS_1.png",px=71,py=95}, + {name = 'collab_VS_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_VS_2.png",px=71,py=95}, + {name = 'collab_DTD_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_DTD_1.png",px=71,py=95}, + {name = 'collab_DTD_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_DTD_2.png",px=71,py=95}, + + {name = 'collab_CYP_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_CYP_1.png",px=71,py=95}, + {name = 'collab_CYP_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_CYP_2.png",px=71,py=95}, + {name = 'collab_STS_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_STS_1.png",px=71,py=95}, + {name = 'collab_STS_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_STS_2.png",px=71,py=95}, + {name = 'collab_TBoI_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_TBoI_1.png",px=71,py=95}, + {name = 'collab_TBoI_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_TBoI_2.png",px=71,py=95}, + {name = 'collab_SV_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_SV_1.png",px=71,py=95}, + {name = 'collab_SV_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_SV_2.png",px=71,py=95}, + + {name = 'collab_SK_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_SK_1.png",px=71,py=95}, + {name = 'collab_SK_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_SK_2.png",px=71,py=95}, + {name = 'collab_DS_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_DS_1.png",px=71,py=95}, + {name = 'collab_DS_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_DS_2.png",px=71,py=95}, + {name = 'collab_CL_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_CL_1.png",px=71,py=95}, + {name = 'collab_CL_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_CL_2.png",px=71,py=95}, + {name = 'collab_D2_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_D2_1.png",px=71,py=95}, + {name = 'collab_D2_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_D2_2.png",px=71,py=95}, + {name = 'collab_PC_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_PC_1.png",px=71,py=95}, + {name = 'collab_PC_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_PC_2.png",px=71,py=95}, + {name = 'collab_WF_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_WF_1.png",px=71,py=95}, + {name = 'collab_WF_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_WF_2.png",px=71,py=95}, + {name = 'collab_EG_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_EG_1.png",px=71,py=95}, + {name = 'collab_EG_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_EG_2.png",px=71,py=95}, + {name = 'collab_XR_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_XR_1.png",px=71,py=95}, + {name = 'collab_XR_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_XR_2.png",px=71,py=95}, + + {name = 'collab_CR_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_CR_1.png",px=71,py=95}, + {name = 'collab_CR_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_CR_2.png",px=71,py=95}, + {name = 'collab_BUG_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_BUG_1.png",px=71,py=95}, + {name = 'collab_BUG_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_BUG_2.png",px=71,py=95}, + {name = 'collab_FO_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_FO_1.png",px=71,py=95}, + {name = 'collab_FO_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_FO_2.png",px=71,py=95}, + {name = 'collab_DBD_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_DBD_1.png",px=71,py=95}, + {name = 'collab_DBD_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_DBD_2.png",px=71,py=95}, + {name = 'collab_C7_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_C7_1.png",px=71,py=95}, + {name = 'collab_C7_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_C7_2.png",px=71,py=95}, + {name = 'collab_R_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_R_1.png",px=71,py=95}, + {name = 'collab_R_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_R_2.png",px=71,py=95}, + {name = 'collab_AC_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_AC_1.png",px=71,py=95}, + {name = 'collab_AC_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_AC_2.png",px=71,py=95}, + {name = 'collab_STP_1', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_STP_1.png",px=71,py=95}, + {name = 'collab_STP_2', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/collabs/collab_STP_2.png",px=71,py=95}, + } + self.asset_images = { + {name = "playstack_logo", path = "resources/textures/1x/playstack-logo.png", px=1417,py=1417}, + {name = "localthunk_logo", path = "resources/textures/1x/localthunk-logo.png", px=1390,py=560} + } + + --Load in all atli defined above + for i=1, #self.animation_atli do + self.ANIMATION_ATLAS[self.animation_atli[i].name] = {} + self.ANIMATION_ATLAS[self.animation_atli[i].name].name = self.animation_atli[i].name + self.ANIMATION_ATLAS[self.animation_atli[i].name].image = love.graphics.newImage(self.animation_atli[i].path, {mipmaps = true, dpiscale = self.SETTINGS.GRAPHICS.texture_scaling}) + self.ANIMATION_ATLAS[self.animation_atli[i].name].px = self.animation_atli[i].px + self.ANIMATION_ATLAS[self.animation_atli[i].name].py = self.animation_atli[i].py + self.ANIMATION_ATLAS[self.animation_atli[i].name].frames = self.animation_atli[i].frames + end + + for i=1, #self.asset_atli do + self.ASSET_ATLAS[self.asset_atli[i].name] = {} + self.ASSET_ATLAS[self.asset_atli[i].name].name = self.asset_atli[i].name + self.ASSET_ATLAS[self.asset_atli[i].name].image = love.graphics.newImage(self.asset_atli[i].path, {mipmaps = true, dpiscale = self.SETTINGS.GRAPHICS.texture_scaling}) + self.ASSET_ATLAS[self.asset_atli[i].name].type = self.asset_atli[i].type + self.ASSET_ATLAS[self.asset_atli[i].name].px = self.asset_atli[i].px + self.ASSET_ATLAS[self.asset_atli[i].name].py = self.asset_atli[i].py + end + for i=1, #self.asset_images do + self.ASSET_ATLAS[self.asset_images[i].name] = {} + self.ASSET_ATLAS[self.asset_images[i].name].name = self.asset_images[i].name + self.ASSET_ATLAS[self.asset_images[i].name].image = love.graphics.newImage(self.asset_images[i].path, {mipmaps = true, dpiscale = 1}) + self.ASSET_ATLAS[self.asset_images[i].name].type = self.asset_images[i].type + self.ASSET_ATLAS[self.asset_images[i].name].px = self.asset_images[i].px + self.ASSET_ATLAS[self.asset_images[i].name].py = self.asset_images[i].py + end + + for _, v in pairs(G.I.SPRITE) do + v:reset() + end + + self.ASSET_ATLAS.Planet = self.ASSET_ATLAS.Tarot + self.ASSET_ATLAS.Spectral = self.ASSET_ATLAS.Tarot +end + +function Game:init_window(reset) + --Initialize the window + self.ROOM_PADDING_H= 0.7 + self.ROOM_PADDING_W = 1 + self.WINDOWTRANS = { + x = 0, y = 0, + w = self.TILE_W+2*self.ROOM_PADDING_W, + h = self.TILE_H+2*self.ROOM_PADDING_H + } + self.window_prev = { + orig_scale = self.TILESCALE, + w=self.WINDOWTRANS.w*self.TILESIZE*self.TILESCALE, + h=self.WINDOWTRANS.h*self.TILESIZE*self.TILESCALE, + orig_ratio = self.WINDOWTRANS.w*self.TILESIZE*self.TILESCALE/(self.WINDOWTRANS.h*self.TILESIZE*self.TILESCALE)} + G.SETTINGS.QUEUED_CHANGE = G.SETTINGS.QUEUED_CHANGE or {} + G.SETTINGS.QUEUED_CHANGE.screenmode = G.SETTINGS.WINDOW.screenmode + + G.FUNCS.apply_window_changes(true) +end + +function Game:delete_run() + if self.ROOM then + remove_all(G.STAGE_OBJECTS[G.STAGE]) + self.load_shop_booster = nil + self.load_shop_jokers = nil + self.load_shop_vouchers = nil + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.deck_preview then self.deck_preview:remove(); self.deck_preview = nil end + if self.shop then self.shop:remove(); self.shop = nil end + if self.blind_select then self.blind_select:remove(); self.blind_select = nil end + if self.booster_pack then self.booster_pack:remove(); self.booster_pack = nil end + if self.MAIN_MENU_UI then self.MAIN_MENU_UI:remove(); self.MAIN_MENU_UI = nil end + if self.SPLASH_FRONT then self.SPLASH_FRONT:remove(); self.SPLASH_FRONT = nil end + if self.SPLASH_BACK then self.SPLASH_BACK:remove(); self.SPLASH_BACK = nil end + if self.SPLASH_LOGO then self.SPLASH_LOGO:remove(); self.SPLASH_LOGO = nil end + if self.GAME_OVER_UI then self.GAME_OVER_UI:remove(); self.GAME_OVER_UI = nil end + if self.collection_alert then self.collection_alert:remove(); self.collection_alert = nil end + if self.HUD then self.HUD:remove(); self.HUD = nil end + if self.HUD_blind then self.HUD_blind:remove(); self.HUD_blind = nil end + if self.HUD_tags then + for k, v in pairs(self.HUD_tags) do + v:remove() + end + self.HUD_tags = nil + end + if self.OVERLAY_MENU then self.OVERLAY_MENU:remove(); self.OVERLAY_MENU = nil end + if self.OVERLAY_TUTORIAL then + G.OVERLAY_TUTORIAL.Jimbo:remove() + if G.OVERLAY_TUTORIAL.content then G.OVERLAY_TUTORIAL.content:remove() end + G.OVERLAY_TUTORIAL:remove() + G.OVERLAY_TUTORIAL = nil + end + for k, v in pairs(G) do + if (type(v) == "table") and v.is and v:is(CardArea) then + G[k] = nil + end + end + G.I.CARD = {} + end + G.VIEWING_DECK = nil + G.E_MANAGER:clear_queue() + G.CONTROLLER:mod_cursor_context_layer(-1000) + G.CONTROLLER.focus_cursor_stack = {} + G.CONTROLLER.focus_cursor_stack_level = 1 + if G.GAME then G.GAME.won = false end + + G.STATE = -1 +end + + + +function Game:save_progress() + G.ARGS.save_progress = G.ARGS.save_progress or {} + G.ARGS.save_progress.UDA = EMPTY(G.ARGS.save_progress.UDA) + G.ARGS.save_progress.SETTINGS = G.SETTINGS + G.ARGS.save_progress.PROFILE = G.PROFILES[G.SETTINGS.profile] + + for k, v in pairs(self.P_CENTERS) do + G.ARGS.save_progress.UDA[k] = (v.unlocked and 'u' or '')..(v.discovered and 'd' or '')..(v.alerted and 'a' or '') + end + for k, v in pairs(self.P_BLINDS) do + G.ARGS.save_progress.UDA[k] = (v.unlocked and 'u' or '')..(v.discovered and 'd' or '')..(v.alerted and 'a' or '') + end + for k, v in pairs(self.P_TAGS) do + G.ARGS.save_progress.UDA[k] = (v.unlocked and 'u' or '')..(v.discovered and 'd' or '')..(v.alerted and 'a' or '') + end + for k, v in pairs(self.P_SEALS) do + G.ARGS.save_progress.UDA[k] = (v.unlocked and 'u' or '')..(v.discovered and 'd' or '')..(v.alerted and 'a' or '') + end + + G.FILE_HANDLER = G.FILE_HANDLER or {} + G.FILE_HANDLER.progress = true + G.FILE_HANDLER.update_queued = true +end + +function Game:save_notify(card) + G.SAVE_MANAGER.channel:push({ + type = 'save_notify', + save_notify = card.key, + profile_num = G.SETTINGS.profile + }) +end + +function Game:save_settings() + G.ARGS.save_settings = G.SETTINGS + G.FILE_HANDLER = G.FILE_HANDLER or {} + G.FILE_HANDLER.settings = true + G.FILE_HANDLER.update_queued = true +end + +function Game:save_metrics() + G.ARGS.save_metrics = G.METRICS + G.FILE_HANDLER = G.FILE_HANDLER or {} + G.FILE_HANDLER.settings = true + G.FILE_HANDLER.update_queued = true +end + +function Game:prep_stage(new_stage, new_state, new_game_obj) + for k, v in pairs(self.CONTROLLER.locks) do + self.CONTROLLER.locks[k] = nil + end + if new_game_obj then self.GAME = self:init_game_object() end + self.STAGE = new_stage or self.STAGES.MAIN_MENU + self.STATE = new_state or self.STATES.MENU + self.STATE_COMPLETE = false + self.SETTINGS.paused = false + + self.ROOM = Node{T={ + x = self.ROOM_PADDING_W, + y = self.ROOM_PADDING_H, + w = self.TILE_W, + h = self.TILE_H} + } + self.ROOM.jiggle = 0 + self.ROOM.states.drag.can = false + self.ROOM:set_container(self.ROOM) + + self.ROOM_ATTACH = Moveable{T={ + x = 0, + y = 0, + w = self.TILE_W, + h = self.TILE_H} + } + self.ROOM_ATTACH.states.drag.can = false + self.ROOM_ATTACH:set_container(self.ROOM) + love.resize(love.graphics.getWidth( ),love.graphics.getHeight( )) +end + +function Game:sandbox() + G.TIMERS.REAL = 0 + G.TIMERS.TOTAL = 0 + + self:prep_stage(G.STAGES.SANDBOX, G.STATES.SANDBOX, true) + self.GAME.selected_back = Back(G.P_CENTERS.b_red) + + ease_background_colour{new_colour = G.C.BLACK, contrast = 1} + + G.SANDBOX = { + vort_time = 7, + vort_speed = 0, + col_op = {'RED','BLUE','GREEN','BLACK','L_BLACK','WHITE','EDITION','DARK_EDITION','ORANGE','PURPLE'}, + col1 = G.C.RED,col2 = G.C.BLUE, + mid_flash = 0, + joker_text = '', + edition = 'base', + tilt = 1, + card_size = 1, + base_size = {w = G.CARD_W, h = G.CARD_H}, + gamespeed = 0 + } + + if G.SPLASH_FRONT then G.SPLASH_FRONT:remove(); G.SPLASH_FRONT = nil end + if G.SPLASH_BACK then G.SPLASH_BACK:remove(); G.SPLASH_BACK = nil end + + G.SPLASH_BACK = Sprite(-30, -13, G.ROOM.T.w+60, G.ROOM.T.h+22, G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x = 2, y = 0}) + G.SPLASH_BACK:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + + G.SPLASH_BACK:define_draw_steps({{ + shader = 'splash', + send = { + {name = 'time', ref_table = G.SANDBOX, ref_value = 'vort_time'}, + {name = 'vort_speed', val = 0.4}, + {name = 'colour_1', ref_table = G.SANDBOX, ref_value = 'col1'}, + {name = 'colour_2', ref_table = G.SANDBOX, ref_value = 'col2'}, + {name = 'mid_flash', ref_table = G.SANDBOX, ref_value = 'mid_flash'}, + {name = 'vort_offset', val = 0}, + }}}) + + function create_UIBox_sandbox_controls() + G.FUNCS.col1change = function(args) + G.SANDBOX.col1 = G.C[args.to_val] + end + G.FUNCS.col2change = function(args) + G.SANDBOX.col2 = G.C[args.to_val] + end + G.FUNCS.edition_change = function(args) + G.SANDBOX.edition = args.to_val + if G.SANDBOX.joker then G.SANDBOX.joker:set_edition({[args.to_val] = true}, true, true) end + end + G.FUNCS.pulseme = function(e) + if math.random() > 0.998 then e.config.object:pulse(1) end + end + G.FUNCS.spawn_joker = function(e) G.FUNCS.rem_joker(); G.SANDBOX.joker = add_joker(G.SANDBOX.joker_text, G.SANDBOX.edition) end + G.FUNCS.rem_joker = function(e) if G.SANDBOX.joker then G.SANDBOX.joker:remove(); G.SANDBOX.joker = nil end end + G.FUNCS.do_time = function(args) if args.to_val == 'PLAY' then G.SANDBOX.gamespeed = 1 else G.SANDBOX.gamespeed = 0 end end + G.FUNCS.cb = function(rt) G.CARD_W = rt.ref_table[rt.ref_value]*G.SANDBOX.base_size.w; G.CARD_H = rt.ref_table[rt.ref_value]*G.SANDBOX.base_size.h end + G.E_MANAGER:add_event(Event({ + func = (function() + G.SANDBOX.file_reload_timer = (G.SANDBOX.file_reload_timer or 0) + if G.SANDBOX.file_reload_timer < G.TIMERS.REAL then + G.SANDBOX.file_reload_timer = G.SANDBOX.file_reload_timer+0.25 + end + if G.SANDBOX.joker then G.SANDBOX.joker.ambient_tilt = G.SANDBOX.tilt end + G.SANDBOX.vort_time = G.SANDBOX.vort_time + G.real_dt*G.SANDBOX.gamespeed + G.CONTROLLER.lock_input = false + end) + })) + + local t = { + n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK}, nodes={ + create_slider({label = 'Time', w = 2, h = 0.3, text_scale = 0.2, label_scale = 0.3, ref_table = G.SANDBOX, ref_value = 'vort_time', min = 0, max = 30}), + create_option_cycle({options = {'PLAY','PAUSE'}, opt_callback = 'do_time', current_option = 1, colour = G.C.RED, w = 2, scale = 0.7}), + create_slider({label = 'tilt', w = 2, h = 0.3, text_scale = 0.2, label_scale = 0.3, ref_table = G.SANDBOX, ref_value = 'tilt', min = 0, max = 3, decimal_places = 2}), + create_slider({label = 'Card size', w = 2, h = 0.3, text_scale = 0.2, label_scale = 0.3, ref_table = G.SANDBOX, ref_value = 'card_size', min = 0.1, max = 3, callback = 'cb', decimal_places = 2}), + create_option_cycle({options = G.SANDBOX.col_op, opt_callback = 'col1change', current_option = 1, colour = G.C.RED, w = 2, scale = 0.7}), + create_option_cycle({options = G.SANDBOX.col_op, opt_callback = 'col2change', current_option = 2, colour = G.C.RED, w = 2, scale = 0.7}), + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes = { + UIBox_button{ label = {"+"}, button = "spawn_joker", minw = 0.7, col = true}, + create_text_input({prompt_text = 'Joker key', extended_corpus = true, ref_table = G.SANDBOX, ref_value = 'joker_text', text_scale = 0.3, w = 1.5, h = 0.6}), + UIBox_button{ label = {"-"}, button = "rem_joker", minw = 0.7, col = true}, + }}, + create_option_cycle({options = {'base', 'foil', 'holo', 'polychrome','negative'}, opt_callback = 'edition_change', current_option = 1, colour = G.C.RED, w = 2, scale = 0.7}), + }} + }} + return t + end + + + G.SANDBOX.UI = UIBox{ + definition = create_UIBox_sandbox_controls(), + config = {align="cli", offset = {x=0,y=0}, major = G.ROOM_ATTACH, bond = 'Weak'} + } + + G.SANDBOX.UI:recalculate(true) +end + +function Game:splash_screen() + --If the skip splash screen option is set, immediately go to the main menu here + if G.SETTINGS.skip_splash == 'Yes' then + G:main_menu() + return + end + + self:prep_stage(G.STAGES.MAIN_MENU, G.STATES.SPLASH, true) + G.E_MANAGER:add_event(Event({ + func = (function() + discover_card() + return true + end) + })) + + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.TIMERS.TOTAL = 0 + G.TIMERS.REAL = 0 + --Prep the splash screen shaders for both the background(colour swirl) and the foreground(white flash), starting at black + G.SPLASH_BACK = Sprite(-30, -13, G.ROOM.T.w+60, G.ROOM.T.h+22, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_BACK:define_draw_steps({{ + shader = 'splash', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'}, + {name = 'vort_speed', val = 1}, + {name = 'colour_1', ref_table = G.C, ref_value = 'BLUE'}, + {name = 'colour_2', ref_table = G.C, ref_value = 'WHITE'}, + {name = 'mid_flash', val = 0}, + {name = 'vort_offset', val = (2*90.15315131*os.time())%100000}, + }}}) + G.SPLASH_BACK:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + G.SPLASH_FRONT = Sprite(0,-20, G.ROOM.T.w*2, G.ROOM.T.h*4, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_FRONT:define_draw_steps({{ + shader = 'flash', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'}, + {name = 'mid_flash', val = 1} + }}}) + G.SPLASH_FRONT:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + + --spawn in splash card + local SC = nil + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2,func = (function() + local SC_scale = 1.2 + SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['j_joker']) + SC.T.y = G.ROOM.T.h/2 - SC_scale*G.CARD_H/2 + SC.ambient_tilt = 1 + SC.states.drag.can = false + SC.states.hover.can = false + SC.no_ui = true + G.VIBRATION = G.VIBRATION + 2 + play_sound('whoosh1', 0.7, 0.2) + play_sound('introPad1', 0.704, 0.6) + return true;end)})) + + --dissolve fool card and start to fade in the vortex + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 1.8,func = (function() --||||||||||| + SC:start_dissolve({G.C.WHITE, G.C.WHITE},true, 12, true) + play_sound('magic_crumple', 1, 0.5) + play_sound('splash_buildup', 1, 0.7) + return true;end)})) + + --create all the cards and suck them in + function make_splash_card(args) + args = args or {} + local angle = math.random()*2*3.14 + local card_size = (args.scale or 1.5)*(math.random() + 1) + local card_pos = args.card_pos or { + x = (18 + card_size)*math.sin(angle), + y = (18 + card_size)*math.cos(angle) + } + local card = Card( card_pos.x + G.ROOM.T.w/2 - G.CARD_W*card_size/2, + card_pos.y + G.ROOM.T.h/2 - G.CARD_H*card_size/2, + card_size*G.CARD_W, card_size*G.CARD_H, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base) + if math.random() > 0.8 then card.sprite_facing = 'back'; card.facing = 'back' end + card.no_shadow = true + card.states.hover.can = false + card.states.drag.can = false + card.vortex = true and not args.no_vortex + card.T.r = angle + return card, card_pos + end + + G.vortex_time = G.TIMERS.REAL + local temp_del = nil + + for i = 1, 200 do + temp_del = temp_del or 3 + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = temp_del, + func = (function() + local card, card_pos = make_splash_card({scale = 2 - i/300}) + local speed = math.max(2. - i*0.005, 0.001) + ease_value(card.T, 'scale', -card.T.scale, nil, nil, nil, 1.*speed, 'elastic') + ease_value(card.T, 'x', -card_pos.x, nil, nil, nil, 0.9*speed) + ease_value(card.T, 'y', -card_pos.y, nil, nil, nil, 0.9*speed) + local temp_pitch = i*0.007 + 0.6 + local temp_i = i + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + if card.T.scale <= 0 then + if temp_i < 30 then + play_sound('whoosh1', temp_pitch + math.random()*0.05, 0.25*(1 - temp_i/50)) + end + + if temp_i == 15 then + play_sound('whoosh_long',0.9, 0.7) + end + G.VIBRATION = G.VIBRATION + 0.1 + card:remove() + return true + end + end)})) + return true + end)})) + temp_del = temp_del + math.max(1/(i), math.max(0.2*(170-i)/500, 0.016)) + end + + --when faded to white, spit out the 'Fool's' cards and slowly have them settle in to place + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 2.,func = (function() + G.SPLASH_BACK:remove() + G.SPLASH_BACK = G.SPLASH_FRONT + G.SPLASH_FRONT = nil + G:main_menu('splash') + return true;end)})) + return true + end) + })) +end + +function Game:main_menu(change_context) --True if main menu is accessed from the splash screen, false if it is skipped or accessed from the game + if change_context ~= 'splash' then + --Skip the timer to 14 seconds for all shaders that need it + G.TIMERS.REAL = 12 + G.TIMERS.TOTAL = 12 + else + --keep all sounds that came from splash screen + RESET_STATES(G.STATES.MENU) + end + + --Prepare the main menu, reset the default deck + self:prep_stage(G.STAGES.MAIN_MENU, G.STATES.MENU, true) + self.GAME.selected_back = Back(G.P_CENTERS.b_red) + + if (not G.SETTINGS.tutorial_complete) and G.SETTINGS.tutorial_progress.completed_parts['big_blind'] then G.SETTINGS.tutorial_complete = true end + + G.FUNCS.change_shadows{to_key = G.SETTINGS.GRAPHICS.shadows == 'On' and 1 or 2} + + ease_background_colour{new_colour = G.C.BLACK, contrast = 1} + + if G.SPLASH_FRONT then G.SPLASH_FRONT:remove(); G.SPLASH_FRONT = nil end + if G.SPLASH_BACK then G.SPLASH_BACK:remove(); G.SPLASH_BACK = nil end + G.SPLASH_BACK = Sprite(-30, -13, G.ROOM.T.w+60, G.ROOM.T.h+22, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_BACK:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + local splash_args = {mid_flash = change_context == 'splash' and 1.6 or 0.} + ease_value(splash_args, 'mid_flash', -(change_context == 'splash' and 1.6 or 0), nil, nil, nil, 4) + + G.SPLASH_BACK:define_draw_steps({{ + shader = 'splash', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL_SHADER'}, + {name = 'vort_speed', val = 0.4}, + {name = 'colour_1', ref_table = G.C, ref_value = 'RED'}, + {name = 'colour_2', ref_table = G.C, ref_value = 'BLUE'}, + {name = 'mid_flash', ref_table = splash_args, ref_value = 'mid_flash'}, + {name = 'vort_offset', val = 0}, + }}}) + + --Display the unlocked decks and cards from the previous run + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + unlock_notify() + return true + end) + })) + + + local SC_scale = 1.1*(G.debug_splash_size_toggle and 0.8 or 1) + local CAI = { + TITLE_TOP_W = G.CARD_W, + TITLE_TOP_H = G.CARD_H, + } + self.title_top = CardArea( + 0, 0, + CAI.TITLE_TOP_W,CAI.TITLE_TOP_H, + {card_limit = 1, type = 'title'}) + + + G.SPLASH_LOGO = Sprite(0, 0, + 13*SC_scale, + 13*SC_scale*(G.ASSET_ATLAS["balatro"].py/G.ASSET_ATLAS["balatro"].px), + G.ASSET_ATLAS["balatro"], {x=0,y=0}) + + G.SPLASH_LOGO:set_alignment({ + major = G.title_top, + type = 'cm', + bond = 'Strong', + offset = {x=0,y=0} + }) + G.SPLASH_LOGO:define_draw_steps({{ + shader = 'dissolve', + }}) + + G.SPLASH_LOGO.dissolve_colours = {G.C.WHITE, G.C.WHITE} + G.SPLASH_LOGO.dissolve = 1 + + + local replace_card = Card(self.title_top.T.x, self.title_top.T.y, 1.2*G.CARD_W*SC_scale, 1.2*G.CARD_H*SC_scale, G.P_CARDS.S_A, G.P_CENTERS.c_base) + self.title_top:emplace(replace_card) + + replace_card.states.visible = false + replace_card.no_ui = true + replace_card.ambient_tilt = 0.0 + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = change_context == 'game' and 1.5 or 0, + blockable = false, + blocking = false, + func = (function() + if change_context == 'splash' then + replace_card.states.visible = true + replace_card:start_materialize({G.C.WHITE,G.C.WHITE}, true, 2.5) + play_sound('whoosh1', math.random()*0.1 + 0.3,0.3) + play_sound('crumple'..math.random(1,5), math.random()*0.2 + 0.6,0.65) + else + replace_card.states.visible = true + replace_card:start_materialize({G.C.WHITE,G.C.WHITE}, nil, 1.2) + end + G.VIBRATION = G.VIBRATION + 1 + return true + end)})) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = change_context == 'splash' and 1.8 or change_context == 'game' and 2 or 0.5, + blockable = false, + blocking = false, + func = (function() + play_sound('magic_crumple'..(change_context == 'splash' and 2 or 3), (change_context == 'splash' and 1 or 1.3), 0.9) + play_sound('whoosh1', 0.4, 0.8) + ease_value(G.SPLASH_LOGO, 'dissolve', -1, nil, nil, nil, change_context == 'splash' and 2.3 or 0.9) + G.VIBRATION = G.VIBRATION + 1.5 + return true + end)})) + + delay(0.1 + (change_context == 'splash' and 2 or change_context == 'game' and 1.5 or 0)) + + if replace_card and (G.P_CENTERS.j_blueprint.unlocked) then + local viable_unlockables = {} + for k, v in ipairs(self.P_LOCKED) do + if (v.set == 'Voucher' or v.set == 'Joker') and not v.demo then + viable_unlockables[#viable_unlockables+1] = v + end + end + if #viable_unlockables > 0 then + local card + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 4.04, + func = (function() + card = Card(self.title_top.T.x, self.title_top.T.y, 1.2*G.CARD_W*SC_scale, 1.2*G.CARD_H*SC_scale, nil, pseudorandom_element(viable_unlockables) or self.P_CENTERS.j_joker) + card.no_ui = #viable_unlockables == 0 + card.states.visible = false + replace_card.parent = nil + replace_card:start_dissolve({G.C.BLACK, G.C.ORANGE, G.C.RED, G.C.GOLD}) + return true + end)})) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.04, + func = (function() + card:start_materialize() + self.title_top:emplace(card) + return true + end)})) + end + end + + G.E_MANAGER:add_event(Event({func = function() G.CONTROLLER.lock_input = false; return true end})) + set_screen_positions() + + self.title_top:sort('order') + self.title_top:set_ranks() + self.title_top:align_cards() + self.title_top:hard_set_cards() + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = change_context == 'splash' and 4.05 or change_context == 'game' and 3 or 1.5, + blockable = false, + blocking = false, + func = (function() + set_main_menu_UI() + return true + end) + })) + + --Do all career stat unlock checking here as well + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].career_stats) do + check_for_unlock({type = 'career_stat', statname = k}) + end + check_for_unlock({type = 'blind_discoveries'}) + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = function() + set_discover_tallies() + set_profile_progress() + G.REFRESH_ALERTS = true + return true + end + })) + + --VERSION + UIBox{ + definition = + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + {n=G.UIT.T, config={text = G.VERSION, scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} + }}, + config = {align="tri", offset = {x=0,y=0}, major = G.ROOM_ATTACH, bond = 'Weak'} + } +end + +function Game:demo_cta() --True if main menu is accessed from the splash screen, false if it is skipped or accessed from the game + --G.TIMERS.REAL = 12 + --G.TIMERS.TOTAL = 12 + --Prepare the main menu, reset the default deck + self:prep_stage(G.STAGES.MAIN_MENU, G.STATES.DEMO_CTA, true) + + self.GAME.selected_back = Back(G.P_CENTERS.b_red) + + G.FUNCS.change_shadows{to_key = G.SETTINGS.GRAPHICS.shadows == 'On' and 1 or 2} + + ease_background_colour{new_colour = G.C.BLACK, contrast = 1} + + if G.SPLASH_FRONT then G.SPLASH_FRONT:remove(); G.SPLASH_FRONT = nil end + if G.SPLASH_BACK then G.SPLASH_BACK:remove(); G.SPLASH_BACK = nil end + G.SPLASH_BACK = Sprite(-30, -13, G.ROOM.T.w+60, G.ROOM.T.h+22, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_BACK:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + local splash_args = {mid_flash = 1.6} + ease_value(splash_args, 'mid_flash', -1.6, nil, nil, nil, 4) + + G.SPLASH_BACK:define_draw_steps({{ + shader = 'splash', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL_SHADER'}, + {name = 'vort_speed', val = 0.4}, + {name = 'colour_1', ref_table = G.C, ref_value = 'RED'}, + {name = 'colour_2', ref_table = G.C, ref_value = 'BLUE'}, + {name = 'mid_flash', ref_table = splash_args, ref_value = 'mid_flash'}, + {name = 'vort_offset', val = 0}, + }}}) + + local SC_scale = 0.9*(G.debug_splash_size_toggle and 0.8 or 1) + + local CAI = { + TITLE_TOP_W = G.CARD_W, + TITLE_TOP_H = G.CARD_H, + } + self.title_top = CardArea( + 0, 0, + CAI.TITLE_TOP_W,CAI.TITLE_TOP_H, + {card_limit = 1, type = 'title'}) + + + G.SPLASH_LOGO = Sprite(0, 0, + 13*SC_scale, + 13*SC_scale*(G.ASSET_ATLAS["balatro"].py/G.ASSET_ATLAS["balatro"].px), + G.ASSET_ATLAS["balatro"], {x=0,y=0}) + + G.SPLASH_LOGO:set_alignment({ + major = G.title_top, + type = 'cm', + bond = 'Strong', + offset = {x=0,y=0} + }) + G.SPLASH_LOGO:define_draw_steps({{ + shader = 'dissolve', + }}) + + G.SPLASH_LOGO.dissolve_colours = {G.C.WHITE, G.C.WHITE} + G.SPLASH_LOGO.dissolve = 1 + + local replace_card = Card(self.title_top.T.x, self.title_top.T.y, 1.2*G.CARD_W*SC_scale, 1.2*G.CARD_H*SC_scale, G.P_CARDS.S_A, G.P_CENTERS.c_base) + self.title_top:emplace(replace_card) + + replace_card.states.visible = false + replace_card.no_ui = true + replace_card.ambient_tilt = 0.0 + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.1, + blockable = false, + blocking = false, + func = (function() + replace_card.states.visible = true + replace_card:start_materialize({G.C.WHITE,G.C.WHITE}, true, 2.5) + play_sound('whoosh1', math.random()*0.1 + 0.3,0.3) + play_sound('crumple'..math.random(1,5), math.random()*0.2 + 0.6,0.65) + return true + end)})) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.8, + blockable = false, + blocking = false, + func = (function() + play_sound('magic_crumple'..(2), 1, 0.9) + play_sound('whoosh1', 0.4, 0.8) + ease_value(G.SPLASH_LOGO, 'dissolve', -1, nil, nil, nil, 2.3) + return true + end)})) + + delay(0.1 + 2) + + G.E_MANAGER:add_event(Event({func = function() G.CONTROLLER.lock_input = false; return true end})) + set_screen_positions() + + self.title_top:sort('order') + self.title_top:set_ranks() + self.title_top:align_cards() + self.title_top:hard_set_cards() + + local playstack = Sprite(0,0,1.7,1.7,G.ASSET_ATLAS["playstack_logo"], {x=0, y=0}) + playstack.states.drag.can = false + local localthunk = Sprite(0,0,1*1390/560,1,G.ASSET_ATLAS["localthunk_logo"], {x=0, y=0}) + localthunk.states.drag.can = false + + self.MAIN_MENU_UI = UIBox{ + definition = {n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.3}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {'Sign up for the next demo!'}, colours = {G.C.WHITE},shadow = true, rotate = true, float = true, bump = true, scale = 0.9, spacing = 1, pop_in = 4.5})}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.3}, nodes={ + {n=G.UIT.C, config={align = "cl", minw = 5, minh = 1}, nodes={ + UIBox_button{button = 'go_to_menu', colour = G.C.ORANGE, minw = 2, minh = 1, label = {'BACK'}, scale = 0.4, col = true}, + }}, + UIBox_button{id = 'demo_cta_playbalatro', button = "go_to_playbalatro", colour = G.C.BLUE, minw = 7.65, minh = 1.95, label = {'PLAYBALATRO.COM'}, scale = 0.9, col = true}, + {n=G.UIT.C, config={align = "cr", minw = 5, minh = 1}, nodes={ + {n=G.UIT.O, config={object = localthunk}}, + {n=G.UIT.O, config={object = playstack}}, + }} + }} + }}, + config = {align="bmi", offset = {x=0,y=10}, major = G.ROOM_ATTACH, bond = 'Weak'} + } + self.MAIN_MENU_UI.states.visible = false + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 4.05, + blockable = false, + blocking = false, + func = (function() + self.MAIN_MENU_UI.states.visible = true + self.MAIN_MENU_UI.alignment.offset.y = 0 + self.MAIN_MENU_UI:align_to_major() + G.CONTROLLER:snap_to{node = self.MAIN_MENU_UI:get_UIE_by_ID('demo_cta_playbalatro')} + return true + end) + })) +end + +function Game:init_game_object() + local bosses_used = {} + for k, v in pairs(G.P_BLINDS) do + if v.boss then bosses_used[k] = 0 end + end + return { + won = false, + round_scores = { + furthest_ante = {label = 'Ante', amt = 0}, + furthest_round = {label = 'Round', amt = 0}, + hand = {label = 'Best Hand', amt = 0}, + poker_hand = {label = 'Most Played Hand', amt = 0}, + new_collection = {label = 'New Discoveries', amt = 0}, + cards_played = {label = 'Cards Played', amt = 0}, + cards_discarded = {label = 'Cards Discarded', amt = 0}, + times_rerolled = {label = 'Times Rerolled', amt = 0}, + cards_purchased = {label = 'Cards Purchased', amt = 0}, + }, + joker_usage = {}, + consumeable_usage = {}, + hand_usage = {}, + last_tarot_planet = nil, + win_ante = 8, + stake = 1, + modifiers = {}, + starting_params = get_starting_params(), + banned_keys = {}, + round = 0, + probabilities = { + normal = 1, + }, + bosses_used = bosses_used, + pseudorandom = {}, + starting_deck_size = 52, + ecto_minus = 1, + pack_size = 2, + skips = 0, + STOP_USE = 0, + edition_rate = 1, + joker_rate = 20, + tarot_rate = 4, + planet_rate = 4, + spectral_rate = 0, + playing_card_rate = 0, + consumeable_buffer = 0, + joker_buffer = 0, + discount_percent = 0, + interest_cap = 25, + interest_amount = 1, + inflation = 0, + hands_played = 0, + unused_discards = 0, + perishable_rounds = 5, + rental_rate = 3, + blind = nil, + chips = 0, + chips_text = '0', + voucher_text = '', + dollars = 0, + max_jokers = 0, + bankrupt_at = 0, + current_boss_streak = 0, + base_reroll_cost = 5, + blind_on_deck = nil, + sort = 'desc', + previous_round = { + dollars = 4 + }, + tags = {}, + tag_tally = 0, + pool_flags = {}, + used_jokers = {}, + used_vouchers = {}, + current_round = { + current_hand = { + chips = 0, + chip_text = '0', + mult = 0, + mult_text = '0', + chip_total = 0, + chip_total_text = '', + handname = "", + hand_level = '' + }, + used_packs = {}, + cards_flipped = 0, + round_text = 'Round ', + idol_card = {suit = 'Spades', rank = 'Ace'}, + mail_card = {rank = 'Ace'}, + ancient_card = {suit = 'Spades'}, + castle_card = {suit = 'Spades'}, + hands_left = 0, + hands_played = 0, + discards_left = 0, + discards_used = 0, + dollars = 0, + reroll_cost = 5, + reroll_cost_increase = 0, + jokers_purchased = 0, + free_rerolls = 0, + round_dollars = 0, + dollars_to_be_earned = '!!!', + most_played_poker_hand = 'High Card', + }, + round_resets = { + hands = 1, + discards = 1, + reroll_cost = 1, + temp_reroll_cost = nil, + temp_handsize = nil, + ante = 1, + blind_ante = 1, + blind_states = {Small = 'Select', Big = 'Upcoming', Boss = 'Upcoming'}, + loc_blind_states = {Small = '', Big = '', Boss = ''}, + blind_choices = {Small = 'bl_small', Big = 'bl_big'}, + boss_rerolled = false, + }, + round_bonus = { + next_hands = 0, + discards = 0, + }, + shop = { + joker_max = 2, + }, + cards_played = { + ['Ace'] = {suits = {}, total = 0}, + ['2'] = {suits = {}, total = 0}, + ['3'] = {suits = {}, total = 0}, + ['4'] = {suits = {}, total = 0}, + ['5'] = {suits = {}, total = 0}, + ['6'] = {suits = {}, total = 0}, + ['7'] = {suits = {}, total = 0}, + ['8'] = {suits = {}, total = 0}, + ['9'] = {suits = {}, total = 0}, + ['10'] = {suits = {}, total = 0}, + ['Jack'] = {suits = {}, total = 0}, + ['Queen'] = {suits = {}, total = 0}, + ['King'] = {suits = {}, total = 0}, + }, + hands = { + ["Flush Five"] = {visible = false, order = 1, mult = 16, chips = 160, s_mult = 16, s_chips = 160, level = 1, l_mult = 3, l_chips = 50, played = 0, played_this_round = 0, example = {{'S_A', true},{'S_A', true},{'S_A', true},{'S_A', true},{'S_A', true}}}, + ["Flush House"] = {visible = false, order = 2, mult = 14, chips = 140, s_mult = 14, s_chips = 140, level = 1, l_mult = 4, l_chips = 40, played = 0, played_this_round = 0, example = {{'D_7', true},{'D_7', true},{'D_7', true},{'D_4', true},{'D_4', true}}}, + ["Five of a Kind"] = {visible = false, order = 3, mult = 12, chips = 120, s_mult = 12, s_chips = 120, level = 1, l_mult = 3, l_chips = 35, played = 0, played_this_round = 0, example = {{'S_A', true},{'H_A', true},{'H_A', true},{'C_A', true},{'D_A', true}}}, + ["Straight Flush"] = {visible = true, order = 4, mult = 8, chips = 100, s_mult = 8, s_chips = 100, level = 1, l_mult = 4, l_chips = 40, played = 0, played_this_round = 0, example = {{'S_Q', true},{'S_J', true},{'S_T', true},{'S_9', true},{'S_8', true}}}, + ["Four of a Kind"] = {visible = true, order = 5, mult = 7, chips = 60, s_mult = 7, s_chips = 60, level = 1, l_mult = 3, l_chips = 30, played = 0, played_this_round = 0, example = {{'S_J', true},{'H_J', true},{'C_J', true},{'D_J', true},{'C_3', false}}}, + ["Full House"] = {visible = true, order = 6, mult = 4, chips = 40, s_mult = 4, s_chips = 40, level = 1, l_mult = 2, l_chips = 25, played = 0, played_this_round = 0, example = {{'H_K', true},{'C_K', true},{'D_K', true},{'S_2', true},{'D_2', true}}}, + ["Flush"] = {visible = true, order = 7, mult = 4, chips = 35, s_mult = 4, s_chips = 35, level = 1, l_mult = 2, l_chips = 15, played = 0, played_this_round = 0, example = {{'H_A', true},{'H_K', true},{'H_T', true},{'H_5', true},{'H_4', true}}}, + ["Straight"] = {visible = true, order = 8, mult = 4, chips = 30, s_mult = 4, s_chips = 30, level = 1, l_mult = 3, l_chips = 30, played = 0, played_this_round = 0, example = {{'D_J', true},{'C_T', true},{'C_9', true},{'S_8', true},{'H_7', true}}}, + ["Three of a Kind"] = {visible = true, order = 9, mult = 3, chips = 30, s_mult = 3, s_chips = 30, level = 1, l_mult = 2, l_chips = 20, played = 0, played_this_round = 0, example = {{'S_T', true},{'C_T', true},{'D_T', true},{'H_6', false},{'D_5', false}}}, + ["Two Pair"] = {visible = true, order = 10,mult = 2, chips = 20, s_mult = 2, s_chips = 20, level = 1, l_mult = 1, l_chips = 20, played = 0, played_this_round = 0, example = {{'H_A', true},{'D_A', true},{'C_Q', false},{'H_4', true},{'C_4', true}}}, + ["Pair"] = {visible = true, order = 11,mult = 2, chips = 10, s_mult = 2, s_chips = 10, level = 1, l_mult = 1, l_chips = 15, played = 0, played_this_round = 0, example = {{'S_K', false},{'S_9', true},{'D_9', true},{'H_6', false},{'D_3', false}}}, + ["High Card"] = {visible = true, order = 12,mult = 1, chips = 5, s_mult = 1, s_chips = 5, level = 1, l_mult = 1, l_chips = 10, played = 0, played_this_round = 0, example = {{'S_A', true},{'D_Q', false},{'D_9', false},{'C_4', false},{'D_3', false}}}, + } + } +end + +function Game:start_run(args) + args = args or {} + + local saveTable = args.savetext or nil + G.SAVED_GAME = nil + + self:prep_stage(G.STAGES.RUN, saveTable and saveTable.STATE or G.STATES.BLIND_SELECT) + + G.STAGE = G.STAGES.RUN + if saveTable then + check_for_unlock({type = 'continue_game'}) + end + + G.STATE_COMPLETE = false + G.RESET_BLIND_STATES = true + + if not saveTable then ease_background_colour_blind(G.STATE, 'Small Blind') + else ease_background_colour_blind(G.STATE, saveTable.BLIND.name:gsub("%s+", "") ~= '' and saveTable.BLIND.name or 'Small Blind') end + + local selected_back = saveTable and saveTable.BACK.name or (args.challenge and args.challenge.deck and args.challenge.deck.type) or (self.GAME.viewed_back and self.GAME.viewed_back.name) or self.GAME.selected_back and self.GAME.selected_back.name or 'Red Deck' + selected_back = get_deck_from_name(selected_back) + self.GAME = saveTable and saveTable.GAME or self:init_game_object() + self.GAME.modifiers = self.GAME.modifiers or {} + self.GAME.stake = args.stake or self.GAME.stake or 1 + self.GAME.STOP_USE = 0 + self.GAME.selected_back = Back(selected_back) + self.GAME.selected_back_key = selected_back + + G.C.UI_CHIPS[1], G.C.UI_CHIPS[2], G.C.UI_CHIPS[3], G.C.UI_CHIPS[4] = G.C.BLUE[1], G.C.BLUE[2], G.C.BLUE[3], G.C.BLUE[4] + G.C.UI_MULT[1], G.C.UI_MULT[2], G.C.UI_MULT[3], G.C.UI_MULT[4] = G.C.RED[1], G.C.RED[2], G.C.RED[3], G.C.RED[4] + + if not saveTable then + if self.GAME.stake >= 2 then + self.GAME.modifiers.no_blind_reward = self.GAME.modifiers.no_blind_reward or {} + self.GAME.modifiers.no_blind_reward.Small = true + end + if self.GAME.stake >= 3 then self.GAME.modifiers.scaling = 2 end + if self.GAME.stake >= 4 then self.GAME.modifiers.enable_eternals_in_shop = true end + if self.GAME.stake >= 5 then self.GAME.starting_params.discards = self.GAME.starting_params.discards - 1 end + if self.GAME.stake >= 6 then self.GAME.modifiers.scaling = 3 end + if self.GAME.stake >= 7 then self.GAME.modifiers.enable_perishables_in_shop = true end + if self.GAME.stake >= 8 then self.GAME.modifiers.enable_rentals_in_shop = true end + + self.GAME.selected_back:apply_to_run() + + if args.challenge then + self.GAME.challenge = args.challenge.id + self.GAME.challenge_tab = args.challenge + local _ch = args.challenge + if _ch.jokers then + for k, v in ipairs(_ch.jokers) do + G.E_MANAGER:add_event(Event({ + func = function() + local _joker = add_joker(v.id, v.edition, k ~= 1) + if v.eternal then _joker:set_eternal(true) end + if v.pinned then _joker.pinned = true end + return true + end + })) + end + end + if _ch.consumeables then + for k, v in ipairs(_ch.consumeables) do + G.E_MANAGER:add_event(Event({ + func = function() + add_joker(v.id, nil, k ~= 1) + return true + end + })) + end + end + if _ch.vouchers then + for k, v in ipairs(_ch.vouchers) do + G.GAME.used_vouchers[v.id] = true + G.E_MANAGER:add_event(Event({ + func = function() + G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 + Card.apply_to_run(nil, G.P_CENTERS[v.id]) + return true + end + })) + end + end + if _ch.rules then + if _ch.rules.modifiers then + for k, v in ipairs(_ch.rules.modifiers) do + self.GAME.starting_params[v.id] = v.value + end + end + if _ch.rules.custom then + for k, v in ipairs(_ch.rules.custom) do + if v.id == 'no_reward' then + self.GAME.modifiers.no_blind_reward = self.GAME.modifiers.no_blind_reward or {} + self.GAME.modifiers.no_blind_reward.Small = true + self.GAME.modifiers.no_blind_reward.Big = true + self.GAME.modifiers.no_blind_reward.Boss = true + elseif v.id == 'no_reward_specific' then + self.GAME.modifiers.no_blind_reward = self.GAME.modifiers.no_blind_reward or {} + self.GAME.modifiers.no_blind_reward[v.value] = true + elseif v.value then + self.GAME.modifiers[v.id] = v.value + elseif v.id == 'no_shop_jokers' then + self.GAME.joker_rate = 0 + else + self.GAME.modifiers[v.id] = true + end + end + end + end + if _ch.restrictions then + if _ch.restrictions.banned_cards then + for k, v in ipairs(_ch.restrictions.banned_cards) do + G.GAME.banned_keys[v.id] = true + if v.ids then + for kk, vv in ipairs(v.ids) do + G.GAME.banned_keys[vv] = true + end + end + end + end + if _ch.restrictions.banned_tags then + for k, v in ipairs(_ch.restrictions.banned_tags) do + G.GAME.banned_keys[v.id] = true + end + end + if _ch.restrictions.banned_other then + for k, v in ipairs(_ch.restrictions.banned_other) do + G.GAME.banned_keys[v.id] = true + end + end + end + end + + self.GAME.round_resets.hands = self.GAME.starting_params.hands + self.GAME.round_resets.discards = self.GAME.starting_params.discards + self.GAME.round_resets.reroll_cost = self.GAME.starting_params.reroll_cost + self.GAME.dollars = self.GAME.starting_params.dollars + self.GAME.base_reroll_cost = self.GAME.starting_params.reroll_cost + self.GAME.round_resets.reroll_cost = self.GAME.base_reroll_cost + self.GAME.current_round.reroll_cost = self.GAME.base_reroll_cost + end + + G.GAME.chips_text = '' + + if not saveTable then + if args.seed then self.GAME.seeded = true end + self.GAME.pseudorandom.seed = args.seed or (not (G.SETTINGS.tutorial_complete or G.SETTINGS.tutorial_progress.completed_parts['big_blind']) and "TUTORIAL") or generate_starting_seed() + end + + for k, v in pairs(self.GAME.pseudorandom) do if v == 0 then self.GAME.pseudorandom[k] = pseudohash(k..self.GAME.pseudorandom.seed) end end + self.GAME.pseudorandom.hashed_seed = pseudohash(self.GAME.pseudorandom.seed) + + G:save_settings() + + if not self.GAME.round_resets.blind_tags then + self.GAME.round_resets.blind_tags = {} + end + + if not saveTable then + self.GAME.round_resets.blind_choices.Boss = get_new_boss() + self.GAME.current_round.voucher = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_voucher or get_next_voucher_key() + self.GAME.round_resets.blind_tags.Small = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_tags and G.SETTINGS.tutorial_progress.forced_tags[1] or get_next_tag_key() + self.GAME.round_resets.blind_tags.Big = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_tags and G.SETTINGS.tutorial_progress.forced_tags[2] or get_next_tag_key() + else + if self.GAME.round_resets.blind and self.GAME.round_resets.blind.key then + self.GAME.round_resets.blind = G.P_BLINDS[self.GAME.round_resets.blind.key] + end + end + G.CONTROLLER.locks.load = true + G.E_MANAGER:add_event(Event({ + no_delete = true, + trigger = 'after', + blocking = false,blockable = false, + delay = 3.5, + timer = 'TOTAL', + func = function() + G.CONTROLLER.locks.load = nil + return true + end + })) + + if saveTable and saveTable.ACTION then + G.E_MANAGER:add_event(Event({delay = 0.5, trigger = 'after', blocking = false,blockable = false,func = (function() + G.E_MANAGER:add_event(Event({func = (function() + G.E_MANAGER:add_event(Event({func = (function() + for k, v in pairs(G.I.CARD) do + if v.sort_id == saveTable.ACTION.card then + G.FUNCS.use_card({config = {ref_table = v}}, nil, true) + end + end + return true + end) + })) + return true + end) + })) + return true + end) + })) + end + + local CAI = { + discard_W = G.CARD_W, + discard_H = G.CARD_H, + deck_W = G.CARD_W*1.1, + deck_H = 0.95*G.CARD_H, + hand_W = 6*G.CARD_W, + hand_H = 0.95*G.CARD_H, + play_W = 5.3*G.CARD_W, + play_H = 0.95*G.CARD_H, + joker_W = 4.9*G.CARD_W, + joker_H = 0.95*G.CARD_H, + consumeable_W = 2.3*G.CARD_W, + consumeable_H = 0.95*G.CARD_H + } + + + self.consumeables = CardArea( + 0, 0, + CAI.consumeable_W, + CAI.consumeable_H, + {card_limit = self.GAME.starting_params.consumable_slots, type = 'joker', highlight_limit = 1}) + + self.jokers = CardArea( + 0, 0, + CAI.joker_W, + CAI.joker_H, + {card_limit = self.GAME.starting_params.joker_slots, type = 'joker', highlight_limit = 1}) + + self.discard = CardArea( + 0, 0, + CAI.discard_W,CAI.discard_H, + {card_limit = 500, type = 'discard'}) + self.deck = CardArea( + 0, 0, + CAI.deck_W,CAI.deck_H, + {card_limit = 52, type = 'deck'}) + self.hand = CardArea( + 0, 0, + CAI.hand_W,CAI.hand_H, + {card_limit = self.GAME.starting_params.hand_size, type = 'hand'}) + self.play = CardArea( + 0, 0, + CAI.play_W,CAI.play_H, + {card_limit = 5, type = 'play'}) + + G.playing_cards = {} + + set_screen_positions() + + G.SPLASH_BACK = Sprite(-30, -6, G.ROOM.T.w+60, G.ROOM.T.h+12, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_BACK:set_alignment({ + major = G.play, + type = 'cm', + bond = 'Strong', + offset = {x=0,y=0} + }) + + G.ARGS.spin = { + amount = 0, + real = 0, + eased = 0 + } + + G.SPLASH_BACK:define_draw_steps({{ + shader = 'background', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL_SHADER'}, + {name = 'spin_time', ref_table = G.TIMERS, ref_value = 'BACKGROUND'}, + {name = 'colour_1', ref_table = G.C.BACKGROUND, ref_value = 'C'}, + {name = 'colour_2', ref_table = G.C.BACKGROUND, ref_value = 'L'}, + {name = 'colour_3', ref_table = G.C.BACKGROUND, ref_value = 'D'}, + {name = 'contrast', ref_table = G.C.BACKGROUND, ref_value = 'contrast'}, + {name = 'spin_amount', ref_table = G.ARGS.spin, ref_value = 'amount'} + }}}) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + blocking = false, + blockable = false, + func = (function() + local _dt = G.ARGS.spin.amount > G.ARGS.spin.eased and G.real_dt*2. or 0.3*G.real_dt + local delta = G.ARGS.spin.real - G.ARGS.spin.eased + if math.abs(delta) > _dt then delta = delta*_dt/math.abs(delta) end + G.ARGS.spin.eased = G.ARGS.spin.eased + delta + G.ARGS.spin.amount = _dt*(G.ARGS.spin.eased) + (1 - _dt)*G.ARGS.spin.amount + G.TIMERS.BACKGROUND = G.TIMERS.BACKGROUND - 60*(G.ARGS.spin.eased - G.ARGS.spin.amount)*_dt + end) + })) + + if saveTable then + local cardAreas = saveTable.cardAreas + for k, v in pairs(cardAreas) do + if G[k] then G[k]:load(v) + else + G['load_'..k] = v + print("ERROR LOADING GAME: Card area '"..k.."' not instantiated before load") end + end + + for k, v in pairs(G.I.CARD) do + if v.playing_card then + table.insert(G.playing_cards, v) + end + end + for k, v in pairs(G.I.CARDAREA) do + v:align_cards() + v:hard_set_cards() + end + table.sort(G.playing_cards, function (a, b) return a.playing_card > b.playing_card end ) + else + local card_protos = nil + local _de = nil + if args.challenge and args.challenge.deck then + _de = args.challenge.deck + end + + if _de and _de.cards then + card_protos = _de.cards + end + + if not card_protos then + card_protos = {} + for k, v in pairs(self.P_CARDS) do + local _ = nil + if self.GAME.starting_params.erratic_suits_and_ranks then _, k = pseudorandom_element(G.P_CARDS, pseudoseed('erratic')) end + local _r, _s = string.sub(k, 3, 3), string.sub(k, 1, 1) + local keep, _e, _d, _g = true, nil, nil, nil + if _de then + if _de.yes_ranks and not _de.yes_ranks[_r] then keep = false end + if _de.no_ranks and _de.no_ranks[_r] then keep = false end + if _de.yes_suits and not _de.yes_suits[_s] then keep = false end + if _de.no_suits and _de.no_suits[_s] then keep = false end + if _de.enhancement then _e = _de.enhancement end + if _de.edition then _d = _de.edition end + if _de.gold_seal then _g = _de.gold_seal end + end + + if self.GAME.starting_params.no_faces and (_r == 'K' or _r == 'Q' or _r == 'J') then keep = false end + + if keep then card_protos[#card_protos+1] = {s=_s,r=_r,e=_e,d=_d,g=_g} end + end + end + + if self.GAME.starting_params.extra_cards then + for k, v in pairs(self.GAME.starting_params.extra_cards) do + card_protos[#card_protos+1] = v + end + end + + table.sort(card_protos, function (a, b) return + ((a.s or '')..(a.r or '')..(a.e or '')..(a.d or '')..(a.g or '')) < + ((b.s or '')..(b.r or '')..(b.e or '')..(b.d or '')..(b.g or '')) end) + + for k, v in ipairs(card_protos) do + card_from_control(v) + end + + self.GAME.starting_deck_size = #G.playing_cards + end + + delay(0.5) + + if not saveTable then + G.GAME.current_round.discards_left = G.GAME.round_resets.discards + G.GAME.current_round.hands_left = G.GAME.round_resets.hands + self.deck:shuffle() + self.deck:hard_set_T() + reset_idol_card() + reset_mail_rank() + self.GAME.current_round.ancient_card.suit = nil + reset_ancient_card() + reset_castle_card() + end + + G.GAME.blind = Blind(0,0,2, 1) + self.deck:align_cards() + self.deck:hard_set_cards() + + self.HUD = UIBox{ + definition = create_UIBox_HUD(), + config = {align=('cli'), offset = {x=-0.7,y=0},major = G.ROOM_ATTACH} + } + self.HUD_blind = UIBox{ + definition = create_UIBox_HUD_blind(), + config = {major = G.HUD:get_UIE_by_ID('row_blind'), align = 'cm', offset = {x=0,y=-10}, bond = 'Weak'} + } + self.HUD_tags = {} + + G.hand_text_area = { + chips = self.HUD:get_UIE_by_ID('hand_chips'), + mult = self.HUD:get_UIE_by_ID('hand_mult'), + ante = self.HUD:get_UIE_by_ID('ante_UI_count'), + round = self.HUD:get_UIE_by_ID('round_UI_count'), + chip_total = self.HUD:get_UIE_by_ID('hand_chip_total'), + handname = self.HUD:get_UIE_by_ID('hand_name'), + hand_level = self.HUD:get_UIE_by_ID('hand_level'), + game_chips = self.HUD:get_UIE_by_ID('chip_UI_count'), + blind_chips = self.HUD_blind:get_UIE_by_ID('HUD_blind_count'), + blind_spacer = self.HUD:get_UIE_by_ID('blind_spacer') + } + + check_and_set_high_score('most_money', G.GAME.dollars) + + if saveTable then + G.GAME.blind:load(saveTable.BLIND) + G.GAME.tags = {} + local tags = saveTable.tags or {} + for k, v in ipairs(tags) do + local _tag = Tag('tag_uncommon') + _tag:load(v) + add_tag(_tag) + end + else + G.GAME.blind:set_blind(nil, nil, true) + reset_blinds() + end + + G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips) + + self.HUD:recalculate() + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + unlock_notify() + return true + end) + })) + +end + +function Game:update(dt) + nuGC(nil, nil, true) + + G.MAJORS = 0 + G.MINORS = 0 + + G.FRAMES.MOVE = G.FRAMES.MOVE + 1 + timer_checkpoint('start->discovery', 'update') + if not G.SETTINGS.tutorial_complete then G.FUNCS.tutorial_controller() end + timer_checkpoint('tallies', 'update') + modulate_sound(dt) + timer_checkpoint('sounds', 'update') + update_canvas_juice(dt) + timer_checkpoint('canvas and juice', 'update') + --Smooth out the dts to avoid any big jumps + self.TIMERS.REAL = self.TIMERS.REAL + dt + self.TIMERS.REAL_SHADER = G.SETTINGS.reduced_motion and 300 or self.TIMERS.REAL + self.TIMERS.UPTIME = self.TIMERS.UPTIME + dt + self.SETTINGS.DEMO.total_uptime = (self.SETTINGS.DEMO.total_uptime or 0) + dt + self.TIMERS.BACKGROUND = self.TIMERS.BACKGROUND + dt*(G.ARGS.spin and G.ARGS.spin.amount or 0) + self.real_dt = dt + + if self.real_dt > 0.05 then print('LONG DT @ '..math.floor(G.TIMERS.REAL)..': '..self.real_dt) end + if not G.fbf or G.new_frame then + G.new_frame = false + + set_alerts() + timer_checkpoint('alerts', 'update') + + local http_resp = G.HTTP_MANAGER.in_channel:pop() + if http_resp then + G.ARGS.HIGH_SCORE_RESPONSE = http_resp + end + + + if G.SETTINGS.paused then dt = 0 end + + if G.STATE ~= G.ACC_state then G.ACC = 0 end + G.ACC_state = G.STATE + + if (G.STATE == G.STATES.HAND_PLAYED) or (G.STATE == G.STATES.NEW_ROUND) then + G.ACC = math.min((G.ACC or 0) + dt*0.2*self.SETTINGS.GAMESPEED, 16) + else + G.ACC = 0 + end + + self.SPEEDFACTOR = (G.STAGE == G.STAGES.RUN and not G.SETTINGS.paused and not G.screenwipe) and self.SETTINGS.GAMESPEED or 1 + self.SPEEDFACTOR = self.SPEEDFACTOR + math.max(0, math.abs(G.ACC) - 2) + + self.TIMERS.TOTAL = self.TIMERS.TOTAL + dt*(self.SPEEDFACTOR) + + self.C.DARK_EDITION[1] = 0.6+0.2*math.sin(self.TIMERS.REAL*1.3) + self.C.DARK_EDITION[3] = 0.6+0.2*(1- math.sin(self.TIMERS.REAL*1.3)) + self.C.DARK_EDITION[2] = math.min(self.C.DARK_EDITION[3], self.C.DARK_EDITION[1]) + + self.C.EDITION[1] = 0.7+0.2*(1+math.sin(self.TIMERS.REAL*1.5 + 0)) + self.C.EDITION[3] = 0.7+0.2*(1+math.sin(self.TIMERS.REAL*1.5 + 3)) + self.C.EDITION[2] = 0.7+0.2*(1+math.sin(self.TIMERS.REAL*1.5 + 6)) + + + self.E_MANAGER:update(self.real_dt) + timer_checkpoint('e_manager', 'update') + + if G.GAME.blind and G.boss_throw_hand and self.STATE == self.STATES.SELECTING_HAND then + if not self.boss_warning_text then + self.boss_warning_text = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, padding = 0.2}, nodes={ + {n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={ + {n=G.UIT.O, config={object = DynaText({scale = 0.7, string = localize('ph_unscored_hand'), maxw = 9, colours = {G.C.WHITE},float = true, shadow = true, silent = true, pop_in = 0, pop_in_rate = 6})}}, + }}, + {n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={ + {n=G.UIT.O, config={object = DynaText({scale = 0.6, string = G.GAME.blind:get_loc_debuff_text(), maxw = 9, colours = {G.C.WHITE},float = true, shadow = true, silent = true, pop_in = 0, pop_in_rate = 6})}}, + }} + }}, + config = { + align = 'cm', + offset ={x=0,y=-3.1}, + major = G.play, + } + } + self.boss_warning_text.attention_text = true + self.boss_warning_text.states.collide.can = false + G.GAME.blind.children.animatedSprite:juice_up(0.05, 0.02) + play_sound('chips1', math.random()*0.1 + 0.55, 0.12) + end + else + G.boss_throw_hand = nil + if self.boss_warning_text then + self.boss_warning_text:remove() + self.boss_warning_text = nil + end + end + + + if self.STATE == self.STATES.SELECTING_HAND then + if (not G.hand.cards[1]) and G.deck.cards[1] then + G.STATE = G.STATES.DRAW_TO_HAND + G.STATE_COMPLETE = false + else + self:update_selecting_hand(dt) + end + end + + if self.STATE == self.STATES.SHOP then + self:update_shop(dt) + end + + if self.STATE == self.STATES.PLAY_TAROT then + self:update_play_tarot(dt) + end + + if self.STATE == self.STATES.HAND_PLAYED then + self:update_hand_played(dt) + end + + if self.STATE == self.STATES.DRAW_TO_HAND then + self:update_draw_to_hand(dt) + end + + if self.STATE == self.STATES.NEW_ROUND then + self:update_new_round(dt) + end + + if self.STATE == self.STATES.BLIND_SELECT then + self:update_blind_select(dt) + end + + if self.STATE == self.STATES.ROUND_EVAL then + self:update_round_eval(dt) + end + + if self.STATE == self.STATES.TAROT_PACK then + self:update_arcana_pack(dt) + end + + if self.STATE == self.STATES.SPECTRAL_PACK then + self:update_spectral_pack(dt) + end + + if self.STATE == self.STATES.STANDARD_PACK then + self:update_standard_pack(dt) + end + + if self.STATE == self.STATES.BUFFOON_PACK then + self:update_buffoon_pack(dt) + end + + if self.STATE == self.STATES.PLANET_PACK then + self:update_celestial_pack(dt) + end + + if self.STATE == self.STATES.GAME_OVER then + self:update_game_over(dt) + end + + if self.STATE == self.STATES.MENU then + self:update_menu(dt) + end + timer_checkpoint('states', 'update') + --animate all animated objects + remove_nils(self.ANIMATIONS) + + for k, v in pairs(self.ANIMATIONS) do + v:animate(self.real_dt*self.SPEEDFACTOR) + end + timer_checkpoint('animate', 'update') + + --move and update all other moveables + G.exp_times.xy = math.exp(-50*self.real_dt) + G.exp_times.scale = math.exp(-60*self.real_dt) + G.exp_times.r = math.exp(-190*self.real_dt) + + local move_dt = math.min(1/20, self.real_dt) + + G.exp_times.max_vel = 70*move_dt + + for k, v in pairs(self.MOVEABLES) do + if v.FRAME.MOVE < G.FRAMES.MOVE then v:move(move_dt) end + end + timer_checkpoint('move', 'update') + + for k, v in pairs(self.MOVEABLES) do + v:update(dt*self.SPEEDFACTOR) + v.states.collide.is = false + end + timer_checkpoint('update', 'update') + end + + self.CONTROLLER:update(self.real_dt) + + --update loc strings if needed + if G.prev_small_state ~= G.GAME.round_resets.blind_states.Small or + G.prev_large_state ~= G.GAME.round_resets.blind_states.Big or + G.prev_boss_state ~= G.GAME.round_resets.blind_states.Boss or G.RESET_BLIND_STATES then + G.RESET_BLIND_STATES = nil + G.prev_small_state = G.GAME.round_resets.blind_states.Small + G.prev_large_state = G.GAME.round_resets.blind_states.Big + G.prev_boss_state = G.GAME.round_resets.blind_states.Boss + G.GAME.round_resets.loc_blind_states.Small = localize(G.GAME.round_resets.blind_states.Small,'blind_states') + G.GAME.round_resets.loc_blind_states.Big = localize(G.GAME.round_resets.blind_states.Big,'blind_states') + G.GAME.round_resets.loc_blind_states.Boss = localize(G.GAME.round_resets.blind_states.Boss,'blind_states') + end + + --Send all steam updates if needed + if G.STEAM and G.STEAM.send_control.update_queued and ( + G.STEAM.send_control.force or + G.STEAM.send_control.last_sent_stage ~= G.STAGE or + G.STEAM.send_control.last_sent_time < G.TIMERS.UPTIME - 120) then + if G.STEAM.userStats.storeStats() then + G.STEAM.send_control.force = false + G.STEAM.send_control.last_sent_stage = G.STAGE + G.STEAM.send_control.last_sent_time = G.TIMERS.UPTIME + G.STEAM.send_control.update_queued = false + else + G.DEBUG_VALUE = 'UNABLE TO STORE STEAM STATS' + end + end + + + if G.DEBUG then + local text_count,uie_count, card_count, uib_count, all = 0,0, 0, 0,0 + for k, v in pairs(G.STAGE_OBJECTS[G.STAGE]) do + all = all + 1 + if v:is(DynaText) then text_count = text_count + 1 end + if v:is(Card) then card_count = card_count + 1 end + if v:is(UIElement) then uie_count = uie_count + 1 end + if v:is(UIBox) then uib_count = uib_count + 1 end + end + + G.DEBUG_VALUE = 'text: '..text_count..'\n'.. + 'uie: '..uie_count..'\n'.. + 'card: '..card_count..'\n'.. + 'uib: '..uib_count..'\n'..'all: '..all + end + + --Save every 10 seconds, unless forced or paused/unpaused + if G.FILE_HANDLER and G.FILE_HANDLER and G.FILE_HANDLER.update_queued and ( + G.FILE_HANDLER.force or + G.FILE_HANDLER.last_sent_stage ~= G.STAGE or + ((G.FILE_HANDLER.last_sent_pause ~= G.SETTINGS.paused) and G.FILE_HANDLER.run) or + (not G.FILE_HANDLER.last_sent_time or (G.FILE_HANDLER.last_sent_time < (G.TIMERS.UPTIME - G.F_SAVE_TIMER)))) then + + if G.FILE_HANDLER.metrics then + G.SAVE_MANAGER.channel:push({ + type = 'save_metrics', + save_metrics = G.ARGS.save_metrics + }) + end + + if G.FILE_HANDLER.progress then + G.SAVE_MANAGER.channel:push({ + type = 'save_progress', + save_progress = G.ARGS.save_progress + }) + elseif G.FILE_HANDLER.settings then + G.SAVE_MANAGER.channel:push({ + type = 'save_settings', + save_settings = G.ARGS.save_settings, + profile_num = G.SETTINGS.profile, + save_profile = G.PROFILES[G.SETTINGS.profile] + }) + end + + if G.FILE_HANDLER.run then + G.SAVE_MANAGER.channel:push({ + type = 'save_run', + save_table = G.ARGS.save_run, + profile_num = G.SETTINGS.profile}) + G.SAVED_GAME = nil + end + + G.FILE_HANDLER.force = false + G.FILE_HANDLER.last_sent_stage = G.STAGE + G.FILE_HANDLER.last_sent_time = G.TIMERS.UPTIME + G.FILE_HANDLER.last_sent_pause = G.SETTINGS.paused + G.FILE_HANDLER.settings = nil + G.FILE_HANDLER.progress = nil + G.FILE_HANDLER.metrics = nil + G.FILE_HANDLER.run = nil + end +end + +function Game:draw() + G.FRAMES.DRAW = G.FRAMES.DRAW + 1 + --draw the room + reset_drawhash() + if G.OVERLAY_TUTORIAL and not G.OVERLAY_MENU then G.under_overlay = true end + timer_checkpoint('start->canvas', 'draw') + love.graphics.setCanvas{self.CANVAS} + love.graphics.push() + love.graphics.scale(G.CANV_SCALE) + + love.graphics.setShader() + love.graphics.clear(0,0,0,1) + + if G.SPLASH_BACK then + if G.debug_background_toggle then + love.graphics.clear({0,1,0,1}) + else + love.graphics.push() + G.SPLASH_BACK:translate_container() + G.SPLASH_BACK:draw() + love.graphics.pop() + end + end + + if not G.debug_UI_toggle then + + for k, v in pairs(self.I.NODE) do + if not v.parent then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + for k, v in pairs(self.I.MOVEABLE) do + if not v.parent then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + if G.SPLASH_LOGO then + love.graphics.push() + G.SPLASH_LOGO:translate_container() + G.SPLASH_LOGO:draw() + love.graphics.pop() + end + + if G.debug_splash_size_toggle then + for k, v in pairs(self.I.CARDAREA) do + if not v.parent then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + else + if (not self.OVERLAY_MENU) or (not self.F_HIDE_BG) then + timer_checkpoint('primatives', 'draw') + for k, v in pairs(self.I.UIBOX) do + if not v.attention_text and not v.parent and v ~= self.OVERLAY_MENU and v ~= self.screenwipe and v ~= self.OVERLAY_TUTORIAL and v ~= self.debug_tools and v ~= self.online_leaderboard and v ~= self.achievement_notification then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + timer_checkpoint('uiboxes', 'draw') + for k, v in pairs(self.I.CARDAREA) do + if not v.parent then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + for k, v in pairs(self.I.CARD) do + if (not v.parent and v ~= self.CONTROLLER.dragging.target and v ~= self.CONTROLLER.focused.target) then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + for k, v in pairs(self.I.UIBOX) do + if v.attention_text and v ~= self.debug_tools and v ~= self.online_leaderboard and v ~= self.achievement_notification then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + if G.SPLASH_FRONT then + love.graphics.push() + G.SPLASH_FRONT:translate_container() + G.SPLASH_FRONT:draw() + love.graphics.pop() + end + + G.under_overlay = false + if self.OVERLAY_TUTORIAL then + love.graphics.push() + self.OVERLAY_TUTORIAL:translate_container() + self.OVERLAY_TUTORIAL:draw() + love.graphics.pop() + + if self.OVERLAY_TUTORIAL.highlights then + for k, v in ipairs(self.OVERLAY_TUTORIAL.highlights) do + love.graphics.push() + v:translate_container() + v:draw() + if v.draw_children then + v:draw_self() + v:draw_children() + end + love.graphics.pop() + end + end + end + end + if (self.OVERLAY_MENU) or (not self.F_HIDE_BG) then + if self.OVERLAY_MENU and self.OVERLAY_MENU ~= self.CONTROLLER.dragging.target then + love.graphics.push() + self.OVERLAY_MENU:translate_container() + self.OVERLAY_MENU:draw() + love.graphics.pop() + end + end + + if self.debug_tools then + if self.debug_tools ~= self.CONTROLLER.dragging.target then + love.graphics.push() + self.debug_tools:translate_container() + self.debug_tools:draw() + love.graphics.pop() + end + end + + G.ALERT_ON_SCREEN = nil + for k, v in pairs(self.I.ALERT) do + love.graphics.push() + v:translate_container() + v:draw() + G.ALERT_ON_SCREEN = true + love.graphics.pop() + end + + if self.CONTROLLER.dragging.target and self.CONTROLLER.dragging.target ~= self.CONTROLLER.focused.target then + love.graphics.push() + G.CONTROLLER.dragging.target:translate_container() + G.CONTROLLER.dragging.target:draw() + love.graphics.pop() + end + + if self.CONTROLLER.focused.target and getmetatable(self.CONTROLLER.focused.target) == Card and + (self.CONTROLLER.focused.target.area ~= G.hand or self.CONTROLLER.focused.target == self.CONTROLLER.dragging.target) then + love.graphics.push() + G.CONTROLLER.focused.target:translate_container() + G.CONTROLLER.focused.target:draw() + love.graphics.pop() + end + + for k, v in pairs(self.I.POPUP) do + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + + if self.achievement_notification then + love.graphics.push() + self.achievement_notification:translate_container() + self.achievement_notification:draw() + love.graphics.pop() + end + + + if self.screenwipe then + love.graphics.push() + self.screenwipe:translate_container() + self.screenwipe:draw() + love.graphics.pop() + end + + love.graphics.push() + self.CURSOR:translate_container() + love.graphics.translate(-self.CURSOR.T.w*G.TILESCALE*G.TILESIZE*0.5, -self.CURSOR.T.h*G.TILESCALE*G.TILESIZE*0.5) + self.CURSOR:draw() + love.graphics.pop() + timer_checkpoint('rest', 'draw') + end +end +love.graphics.pop() + + love.graphics.setCanvas(G.AA_CANVAS) + love.graphics.push() + love.graphics.setColor(G.C.WHITE) + if (not G.recording_mode or G.video_control )and true then + G.ARGS.eased_cursor_pos = G.ARGS.eased_cursor_pos or {x=G.CURSOR.T.x,y=G.CURSOR.T.y, sx = G.CONTROLLER.cursor_position.x, sy = G.CONTROLLER.cursor_position.y} + G.screenwipe_amt = G.screenwipe_amt and (0.95*G.screenwipe_amt + 0.05*((self.screenwipe and 0.4 or self.screenglitch and 0.4) or 0)) or 1 + G.SETTINGS.GRAPHICS.crt = G.SETTINGS.GRAPHICS.crt*0.3 + G.SHADERS['CRT']:send('distortion_fac', {1.0 + 0.07*G.SETTINGS.GRAPHICS.crt/100, 1.0 + 0.1*G.SETTINGS.GRAPHICS.crt/100}) + G.SHADERS['CRT']:send('scale_fac', {1.0 - 0.008*G.SETTINGS.GRAPHICS.crt/100, 1.0 - 0.008*G.SETTINGS.GRAPHICS.crt/100}) + G.SHADERS['CRT']:send('feather_fac', 0.01) + G.SHADERS['CRT']:send('bloom_fac', G.SETTINGS.GRAPHICS.bloom - 1) + G.SHADERS['CRT']:send('time',400 + G.TIMERS.REAL) + G.SHADERS['CRT']:send('noise_fac',0.001*G.SETTINGS.GRAPHICS.crt/100) + G.SHADERS['CRT']:send('crt_intensity', 0.16*G.SETTINGS.GRAPHICS.crt/100) + G.SHADERS['CRT']:send('glitch_intensity', 0)--0.1*G.SETTINGS.GRAPHICS.crt/100 + (G.screenwipe_amt) + 1) + G.SHADERS['CRT']:send('scanlines', G.CANVAS:getPixelHeight()*0.75/G.CANV_SCALE) + G.SHADERS['CRT']:send('mouse_screen_pos', G.video_control and {love.graphics.getWidth( )/2, love.graphics.getHeight( )/2} or {G.ARGS.eased_cursor_pos.sx, G.ARGS.eased_cursor_pos.sy}) + G.SHADERS['CRT']:send('screen_scale', G.TILESCALE*G.TILESIZE) + G.SHADERS['CRT']:send('hovering', 1) + love.graphics.setShader( G.SHADERS['CRT']) + G.SETTINGS.GRAPHICS.crt = G.SETTINGS.GRAPHICS.crt/0.3 + end + + love.graphics.draw(self.CANVAS, 0, 0) + love.graphics.pop() + + love.graphics.setCanvas() + love.graphics.setShader() + + if G.AA_CANVAS then + love.graphics.push() + love.graphics.scale(1/G.CANV_SCALE) + love.graphics.draw(G.AA_CANVAS, 0, 0) + love.graphics.pop() + end + + timer_checkpoint('canvas', 'draw') + + if not _RELEASE_MODE and G.DEBUG and not G.video_control and G.F_VERBOSE then + love.graphics.push() + love.graphics.setColor(0, 1, 1,1) + local fps = love.timer.getFPS( ) + love.graphics.print("Current FPS: "..fps, 10, 10) + + if G.check and G.SETTINGS.perf_mode then + local section_h = 30 + local resolution = 60*section_h + local poll_w = 1 + local v_off = 100 + for a, b in ipairs({G.check.update, G.check.draw}) do + for k, v in ipairs(b.checkpoint_list) do + love.graphics.setColor(0,0,0,0.2) + love.graphics.rectangle('fill', 12, 20 + v_off,poll_w+poll_w*#v.trend,-section_h + 5) + for kk, vv in ipairs(v.trend) do + if a == 2 then + love.graphics.setColor(0.3,0.7,0.7,1) + else + love.graphics.setColor(self:state_col(v.states[kk] or 123)) + end + love.graphics.rectangle('fill', 10+poll_w*kk, 20 + v_off, 5*poll_w, -(vv)*resolution) + end + love.graphics.setColor(a == 2 and 0.5 or 1, a == 2 and 1 or 0.5, 1,1) + love.graphics.print(v.label..': '..(string.format("%.2f",1000*(v.average or 0)))..'\n', 10, -section_h + 30 + v_off) + v_off = v_off + section_h + end + end + end + + love.graphics.pop() + end + timer_checkpoint('debug', 'draw') +end + +function Game:state_col(_state) + return (_state*15251252.2/5.132)%1, (_state*1422.5641311/5.42)%1, (_state*1522.1523122/5.132)%1, 1 +end + +function Game:update_selecting_hand(dt) + if not self.deck_preview and not G.OVERLAY_MENU and ( + (self.deck and self.deck.cards[1] and self.deck.cards[1].states.collide.is and ((not self.deck.cards[1].states.drag.is) or self.CONTROLLER.HID.touch) and (not self.CONTROLLER.HID.controller)) or + G.CONTROLLER.held_buttons.triggerleft) then + if self.buttons then + self.buttons.states.visible = false + end + self.deck_preview = UIBox{ + definition = self.UIDEF.deck_preview(), + config = {align='tm', offset = {x=0,y=-0.8},major = self.hand, bond = 'Weak'} + } + self.E_MANAGER:add_event(Event({ + blocking = false, + blockable = false, + func = function() + if self.deck_preview and not (((self.deck and self.deck.cards[1] and self.deck.cards[1].states.collide.is and not self.CONTROLLER.HID.controller)) or G.CONTROLLER.held_buttons.triggerleft) then + self.deck_preview:remove() + self.deck_preview = nil + local _card = G.CONTROLLER.focused.target + local start = G.TIMERS.REAL + self.E_MANAGER:add_event(Event({ + func = function() + if _card and _card.area and _card.area == G.hand then + local _x, _y = _card:put_focused_cursor() + G.CONTROLLER:update_cursor({x=_x/(G.TILESCALE*G.TILESIZE),y=_y/(G.TILESCALE*G.TILESIZE)}) + end + if start + 0.4 < G.TIMERS.REAL then + return true + end + end + })) + return true + end + end + })) + end + if not self.buttons and not self.deck_preview then + self.buttons = UIBox{ + definition = create_UIBox_buttons(), + config = {align="bm", offset = {x=0,y=0.3},major = G.hand, bond = 'Weak'} + } + end + if self.buttons and not self.buttons.states.visible and not self.deck_preview then + self.buttons.states.visible = true + end + + if #G.hand.cards < 1 and #G.deck.cards < 1 and #G.play.cards < 1 then + end_round() + end + + if self.shop then self.shop:remove(); self.shop = nil end + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + if #G.hand.cards < 1 and #G.deck.cards < 1 then + end_round() + else + save_run() + G.CONTROLLER:recall_cardarea_focus('hand') + end + end +end + +function Game:update_shop(dt) + if not G.STATE_COMPLETE then + stop_use() + ease_background_colour_blind(G.STATES.SHOP) + local shop_exists = not not G.shop + G.shop = G.shop or UIBox{ + definition = G.UIDEF.shop(), + config = {align='tmi', offset = {x=0,y=G.ROOM.T.y+11},major = G.hand, bond = 'Weak'} + } + G.E_MANAGER:add_event(Event({ + func = function() + G.shop.alignment.offset.y = -5.3 + G.shop.alignment.offset.x = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.2, + blockable = false, + func = function() + if math.abs(G.shop.T.y - G.shop.VT.y) < 3 then + G.ROOM.jiggle = G.ROOM.jiggle + 3 + play_sound('cardFan2') + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'shop_start'}) + end + local nosave_shop = nil + if not shop_exists then + + if G.load_shop_jokers then + nosave_shop = true + G.shop_jokers:load(G.load_shop_jokers) + for k, v in ipairs(G.shop_jokers.cards) do + create_shop_card_ui(v) + if v.ability.consumeable then v:start_materialize() end + for _kk, vvv in ipairs(G.GAME.tags) do + if vvv:apply_to_run({type = 'store_joker_modify', card = v}) then break end + end + end + G.load_shop_jokers = nil + else + for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do + G.shop_jokers:emplace(create_card_for_shop(G.shop_jokers)) + end + end + + if G.load_shop_vouchers then + nosave_shop = true + G.shop_vouchers:load(G.load_shop_vouchers) + for k, v in ipairs(G.shop_vouchers.cards) do + create_shop_card_ui(v) + v:start_materialize() + end + G.load_shop_vouchers = nil + else + if G.GAME.current_round.voucher and G.P_CENTERS[G.GAME.current_round.voucher] then + local card = Card(G.shop_vouchers.T.x + G.shop_vouchers.T.w/2, + G.shop_vouchers.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[G.GAME.current_round.voucher],{bypass_discovery_center = true, bypass_discovery_ui = true}) + card.shop_voucher = true + create_shop_card_ui(card, 'Voucher', G.shop_vouchers) + card:start_materialize() + G.shop_vouchers:emplace(card) + end + end + + + if G.load_shop_booster then + nosave_shop = true + G.shop_booster:load(G.load_shop_booster) + for k, v in ipairs(G.shop_booster.cards) do + create_shop_card_ui(v) + v:start_materialize() + end + G.load_shop_booster = nil + else + for i = 1, 2 do + G.GAME.current_round.used_packs = G.GAME.current_round.used_packs or {} + if not G.GAME.current_round.used_packs[i] then + G.GAME.current_round.used_packs[i] = get_pack('shop_pack').key + end + + if G.GAME.current_round.used_packs[i] ~= 'USED' then + local card = Card(G.shop_booster.T.x + G.shop_booster.T.w/2, + G.shop_booster.T.y, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[G.GAME.current_round.used_packs[i]], {bypass_discovery_center = true, bypass_discovery_ui = true}) + create_shop_card_ui(card, 'Booster', G.shop_booster) + card.ability.booster_pos = i + card:start_materialize() + G.shop_booster:emplace(card) + end + end + + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'voucher_add'}) + end + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'shop_final_pass'}) + end + end + end + + G.CONTROLLER:snap_to({node = G.shop:get_UIE_by_ID('next_round_button')}) + if not nosave_shop then G.E_MANAGER:add_event(Event({ func = function() save_run(); return true end})) end + return true + end + end})) + return true + end + })) + G.STATE_COMPLETE = true + end + if self.buttons then self.buttons:remove(); self.buttons = nil end +end + +function Game:update_play_tarot(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end +end + +function Game:update_hand_played(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if G.GAME.chips - G.GAME.blind.chips >= 0 or G.GAME.current_round.hands_left < 1 then + G.STATE = G.STATES.NEW_ROUND + else + G.STATE = G.STATES.DRAW_TO_HAND + end + G.STATE_COMPLETE = false + return true + end + })) + end +end + +function Game:update_draw_to_hand(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'round_start_bonus'}) + end + ease_background_colour_blind(G.STATES.DRAW_TO_HAND) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if G.FUNCS.draw_from_deck_to_hand(nil) then + return true + end + + if G.GAME.current_round.hands_played == 0 and + G.GAME.current_round.discards_used == 0 and G.GAME.facing_blind then + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({first_hand_drawn = true}) + end + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE = G.STATES.SELECTING_HAND + G.STATE_COMPLETE = false + G.GAME.blind:drawn_to_hand() + return true + end + })) + return true + end + })) + end +end + +function Game:update_new_round(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + end_round() + end +end + +function Game:update_blind_select(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + stop_use() + ease_background_colour_blind(G.STATES.BLIND_SELECT) + G.E_MANAGER:add_event(Event({ func = function() save_run(); return true end})) + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + --G.GAME.round_resets.blind_states = G.GAME.round_resets.blind_states or {Small = 'Select', Big = 'Upcoming', Boss = 'Upcoming'} + --if G.GAME.round_resets.blind_states.Boss == 'Defeated' then + -- G.GAME.round_resets.blind_states.Small = 'Upcoming' + -- G.GAME.round_resets.blind_states.Big = 'Upcoming' + -- G.GAME.round_resets.blind_states.Boss = 'Upcoming' + -- G.GAME.blind_on_deck = 'Small' + -- G.GAME.round_resets.blind_choices.Boss = get_new_boss() + -- G.GAME.round_resets.boss_rerolled = false + --end + play_sound('cancel') + G.blind_select = UIBox{ + definition = create_UIBox_blind_select(), + config = {align="bmi", offset = {x=0,y=G.ROOM.T.y + 29},major = G.hand, bond = 'Weak'} + } + G.blind_select.alignment.offset.y = 0.8-(G.hand.T.y - G.jokers.T.y) + G.blind_select.T.h + G.ROOM.jiggle = G.ROOM.jiggle + 3 + G.blind_select.alignment.offset.x = 0 + G.CONTROLLER.lock_input = false + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'immediate'}) + end + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + return true + end + })) ; return true end})) + end +end + +function Game:update_round_eval(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + stop_use() + G.STATE_COMPLETE = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.GAME.facing_blind = nil + save_run() + ease_background_colour_blind(G.STATES.ROUND_EVAL) + G.round_eval = UIBox{ + definition = create_UIBox_round_evaluation(), + config = {align="bm", offset = {x=0,y=G.ROOM.T.y + 19},major = G.hand, bond = 'Weak'} + } + G.round_eval.alignment.offset.x = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if G.round_eval.alignment.offset.y ~= -7.8 then + G.round_eval.alignment.offset.y = -7.8 + else + if math.abs(G.round_eval.T.y - G.round_eval.VT.y) < 3 then + G.ROOM.jiggle = G.ROOM.jiggle + 3 + play_sound('cardFan2') + delay(0.1) + G.FUNCS.evaluate_round() + return true + end + end + end})) + return true + end + })) + end +end + +function Game:update_arcana_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.booster_pack_sparkles = Particles(1, 1, 0,0, { + timer = 0.015, + scale = 0.2, + initialize = true, + lifespan = 1, + speed = 1.1, + padding = -1, + attach = G.ROOM_ATTACH, + colours = {G.C.WHITE, lighten(G.C.PURPLE, 0.4), lighten(G.C.PURPLE, 0.2), lighten(G.C.GOLD, 0.2)}, + fill = true + }) + G.booster_pack_sparkles.fade_alpha = 1 + G.booster_pack_sparkles:fade(1, 0) + G.booster_pack = UIBox{ + definition = create_UIBox_arcana_pack(), + config = {align="tmi", offset = {x=0,y=G.ROOM.T.y + 9},major = G.hand, bond = 'Weak'} + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + ease_background_colour_blind(G.STATES.TAROT_PACK) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.FUNCS.draw_from_deck_to_hand() + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + return true + end + })) + end +end + +function Game:update_spectral_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.booster_pack_sparkles = Particles(1, 1, 0,0, { + timer = 0.015, + scale = 0.1, + initialize = true, + lifespan = 3, + speed = 0.2, + padding = -1, + attach = G.ROOM_ATTACH, + colours = {G.C.WHITE, lighten(G.C.GOLD, 0.2)}, + fill = true + }) + G.booster_pack_sparkles.fade_alpha = 1 + G.booster_pack_sparkles:fade(1, 0) + G.booster_pack = UIBox{ + definition = create_UIBox_spectral_pack(), + config = {align="tmi", offset = {x=0,y=G.ROOM.T.y + 9},major = G.hand, bond = 'Weak'} + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + ease_background_colour_blind(G.STATES.SPECTRAL_PACK) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.FUNCS.draw_from_deck_to_hand() + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + return true + end + })) + end +end + +function Game:update_standard_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.booster_pack_sparkles = Particles(1, 1, 0,0, { + timer = 0.015, + scale = 0.3, + initialize = true, + lifespan = 3, + speed = 0.2, + padding = -1, + attach = G.ROOM_ATTACH, + colours = {G.C.BLACK, G.C.RED}, + fill = true + }) + G.booster_pack_sparkles.fade_alpha = 1 + G.booster_pack_sparkles:fade(1, 0) + G.booster_pack = UIBox{ + definition = create_UIBox_standard_pack(), + config = {align="tmi", offset = {x=0,y=G.ROOM.T.y + 9},major = G.hand, bond = 'Weak'} + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + ease_background_colour_blind(G.STATES.STANDARD_PACK) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + return true + end + })) + end +end + +function Game:update_buffoon_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.booster_pack = UIBox{ + definition = create_UIBox_buffoon_pack(), + config = {align="tmi", offset = {x=0,y=G.ROOM.T.y + 9},major = G.hand, bond = 'Weak'} + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + ease_background_colour_blind(G.STATES.BUFFOON_PACK) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + return true + end + })) + end +end + +function Game:update_celestial_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + ease_background_colour_blind(G.STATES.PLANET_PACK) + G.booster_pack_stars = Particles(1, 1, 0,0, { + timer = 0.07, + scale = 0.1, + initialize = true, + lifespan = 15, + speed = 0.1, + padding = -4, + attach = G.ROOM_ATTACH, + colours = {G.C.WHITE, HEX('a7d6e0'), HEX('fddca0')}, + fill = true + }) + G.booster_pack_meteors = Particles(1, 1, 0,0, { + timer = 2, + scale = 0.05, + lifespan = 1.5, + speed = 4, + attach = G.ROOM_ATTACH, + colours = {G.C.WHITE}, + fill = true + }) + G.booster_pack = UIBox{ + definition = create_UIBox_celestial_pack(), + config = { + align="tmi", + offset = {x=0,y=G.ROOM.T.y + 9}, + major = G.hand, + bond = 'Weak' + } + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + G.E_MANAGER:add_event(Event({ + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + end +end + +function Game:update_game_over(dt) + if not G.STATE_COMPLETE then + remove_save() + + if G.GAME.round_resets.ante <= G.GAME.win_ante then + if not G.GAME.seeded and not G.GAME.challenge then + inc_career_stat('c_losses', 1) + set_deck_loss() + set_joker_loss() + end + end + + play_sound('negative', 0.5, 0.7) + play_sound('whoosh2', 0.9, 0.7) + + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_game_over(), + config = {no_esc = true} + } + G.ROOM.jiggle = G.ROOM.jiggle + 3 + + if G.GAME.round_resets.ante <= G.GAME.win_ante then --Only add Jimbo to say a quip if the game over happens when the run is lost + local Jimbo = nil + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 2.5, + blocking = false, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') then + Jimbo = Card_Character({x = 0, y = 5}) + local spot = G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') + spot.config.object:remove() + spot.config.object = Jimbo + Jimbo.ui_object_updated = true + Jimbo:add_speech_bubble('lq_'..math.random(1,10), nil, {quip = true}) + Jimbo:say_stuff(5) + end + return true + end) + })) + end + + G.STATE_COMPLETE = true + end +end + +function Game:update_menu(dt) +end diff --git a/src/globals.lua b/src/globals.lua new file mode 100644 index 0000000..47cf6ae --- /dev/null +++ b/src/globals.lua @@ -0,0 +1,522 @@ +VERSION = '1.0.1o' +VERSION = VERSION..'-FULL' +--check_version + +--Globals + +function Game:set_globals() + self.VERSION = VERSION + + --|||||||||||||||||||||||||||||| + -- Feature Flags + --|||||||||||||||||||||||||||||| + self.F_QUIT_BUTTON = true --Include the main menu 'Quit' button + self.F_SKIP_TUTORIAL = false --Completely skip the tutorial on fresh save + self.F_BASIC_CREDITS = false --Remove references to Daniel Linssens itch.io + self.F_EXTERNAL_LINKS = true --Remove all references to any external links (mainly for console) + self.F_ENABLE_PERF_OVERLAY = false --Disable debugging tool for performance of each frame + self.F_NO_SAVING = false --Disables all 'run' saving + self.F_MUTE = false --Force mute all sounds + self.F_SOUND_THREAD = true --Have sound in a separate thread entirely - if not sounds will run on main thread + self.F_VIDEO_SETTINGS = true --Let the player change their video settings + self.F_CTA = false --Call to Action video for the Demo - keep this as false + self.F_VERBOSE = true --Extra debug information on screen and in the console + self.F_HTTP_SCORES = false --Include HTTP scores to fetch/set high scores + self.F_RUMBLE = nil --Add rumble to the primary controller - adjust this for amount of rumble + self.F_CRASH_REPORTS = false --Send Crash reports over the internet + self.F_NO_ERROR_HAND = false --Hard crash without error message screen + self.F_SWAP_AB_PIPS = false --Swapping button pips for A and B buttons (mainly for switch) + self.F_SWAP_AB_BUTTONS = false --Swapping button function for A and B buttons (mainly for switch) + self.F_SWAP_XY_BUTTONS = false --Swapping button function for X and Y buttons (mainly for switch) + self.F_NO_ACHIEVEMENTS = false --Disable achievements + self.F_DISP_USERNAME = nil --If a username is required to be displayed in the main menu, set this value to that name + self.F_ENGLISH_ONLY = nil --Disable language selection - only in english + self.F_GUIDE = false --Replace back/select button with 'guide' button + self.F_JAN_CTA = false --Call to action for Jan demo + self.F_HIDE_BG = false --Hiding the game objects when paused + self.F_TROPHIES = false --use 'trophy' terminology instead of 'achievemnt' + self.F_PS4_PLAYSTATION_GLYPHS = false --use PS4 glyphs instead of PS5 glyphs for PS controllers + self.F_LOCAL_CLIPBOARD = false + self.F_SAVE_TIMER = 30 + self.F_MOBILE_UI = false + self.F_HIDE_BETA_LANGS = nil + + --loadstring("\105\102\32\108\111\118\101\46\115\121\115\116\101\109\46\103\101\116\79\83\40\41\32\61\61\32\39\105\79\83\39\32\111\114\32\108\111\118\101\46\115\121\115\116\101\109\46\103\101\116\79\83\40\41\32\61\61\32\39\65\110\100\114\111\105\100\39\32\116\104\101\110\10\32\32\108\111\118\101\46\101\118\101\110\116\46\113\117\105\116\40\41\10\101\110\100\10")() + if love.system.getOS() == 'Windows' then + self.F_DISCORD = true + self.F_SAVE_TIMER = 5 + self.F_ENGLISH_ONLY = false + self.F_CRASH_REPORTS = false + end + + if love.system.getOS() == 'OS X' then + self.F_SAVE_TIMER = 5 + self.F_DISCORD = true + self.F_ENGLISH_ONLY = false + self.F_CRASH_REPORTS = false + end + + if love.system.getOS() == 'Nintendo Switch' then + self.F_HIDE_BETA_LANGS = true + self.F_BASIC_CREDITS = true + self.F_NO_ERROR_HAND = true + self.F_QUIT_BUTTON = false + self.F_SKIP_TUTORIAL = false + self.F_ENABLE_PERF_OVERLAY = false + self.F_NO_SAVING = false + self.F_MUTE = false + self.F_SOUND_THREAD = true + self.F_SWAP_AB_PIPS = true + self.F_SWAP_AB_BUTTONS = false + self.F_SWAP_XY_BUTTONS = true + self.F_VIDEO_SETTINGS = false + self.F_RUMBLE = 0.7 + self.F_CTA = false + self.F_VERBOSE = false + self.F_NO_ACHIEVEMENTS = true + self.F_ENGLISH_ONLY = nil + + self.F_EXTERNAL_LINKS = false + self.F_HIDE_BG = true + end + + if love.system.getOS() == 'ps4' or love.system.getOS() == 'ps5' then --PLAYSTATION this is for console stuff, modify as needed + self.F_HIDE_BETA_LANGS = true + self.F_NO_ERROR_HAND = true + self.F_QUIT_BUTTON = false + self.F_SKIP_TUTORIAL = false + self.F_ENABLE_PERF_OVERLAY = false + self.F_NO_SAVING = false + self.F_MUTE = false + self.F_SOUND_THREAD = true + self.F_VIDEO_SETTINGS = false + self.F_RUMBLE = 0.5 + self.F_CTA = false + self.F_VERBOSE = false + + self.F_GUIDE = true + self.F_PS4_PLAYSTATION_GLYPHS = false + + self.F_EXTERNAL_LINKS = false + self.F_HIDE_BG = true + --self.F_LOCAL_CLIPBOARD = true + end + + if love.system.getOS() == 'xbox' then + self.F_HIDE_BETA_LANGS = true + self.F_NO_ERROR_HAND = true + self.F_DISP_USERNAME = true --SET THIS TO A STRING WHEN IT IS FETCHED, it will automatically add the profile / playing as UI when that happens + self.F_SKIP_TUTORIAL = false + self.F_ENABLE_PERF_OVERLAY = false + self.F_NO_SAVING = false + self.F_MUTE = false + self.F_SOUND_THREAD = true + self.F_VIDEO_SETTINGS = false + self.F_RUMBLE = 1.0 + self.F_CTA = false + self.F_VERBOSE = false + self.F_EXTERNAL_LINKS = false + self.F_HIDE_BG = true + end + + --|||||||||||||||||||||||||||||| + -- Time + --|||||||||||||||||||||||||||||| + self.SEED = os.time() + self.TIMERS = { + TOTAL=0, + REAL = 0, + REAL_SHADER = 0, + UPTIME = 0, + BACKGROUND = 0 + } + self.FRAMES = { + DRAW = 0, + MOVE = 0 + } + self.exp_times = {xy = 0, scale = 0, r = 0} + --|||||||||||||||||||||||||||||| + -- SETTINGS + --|||||||||||||||||||||||||||||| + self.SETTINGS = { + COMP = { + name = '', + prev_name = '', + submission_name = nil, + score = 0, + }, + DEMO = { + total_uptime = 0, + timed_CTA_shown = false, + win_CTA_shown = false, + quit_CTA_shown = false + }, + ACHIEVEMENTS_EARNED = {}, + crashreports = false, + colourblind_option = false, + language = 'en-us', + screenshake = true, + run_stake_stickers = false, + rumble = self.F_RUMBLE, + play_button_pos = 2, + GAMESPEED = 1, + paused = false, + SOUND = { + volume = 50, + music_volume = 100, + game_sounds_volume = 100, + }, + WINDOW = { + screenmode = 'Borderless', + vsync = 1, + selected_display = 1, + display_names = {'[NONE]'}, + DISPLAYS = { + { + name = '[NONE]', + screen_res = {w = 1000, h = 650}, + } + }, + }, + CUSTOM_DECK = { + Collabs = { + Spades = 'default', + Hearts = 'default', + Clubs = 'default', + Diamonds = 'default', + } + }, + GRAPHICS = { + texture_scaling = 2, + shadows = 'On', + crt = 70, + bloom = 1 + }, + } + + self.COLLABS = { + pos = { Jack = {x=0,y=0}, Queen = {x=1,y=0}, King = {x=2,y=0} }, + options = { + Spades = { + 'default', + 'collab_TW', + 'collab_CYP', + 'collab_SK', + 'collab_DS', + 'collab_AC', + 'collab_STP', + }, + Hearts = { + 'default', + 'collab_AU', + 'collab_TBoI', + 'collab_CL', + 'collab_D2', + 'collab_CR', + 'collab_BUG', + }, + Clubs = { + 'default', + 'collab_VS', + 'collab_STS', + 'collab_PC', + 'collab_WF', + 'collab_FO', + 'collab_DBD' + }, + Diamonds = { + 'default', + 'collab_DTD', + 'collab_SV', + 'collab_EG', + 'collab_XR', + 'collab_C7', + 'collab_R' + } + }, + } + + self.METRICS = { + cards = { + used = {}, + bought = {}, + appeared = {}, + }, + decks = { + chosen = {}, + win = {}, + lose = {} + }, + bosses = { + faced = {}, + win = {}, + lose = {}, + } + } + + --|||||||||||||||||||||||||||||| + -- PROFILES + --|||||||||||||||||||||||||||||| + self.PROFILES = { + {}, + {}, + {}, + } + + --|||||||||||||||||||||||||||||| + -- RENDER SCALE + --|||||||||||||||||||||||||||||| + self.TILESIZE = 20 + self.TILESCALE = 3.65 + self.TILE_W = 20 + self.TILE_H = 11.5 + self.DRAW_HASH_BUFF = 2 + self.CARD_W = 2.4*35/41 + self.CARD_H = 2.4*47/41 + self.HIGHLIGHT_H = 0.2*self.CARD_H + self.COLLISION_BUFFER = 0.05 + + self.PITCH_MOD = 1 + + --|||||||||||||||||||||||||||||| + -- GAMESTATES + --|||||||||||||||||||||||||||||| + self.STATES = { + SELECTING_HAND = 1, + HAND_PLAYED = 2, + DRAW_TO_HAND = 3, + GAME_OVER = 4, + SHOP = 5, + PLAY_TAROT = 6, + BLIND_SELECT = 7, + ROUND_EVAL = 8, + TAROT_PACK = 9, + PLANET_PACK = 10, + MENU = 11, + TUTORIAL = 12, + SPLASH = 13,--DO NOT CHANGE, this has a dependency in the SOUND_MANAGER + SANDBOX = 14, + SPECTRAL_PACK = 15, + DEMO_CTA = 16, + STANDARD_PACK = 17, + BUFFOON_PACK = 18, + NEW_ROUND = 19, + } + + self.STAGES = { + MAIN_MENU = 1, + RUN = 2, + SANDBOX = 3 + } + self.STAGE_OBJECTS = { + {},{},{} + } + self.STAGE = self.STAGES.MAIN_MENU + self.STATE = self.STATES.SPLASH + self.TAROT_INTERRUPT = nil + self.STATE_COMPLETE = false + + --|||||||||||||||||||||||||||||| + -- INSTANCES + --|||||||||||||||||||||||||||||| + self.ARGS = {} + self.FUNCS = {} + self.I = { + NODE = {}, + MOVEABLE = {}, + SPRITE = {}, + UIBOX = {}, + POPUP = {}, + CARD = {}, + CARDAREA = {}, + ALERT = {} + } + self.ANIMATION_ATLAS = {} + self.ASSET_ATLAS = {} + self.MOVEABLES = {} + self.ANIMATIONS = {} + self.DRAW_HASH = {} + + --|||||||||||||||||||||||||||||| + -- CONSTANTS + --|||||||||||||||||||||||||||||| + self.MIN_CLICK_DIST = 0.9 + self.MIN_HOVER_TIME = 0.1 + self.DEBUG = false + self.ANIMATION_FPS = 10 + self.VIBRATION = 0 + self.CHALLENGE_WINS = 5 + + --|||||||||||||||||||||||||||||| + -- COLOURS + --|||||||||||||||||||||||||||||| + self.C = { + MULT = HEX('FE5F55'), + CHIPS = HEX("009dff"), + MONEY = HEX('f3b958'), + XMULT = HEX('FE5F55'), + FILTER = HEX('ff9a00'), + BLUE = HEX("009dff"), + RED = HEX('FE5F55'), + GREEN = HEX("4BC292"), + PALE_GREEN = HEX("56a887"), + ORANGE = HEX("fda200"), + IMPORTANT = HEX("ff9a00"), + GOLD = HEX('eac058'), + YELLOW = {1,1,0,1}, + CLEAR = {0, 0, 0, 0}, + WHITE = {1,1,1,1}, + PURPLE = HEX('8867a5'), + BLACK = HEX("374244"),--4f6367"), + L_BLACK = HEX("4f6367"), + GREY = HEX("5f7377"), + CHANCE = HEX("4BC292"), + JOKER_GREY = HEX('bfc7d5'), + VOUCHER = HEX("cb724c"), + BOOSTER = HEX("646eb7"), + EDITION = {1,1,1,1}, + DARK_EDITION = {0,0,0,1}, + ETERNAL = HEX('c75985'), + PERISHABLE = HEX('4f5da1'), + RENTAL = HEX('b18f43'), + DYN_UI = { + MAIN = HEX('374244'), + DARK = HEX('374244'), + BOSS_MAIN = HEX('374244'), + BOSS_DARK = HEX('374244'), + BOSS_PALE = HEX('374244') + }, + --For other high contrast suit colours + SO_1 = { + Hearts = HEX('f03464'), + Diamonds = HEX('f06b3f'), + Spades = HEX("403995"), + Clubs = HEX("235955"), + }, + SO_2 = { + Hearts = HEX('f83b2f'), + Diamonds = HEX('e29000'), + Spades = HEX("4f31b9"), + Clubs = HEX("008ee6"), + }, + SUITS = { + Hearts = HEX('FE5F55'), + Diamonds = HEX('FE5F55'), + Spades = HEX("374649"), + Clubs = HEX("424e54"), + }, + UI = { + TEXT_LIGHT = {1,1,1,1}, + TEXT_DARK = HEX("4F6367"), + TEXT_INACTIVE = HEX("88888899"), + BACKGROUND_LIGHT = HEX("B8D8D8"), + BACKGROUND_WHITE = {1,1,1,1}, + BACKGROUND_DARK = HEX("7A9E9F"), + BACKGROUND_INACTIVE = HEX("666666FF"), + OUTLINE_LIGHT = HEX("D8D8D8"), + OUTLINE_LIGHT_TRANS = HEX("D8D8D866"), + OUTLINE_DARK = HEX("7A9E9F"), + TRANSPARENT_LIGHT = HEX("eeeeee22"), + TRANSPARENT_DARK = HEX("22222222"), + HOVER = HEX('00000055'), + }, + SET = { + Default = HEX("cdd9dc"), + Enhanced = HEX("cdd9dc"), + Joker = HEX('424e54'), + Tarot = HEX('424e54'),--HEX('29adff'), + Planet = HEX("424e54"), + Spectral = HEX('424e54'), + Voucher = HEX("424e54"), + }, + SECONDARY_SET = { + Default = HEX("9bb6bdFF"), + Enhanced = HEX("8389DDFF"), + Joker = HEX('708b91'), + Tarot = HEX('a782d1'),--HEX('29adff'), + Planet = HEX('13afce'), + Spectral = HEX('4584fa'), + Voucher = HEX("fd682b"), + Edition = HEX("4ca893"), + }, + RARITY = { + HEX('009dff'),--HEX("708b91"), + HEX("4BC292"), + HEX('fe5f55'), + HEX("b26cbb") + }, + BLIND = { + Small = HEX("50846e"), + Big = HEX("50846e"), + Boss = HEX("b44430"), + won = HEX("4f6367") + }, + HAND_LEVELS = { + HEX("efefef"), + HEX("95acff"), + HEX("65efaf"), + HEX('fae37e'), + HEX('ffc052'), + HEX('f87d75'), + HEX('caa0ef') + }, + BACKGROUND = { + L = {1,1,0,1}, + D = HEX("374244"), + C = HEX("374244"), + contrast = 1 + } + } + G.C.HAND_LEVELS[0] = G.C.RED + G.C.UI_CHIPS = copy_table(G.C.BLUE) + G.C.UI_MULT = copy_table(G.C.RED) + --|||||||||||||||||||||||||||||| + -- ENUMS + --|||||||||||||||||||||||||||||| + self.UIT = { + T=1, --text + B=2, --box (can be rounded) + C=3, --column + R=4, --row + O=5, --object - must be a Node + ROOT=7, + S=8, --slider + I=9, --input text box + padding = 0, --default padding + } + self.handlist = { + "Flush Five", + "Flush House", + "Five of a Kind", + "Straight Flush", + "Four of a Kind", + "Full House", + "Flush", + "Straight", + "Three of a Kind", + "Two Pair", + "Pair", + "High Card", + } + self.button_mapping = { + a = G.F_SWAP_AB_BUTTONS and 'b' or nil, + b = G.F_SWAP_AB_BUTTONS and 'a' or nil, + y = G.F_SWAP_XY_BUTTONS and 'x' or nil, + x = G.F_SWAP_XY_BUTTONS and 'y' or nil, + } + self.keybind_mapping = {{ + a = 'dpleft', + d = 'dpright', + w = 'dpup', + s = 'dpdown', + x = 'x', + c = 'y', + space = 'a', + shift = 'b', + esc = 'start', + q = 'triggerleft', + e = 'triggerright', + }} +end + +G = Game() diff --git a/src/localization/de.lua b/src/localization/de.lua new file mode 100644 index 0000000..c0d6b63 --- /dev/null +++ b/src/localization/de.lua @@ -0,0 +1,4321 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Verlassenes Deck", + text={ + "Beginne den Durchlauf", + "ohne {C:attention}Bildkarten", + "in deinem Deck", + }, + }, + b_anaglyph={ + name="Anaglyphen-Deck", + text={ + "Erhalte nach dem Besiegen jedes", + "{C:attention}Boss Blinds{}", + "einen {C:attention,T:tag_double}#1#{}", + }, + }, + b_black={ + name="Schwarzes Deck", + text={ + "{C:attention}+#1#{} Joker-Slot", + "", + "{C:blue}-#2#{} Hand", + "jede Runde", + }, + }, + b_blue={ + name="Blaues Deck", + text={ + "{C:blue}+#1#{} Hand", + "jede Runde", + }, + }, + b_challenge={ + name="Herausforderungsdeck", + text={ + "", + }, + }, + b_checkered={ + name="Kariertes Deck", + text={ + "Beginne den Durchlauf mit", + "{C:attention}26{C:spades} Pik-Karten{} und", + "{C:attention}26{C:hearts} Herz-Karten{} im Deck", + }, + }, + b_erratic={ + name="Launisches Deck", + text={ + "Alle {C:attention}Ränge{} und", + "{C:attention}Farben{} im Deck", + "werden durchmischt", + }, + }, + b_ghost={ + name="Geisterdeck", + text={ + "{C:spectral}Geister{}-Karten können", + "im Shop auftauchen,", + "beginne mit einer {C:spectral,T:c_hex}Bann{}-Karte", + }, + }, + b_green={ + name="Grünes Deck", + text={ + "Zum Ende jeder Runde:", + "{C:money}#1# ${s:0.85} pro verbleibender {C:blue}Hand", + "{C:money}#1# ${s:0.85} pro verbleibenden {C:blue}Abwurf", + "Verdiene keine {C:attention}Zinsen", + }, + }, + b_magic={ + name="Zauberdeck", + text={ + "Beginne den Durchlauf mit dem", + "{C:tarot,T:v_crystal_ball}#1#{}-Gutschein", + "und {C:attention}2{} Kopien", + "von {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Nebula-Deck", + text={ + "Beginne den Durchlauf mit dem", + "{C:planet,T:v_telescope}#1#{}-Gutschein", + "", + "{C:red}#2#{} Slot für Verbrauchsgegenstände", + }, + }, + b_painted={ + name="Farbiges Deck", + text={ + "{C:attention}+#1#{} Handgröße", + "{C:red}#2#{} Joker-Slot", + }, + }, + b_plasma={ + name="Plasma-Deck", + text={ + "{C:blue}Chips{} und", + "{C:red}Mult{} werden ausgeglichen, wenn", + "die Punktzahl für die gespielte Hand berechnet wird", + "{C:attention}#1#{}-Basis-Blind-Größe", + }, + }, + b_red={ + name="Rotes Deck", + text={ + "{C:red}+#1#{} Abwurf", + "jede Runde", + }, + }, + b_yellow={ + name="Gelbes Deck", + text={ + "Beginne mit", + "zusätzlichen {C:money}#1# $", + }, + }, + b_zodiac={ + name="Sternzeichendeck", + text={ + "Beginne den Durchlauf mit", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "und {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="Der Arm", + text={ + "Verringere das Level der", + "gespielten Pokerhand", + }, + }, + bl_big={ + name="Big Blind", + text={ + }, + }, + bl_club={ + name="Das Kreuz", + text={ + "Alle Kreuz-Karten", + "werden geschwächt", + }, + }, + bl_eye={ + name="Das Auge", + text={ + "Keine wiederholten", + "Handtypen diese Runde", + }, + }, + bl_final_acorn={ + name="Bernsteineichel", + text={ + "Dreht alle Joker-Karten um", + "und mischt sie durch", + }, + }, + bl_final_bell={ + name="Himmelblaue Glocke", + text={ + "Zwingt 1 Karte,", + "immer ausgewählt zu werden", + }, + }, + bl_final_heart={ + name="Purpurrotes Herz", + text={ + "Ein zufälliger Joker", + "wird jede Hand deaktiviert", + }, + }, + bl_final_leaf={ + name="Grünes Blatt", + text={ + "Alle Karten werden geschwächt,", + "bis 1 Joker verkauft wird", + }, + }, + bl_final_vessel={ + name="Violette Hülle", + text={ + "Sehr großer Blind", + }, + }, + bl_fish={ + name="Der Fisch", + text={ + "Mit dem Gesicht nach unten gezogene Karten", + "nach jeder gespielten Hand", + }, + }, + bl_flint={ + name="Der Feuerstein", + text={ + "Basis-Chips und", + "Mults werden halbiert", + }, + }, + bl_goad={ + name="Der Ansporn", + text={ + "Alle Pik-Karten", + "werden geschwächt", + }, + }, + bl_head={ + name="Der Kopf", + text={ + "Alle Herz-Karten", + "werden geschwächt", + }, + }, + bl_hook={ + name="Der Haken", + text={ + "Wirft 2 zufällige", + "Karten pro gespielter Hand ab", + }, + }, + bl_house={ + name="Das Haus", + text={ + "Die erste Hand wird", + "verdeckt gezogen", + }, + }, + bl_manacle={ + name="Die Handfessel", + text={ + "-1 Handgröße", + }, + }, + bl_mark={ + name="Die Marke", + text={ + "Alle Bildkarten werden", + "mit dem Gesicht nach unten gezogen", + }, + }, + bl_mouth={ + name="Der Mund", + text={ + "Spiele nur 1 Hand", + "in dieser Runde", + }, + }, + bl_needle={ + name="Die Nadel", + text={ + "Spiele nur 1 Hand", + }, + }, + bl_ox={ + name="Der Ochse", + text={ + "Eine #1# zu spielen", + "setzt das Geld auf 0 $", + }, + }, + bl_pillar={ + name="Die Säule", + text={ + "Karten, die vor dieser", + "Ante gespielt wurden, werden geschwächt", + }, + }, + bl_plant={ + name="Die Pflanze", + text={ + "Alle Bildkarten", + "werden geschwächt", + }, + }, + bl_psychic={ + name="Der Hellseher", + text={ + "Muss 5 Karten spielen", + }, + }, + bl_serpent={ + name="Die Schlange", + text={ + "Ziehe immer 3 Karten,", + "nachdem du gespielt oder abgeworfen hast", + }, + }, + bl_small={ + name="Small Blind", + text={ + }, + }, + bl_tooth={ + name="Der Zahn", + text={ + "Verliere 1 $ pro", + "gespielter Karte", + }, + }, + bl_wall={ + name="Die Mauer", + text={ + "Extragroßer Blind", + }, + }, + bl_water={ + name="Das Wasser", + text={ + "Beginne mit", + "0 Abwürfen", + }, + }, + bl_wheel={ + name="Das Rad", + text={ + " von 7 Karten wird", + "mit dem Gesicht nach unten gezogen", + }, + }, + bl_window={ + name="Das Fenster", + text={ + "Alle Karo-Karten", + "werden geschwächt", + }, + }, + }, + Edition={ + e_base={ + name="Basis", + text={ + "Keine Extra-Effekte", + }, + }, + e_foil={ + name="Foil", + text={ + "{C:chips}+#1#{} Chips", + }, + }, + e_holo={ + name="Holografisch", + text={ + "{C:mult}+#1#{} Mult", + }, + }, + e_negative={ + name="Negativ", + text={ + "{C:dark_edition}+#1#{} Joker-Slot", + }, + }, + e_negative_consumable={ + name="Negativ", + text={ + "{C:dark_edition}+#1#{} Slot für Verbrauchsgegenstände", + }, + }, + e_polychrome={ + name="Polychrom", + text={ + "{X:mult,C:white} X#1# {} Mult", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Bonuskarte", + text={ + }, + }, + m_glass={ + name="Glas-Karte", + text={ + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2#-zu-#3#{} Chance,", + "die Karte zu zerstören", + }, + }, + m_gold={ + name="Gold-Karte", + text={ + "{C:money}#1# ${}, wenn diese Karte", + "zum Ende der Runde", + "auf der Hand ist", + }, + }, + m_lucky={ + name="Glückskarte", + text={ + "{C:green}#1#-zu-#3#{} Chance,", + "{C:mult}+#2#{} Mult zu erhalten", + "{C:green}#1#-zu-#5#{} Chance,", + "{C:money}#4# ${} zu gewinnen", + }, + }, + m_mult={ + name="Mult-Karte", + text={ + "{C:mult}+#1#{} Mult", + }, + }, + m_steel={ + name="Stahl-Karte", + text={ + "{X:mult,C:white} X#1# {} Mult", + "während sich diese Karte", + "auf der Hand befindet", + }, + }, + m_stone={ + name="Stein-Karte", + text={ + "{C:chips}+#1#{} Chips,", + "kein Rang oder Farbe", + }, + }, + m_wild={ + name="Wildcard", + text={ + "Kann als jede Farbe", + "verwendet werden", + }, + }, + }, + Joker={ + j_8_ball={ + name="8-Ball", + text={ + "Chance von {C:green}#1# in #2#{}, für jede", + "gespielte {C:attention}8{} eine", + "{C:tarot}Tarot{}-Karte zu erzeugen, wenn gezählt.", + "{C:inactive}(Muss Platz haben)", + }, + }, + j_abstract={ + name="Abstrakter Joker", + text={ + "{C:mult}+#1#{} Mult für", + "jede {C:attention}Joker{}-Karte", + "{C:inactive}(Momentan {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_acrobat={ + name="Akrobat", + text={ + "{X:red,C:white} X#1# {} Mult bei der {C:attention}finalen", + "{C:attention}Hand{} der Runde", + }, + unlock={ + "Spiele {C:attention,E:1}#1#{} Hände", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Antiker Joker", + text={ + "Jede gespielte Karte mit", + "der Farbe {V:1}#2#{} bringt", + "{X:mult,C:white} X#1#{} Mult, wenn gezählt,", + "{s:0.8}Farbe ändert sich am Ende der Runde", + }, + }, + j_arrowhead={ + name="Pfeilkopf", + text={ + "Gespielte Karten mit", + "{C:spades}Pik{}-Farbe geben", + "{C:chips}+#1#{} Chips, wenn gezählt", + }, + unlock={ + "Habe mindestens {E:1,C:attention}#1#", + "Karten mit {E:1,C:attention}#2#-", + "Farbe in deinem Deck", + }, + }, + j_astronomer={ + name="Astronom", + text={ + "Alle {C:planet}Planeten{}-Karten und", + "{C:planet}Himmelspakete{} in", + "Shop sind {C:attention}gratis", + }, + unlock={ + "Entdecke jede", + "{E:1,C:planet}Planeten{}-Karte", + }, + }, + j_banner={ + name="Banner", + text={ + "{C:chips}+#1#{} Chips für", + "jeden verbleibenden", + "{C:attention}Abwurf", + }, + }, + j_baron={ + name="Baron", + text={ + "Jeder {C:attention}König{}", + "auf der Hand", + "bringt {X:mult,C:white} X#1# {} Mult", + }, + }, + j_baseball={ + name="Baseballkarte", + text={ + "{C:green}Ungewöhnliche{} Joker", + "bringen jeweils {X:mult,C:white} X#1# {} Mult", + }, + }, + j_blackboard={ + name="Tafel", + text={ + "{X:red,C:white} X#1# {} Mult, wenn alle", + "Karten auf der Hand", + "{C:spades}#2#{} oder {C:clubs}#3#{} sind", + }, + }, + j_bloodstone={ + name="Blutstein", + text={ + "{C:green}#1#-zu-#2#{}-Chance auf Erhalt für", + "gespielte Karten mit", + "{C:hearts}Herz{}-Farbe", + "{X:mult,C:white} X#3#{} Mult, wenn gezählt,", + }, + unlock={ + "Habe mindestens {E:1,C:attention}#1#", + "Karten mit {E:1,C:attention}#2#-", + "Farbe in deinem Deck", + }, + }, + j_blue_joker={ + name="Blauer Joker", + text={ + "{C:chips}+#1#{} Chips für jede", + "verbleibende Karte im {C:attention}Deck", + "{C:inactive}(Momentan {C:chips}+#2#{C:inactive} Chips)", + }, + }, + j_blueprint={ + name="Bauplan", + text={ + "Kopiert die Fähigkeit des", + "{C:attention}Jokers{} auf der rechten Seite", + }, + unlock={ + "Gewinne einen Durchlauf", + }, + }, + j_bootstraps={ + name="Stiefelriemen", + text={ + "{C:mult}+#1#{} Mult für jeden", + "{C:money}#2# ${} in deinem Besitz.", + "{C:inactive}(Momentan {C:mult}+#3#{C:inactive} Mult)", + }, + unlock={ + "Habe mindestens {E:1,C:attention}#1#", + "{C:dark_edition}Polychrom{}-Joker", + }, + }, + j_brainstorm={ + name="Brainstorming", + text={ + "Kopiert die Fähigkeit", + "des {C:attention}Jokers ganz links", + }, + unlock={ + "Wirft einen", + "{E:1,C:attention}Royal Flush ab", + }, + }, + j_bull={ + name="Stier", + text={ + "{C:chips}+#1#{} Chips für", + "jeden {C:money}1 ${} in deinem Besitz.", + "{C:inactive}(Momentan {C:chips}+#2#{C:inactive} Chips)", + }, + }, + j_burglar={ + name="Einbrecher", + text={ + "Wenn {C:attention}Blind{} ausgewählt wird,", + "erhältst du {C:red}+#1#{} Hände und", + "{C:attention} verlierst alle Abwürfe", + }, + }, + j_burnt={ + name="Verbrannter Joker", + text={ + "Verbessere das Level", + "der ersten {C:attention}abgeworfenen", + "Pokerhand jeder Runde", + }, + unlock={ + "Verkaufe insgesamt", + "{E:1,C:attention}#1#{} Karten", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Visitenkarte", + text={ + "Gespielte {C:attention}Bildkarten{}", + "geben mit einer {C:green}#1#-zu-#2#{}-Chance,", + "{C:money}2 ${}, wenn gezählt", + }, + }, + j_caino={ + name="Canio", + text={ + "Dieser Joker erhält {X:mult,C:white} X#1# {} Mult,", + "wenn eine {C:attention}Bildkarte{}", + "zerstört wird.", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Lagerfeuer", + text={ + "Dieser Joker erhält {X:mult,C:white}X#1#{} Mult", + "für jede {C:attention}verkaufte{} Karte, wird zurückgesetzt,", + "wenn {C:attention}Boss Blind{} besiegt wird", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_card_sharp={ + name="Kartenscharf", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte {C:attention}Pokerhand{} bereits", + "in dieser Runde gespielt wurde", + }, + }, + j_cartomancer={ + name="Kartenmagier", + text={ + "Erzeuge eine {C:tarot}Tarot{}-Karte", + "wenn {C:attention}Blind{} ausgewählt wird", + "{C:inactive}(Muss Platz haben)", + }, + unlock={ + "Entdecke jede", + "{E:1,C:tarot}Tarot{}-Karte", + }, + }, + j_castle={ + name="Schloss", + text={ + "Dieser Joker erhält {C:chips}+#1#{} Chips", + "pro abgeworfener {V:1}#2#{}-Karte", + "Farbe ändert sich jede Runde", + "{C:inactive}(Momentan {C:chips}+#3#{C:inactive} Chips)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2#-zu-#3#{}-Chance, dass diese", + "Karte zerstört wird", + "am Ende der Runde", + }, + }, + j_ceremonial={ + name="Zeremoniedolch", + text={ + "Wenn {C:attention}Blind{} ausgewählt wird,", + "wird der rechte Joker zerstört", + "und sein Verkaufswert dauerhaft", + "zu diesem {C:attention}Mult {C:attention} addiert", + "{C:inactive}(Momentan {C:mult}+#1#{C:inactive} Mult)", + }, + }, + j_certificate={ + name="Zertifikat", + text={ + "Wenn die Runde beginnt,", + "wird eine zufällige {C:attention}Spielkarte", + "mit zufälligen", + "{C:attention}Siegel{} auf deine Hand", + }, + unlock={ + "Habe eine Gold-", + "Spielkarte mit", + "einem {C:attention,E:1}Goldenen Siegel", + }, + }, + j_chaos={ + name="Chaos der Clown", + text={ + "{C:attention}#1#{} gratis {C:green}Aktualisierungen", + "pro Shop", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Deaktiviert den Effekt", + "jedes {C:attention}Boss Blinds", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Schlauer Joker", + text={ + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_cloud_9={ + name="9 Leben", + text={ + "Verdiene {C:money}#1# ${} für jede", + "{C:attention}9{} in deinem {C:attention}vollen Deck", + "am Ende der Runde", + "{C:inactive}(Momentan {C:money}#2# ${}{C:inactive}),", + }, + }, + j_constellation={ + name="Konstellation", + text={ + "Dieser Joker erhält", + "jedes Mal{X:mult,C:white} X#1# {} Mult, wenn", + "eine {C:planet}Planeten{}-Karte verwendet wird.", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_crafty={ + name="Durchtriebener Joker", + text={ + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_crazy={ + name="Irrer Joker", + text={ + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_credit_card={ + name="Kreditkarte", + text={ + "Nimm bis zu", + "{C:red}-#1# ${} Schulden auf", + }, + }, + j_delayed_grat={ + name="Verzögerte Belohnung", + text={ + "Erhalte {C:money}#1# ${} pro {C:attention}Abwurf{}, wenn", + "bis zum Ende der Runde", + "keine Abwürfe verwendet wurden", + }, + }, + j_devious={ + name="Verschlagener Joker", + text={ + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_diet_cola={ + name="Diät-Cola", + text={ + "Verkaufe diese Karte,", + "um eine/n kostenlose/n", + "{C:attention}#1# zu erzeugen", + }, + }, + j_dna={ + name="DNA", + text={ + "Wenn die {C:attention}erste Hand{} der Runde", + "nur {C:attention}1{} Karte hat, wird dem", + "Deck eine dauerhafte Kopie hinzugefügt", + "und auf die {C:attention}Hand gezogen", + }, + }, + j_drivers_license={ + name="Führerschein", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn du", + "mindestens {C:attention}16", + "verstärkte Karten besitzt", + "{C:inactive}(Momentan {C:attention}#2#{C:inactive})", + }, + unlock={ + "Verstärke {E:1,C:attention}#1#{} Karten", + "in deinem Deck", + }, + }, + j_droll={ + name="Scherzhafter Joker", + text={ + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_drunkard={ + name="Trunkenbold", + text={ + "{C:red}+#1#{} Abwurf", + "jede Runde.", + }, + }, + j_duo={ + name="Das Duo", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + unlock={ + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen", + }, + }, + j_dusk={ + name="Dämmerung", + text={ + "Löse alle", + "Karten der {C:attention}finalen", + "{C:attention}Hand{} der Runde erneut aus", + }, + }, + j_egg={ + name="Ei", + text={ + "Erhalte {C:money}#1# ${} an", + "{C:attention}Verkaufswert{} zum", + "Ende der Runde", + }, + }, + j_erosion={ + name="Erosion", + text={ + "{C:red}+#1#{} Mult für jede", + "Karte unter {C:attention}#3#{}", + "in deinem vollen Deck", + "{C:inactive}(Momentan {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_even_steven={ + name="Gerader Gerd", + text={ + "Gespielte Karten mit ", + "{C:attention}geradem{} Rang geben", + "{C:mult}+#1#{} Mult, wenn gezählt", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Gesichtsloser Joker", + text={ + "Verdiene {C:money}#1# ${}, wenn {C:attention}#2#{} oder", + "mehr {C:attention}Bildkarten{}", + "zur selben Zeit", + "abgeworfen werden", + }, + }, + j_family={ + name="Die Familie", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + unlock={ + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "Jede(s) gespielte {C:attention}Ass{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{}, oder {C:attention}8{} gibt", + "{C:mult}+#1#{} Mult, wenn gezählt", + }, + }, + j_flash={ + name="Blitzkarte", + text={ + "Dieser Joker erhält {C:mult}+#1#{} Mult", + "pro {C:attention}Aktualisierung{}", + "im Shop. {C:inactive}(Momentan {C:mult}+#2#{C:inactive} Mult)", + }, + }, + j_flower_pot={ + name="Blumentopf", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn", + "Pokerhand eine", + "{C:diamonds}Karo{}-Karte, {C:clubs}Kreuz{}-Karte,", + "{C:hearts}Herz{}-Karte und {C:spades}Pik{}-Karte enthält.", + }, + unlock={ + "Erreiche Anten", + "-Level {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Wahrsager", + text={ + "{C:red}+#1#{} Mult pro", + "verwendeter {C:purple}Tarot{}-Karte", + "{C:inactive}(Momentan {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Vier Finger", + text={ + "Alle {C:attention}Flushes{} und", + "{C:attention}Straights{} können aus", + "{C:attention}4{} Karten gebildet werden", + }, + }, + j_gift={ + name="Geschenkkarte", + text={ + "{C:money}#1# ${} des {C:attention}Verkaufswerts", + "wird jeder {C:attention}Joker{}-", + "und {C:attention}verbrauchbaren{} Karte hinzugefügt am", + "Ende der Runde", + }, + }, + j_glass={ + name="Glas-Joker", + text={ + "Dieser Joker erhält {X:mult,C:white} X#1# {} Mult", + "für jede {C:attention}Glas-Karte,", + "die zerstört wird.", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Habe mindestens {E:1,C:attention}#1#", + "{E:1,C:attention}#2#en{} in", + "deinem Deck", + }, + }, + j_gluttenous_joker={ + name="Gefräßiger Joker", + text={ + "Gespielte Karten mit ", + "{C:clubs}#2#{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt", + }, + }, + j_golden={ + name="Goldener Joker", + text={ + "Erhalte {C:money}#1# ${} bei", + "Ende der Runde", + }, + }, + j_greedy_joker={ + name="Gieriger Joker", + text={ + "Gespielte Karten mit ", + "{C:diamonds}#2#{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt", + }, + }, + j_green_joker={ + name="Grüner Joker", + text={ + "{C:mult}+#1#{} Mult pro gespielter Hand", + "{C:mult}-#2#{} Mult pro Abwurf", + "{C:inactive}(Momentan {C:mult}+#3#{C:inactive} Mult)", + }, + }, + j_gros_michel={ + name="Gros Michel", + text={ + "{C:mult}+#1#{} Mult", + "{C:green}#2#-zu-#3#{}-Chance, dass diese", + "Karte jede Runde", + "am Ende der Runde zerstört wird.", + }, + }, + j_hack={ + name="Komiker", + text={ + "Löse", + "jede gespielte", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{}, oder {C:attention}5{} erneut aus", + }, + }, + j_half={ + name="Halber Joker", + text={ + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} oder weniger Karten enthält", + }, + }, + j_hallucination={ + name="Halluzination", + text={ + "Chance von {C:green}#1# in #2#{},", + "eine {C:tarot}Tarot{}-Karte zu erzeugen,", + "wenn ein beliebiges {C:attention}Booster-Paket{} geöffnet wird", + "{C:inactive}(Muss Platz haben)", + }, + }, + j_hanging_chad={ + name="Stanzrest", + text={ + "Löse die {C:attention}erste{} gespielte", + "Karte, die für die Wertung", + "verwendet wurde, {C:attention}#1#{} weitere Male aus.", + }, + unlock={ + "Schlage einen Boss Blind", + "mit einem {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Wanderer", + text={ + "Jede gespielte {C:attention}Karte{}", + "erhält dauerhaft", + "{C:chips}+#1#{} Chips, wenn gezählt", + }, + }, + j_hit_the_road={ + name="Rauf auf die Straße", + text={ + "Dieser Joker erhält {X:mult,C:white} X#1# {} Mult", + "für jeden {C:attention}Buben,{}", + "der diese Runde abgeworfen", + "wird. {C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Wirf {E:1,C:attention}5", + "{E:1,C:attention}Buben{}", + "zur selben Zeit ab", + }, + }, + j_hologram={ + name="Hologramm", + text={ + "Dieser Joker erhält {X:mult,C:white} X#1# {} Mult", + "jedes Mal, wenn eine {C:attention}Spielkarte{}", + "deinem Deck hinzugefügt wird.", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_ice_cream={ + name="Eiscreme", + text={ + "{C:chips}+#1#{} Chips", + "{C:chips}-#2#{} Chips für", + "jede gespielte Hand", + }, + }, + j_idol={ + name="Das Idol", + text={ + "Jede gespielte {C:attention}#2#", + "von {V:1}#3#{} gibt", + "{X:mult,C:white} X#1# {} Mult, wenn gezählt", + "{s:0.8}Die Karte ändert sich jede Runde", + }, + unlock={ + "Verdiene in einer Hand", + "mindestens", + "{E:1,C:attention}#1#{} Chips", + }, + }, + j_invisible={ + name="Unsichtbarer Joker", + text={ + "Verkaufe nach {C:attention}#1#{} Runden", + "diese Karte,", + "um einen zufälligen Joker zu {C:attention}duplizieren{}", + "{C:inactive}(Momentan {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Gewinne einen Durchlauf,", + "ohne je mehr als", + "{E:1,C:attention}4 Joker{} zu haben", + }, + }, + j_joker={ + name="Joker", + text={ + "{C:red,s:1.1}+#1#{} Mult", + }, + }, + j_jolly={ + name="Lustiger Joker", + text={ + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_juggler={ + name="Jongleur", + text={ + "{C:attention}+#1#{} Handgröße", + "Größe der Hand", + }, + }, + j_loyalty_card={ + name="Treuekarte", + text={ + "{X:red,C:white} X#1# {} Mult nach jeder", + "{C:attention}#2#{} gespielten Hand", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Verkaufe diese Karte,", + "um den aktuellen", + "{C:attention}Boss Blind{} zu deaktivieren.", + }, + }, + j_lucky_cat={ + name="Glückskatze", + text={ + "Dieser Joker erhält jedes Mal {X:mult,C:white} X#1# {} Mult", + ", wenn eine {C:attention}Glückskarte{}", + "{C:green}erfolgreich{} ausgelöst wird.", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_lusty_joker={ + name="Lüsterner Joker", + text={ + "Gespielte Karten mit ", + "{C:hearts}#2#{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt", + }, + }, + j_mad={ + name="Verrückter Joker", + text={ + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_madness={ + name="Wahnsinn", + text={ + "Wenn {C:attention}Small Blind{} oder {C:attention}Big Blind{}", + "gewählt ist, erhalte {X:mult,C:white} X#1# {} Mult", + "und {C:attention}zerstöre{} einen zufälligen", + "Joker. {C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_mail={ + name="Post-Rabatt", + text={ + "Verdiene {C:money}#1# ${} für", + "jede abgeworfene {C:attention}#2#{}-Karte, Rang", + "ändert sich jede Runde", + }, + }, + j_marble={ + name="Marmor-Joker", + text={ + "Fügt eine {C:attention}Stein{}-Karte", + "zum Deck hinzu, wenn", + "{C:attention}Blind{} ausgewählt wird", + }, + }, + j_matador={ + name="Matador", + text={ + "Verdiene {C:money}#1# ${}, wenn die", + "gespielte Hand die", + "{C:attention}Boss-Blind{}-Fähigkeit auslöst", + }, + unlock={ + "Besiege einen Boss Blind", + "in {E:1,C:attention}1 Hand{}, ohne", + "Abwürfe zu verwenden", + }, + }, + j_merry_andy={ + name="Fröhlicher Andy", + text={ + "{C:red}+#1#{} Abwürfe", + "jede Runde,", + "{C:red}#2#{} Handgröße.", + }, + unlock={ + "Gewinne einen Durchlauf in maximal {E:1,C:attention}#1#", + "Runden", + }, + }, + j_midas_mask={ + name="Midas-Maske", + text={ + "Alle gespielten {C:attention}Bildkarten{}", + "werden zu {C:attention}Gold{}-Karten", + "wenn gezählt.", + }, + }, + j_mime={ + name="Pantomime", + text={ + "Alle Fähigkeiten", + "der Karten {C:attention}auf der", + "{C:attention}Hand{} erneut auslösen", + }, + }, + j_misprint={ + name="Fehldruck", + text={ + "", + }, + }, + j_mr_bones={ + name="Mr. Bones", + text={ + "Verhindert Tod,", + "wenn die erzielten Chips", + "mindestens {C:attention}25  %", + "der benötigten Chips betragen", + "{S:1.1,C:red,E:2}zerstört sich selbst{}", + }, + unlock={ + "Verliere {C:attention,E:1}#1#{} Durchläufe", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Mystischer Gipfel", + text={ + "{C:mult}+#1#{} Mult, wenn", + "{C:attention}#2#{} Abwürfe", + "verbleiben", + }, + }, + j_obelisk={ + name="Obelisk", + text={ + "Dieser Joker erhält {X:mult,C:white} X#1# {} Mult", + "pro {C:attention}aufeinanderfolgend{} gespielter", + "Hand, die ohne deine", + "meistgespielte {C:attention}Pokerhand", + "{C:inactive}gespielt wurde. (Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_odd_todd={ + name="Ungerader Udo", + text={ + "Gespielte Karten mit ", + "{C:attention}ungeradem{} Rang geben", + "{C:chips}+#1#{} Chips, wenn gezählt", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Onyx-Achat", + text={ + "Gespielte Karten mit", + "{C:clubs}Kreuz{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt", + }, + unlock={ + "Habe mindestens {E:1,C:attention}#1#", + "Karten mit {E:1,C:attention}#2#-", + "Farbe in deinem Deck", + }, + }, + j_oops={ + name="Ups! Alle 6en", + text={ + "Verdoppelt alle {C:attention}aufgelisteten", + "{C:green,E:1,S:1.1}Wahrscheinlichkeiten", + "{C:inactive}(bspw.: {C:green}1 in 3{C:inactive} -> {C:green}2 in 3{C:inactive})", + }, + unlock={ + "Verdiene in einer Hand", + "mindestens", + "{E:1,C:attention}#1#{} Chips", + }, + }, + j_order={ + name="Der Orden", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + unlock={ + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen", + }, + }, + j_pareidolia={ + name="Pareidolie", + text={ + "Alle Karten werden", + "als", + "{C:attention}Bildkarten{} angesehen", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Erzeug eine {C:dark_edition}negative{} Kopie von", + "{C:attention}1{} zufälligen {C:attention}verbrauchbaren{}", + "Karte in deinem Besitz", + "am Ende des {C:attention}Shops", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Fotograf", + text={ + "Die erste gespielte {C:attention}Bildkarte", + "gibt {X:mult,C:white} X#1# {} Mult,", + "wenn gezählt", + }, + }, + j_popcorn={ + name="Popcorn", + text={ + "{C:mult}+#1#{} Mult", + "{C:mult}-#2#{} Mult pro", + "gespielter Runde", + }, + }, + j_raised_fist={ + name="Erhobene Faust", + text={ + "Fügt Mult den {C:attention}doppelten{} Rang", + "der Karte mit dem", + "{C:attention}niedrigsten{} Rang in der Hand hinzu.", + }, + }, + j_ramen={ + name="Ramen", + text={ + "{X:mult,C:white} X#1# {} Mult,", + "verliert {X:mult,C:white} X#2# {} Mult", + "pro abgeworfener {C:attention}Karte{}", + }, + }, + j_red_card={ + name="Rote Karte", + text={ + "Dieser Joker erhält", + "{C:red}+#1#{} Mult, wenn ein beliebiges", + "{C:attention}Booster-Paket{}", + "übersprungen wird. {C:inactive}(Momentan {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_reserved_parking={ + name="Reservierter Parkplatz", + text={ + "Jede {C:attention}Bildkarte{}", + "auf der Hand hat", + "eine Chance von {C:green}#2#-zu-#3#{},", + "um {C:money}#1# ${} zu bringen", + }, + }, + j_ride_the_bus={ + name="Im Bus fahren", + text={ + "Dieser Joker erhält {C:mult}+#1#{} Mult", + "pro {C:attention}aufeinanderfolgend{} gespielter", + "Hand, ohne eine", + "wertende {C:attention}Bildkarte{}.", + "{C:inactive}(Momentan {C:mult}+#2#{C:inactive} Mult)", + }, + }, + j_riff_raff={ + name="Gesindel", + text={ + "Erzeugt beim Auswählen eines{C:attention}Blinds{},", + "{C:attention}#1# {C:blue}gewöhnliche{C:attention} Joker", + "{C:inactive}(Muss Platz haben)", + }, + }, + j_ring_master={ + name="Ringmeister", + text={ + "{C:attention}Joker{}-, {C:tarot}Tarot{}-, {C:planet}Planeten{}-", + "und {C:spectral}Geister{}-Karten können", + "mehrfach erscheinen", + }, + unlock={ + "Erreiche Anten", + "-Level {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Rakete", + text={ + "Erhalte {C:money}#1# ${} bei Ende der Runde.", + "Auszahlung erhöht sich um {C:money}#2# ${}", + ", wenn {C:attention}Boss Blind{} besiegt ist.", + }, + }, + j_rough_gem={ + name="Rohedelstein", + text={ + "Gespielte Karten mit", + "{C:diamonds}Kreuz{}-Farbe verdienen", + "{C:money}#1# ${}, wenn gezählt", + }, + unlock={ + "Habe mindestens {E:1,C:attention}#1#", + "Karten mit {E:1,C:attention}#2#-", + "Farbe in deinem Deck", + }, + }, + j_runner={ + name="Läufer", + text={ + "Erhält {C:chips}+#2#{} Chips,", + "wenn die gespielte Hand", + "einen {C:attention}Straight{} enthält", + "{C:inactive}(Momentan {C:chips}+#1#{C:inactive} Chips)", + }, + }, + j_satellite={ + name="Satellit", + text={ + "Verdiene {C:money}#1# ${} am Ende", + "der Runde pro einzigartige {C:planet}Planeten-", + "Karte, die in diesem Durchlauf verwendet wird", + "{C:inactive}(Momentan {C:money}#2# ${C:inactive})", + }, + unlock={ + "Habe mindestens", + "{E:1,C:money}#1# $", + }, + }, + j_scary_face={ + name="Gruselgesicht", + text={ + "Gespielte {C:attention}Bildkarten{}", + "geben {C:chips}+#1#{} Chips,", + "wenn gezählt", + }, + }, + j_scholar={ + name="Gelehrter", + text={ + "Gespielte {C:attention}Asse{}", + "geben {C:chips}+#2#{} Chips", + "und {C:mult}+#1#{} Mult", + "wenn gezählt", + }, + }, + j_seance={ + name="Séance", + text={ + "Wenn {C:attention}Pokerhand{} eine", + "{C:attention}#1#{} ist, erscheint eine", + "zufällige {C:spectral}Geister{}-Karte", + "{C:inactive}(Muss Platz haben)", + }, + }, + j_seeing_double={ + name="Doppelt sehen", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn die gespielte", + "Hand eine wertende", + "{C:clubs}Kreuz{}-Karte und eine wertende", + "Karte einer beliebigen anderen {C:attention}Farbe", + }, + unlock={ + "Spiele eine Hand,", + "die", + "{E:1,C:attention}#1# enthält", + }, + }, + j_selzer={ + name="Selters", + text={ + "Löse alle", + "gespielten Karten", + "für die nächsten {C:attention}#1#{} Hände erneut aus", + }, + }, + j_shoot_the_moon={ + name="Aufs Ganze gehen", + text={ + "Jede {C:attention}Dame{}", + "auf der Hand", + "bringt {C:mult}+#1#{} Mult.", + }, + unlock={ + "Spiele jedes {E:1,C:attention}Herz", + "in deinem Deck", + "in einer einzigen Runde", + }, + }, + j_shortcut={ + name="Abkürzung", + text={ + "Erlaubt {C:attention}Straights{} mit", + "Lücken von {C:attention}1 Rang", + "gebildet zu werden. {C:inactive}(bspw.: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Sechster Sinn", + text={ + "Wenn die {C:attention}erste Hand{} der Runde", + "eine einzige {C:attention}6{} ist, wird sie zerstört und", + "eine {C:spectral}Geister{}-Karte erzeugt", + "{C:inactive}(Muss Platz haben)", + }, + }, + j_sly={ + name="Listiger Joker", + text={ + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_smeared={ + name="Schmieriger Joker", + text={ + "{C:diamonds}Herzen{} und {C:diamonds}Karos", + "zählen als dieselbe Farbe,", + "{C:spades}Piks{} und {C:spades}Kreuzen", + "zählen als dieselbe Farbe", + }, + unlock={ + "Habe mindestens {C:attention}#1#", + "{E:1,C:attention}#2#{} in", + "deinem Deck", + }, + }, + j_smiley={ + name="Smiley", + text={ + "Gespielte {C:attention}Bildkarten{}", + "bringen {C:mult}+#1#{} Mult,", + "wenn gezählt", + }, + }, + j_sock_and_buskin={ + name="Komödie und Tragödie", + text={ + "Löse alle", + "gespielten {C:attention}Bildkarten{} erneut aus", + }, + unlock={ + "Spiele insgesamt", + "{C:attention,E:1}#1#{} Bildkarten", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Weltraum-Joker", + text={ + "{C:green}#1#-zu-#2#{}-Chance,", + "das Level der", + "gespielten {C:attention}Pokerhand{} zu verbessern", + }, + }, + j_splash={ + name="Platscher", + text={ + "Jede {C:attention}gespielte Karte", + "zählt bei der Punktezählung", + }, + }, + j_square={ + name="Quadrat-Joker", + text={ + "Dieser Joker erhält {C:chips}+#2#{} Chips,", + "wenn die gespielte Hand", + "genau {C:attention}4{} Karten hat.", + "{C:inactive}(Momentan {C:chips}#1#{C:inactive} Chips)", + }, + }, + j_steel_joker={ + name="Stahl-Joker", + text={ + "Gibt {X:mult,C:white} X#1# {} Mult", + "für jede {C:attention}Stahl-Karte", + "in deinem {C:attention}vollen Deck.", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_stencil={ + name="Joker-Schablone", + text={ + "{X:red,C:white} X#1# {} Mult für jeden", + "leeren {C:attention}Joker{}-Slot", + "{s:0.8}Joker-Schablone eingeschlossen", + "{C:inactive}(Momentan {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Stein-Joker", + text={ + "Gibt {C:chips}+#1#{} Chips für", + "jede {C:attention}Stein-Karte", + "in deinem {C:attention}vollen Deck.", + "{C:inactive}(Momentan {C:chips}+#2#{C:inactive} Chips)", + }, + }, + j_stuntman={ + name="Stuntman", + text={ + "{C:chips}+#1#{} Chips,", + "{C:attention}-#2#{} Handgröße", + }, + unlock={ + "Verdiene in einer Hand", + "mindestens", + "{E:1,C:attention}#1#{} Chips", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Fügt hinzu, wie oft", + "{C:attention}Pokerhand{} in diesem", + "Durchlauf auf Mult gespielt wurde.", + }, + }, + j_superposition={ + name="Superposition", + text={ + "Erzeuge eine {C:tarot}Tarot{}-Karte, wenn", + "die Pokerhand ein", + "{C:attention}Ass{} und ein {C:attention}Straight{} enthält", + "{C:inactive}(Muss Platz haben)", + }, + }, + j_swashbuckler={ + name="Säbelrassler", + text={ + "Fügt Mult den Verkaufswert", + "aller anderen eigenen", + "{C:attention}Joker{} hinzu.", + "{C:inactive}(Momentan {C:mult}+#1#{C:inactive} Mult)", + }, + unlock={ + "Verkaufe insgesamt", + "{C:attention,E:1}#1#{} Joker-Karten", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Rückblick", + text={ + "{X:mult,C:white} X#1# {} Mult für jeden", + "In diesem Durchlauf übersprungenen {C:attention}Blind{}", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Fahre mit einem gespeicherten Durchlauf", + "aus dem Hauptmenü fort", + }, + }, + j_ticket={ + name="Goldenes Ticket", + text={ + "Gespielte {C:attention}Gold{}-Karten", + "verdienen {C:money}#1# ${}, wenn gezählt", + }, + unlock={ + "Spiele eine 5-Karten-Hand,", + "die ausschließlich", + "{C:attention,E:1}Gold{}-Karten enthält", + }, + }, + j_to_the_moon={ + name="Zum Mond", + text={ + "Verdiene zusätzlich {C:money}#1# ${}", + "{C:attention}Zinsen{} pro {C:money}5 ${},", + "die sich zum Ende der Runde auf deiner Hand befinden", + }, + }, + j_todo_list={ + name="To-do-Liste", + text={ + "Erhalte {C:money}#1# ${}, wenn {C:attention}Pokerhand{}", + "eine {C:attention}#2#{} ist.", + "Pokerhand ändert sich", + "am Ende der Runde.", + }, + }, + j_trading={ + name="Sammelkarte", + text={ + "Wenn der {C:attention}erste Abwurf{} der Runde", + "nur {C:attention}1{} Karte hat, zerstöre", + "sie und verdiene {C:money}#1# $", + }, + }, + j_tribe={ + name="Der Stamm", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + unlock={ + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "Gespielte {C:attention}Könige{} und", + "{C:attention}Damen{} geben jeweils", + "{X:mult,C:white} X#1#{} Mult, wenn gezählt,", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="Das Trio", + text={ + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + unlock={ + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen", + }, + }, + j_troubadour={ + name="Troubadour", + text={ + "{C:attention}+#1#{} Handgröße,", + "{C:blue}-#2#{} Hand jede Runde.", + }, + unlock={ + "Gewinne {C:attention,E:1}#1#{} Runden", + "hintereinander, in denen du", + "nur 1 Hand spielst", + }, + }, + j_trousers={ + name="Ersatzhose", + text={ + "Dieser Joker erhält {C:mult}+#1#{} Mult,", + "wenn die gespielte Hand", + "{C:attention}#2#", + "enthält. {C:inactive}(Momentan {C:red}+#3#{C:inactive} Mult)", + }, + }, + j_turtle_bean={ + name="Schwarze Bohne", + text={ + "{C:attention}+#1#{} Handgröße,", + "verringert sich um", + "{C:red}#2#{} jede Runde", + }, + }, + j_vagabond={ + name="Vagabund", + text={ + "Erzeuge eine {C:purple}Tarot{}-Karte,", + "wenn eine Hand gespielt wird", + "mit {C:money}#1# ${} oder weniger", + }, + }, + j_vampire={ + name="Vampir", + text={ + "Dieser Joker erhält {X:mult,C:white} X#1# {} Mult", + "für jede wertende {C:attention}Verstärkte Karte{}, die gespielt wurde.", + "Entfernt {C:attention}Kartenverstärkung.", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_walkie_talkie={ + name="Walkie-Talkie", + text={ + "Jede gespielte {C:attention}10{} oder {C:attention}4", + "bringt {C:chips}+#1#{} Chips und", + "{C:mult} X#2#{} Mult, wenn gezählt,", + }, + }, + j_wee={ + name="Winziger Joker", + text={ + "Dieser Joker erhält", + "{C:chips}+#2#{} Chips, wenn jede", + "gespielte {C:attention}2{} gezählt wird", + "{C:inactive}(Momentan {C:chips}+#1#{C:inactive} Chips)", + }, + unlock={ + "Gewinne einen Durchlauf in maximal {E:1,C:attention}#1#", + "Runden", + }, + }, + j_wily={ + name="Trickreicher Joker", + text={ + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + j_wrathful_joker={ + name="Zorniger Joker", + text={ + "Gespielte Karten mit ", + "{C:spades}#2#{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt", + }, + }, + j_yorick={ + name="Yorick", + text={ + "Dieser Joker erhält", + "{X:mult,C:white} X#1# {} Mult alle {C:attention}#2#{C:inactive} [#3#]{}", + "abgeworfenen Karten.", + "{C:inactive}(Momentan {X:mult,C:white} X#4# {C:inactive} Mult)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Schräger Joker", + text={ + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + }, + }, + }, + Other={ + black_sticker={ + name="Schwarzer Sticker", + text={ + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Schwarzen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen", + }, + }, + blue_seal={ + name="Blaues Siegel", + text={ + "Erschafft die {C:planet}Planeten{}-Karte", + "für die letzte gespielte {C:attention}Pokerhand{}", + "der Runde, wenn sie {C:attention}auf der Hand{} ist.", + "{C:inactive}(Muss Platz haben)", + }, + }, + blue_sticker={ + name="Blauer Sticker", + text={ + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Blauen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} Chips", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} Extra-Chips", + }, + }, + challenge_locked={ + name="Gesperrt", + text={ + "Gewinne mindestens einen Durchlauf", + "mit 5 unterschiedlichen Decks,", + "um den Herausforderungsmodus freizuschalten", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Geschwächt", + text={ + "Alle Fähigkeiten", + "sind deaktiviert", + }, + }, + debuffed_playing_card={ + name="Geschwächt", + text={ + "Erzielt keine Chips", + "und alle Fähigkeiten", + "sind deaktiviert", + }, + }, + deck_locked_discover={ + name="Gesperrt", + text={ + "Entdecke mindestens", + "{C:attention}#1#{} Gegenstände aus", + "deiner Sammlung", + }, + }, + deck_locked_stake={ + name="Gesperrt", + text={ + "Gewinne einen Durchlauf mit einem beliebigen", + "Deck auf mindestens", + "Schwierigkeitsstufe {V:1}#1#{}", + }, + }, + deck_locked_win={ + name="Gesperrt", + text={ + "Gewinne einen Durchlauf mit", + "{C:attention}#1#{}", + "auf einer beliebigen Schwierigkeitsstufe", + }, + }, + demo_locked={ + name="Gesperrt", + text={ + "Nicht verfügbar", + "in dieser Demo", + }, + }, + demo_shop_locked={ + name="Gesperrt", + text={ + "Karten aus {C:attention}Jimbos", + "persönlicher Sammlung,", + "verfügbar in der", + "Vollversion von {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Ewig", + text={ + "Kann nicht verkauft", + "oder zerstört werden", + }, + }, + gold_seal={ + name="Goldenes Siegel", + text={ + "Verdiene {C:money}3 ${}, wenn diese", + "Karte gespielt wird", + "und punktet", + }, + }, + gold_sticker={ + name="Goldener Sticker", + text={ + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Goldenen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen", + }, + }, + green_sticker={ + name="Grüner Sticker", + text={ + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Grünen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen", + }, + }, + joker_locked_legendary={ + name="Gesperrt", + text={ + "Finde diesen Joker", + "aus der {C:spectral}Seelen{}-Karte", + }, + }, + locked={ + name="Gesperrt", + text={ + }, + }, + orange_sticker={ + name="Orangener Sticker", + text={ + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Orangenen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen", + }, + }, + p_arcana_jumbo={ + name="Riesiges Arkana-Paket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:tarot} Tarot{}-Karten", + "zur sofortigen Verwendung", + }, + }, + p_arcana_mega={ + name="Mega-Arkana-Paket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:tarot} Tarot{}-Karten", + "zur sofortigen Verwendung", + }, + }, + p_arcana_normal={ + name="Arkana-Paket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:tarot} Tarot{}-Karten", + "zur sofortigen Verwendung", + }, + }, + p_buffoon_jumbo={ + name="Riesiges Clownspaket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:joker} Joker{}-Karten", + }, + }, + p_buffoon_mega={ + name="Mega-Clownspaket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:joker} Joker{}-Karten", + }, + }, + p_buffoon_normal={ + name="Clownspaket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:joker} Joker{}-Karten", + }, + }, + p_celestial_jumbo={ + name="Riesiges Himmelspaket", + text={ + "Wähle {C:attention}#1#{}aus bis zu", + "{C:attention}#2#{C:planet} Planeten{}-Karten", + "zur sofortigen Verwendung", + }, + }, + p_celestial_mega={ + name="Mega-Himmelspaket", + text={ + "Wähle {C:attention}#1#{}aus bis zu", + "{C:attention}#2#{C:planet} Planeten{}-Karten", + "zur sofortigen Verwendung", + }, + }, + p_celestial_normal={ + name="Himmelspaket", + text={ + "Wähle {C:attention}#1#{} aus", + "{C:attention}#2#{C:planet} Planeten{}-Karten", + "zur sofortigen Verwendung aus", + }, + }, + p_spectral_jumbo={ + name="Riesiges Geisterpaket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:spectral} Geister{}-Karten", + "zur sofortigen Verwendung", + }, + }, + p_spectral_mega={ + name="Mega-Geisterpaket", + text={ + "Wähle {C:attention}#1#{} aus", + "{C:attention}#2#{C:spectral} Geister{}-Karten", + "zur sofortigen Verwendung aus", + }, + }, + p_spectral_normal={ + name="Geisterpaket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:spectral} Geister{}-Karten", + "zur sofortigen Verwendung", + }, + }, + p_standard_jumbo={ + name="Riesiges Standardpaket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:attention} Spielkarten{},", + "um sie deinem Deck hinzuzufügen", + }, + }, + p_standard_mega={ + name="Mega-Standardpaket", + text={ + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:attention} Spielkarten{},", + "um sie deinem Deck hinzuzufügen", + }, + }, + p_standard_normal={ + name="Standardpaket", + text={ + "Wähle {C:attention}#1#{} aus", + "{C:attention}#2#{C:attention} Spielkarten{} aus,", + "um sie deinem Deck hinzuzufügen", + }, + }, + perishable={ + name="Verderblich", + text={ + "Geschwächt nach", + "{C:attention}#1#{} Runden.", + "{C:inactive}({C:attention}#2#{C:inactive} verbleiben)", + }, + }, + pinned_left={ + name="Angeheftet", + text={ + "Dieser Joker bleibt", + "an der Position", + "ganz links angeheftet", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# von {V:1}#2# ", + }, + }, + purple_seal={ + name="Lila Siegel", + text={ + "Erzeugt eine {C:tarot}Tarot{}-Karte", + "bei {C:attention}Abwurf", + "{C:inactive}(Muss Platz haben)", + }, + }, + purple_sticker={ + name="Lila Sticker", + text={ + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Lila", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen", + }, + }, + red_seal={ + name="Rotes Siegel", + text={ + "Löse diese", + "Karte {C:attention}1{}-mal aus", + }, + }, + red_sticker={ + name="Roter Sticker", + text={ + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Roten", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen", + }, + }, + remove_negative={ + name="Negativ", + text={ + "{C:inactive,s:0.9}(Entfernt {C:dark_edition,s:0.9}Negativ{C:inactive,s:0.9} von der Kopie)", + }, + }, + rental={ + name="Gemietet", + text={ + "Verliere {C:money}#1# ${} bei", + "Ende der Runde.", + }, + }, + undiscovered_booster={ + name="Nicht entdeckt", + text={ + "Öffne dieses Paket", + "in einem Durchlauf ohne Code,", + "um herauszufinden, was es bewirkt", + }, + }, + undiscovered_edition={ + name="Nicht entdeckt", + text={ + "Finde diese Edition", + "in einem Durchlauf ohne Code,", + "um herauszufinden, was es bewirkt", + }, + }, + undiscovered_joker={ + name="Nicht entdeckt", + text={ + "Kaufe oder verwende", + "diese Karte in einem", + "Durchlauf ohne Code, um", + "herauszufinden, was sie bewirkt", + }, + }, + undiscovered_planet={ + name="Nicht entdeckt", + text={ + "Kaufe oder verwende", + "diese Karte in einem", + "Durchlauf ohne Code, um", + "herauszufinden, was sie bewirkt", + }, + }, + undiscovered_spectral={ + name="Nicht entdeckt", + text={ + "Kaufe oder verwende", + "diese Karte in einem", + "Durchlauf ohne Code, um", + "herauszufinden, was sie bewirkt", + }, + }, + undiscovered_tag={ + name="Nicht entdeckt", + text={ + "Nutze diesen Tag in", + "einem Durchlauf ohne Code, um", + "herauszufinden, was er bewirkt", + }, + }, + undiscovered_tarot={ + name="Nicht entdeckt", + text={ + "Kaufe oder verwende", + "diese Karte in einem", + "Durchlauf ohne Code, um", + "herauszufinden, was sie bewirkt", + }, + }, + undiscovered_voucher={ + name="Nicht entdeckt", + text={ + "Löse diesen", + "Gutschein in einem", + "Durchlauf ohne Code ein, um", + "herauszufinden, was er bewirkt", + }, + }, + white_sticker={ + name="Weißer Sticker", + text={ + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Weißen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen", + }, + }, + wip_locked={ + name="Gesperrt", + text={ + "In", + "Arbeit", + }, + }, + }, + Planet={ + c_ceres={ + name="Ceres", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_earth={ + name="Erde", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_jupiter={ + name="Jupiter", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_mars={ + name="Mars", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_mercury={ + name="Merkur", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_neptune={ + name="Neptun", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_planet_x={ + name="Planet X", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_pluto={ + name="Pluto", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_saturn={ + name="Saturn", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_uranus={ + name="Uranus", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + c_venus={ + name="Venus", + text={ + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung für", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips", + }, + }, + }, + Spectral={ + c_ankh={ + name="Anch", + text={ + "Erzeuge eine Kopie eines", + "zufälligen {C:attention}Jokers{}, zerstöre", + "alle anderen Joker", + }, + }, + c_aura={ + name="Aura", + text={ + "Füge den {C:dark_edition}Foil{}, {C:dark_edition}holographischen{},", + "oder {C:dark_edition}Polychrom{}-Effekt", + "{C:attention}1{} ausgewählten Karte in deiner Hand hinzu", + }, + }, + c_black_hole={ + name="Schwarzes Loch", + text={ + "Verbessere jede", + "{C:legendary,E:1}Pokerhand", + "um {C:attention}1{} Level", + }, + }, + c_cryptid={ + name="Cryptid", + text={ + "Erzeuge {C:attention}#1#{} Kopien von", + "{C:attention}1{} ausgewählten Karte", + "auf deiner Hand", + }, + }, + c_deja_vu={ + name="Déjà-vu", + text={ + "Füge ein {C:red}Rotes Siegel{}", + "zu {C:attention}1{} ausgewählten", + "Karte auf deiner Hand hinzu", + }, + }, + c_ectoplasm={ + name="Ektoplasma", + text={ + "Fügt {C:dark_edition}Negativ{} zu", + "einem zufälligen {C:attention}Joker hinzu,", + "{C:red}-1{} Handgröße", + }, + }, + c_familiar={ + name="Vertrauter", + text={ + "Zerstöre {C:attention}1{} zufällige", + "Karte in deiner Hand und füge", + "{C:attention}#1#{} zufällige {C:attention}verstärkte Bildkarte", + "{}hinzu", + }, + }, + c_grim={ + name="Finsternis", + text={ + "Zerstöre {C:attention}1{} zufällige", + "Karte auf deiner Hand,", + "füge {C:attention}#1#{} zufällige {C:attention}verstärkte", + "{C:attention}Asse{} hinzu", + }, + }, + c_hex={ + name="Bann", + text={ + "Füge ein {C:dark_edition}Polychrom{}", + "zu einem zufälligen {C:attention}Joker{} hinzu, zerstöre", + "alle anderen Joker", + }, + }, + c_immolate={ + name="Opferung", + text={ + "Zerstört {C:attention}#1#{} zufällige", + "Karten auf der Hand,", + "gibt {C:money}#2# $", + }, + }, + c_incantation={ + name="Beschwörung", + text={ + "Zerstöre {C:attention}1{} zufällige", + "Karte in deine Hand und füge {C:attention}#1#", + "zufällige {C:attention}verstärkte Zahlenkarte", + "hinzu", + }, + }, + c_medium={ + name="Medium", + text={ + "Füge ein {C:purple}Lila Siegel{}", + "zu {C:attention}1{} ausgewählten", + "Karte auf deiner Hand hinzu", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Verwandelt alle Karten", + "auf der Hand in einen einzigen", + "zufälligen {C:attention}Rang", + "{C:red}-1{} Handgröße", + }, + }, + c_sigil={ + name="Siegel", + text={ + "Verwandelt alle Karten", + "auf der Hand in eine einzige", + "zufällige {C:attention}Farbe", + }, + }, + c_soul={ + name="Die Seele", + text={ + "Erschafft einen", + "{C:legendary,E:1}legendären{} Joker", + "{C:inactive}(Muss Platz haben)", + }, + }, + c_talisman={ + name="Talisman", + text={ + "Fügt ein {C:attention}Goldenes Siegel{}", + "zu {C:attention}1{} ausgewählten", + "Karte auf deiner Hand hinzu", + }, + }, + c_trance={ + name="Trance", + text={ + "Füge ein {C:blue}Blaues Siegel{}", + "zu {C:attention}1{} ausgewählten", + "Karte auf deiner Hand hinzu", + }, + }, + c_wraith={ + name="Gespenst", + text={ + "Lässt einen zufälligen", + "{C:red}seltenen{C:attention} Joker{} erscheinen,", + "setzt Geld auf {C:money}0 $", + }, + }, + }, + Stake={ + stake_black={ + name="Schwarzer Einsatz", + text={ + "Shop kann {C:attention}ewige{} Joker haben", + "{C:inactive,s:0.8}(Kann nicht verkauft oder zerstört werden)", + "{s:0.8}Gilt für alle vorherigen Einsätze", + }, + }, + stake_blue={ + name="Blauer Einsatz", + text={ + "{C:red}-1{} Abwurf", + "{s:0.8}Gilt für alle vorherigen Einsätze", + }, + }, + stake_gold={ + name="Goldener Einsatz", + text={ + "Shop kann {C:attention}gemietete{} Joker haben.", + "{C:inactive,s:0.8}(Kosten {C:money,s:0.8}3 ${C:inactive,s:0.8} pro Runde)", + "{s:0.8}Gilt für alle vorherigen Einsätze.", + }, + }, + stake_green={ + name="Grüner Einsatz", + text={ + "Benötigte Punktzahl skaliert", + "schneller für jede {C:attention}Ante", + "{s:0.8}Gilt für alle vorherigen Einsätze", + }, + }, + stake_orange={ + name="Orangener Einsatz", + text={ + "Shop kann {C:attention}verderbliche{} Joker haben.", + "{C:inactive,s:0.8}(Werden nach 5 Runden geschwächt)", + "{s:0.8}Gilt für alle vorherigen Einsätze.", + }, + }, + stake_purple={ + name="Lila Einsatz", + text={ + "Benötigte Punktzahl skaliert", + "schneller für jede {C:attention}Ante", + "{s:0.8}Gilt für alle vorherigen Einsätze", + }, + }, + stake_red={ + name="Roter Einsatz", + text={ + "{C:attention}Small Blind{} gibt", + "kein Belohnungsgeld", + "{s:0.8}Gilt für alle vorherigen Einsätze", + }, + }, + stake_white={ + name="Weißer Einsatz", + text={ + "Basis-Schwierigkeit", + }, + }, + }, + Tag={ + tag_boss={ + name="Boss-Tag", + text={ + "Aktualisiert den", + "{C:attention}Boss Blind", + }, + }, + tag_buffoon={ + name="Clown-Tag", + text={ + "Gibt ein gratis", + "{C:attention}Clownspaket", + }, + }, + tag_charm={ + name="Charme-Tag", + text={ + "Gibt ein gratis", + "{C:tarot}Mega-Arkana-Paket", + }, + }, + tag_coupon={ + name="Coupon-Tag", + text={ + "Anfangskarten und", + "Booster-Pakete sind", + "im nächsten Shop gratis", + }, + }, + tag_d_six={ + name="D6-Tag", + text={ + "Aktualisieren beginnt ", + "im nächsten Shop", + "bei {C:money}0 $", + }, + }, + tag_double={ + name="Doppel-Tag", + text={ + "Gibt eine Kopie des", + "nächsten ausgewählten {C:attention}Tags{},", + "{s:0.8,C:attention}Doppel-Tag{s:0.8} ausgeschlossen", + }, + }, + tag_economy={ + name="Sparer-Tag", + text={ + "Verdoppelt dein Geld", + "{C:inactive}(Max. {C:money}#1# ${C:inactive})", + }, + }, + tag_ethereal={ + name="Ätherischer Tag", + text={ + "Gibt ein gratis", + "{C:planet}Geisterpaket", + }, + }, + tag_foil={ + name="Foil-Tag", + text={ + "Der nächste Basis-Joker", + "aus dem Shop ist kostenlos und", + "wird zu {C:dark_edition}Foil.", + }, + }, + tag_garbage={ + name="Müll-Tag", + text={ + "Gibt {C:money}#1# ${} pro ungenutztem", + "{C:red}Abwurf{} in diesem Durchlauf", + "{C:inactive}(Gibt {C:money}#2# ${C:inactive})", + }, + }, + tag_handy={ + name="Nützlicher Tag", + text={ + "Gibt {C:money}#1# ${} pro gespielter", + "{C:blue}Hand{} in diesem Durchlauf", + "{C:inactive}(Gibt {C:money}#2# ${C:inactive})", + }, + }, + tag_holo={ + name="Holografischer Tag", + text={ + "Der nächste Basis-Joker", + "aus dem Shop ist kostenlos und", + "wird zu {C:dark_edition}Holografisch.", + }, + }, + tag_investment={ + name="Investment-Tag", + text={ + "Nachdem du den", + "Boss Blind besiegst,", + "erhältst du {C:money}#1# $", + }, + }, + tag_juggle={ + name="Jongleur-Tag", + text={ + "{C:attention}+#1#{} Handgröße", + "in der nächsten Runde", + }, + }, + tag_meteor={ + name="Meteor-Tag", + text={ + "Gibt ein gratis", + "{C:planet}Mega-Himmelspaket", + }, + }, + tag_negative={ + name="Negativer Tag", + text={ + "Der nächste Basis-Joker", + "aus dem Shop ist kostenlos und", + "wird zu {C:dark_edition}Negativ.", + }, + }, + tag_orbital={ + name="Orbital-Tag", + text={ + "Verbessere {C:attention}#1#", + "um {C:attention}#2# Levels", + }, + }, + tag_polychrome={ + name="Polychrom-Tag", + text={ + "Der nächste Basis-Joker", + "aus dem Shop ist kostenlos und", + "wird zu {C:dark_edition}Polychrom.", + }, + }, + tag_rare={ + name="Seltener Tag", + text={ + "Shop hat einen kostenlosen", + "{C:red}Seltenen Joker.", + }, + }, + tag_skip={ + name="Tempo-Tag", + text={ + "Gibt in diesem Durchlauf {C:money}#1# ${}", + "pro übersprungenem Blind", + "{C:inactive}(Gibt {C:money}#2# ${C:inactive})", + }, + }, + tag_standard={ + name="Standard-Tag", + text={ + "Gibt ein gratis", + "{C:attention}Mega-Standardpaket", + }, + }, + tag_top_up={ + name="Auffüllungs-Tag", + text={ + "Erzeugt bis zu {C:attention}#1#", + "{C:blue}gewöhnliche{} Joker", + "{C:inactive}(Muss Platz haben)", + }, + }, + tag_uncommon={ + name="Ungewöhnlicher Tag", + text={ + "Shop hat einen kostenlosen", + "{C:green}Ungewöhnlichen Joker.", + }, + }, + tag_voucher={ + name="Gutschein-Tag", + text={ + "Fügt einen {C:voucher}Gutschein", + "im nächsten Shop hinzu", + }, + }, + }, + Tarot={ + c_chariot={ + name="Der Wagen", + text={ + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#", + }, + }, + c_death={ + name="Tod", + text={ + "Wähle {C:attention}#1#{} Karten,", + "die {C:attention}linke{} Karte", + "wird in die {C:attention}rechte{} Karte verwandelt", + "{C:inactive}(Zur Neuanordnung ziehen)", + }, + }, + c_devil={ + name="Der Teufel", + text={ + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="Der Herrscher", + text={ + "Lässt bis zu {C:attention}#1#", + "zufällige {C:tarot}Tarot{}-Karten erscheinen", + "{C:inactive}(Muss Platz haben)", + }, + }, + c_empress={ + name="Die Herrscherin", + text={ + "Verstärkt {C:attention}#1#", + "gespielte Karten auf", + "{C:attention}#2#n", + }, + }, + c_fool={ + name="Der Narr", + text={ + "Lässt die letzte", + "{C:tarot}Tarot{}- oder {C:planet}Planeten{}-Karten", + "dieses Durchlaufs erscheinen,", + "abgesehen von {s:0.8,C:tarot}Der Narr{s:0.8}", + }, + }, + c_hanged_man={ + name="Der Gehängte", + text={ + "Zerstört bis zu", + "{C:attention}#1#{} ausgewählte Karten", + }, + }, + c_heirophant={ + name="Der Hierophant", + text={ + "Verstärkt {C:attention}#1#", + "gespielte Karten auf", + "{C:attention}#2#n", + }, + }, + c_hermit={ + name="Der Eremit", + text={ + "Verdoppelt Geld", + "{C:inactive}(Max. {C:money}#1# ${C:inactive})", + }, + }, + c_high_priestess={ + name="Die Hohepriesterin", + text={ + "Lässt bis zu {C:attention}#1#", + "zufällige {C:planet}Planeten{}-Karten erscheinen", + "{C:inactive}(Muss Platz haben)", + }, + }, + c_judgement={ + name="Gericht", + text={ + "Lässt eine zufällige", + "{C:attention}Joker{}-Karte erscheinen", + "{C:inactive}(Muss Platz haben)", + }, + }, + c_justice={ + name="Gerechtigkeit", + text={ + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="Die Liebenden", + text={ + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#", + }, + }, + c_magician={ + name="Der Magier", + text={ + "Verstärkt {C:attention}#1#{}", + "gespielte Karten auf", + "{C:attention}#2#n.", + }, + }, + c_moon={ + name="Der Mond", + text={ + "Verwandelt bis zu", + "{C:attention}#1#{} ausgewählte Karten", + "in {V:1}#2#{}", + }, + }, + c_star={ + name="Der Stern", + text={ + "Verwandelt bis zu", + "{C:attention}#1#{} ausgewählte Karten", + "in {V:1}#2#{}", + }, + }, + c_strength={ + name="Kraft", + text={ + "Erhöht den Rang von", + "bis zu {C:attention}#1#{} ausgewählten", + "Karten um {C:attention}1", + }, + }, + c_sun={ + name="Die Sonne", + text={ + "Verwandelt bis zu", + "{C:attention}#1#{} ausgewählte Karten", + "in {V:1}#2#{}", + }, + }, + c_temperance={ + name="Mäßigkeit", + text={ + "Gibt den gesamten", + "Verkaufswert aller momentanen", + "Joker {C:inactive}(Max. {C:money}#1# ${C:inactive})", + "{C:inactive}(Momentan {C:money}#2# ${C:inactive})", + }, + }, + c_tower={ + name="Der Turm", + text={ + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="Das Rad des Schicksals", + text={ + "{C:green}#1#-zu-#2#{}-Chance, die", + "{C:dark_edition}Foil{}, {C:dark_edition}holographische{} oder", + "{C:dark_edition}Polychrom{}-Edition", + "zu einem zufälligen {C:attention}Joker{} hinzuzufügen", + }, + }, + c_world={ + name="Die Welt", + text={ + "Verwandelt bis zu", + "{C:attention}#1#{} ausgewählte Karten", + "in {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimaterie", + text={ + "{C:dark_edition}+1{} Joker-Slot", + }, + unlock={ + "Löse {C:voucher}Leer{}", + "{C:attention}#1#{} Mal ein", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="Leer", + text={ + "{C:inactive}Tut nichts?", + }, + }, + v_clearance_sale={ + name="Ausverkauf", + text={ + "Alle Karten und Pakete im", + "Shop sind um {C:attention}#1#  %{} reduziert", + }, + }, + v_crystal_ball={ + name="Kristallkugel", + text={ + "{C:attention}+1{} Slot für Verbrauchsgegenstände", + }, + }, + v_directors_cut={ + name="Director‘s Cut", + text={ + "Boss Blind aktualisieren", + "{C:attention}1{} Mal pro Ante,", + "{C:money}#1# ${} pro Roll", + }, + }, + v_glow_up={ + name="Glow-Up", + text={ + "{C:dark_edition}Foil{}, {C:dark_edition}holografische{} und", + "{C:dark_edition}Polychrom{}-Karten", + "erscheinen {C:attention}#1#X{} öfter", + }, + unlock={ + "Habe mindestens {C:attention}#1#", + "{C:attention}Joker{}-Karten in der", + "{C:dark_edition}Foil{}, {C:dark_edition}holographischen{} oder", + "{C:dark_edition}Polychrom{}-Edition", + }, + }, + v_grabber={ + name="Greifer", + text={ + "Erhalte dauerhaft", + "{C:blue}+#1#{} Hand", + "pro Runde", + }, + }, + v_hieroglyph={ + name="Hieroglyphe", + text={ + "{C:attention}-#1#{} Ante,", + "{C:blue}-#1#{} Hand", + "jede Runde.", + }, + }, + v_hone={ + name="Schleiferei", + text={ + "{C:dark_edition}Foil{}, {C:dark_edition}holografische{} und", + "{C:dark_edition}Polychrom{}-Karten", + "erscheinen {C:attention}#1#X{} öfter", + }, + }, + v_illusion={ + name="Illusion", + text={ + "{C:attention}Spielkarten{} im Shop", + "können eine {C:enhanced}Verstärkung{},", + "{C:dark_edition}Edition{} und/oder ein {C:attention}Siegel{} haben", + }, + unlock={ + "Kaufe insgesamt", + "{C:attention}#1#{} Spielkarten", + "aus dem Shop", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Liquidierung", + text={ + "Alle Karten und Pakete im", + "Shop sind um {C:attention}#1#  %{} reduziert", + }, + unlock={ + "Löse mindestens", + "{C:attention}#1#{C:voucher} Gutschein{}-Karten", + "in einem Durchlauf ein", + }, + }, + v_magic_trick={ + name="Zaubertrick", + text={ + "{C:attention}Spielkarten{} können", + "aus dem {C:attention}Shop", + "gekauft werden", + }, + }, + v_money_tree={ + name="Geldbaum", + text={ + "Erhöhe die Obergrenze für", + "erhaltene Zinsen in", + "jeder Runde auf {C:money}#1# ${}.", + }, + unlock={ + "Maximiere die Zinsen", + "pro Rundeneinnahme für", + "{C:attention}#1#{} Runden hintereinander", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Nacho Tong", + text={ + "Erhalte dauerhaft", + "{C:blue}+#1#{} Hand", + "pro Runde", + }, + unlock={ + "Spiele insgesamt", + "{C:attention}#1#{} Karten", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Obvervatorium", + text={ + "{C:planet}Planeten{}-Karten in deinem", + "{C:attention}Verbrauchsgegenstand{}-Bereich geben", + "{X:red,C:white} X#1# {} Mult für ihre", + "festgelegte {C:attention}Pokerhand", + }, + unlock={ + "Verwende insgesamt {C:attention}#1#", + "{C:planet}Planeten{}-Karten aus einem beliebigen", + "{C:planet}Himmelspaket", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Omen-Globus", + text={ + "{C:spectral}Geister{}-Karten können", + "in jedem beliebigen", + "{C:attention}Arkana-Paket auftauchen", + }, + unlock={ + "Verwende insgesamt {C:attention}#1#", + "{C:tarot}Tarot{}-Karten aus einem beliebigen", + "{C:tarot}Arkana-Paket", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Überbestand", + text={ + "{C:attention}+1{} im Shop", + "verfügbarer Kartenslot", + }, + }, + v_overstock_plus={ + name="Überbestand Plus", + text={ + "{C:attention}+1{} im Shop", + "verfügbarer Kartenslot", + }, + unlock={ + "Gib insgesamt", + "{C:money}#1# ${} im Shop aus", + "{C:inactive}(#2# $)", + }, + }, + v_paint_brush={ + name="Pinsel", + text={ + "{C:attention}+#1#{} Handgröße", + "Größe der Hand", + }, + }, + v_palette={ + name="Palette", + text={ + "{C:attention}+#1#{} Handgröße", + "Größe der Hand", + }, + unlock={ + "Verringere deine Handgröße", + "auf {C:attention}#1#{} Karten", + }, + }, + v_petroglyph={ + name="Petroglyphe", + text={ + "{C:attention}-#1#{} Ante,", + "{C:red}-#1#{} Abwurf", + "jede Runde.", + }, + unlock={ + "Erreiche Anten", + "-Level {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Planeten-Händler", + text={ + "{C:planet}Planeten{}-Karten tauchen", + "{C:attention}#1#X{} häufiger", + "im Shop auf", + }, + }, + v_planet_tycoon={ + name="Planeten-Tycoon", + text={ + "{C:planet}Planeten{}-Karten tauchen", + "{C:attention}#1#X{} häufiger", + "im Shop auf", + }, + unlock={ + "Kaufe insgesamt", + "{C:attention}#1#{C:planet} Planeten{}-Karten", + "aus dem Shop", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Erneute Weissagung", + text={ + "Erhalte dauerhaft", + "{C:red}+#1#{} Abwurf", + "jede Runde.", + }, + unlock={ + "Wirf insgesamt", + "{C:attention}#1#{} Karten ab", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Aktualisierungsüberfluss", + text={ + "Aktualisierungen kosten", + "{C:money}#1# ${} weniger", + }, + unlock={ + "Aktualisiere den Shop insgesamt", + "{C:attention}#1#{} Mal", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Aktualisierungsüberschuss", + text={ + "Aktualisierungen kosten", + "{C:money}#1# ${} weniger", + }, + }, + v_retcon={ + name="Rückwirkende Kontinuität", + text={ + "Boss Blind aktualisieren", + "{C:attention}unbegrenzt{} oft,", + "{C:money}#1# ${} pro Roll", + }, + unlock={ + "Entdecke", + "{C:attention}#1#{} Blinds", + }, + }, + v_seed_money={ + name="Startkapital", + text={ + "Erhöhe die Obergrenze für", + "erhaltene Zinsen in", + "jeder Runde auf {C:money}#1# ${}.", + }, + }, + v_tarot_merchant={ + name="Tarot-Händler", + text={ + "{C:tarot}Tarot{}-Karten tauchen", + "{C:attention}#1#X{} häufiger", + "im Shop auf", + }, + }, + v_tarot_tycoon={ + name="Tarot-Tycoon", + text={ + "{C:tarot}Tarot{}-Karten tauchen", + "{C:attention}#1#X{} häufiger", + "im Shop auf", + }, + unlock={ + "Kaufe insgesamt", + "{C:attention}#1#{C:tarot} Tarot{}-Karten", + "aus dem Shop", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Teleskop", + text={ + "{C:attention}Himmelspakete{} enthalten immer", + "die {C:planet}Planeten{}", + "-Karte für deine", + "meistgespielte {C:attention}Pokerhand", + }, + }, + v_wasteful={ + name="Verschwenderisch", + text={ + "Erhalte dauerhaft", + "{C:red}+#1#{} Abwurf", + "jede Runde.", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Erziele 100.000.000 Chips in einer einzelnen Hand.", + _1000k="Erziele 1.000.000 Chips in einer einzelnen Hand.", + _10k="Erziele 10.000 Chips in einer einzelnen Hand.", + ante_up="Erreiche Ante 4", + ante_upper="Erreiche Ante 8", + astronomy="Entdecke jede Planeten-Karte.", + big_hands="Halte mindestens 80 Karten in deinem Deck.", + card_discarder="Wirf mindestens 2.500 Karten ab.", + card_player="Spiele mindestens 2.500 Karten.", + cartomancy="Entdecke jede Tarot-Karte.", + clairvoyance="Entdecke jede Geister-Karte.", + completionist="Entdecke 100 % deiner Sammlung.", + completionist_plus="Gewinne mit jedem Deck auf der Schwierigkeitsstufe „Goldener Einsatz“.", + completionist_plus_plus="Verdiene einen Goldenen Sticker bei jedem Joker.", + extreme_couponer="Entdecke jeden Gutschein.", + flushed="Spiele einen Flush mit 5 Wildcards.", + heads_up="Gewinne einen Durchlauf.", + high_stakes="Gewinne einen Durchlauf mindestens auf der Schwierigkeitsstufe „Goldener Einsatz“.", + legendary="Entdecke einen legendären Joker.", + low_stakes="Gewinne einen Durchlauf mindestens auf der Schwierigkeitsstufe „Roter Einsatz“.", + mid_stakes="Gewinne einen Durchlauf mindestens auf der Schwierigkeitsstufe „Schwarzer Einsatz“.", + nest_egg="Besitze mindestens 400 $ während eines Durchlaufs.", + retrograde="Bringe eine beliebige Pokerhand auf Level 10.", + roi="Kaufe 5 Gutscheine bis Ante 4.", + royale="Spiele einen Royal Flush.", + rule_bender="Schließe einen beliebigen Herausforderungsdurchlauf ab.", + rule_breaker="Schließe jeden Herausforderungsdurchlauf ab.", + shattered="Zerbrich 2 Glaskarten in einer einzelnen Hand.", + speedrunner="Gewinne einen Durchlauf in maximal 12 Runden.", + tiny_hands="Dünne dein Deck auf maximal 20 Karten aus", + you_get_what_you_get="Gewinne einen Durchlauf ohne Aktualisierung des Shops.", + }, + achievement_names={ + _100000k="100.000k", + _1000k="1.000k", + _10k="10k", + ante_up="Ante-Steigerung!", + ante_upper="Größere Ante-Steigerung!", + astronomy="Astronomie", + big_hands="Große Hände", + card_discarder="Kartenabwerfer", + card_player="Kartenspieler", + cartomancy="Kartenlegen", + clairvoyance="Hellseherei", + completionist="Vervollständiger", + completionist_plus="Vervollständiger+", + completionist_plus_plus="Vervollständiger++", + extreme_couponer="Coupons en masse", + flushed="Total geflushed", + heads_up="Achtung", + high_stakes="Hoher Einsatz", + legendary="Legendär", + low_stakes="Niedriger Einsatz", + mid_stakes="Mittlerer Einsatz", + nest_egg="Notgroschen", + retrograde="Retrograd", + roi="ROI", + royale="Royale", + rule_bender="Regelbieger", + rule_breaker="Regelbrecher", + shattered="Zerbrochen", + speedrunner="Schnellläufer", + tiny_hands="Winzige Hände", + you_get_what_you_get="Du kriegst, was du willst", + }, + blind_states={ + Current="Momentan", + Defeated="Besiegt", + Select="Auswählen", + Selected="Ausgewählt", + Skipped="Übersprungen", + Upcoming="Anstehend", + }, + challenge_names={ + c_blast_off_1="Abheben", + c_bram_poker_1="Bram-Poker", + c_city_1="15-Minuten-Stadt", + c_cruelty_1="Grausamkeit", + c_double_nothing_1="Doppelt oder nichts", + c_five_card_1="Fünf-Karten-Zug", + c_fragile_1="Zerbrechlich", + c_golden_needle_1="Goldene Nadel", + c_inflation_1="Inflation", + c_jokerless_1="Jokerlos", + c_knife_1="Auf Messers Schneide", + c_luxury_1="Luxussteuer", + c_mad_world_1="Verrückte Welt", + c_medusa_1="Medusa", + c_monolith_1="Monolith", + c_non_perishable_1="Haltbar", + c_omelette_1="Das Omelett", + c_rich_1="Reiche werden reicher", + c_typecast_1="Typisierung", + c_xray_1="Röntgenblick", + }, + collabs={ + Clubs={ + ["1"]="Standard", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Standard", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Standard", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Standard", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="FAQ", + b_and_use="& VERWENDEN", + b_back="Zurück", + b_blinds="Blinds", + b_booster_packs="Booster-Pakete", + b_buy="KAUFEN", + b_cash_out="Gewinn:", + b_challenges="Herausforderungen", + b_collection="Sammlung", + b_collection_cap="SAMMLUNG", + b_continue="Fortfahren", + b_copy="Kopieren", + b_copy_seed="Code kopieren", + b_create_profile="Profil erstellen", + b_credits="Credits", + b_current_profile="Aktuelles Profil", + b_customize_deck="Deck anpassen", + b_deck="Deck", + b_decks="Decks", + b_delete_profile="Profil löschen", + b_discard="Abwerfen", + b_editions="Editionen", + b_endless="Endloser Modus", + b_enhanced_cards="Verstärkte Karten", + b_full_deck="Volles Deck", + b_high_contrast_cards="Hochkontrastkarten", + b_how_to_play="Spielanleitung", + b_imagery="Bilder", + b_jokers="Joker", + b_load_profile="Profil laden", + b_main_menu="Hauptmenü", + b_music="Musik", + b_new_challenge="Neue Herausforderung starten", + b_new_run="Neuer Durchlauf", + b_next="Weiter", + b_next_round_1="Nächste", + b_next_round_2="Runde", + b_open="ÖFFNEN", + b_options="Optionen", + b_options_cap="OPTIONEN", + b_planet_cards="Planeten-Karten", + b_play_cap="SPIELEN", + b_play_hand="Hand spielen", + b_playbalatro="Besuche playbalatro.com", + b_poker_hands="Pokerhände", + b_quit_cap="BEENDEN", + b_redeem="EINLÖSEN", + b_reduced_motion="Bewegungsverringerung", + b_remaining="Verbleibend", + b_reroll_boss="Boss aktualisieren", + b_reset_profile="Profil zurücksetzen", + b_restrictions="Beschränkungen", + b_retry="Wiederholen", + b_rules="Regeln", + b_run_info_1="Info", + b_run_info_2="anzeigen", + b_seals="Siegel", + b_seed="Code", + b_select="AUSWÄHLEN", + b_sell="VERKAUFEN", + b_set_CRT="CRT", + b_set_CRT_bloom="CRT-Bloom", + b_set_apply="Anwenden", + b_set_audio="Audio", + b_set_crash_reports="Absturzberichte", + b_set_game="Spiel", + b_set_game_vol="Spiellautstärke", + b_set_gamespeed="Spielgeschwindigkeit", + b_set_graphics="Grafik", + b_set_master_vol="Gesamtlautstärke", + b_set_monitor="Anzeigemonitor", + b_set_music_vol="Musiklautstärke", + b_set_pixel_smoothing="Pixelart-Glättung", + b_set_play_discard_pos="Spiel-/Abwurf-Tastenposition", + b_set_rumble="Controller-Vibration", + b_set_screenshake="Bildschirmrütteln", + b_set_shadows="Schatten", + b_set_vibration="Vibration", + b_set_video="Video", + b_set_windowmode="Fenstermodus", + b_settings="Einstellungen", + b_skip="Überspringen", + b_skip_blind="Blind überspringen", + b_skip_reward="Belohnung überspringen", + b_sort_hand="Hand sortieren", + b_sounds="Töne", + b_spectral_cards="Geister-Karten", + b_stake="Einsatz", + b_start_new_run="Neuer Durchlauf", + b_stat_consumables="Verbrauchsgegenstände", + b_stat_jokers="Joker", + b_stat_planets="Planeten", + b_stat_spectrals="Geister", + b_stat_tarots="Tarots", + b_stat_vouchers="Gutscheine", + b_stats="Statistiken", + b_tags="Tags", + b_tarot_cards="Tarot-Karten", + b_unlock_all="Alles freischalten", + b_use="VERWENDEN", + b_vouchers="Gutscheine", + b_wishlist="Auf die Steam-Wunschliste setzen", + k_aces="Asse", + k_achievement="Erfolg", + k_achievements_disabled="Erfolge deaktiviert", + k_active="aktiv", + k_active_ex="Aktiv!", + k_again_ex="Nochmal!", + k_all_hands="Alle Hände", + k_also_applied="Auch angewandt", + k_ante="Ante", + k_ante_cap="ANTE", + k_arcana_pack="Arkana-Paket", + k_balanced="Ausgewogen", + k_banned_cards="Verbotene Karten", + k_banned_tags="Verbotene Tags", + k_base_cap="BASIS", + k_base_cards="Basis-Karten", + k_best_hand="Beste Hand", + k_booster="Booster", + k_buffoon_pack="Clownspaket", + k_cap_consumables="VERBRAUCHSGEGENSTÄNDE", + k_card_stats="Kartenstatistiken", + k_celestial_pack="Himmelspaket", + k_challenge_mode="Herausforderungsmodus", + k_challenges="Herausforderungen", + k_choose="Wähle", + k_collection="Sammlung", + k_common="Gewöhnlich", + k_compatible="kompatibel", + k_copied_ex="Kopiert!", + k_custom_rules="Individuelle Regeln", + k_daily_run="Täglicher Durchlauf", + k_debuffed="Geschwächt", + k_deck="ansehen", + k_deck_stake_wins="Deck-Einsatz-Siege", + k_defeated_by="Besiegt von", + k_demo_version_ex="Demo-Version!", + k_disabled_ex="Deaktiviert!", + k_drank_ex="Getrunken!", + k_duplicated_ex="Dupliziert!", + k_dwarf_planet="Zwergplanet", + k_eaten_ex="Gegessen!", + k_edition="Edition", + k_effective="Effektiv", + k_empty_caps="LEER", + k_enter_name="Namen eingeben", + k_enter_seed="Code eingeben", + k_enter_text="Text eingeben", + k_eroded_ex="Verputzt!", + k_extinct_ex="Erloschen!", + k_face_cards="Bildkarten", + k_game_modifiers="Spielmodifikatoren", + k_gold="Gold", + k_high_score_ex="Höchste Punktzahl!", + k_hud_discards="Abwürfe", + k_hud_hands="Hände", + k_incompatible="inkompatibel", + k_joker="Joker", + k_joker_stickers="Joker-Sticker", + k_jokers_cap="JOKER", + k_legendary="Legendär", + k_level_prefix="Lvl.", + k_level_up_ex="Aufwertung!", + k_locked="Gesperrt", + k_lower_score="Punktzahl", + k_lvl="Lvl.", + k_melted_ex="Geschmolzen!", + k_money="Geld", + k_mult="Mult", + k_no_other_jokers="Keine anderen Joker!", + k_no_reward="Keine Belohnung", + k_no_room_ex="Kein Platz!", + k_no_space_ex="Kein Platz!", + k_none="Keine", + k_nope_ex="Nö!", + k_not_allowed_ex="Nicht erlaubt!", + k_not_discovered="Nicht entdeckt", + k_numbered_cards="Zahlenkarten", + k_or="oder", + k_other="Andere", + k_page="Seite", + k_planet="Planet", + k_planet_q="Planet?", + k_playing_as="Spiele als", + k_plus_joker="+1 Joker", + k_plus_planet="+1 Planet", + k_plus_spectral="+1 Geister", + k_plus_stone="+1 Steine", + k_plus_tarot="+1 Tarot", + k_poker_hand="Pokerhand", + k_profile="Profil", + k_progress="Fortschritt", + k_rank="Rang", + k_rare="Selten", + k_redeemed_ex="Eingelöst!", + k_reroll="Neu ziehen", + k_reset="Zurücksetzen", + k_reward="Belohnung", + k_round="Runde", + k_safe_ex="Sicher!", + k_saved_ex="Gespeichert!", + k_seed="Code", + k_seeded_run="Durchlauf mit Code", + k_skipped_cap="ÜBERSPRUNGEN", + k_spectral="Geister", + k_spectral_pack="Geisterpaket", + k_stake="Einsatz", + k_stake_level="Einsatzlevel", + k_standard_pack="Standardpaket", + k_suit="Farbe", + k_swapped_ex="Getauscht!", + k_tarot="Tarot", + k_trophies_disabled="Trophäen deaktiviert", + k_trophy="Trophäe", + k_uncommon="Ungewöhnlich", + k_undisovered="Nicht entdeckt", + k_unknown="?????", + k_unlocked_ex="Freigeschaltet!", + k_upgrade_ex="Verbesserung!", + k_val_up="Wert erhöht!", + k_view="Deck", + k_voucher="Gutschein", + k_vouchers_cap="GUTSCHEINE", + k_wins="Siege", + k_x_base="X-Basis", + ml_bloom_opt={ + "Aus", + "Ein", + }, + ml_buy_and_use_target={ + "KAUFEN", + "& VERWENDEN", + }, + ml_buy_target={ + "KAUFEN", + }, + ml_card_stats={ + "Karte", + "Statistiken", + }, + ml_controller_required={ + "Zum Spielen wird ein Game Controller benötigt.", + "Bitte schließe einen Controller an, um fortzufahren.", + }, + ml_crash_report_info={ + "Absturzberichte werden den Entwicklern übermittelt,", + "um Probleme in der Zukunft zu vermeiden. Es werden keine", + "personenbezogenen Daten übermittelt.", + }, + ml_demo_thanks_message={ + "Bitte denke darüber nach,", + "ob du Balatro auf deine Steam-Wunschliste setzen und dich", + "unter playbalatro.com für den Newsletter anmelden möchtest", + }, + ml_disabled_seed={ + "Alle Freischaltungen und", + "Entdeckungen deaktiviert", + }, + ml_edition_seal_enhancement_explanation={ + "Spielkarten können jeweils 1", + "Verstärkung, Edition und Siegel haben.", + }, + ml_eternal={ + "Ewig", + "Kann nicht verkauft", + "oder zerstört werden", + }, + ml_gold_seal_desc={ + "Goldenes Siegel", + "kehrt in die Hand zurück,", + "wenn es gespielt wird", + }, + ml_offline_message={ + "Dieses Gerät ist offline.", + "Der Speicherstand ist möglicherweise nicht mehr aktuell.", + }, + ml_open_target={ + "ÖFFNEN", + }, + ml_paste_seed={ + "Code", + "Einfügen", + }, + ml_play_discard_pos_opt={ + "Abwerfen/Spielen", + "Spielen/Abwerfen", + }, + ml_redeem_target={ + "EINLÖSEN", + }, + ml_sell_target={ + "VERKAUFEN", + }, + ml_shadow_opt={ + "Ein", + "Aus", + }, + ml_smoothing_opt={ + "Aus", + "Ein", + }, + ml_unlock_all_explanation={ + "WARNUNG! Wenn du die komplette Sammlung freischaltest,", + "werden Erfolge für dieses Profil deaktiviert!", + }, + ml_unlock_all_trophies={ + "WARNUNG! Wenn du die komplette Sammlung freischaltest,", + "werden Trophäen für dieses Profil deaktiviert!", + }, + ml_vsync_opt={ + "V-Sync ein", + "V-Sync aus", + }, + ml_windowmode_opt={ + "Im Fenster", + "Vollbild", + "Randlos", + }, + ph_1_level="+1 Level", + ph_4_7_of_clubs="vier 7 der Kreuze", + ph_alert_debuff_confirm="Drücke zum Bestätigen erneut ‚Spielen‘", + ph_all_poker_hand="Alle Pokerhände", + ph_blind_reward="Belohnung: ", + ph_blind_score_at_least="Erreiche mindestens", + ph_boss_disabled="Boss deaktiviert!", + ph_choose_blind_1="Wähle deinen", + ph_choose_blind_2="nächsten Blind", + ph_click_confirm="Zum Bestätigen erneut drücken", + ph_deck_preview_effective="Effektiver Gesamtwert aufgrund von Jokern, Blinds und Kartenverstärkungen", + ph_deck_preview_stones="Steine", + ph_defeat_the_boss="Besiege den Boss Blind", + ph_defeat_this_blind_1="Besiege diesen Blind,", + ph_defeat_this_blind_2="um ihn zu entdecken", + ph_demo_thanks_1="Danke fürs Spielen der", + ph_demo_thanks_2="BALATRO-DEMO", + ph_display_stickers="Anzeige von Einsatz-Stickern während des Durchlaufs", + ph_game_over="GAME OVER", + ph_improve_run="Verbessere deinen Durchlauf!", + ph_most_played="(Meistgespielte Hand)", + ph_mr_bones="Von Mr. Bones gerettet", + ph_no_boss_active="kein Boss aktiv", + ph_no_vouchers="Keine Gutscheine in diesem Durchlauf eingelöst", + ph_score_at_least="Erreiche mindestens", + ph_score_cards_discarded="Abgeworfene Karten", + ph_score_cards_played="Gespielte Karten", + ph_score_cards_purchased="Gekaufte Karten", + ph_score_furthest_ante="Ante", + ph_score_furthest_round="Runde", + ph_score_hand="Beste Hand", + ph_score_new_collection="Neue Entdeckungen", + ph_score_poker_hand="Meistgespielte Hand", + ph_score_times_rerolled="Anzahl an Aktualisierungen", + ph_select_challenge="Wähle eine Herausforderung", + ph_sneak_peek="Sneak-Peek", + ph_stat_consumable="Wie oft diese Karte gespielt wurde", + ph_stat_joker="Insgesamt mit dieser Karte abgeschlossene Runden", + ph_stat_voucher="Wie oft dieser Gutschein eingelöst wurde", + ph_unscored_hand="Hand erzielt keine Punktzahl", + ph_up_ante_1="Erhöhe die Ante", + ph_up_ante_2="Erhöhe alle Blinds", + ph_up_ante_3="Aktualisiere Blinds", + ph_vouchers_redeemed="In diesem Durchlauf eingelöste Gutscheine", + ph_you_win="DU GEWINNST!", + ph_you_win_demo="DU GEWINNST DIE DEMO!", + }, + high_scores={ + boss_streak="Meiste Bosse hintereinander", + collection="Sammlung", + current_streak="", + furthest_ante="Höchste Ante", + furthest_round="Höchste Runde", + hand="Beste Hand", + most_money="Meistes Geld", + poker_hand="Meistgespielte Hand", + win_streak="Beste Siegesserie", + }, + labels={ + blue_seal="Blaues Siegel", + common="Gewöhnlich", + eternal="Ewig", + foil="Foil", + gold_seal="Goldenes Siegel", + holographic="Holografisch", + legendary="Legendär", + locked="Gesperrt", + negative="Negativ", + perishable="Verderblich", + pinned_left="Angeheftet", + planet="Planet", + pluto_planet="Zwergplanet", + polychrome="Polychrom", + purple_seal="Lila Siegel", + rare="Selten", + red_seal="Rotes Siegel", + rental="Gemietet", + tarot="Tarot", + uncommon="Ungewöhnlich", + voucher="Gutschein", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 Karten mit demselben Rang", + }, + Flush={ + "5 Karten mit derselben Farbe", + }, + ["Flush Five"]={ + "5 Karten mit demselben Rang und derselben Farbe", + }, + ["Flush House"]={ + "Ein Drilling und ein Paar mit", + "allen Karten in derselben Farbe", + }, + ["Four of a Kind"]={ + "4 Karten mit demselben Rang. Sie können", + "mit 1 anderen unbewerteten Karte gespielt werden", + }, + ["Full House"]={ + "Ein Drilling und ein Paar", + }, + ["High Card"]={ + "Wenn die gespielte Hand keine der oben genannten Hände ist,", + "zählt nur die Karte mit dem höchsten Rang", + }, + Pair={ + "2 Karten mit demselben Rang. Sie können", + "mit bis zu 3 anderen unbewerteten Karten gespielt werden", + }, + ["Royal Flush"]={ + "5 Karten hintereinander {aufeinanderfolgende Ränge} mit", + "allen Karten in derselben Farbe", + }, + Straight={ + "5 Karten hintereinander {aufeinanderfolgende Ränge}", + }, + ["Straight Flush"]={ + "5 Karten hintereinander {aufeinanderfolgende Ränge} mit", + "allen Karten in derselben Farbe", + }, + ["Three of a Kind"]={ + "3 Karten mit demselben Rang. Sie können", + "mit bis zu 2 anderen unbewerteten Karten gespielt werden", + }, + ["Two Pair"]={ + "2 Kartenpaare mit unterschiedlichen Rängen, sie können", + "mit 1 anderen unbewerteten Karte gespielt werden", + }, + }, + poker_hands={ + ["Five of a Kind"]="Fünfling", + Flush="Flush", + ["Flush Five"]="Flush Five", + ["Flush House"]="Flush House", + ["Four of a Kind"]="Vierling", + ["Full House"]="Full House", + ["High Card"]="High Card", + Pair="Paar", + ["Royal Flush"]="Royal Flush", + Straight="Straight", + ["Straight Flush"]="Straight Flush", + ["Three of a Kind"]="Drilling", + ["Two Pair"]="Zwei Paare", + }, + quips={ + dq_1={ + "Mannomann! Hoffentlich", + "hast du ein paar Tricks", + "im Ärmel für", + "diese letzte Herausforderung!", + }, + lq_1={ + "Vielleicht ist Quartett", + "eher unser", + "Tempo ...", + }, + lq_10={ + "So ein Flop!", + }, + lq_2={ + "Wir sind umgeknickt", + "wie Streichhölzer!", + }, + lq_3={ + "Zeit, dass wir", + "neu mischen und", + "es erneut versuchen!", + }, + lq_4={ + "Du weißt,", + "wie es heißt:", + "Die Bank gewinnt immer!", + }, + lq_5={ + "Anscheinend wissen", + "wir jetzt, wer", + "der wahre Joker ist!", + }, + lq_6={ + "Oh, nein, hast du", + "auch geblufft?", + }, + lq_7={ + "Anscheinend sind wir", + "die Angeschmierten!", + }, + lq_8={ + "Hätte ich Hände,", + "würde ich mir", + "die Augen zuhalten!", + }, + lq_9={ + "Ich bin buchstäblich", + "ein Narr. Was ist", + "deine Ausrede?", + }, + wq_1={ + "Ass-rein!", + }, + wq_2={ + "Das hast du", + "gut hingekriegt!", + }, + wq_3={ + "Anscheinend", + "bluffst du!", + }, + wq_4={ + "Schade, dass", + "die Chips bloß", + "virtuell sind ...", + }, + wq_5={ + "Anscheinend habe ich", + "dir das gut beigebracht!", + }, + wq_6={ + "Du hast Aufsehen mit", + "deinen Spielen erregt!", + }, + wq_7={ + "Zum Glück", + "habe ich nicht", + "gegen dich gewettet", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="Ass", + Jack="Bube", + King="König", + Queen="Dame", + }, + suits_plural={ + Clubs="Kreuz", + Diamonds="Karo", + Hearts="Herz", + Spades="Piks", + }, + suits_singular={ + Clubs="Kreuz", + Diamonds="Karo", + Hearts="Herz", + Spades="Pik", + }, + tutorial={ + bb_1={ + "Wähle den {C:attention}Big Blind,", + "um etwas Geld zu verdienen,", + }, + bb_2={ + "oder {C:attention}überspringe ihn,", + "um einen {C:attention}Tag{} zu erhalten! Jeder", + "{C:attention}Tag{} hat einen einzigartigen Effekt,", + }, + bb_3={ + "aber achte auf", + "den {C:attention}Boss Blind{}. Er", + "hat eine Fähigkeit,", + "um die du herum planen musst.", + }, + bb_4={ + "Wenn du ihn schlägst,", + "steigt die {C:attention}Ante{} und alle", + "{C:attention}Blinds{} werden schwieriger", + }, + bb_5={ + "Schlage die {C:attention}Ante{} #1#, um zu gewinnen.", + "Wähle nun deinen Weg!", + }, + fh_1={ + "Du verdienst Chips, indem du", + "{C:attention}Pokerhände spielst", + }, + fh_2={ + "Jede {C:attention}Pokerhand{} verdient einen", + "Basisbetrag an {C:blue}Chips,", + "der mit einigen {C:red}Mult multipliziert wird", + }, + fh_3={ + "Deine {C:attention}Pokerhände", + "kannst du im Bereich {C:attention}Durchlaufinfo{} ansehen.", + "Dort findest du auch weitere Infos", + "über deinen aktuellen Durchlauf", + }, + fh_4={ + "Karten verdienen dir außerdem", + "einige {C:blue}Chips{}.", + "Bewege deine Maus darüber, um das zu sehen!", + }, + fh_4_touch={ + "Karten bringen dir außerdem", + "einige {C:blue}Chips{} ein.", + "Drücken und halten, um das zu sehen!", + }, + fh_5={ + "Wähle nun bis zu", + "{C:attention}5{} Karten zum Spielen", + "und drücke {C:blue}„Hand spielen“", + }, + fh_5_touch={ + "Tippe nun auf bis zu", + "{C:attention}5{} Karten zum Spielen", + "und drücke {C:blue}„Hand spielen“", + }, + fh_6={ + "Du kannst außerdem bis zu", + "ausgewählte Karten {C:red}Abwerfen{},", + "um sogar noch", + "stärkere Hände zu bilden. Probier es aus!", + }, + fh_7={ + "Aber Vorsicht! Du hast nur eine", + "begrenzte Anzahl an {C:blue}Händen", + "und {C:red}Abwürfen{} pro Runde", + }, + fh_8={ + "Verdiene {C:attention}300 Chips{}, bevor du", + "keine {C:blue}Hände mehr hast,", + "um diese Runde zu gewinnen.", + "Viel Glück!", + }, + s_1={ + "Gut gemacht! Nun, da du", + "eine {E:1}Menge{} {C:money}Geld{} hast,", + "kannst du dir ein paar neue", + "Karten im {C:attention}Shop kaufen", + }, + s_10={ + "{C:attention}Gutscheine{} werden wieder aufgefüllt,", + "nachdem du den", + "{C:attention}Boss Blind{} besiegst.", + }, + s_11={ + "Und sieh dir beide", + "{C:booster}Booster-Pakete{} in", + "jedem Shop an. Sie stecken", + "voller nützlicher Sachen!", + }, + s_12={ + "Gehen wir über", + "zur {C:attention}nächsten Runde{}.", + }, + s_2={ + "Versuche, diesen", + "schicken Teufel zu kaufen", + }, + s_2_touch={ + "Versuche, diesen", + "schicken Teufel zu kaufen!", + "Ziehe ihn aus dem Shop", + "in den Bereich {C:attention}‚KAUFEN‘{}", + }, + s_3={ + "Das hier ist einer der {C:attention}#1#", + "{C:attention}Joker{}, die du deinem Durchlauf", + "hinzufügen kannst. Jeder {C:attention}Joker", + "macht etwas anderes", + }, + s_4={ + "Dieser hier fügt {C:red}+4 Mult{} zu", + "jeder Hand hinzu, die du spielst!", + }, + s_5={ + "Sei wählerisch, du kannst nur", + "{C:attention}5 Joker{}-Karten", + "gleichzeitig haben", + }, + s_6={ + "Kaufe nun die andere", + "Karte im {C:attention}Shop", + }, + s_7={ + "Diese {C:tarot}Tarot{}-Karte ist ein", + "{C:attention}Verbrauchsgegenstand{}. Die hier", + "verstärkt deine Spielkarten!", + "Bewahre sie also auf.", + }, + s_8={ + "Du kannst bis zu", + "{C:attention}2 Verbrauchsgegenstand{}-Karten", + "gleichzeitig haben.", + }, + s_9={ + "Wenn du genug ansparst,", + "kannst du dir einen {C:attention}Gutschein{} kaufen.", + "{C:attention}Gutscheine{} verbessern passiv", + "deinen Durchlauf!", + }, + sb_1={ + "Hallo! Mein Name lautet", + "{C:attention}Jimbo{}. Ich bin hier,", + "um dir das Spiel beizubringen!", + }, + sb_2={ + "Dein Ziel ist es,", + "{C:blue}Chips{} zu verdienen, um", + "den gegnerischen {C:attention}Blind zu besiegen", + }, + sb_3={ + "Das hier ist ein {C:blue}Small Blind{}.", + "Du musst nur", + "{C:attention}300 Chips{} erzielen, um ihn zu schlagen.", + }, + sb_4={ + "Wähle den {C:blue}Small Blind,", + "um die Runde zu beginnen!", + }, + sh_1={ + "Wenn du mehr Karten erhältst,", + "denk dran, dass du sie neu anordnen kannst.", + "{C:attention}Joker{} werden von", + "links nach rechts ausgelöst", + }, + sh_2={ + "Und denk dran,", + "deine Verbrauchsgegenstände zu {C:attention}VERWENDEN{}!", + }, + sh_3={ + "Wähle bis zu {C:attention}2{} Karten", + "auf deiner Hand und drücke", + "{C:attention}„VERWENDEN“{} auf der {C:tarot}Tarot{}-Karte,", + "um sie zu verstärken!", + }, + sh_3_touch={ + "Wähle bis zu {C:attention}2{} Karten", + "auf deiner Hand und ziehe", + "die {C:tarot}Tarot{}-Karte in den Bereich {C:attention}‚VERWENDEN‘,{}", + "um sie zu verstärken!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Hände", + a_handsize="+#1# Handgröße", + a_handsize_minus="-#1# Handgröße", + a_mult="+#1# Mult.", + a_mult_minus="-#1# Mult", + a_remaining="#1# Verbleibend", + a_sold_tally="#1#/#2# Verkauft", + a_xmult="X#1# Mult", + a_xmult_minus="-X#1# Mult", + ante_x_voucher="ANTE-#1#-GUTSCHEIN", + challenges_completed="#1#/#2# Herausforderungen abgeschlossen", + completed="#1#/#2# Abgeschlossen", + deck_preview_wheel_plural="Zahlen können niedriger sein, da die #1#-Karten mit dem Gesicht nach unten gezogen werden", + deck_preview_wheel_singular="Zahlen können niedriger sein, da die #1#-Karte mit dem Gesicht nach unten gezogen wird", + interest="#1# Zinsen pro #2# $ (#3# max.)", + loyalty_active="Aktiv!", + loyalty_inactive="#1# verbleibend", + ml_foil_desc={ + "Foil", + "+#1# Chips", + }, + ml_holo_desc={ + "Holografisch", + "+#1# Mult", + }, + ml_negative_consumable_desc={ + "Negativ", + "+#1# Slot für Verbrauchsgegenstände", + }, + ml_negative_desc={ + "Negativ", + "+#1# Joker-Slot", + }, + ml_polychrome_desc={ + "Polychrom", + "X#1# Mult", + }, + remaining_discard_money="Verbleibende Abwürfe (#1# $ pro Abwurf)", + remaining_hand_money="Verbleibende Hände (#1# $ pro Hand)", + unlocked="#1#/#2# Freigeschaltet", + }, + v_text={ + ch_c_all_eternal={ + "Alle Shop-Joker sind {C:eternal}ewig{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}Chips{} können die aktuellen {C:money} $ {} nicht übersteigen", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Tägliche Herausforderung!", + }, + ch_c_debuff_played_cards={ + "Alle {C:attention}gespielten{} Karten werden nach der Punktezählung {C:attention}geschwächt{}", + }, + ch_c_discard_cost={ + "Abwürfe kosten jeweils {C:money}#1# ${}", + }, + ch_c_flipped_cards={ + "{C:green}1 in #1#{} Karten werden mit dem Gesicht nach unten gezogen", + }, + ch_c_inflation={ + "Erhöht die Preise bei jedem Kauf dauerhaft um {C:money}1 ${}", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Halte {C:red}-1{} Karten auf der Hand pro {C:money}#1# ${} in deinem Besitz", + }, + ch_c_no_extra_hand_money={ + "{C:blue}Extra-Hände{} verdienen kein Geld mehr", + }, + ch_c_no_interest={ + "Erhalte am Ende der Runde keine {C:attention}Zinsen{}", + }, + ch_c_no_reward={ + "Alle {C:attention}Blinds{} geben kein Belohnungsgeld", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# Blinds{} geben kein Belohnungsgeld", + }, + ch_c_no_shop_jokers={ + "Joker tauchen nicht mehr im {C:attention}Shop auf", + }, + ch_c_none={ + "{C:inactive}Keine", + }, + ch_c_set_eternal_ante={ + "Wenn der Ante-{C:attention}#1#{}-Boss besiegt wird, werden alle Joker {C:attention}ewig", + }, + ch_c_set_joker_slots_ante={ + "Wenn der Ante-{C:attention}#1#{}-Boss besiegt wird, werden Joker-Slots auf {C:attention}0 gesetzt", + }, + ch_c_set_seed={ + "1 Versuch mit festgelegtem Code: {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} Slots für Verbrauchsgegenstände", + }, + ch_m_discards={ + "{C:blue}#1#{} Abwürfe pro Runde", + }, + ch_m_dollars={ + "Beginne mit {C:money}#1# $", + }, + ch_m_hand_size={ + "{C:attention}#1#{} Handgröße", + }, + ch_m_hands={ + "{C:blue}#1#{} Hände pro Runde", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} Joker-Slots", + }, + ch_m_none={ + "{C:inactive}Keine", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/en-us.lua b/src/localization/en-us.lua new file mode 100644 index 0000000..0ebc969 --- /dev/null +++ b/src/localization/en-us.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Abandoned Deck", + text={ + "Start run with", + "no {C:attention}Face Cards", + "in your deck", + }, + }, + b_anaglyph={ + name="Anaglyph Deck", + text={ + "After defeating each", + "{C:attention}Boss Blind{}, gain a", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Black Deck", + text={ + "{C:attention}+#1#{} Joker slot", + "", + "{C:blue}-#2#{} hand", + "every round", + }, + }, + b_blue={ + name="Blue Deck", + text={ + "{C:blue}+#1#{} hand", + "every round", + }, + }, + b_challenge={ + name="Challenge Deck", + text={ + "", + }, + }, + b_checkered={ + name="Checkered Deck", + text={ + "Start run with", + "{C:attention}26{C:spades} Spades{} and", + "{C:attention}26{C:hearts} Hearts{} in deck", + }, + }, + b_erratic={ + name="Erratic Deck", + text={ + "All {C:attention}Ranks{} and", + "{C:attention}Suits{} in deck", + "are randomized", + }, + }, + b_ghost={ + name="Ghost Deck", + text={ + "{C:spectral}Spectral{} cards may", + "appear in the shop,", + "start with a {C:spectral,T:c_hex}Hex{} card", + }, + }, + b_green={ + name="Green Deck", + text={ + "At end of each Round:", + "{C:money}$#1#{s:0.85} per remaining {C:blue}Hand", + "{C:money}$#2#{s:0.85} per remaining {C:red}Discard", + "Earn no {C:attention}Interest", + }, + }, + b_magic={ + name="Magic Deck", + text={ + "Start run with the", + "{C:tarot,T:v_crystal_ball}#1#{} voucher", + "and {C:attention}2{} copies", + "of {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Nebula Deck", + text={ + "Start run with the", + "{C:planet,T:v_telescope}#1#{} voucher", + "", + "{C:red}#2#{} consumable slot", + }, + }, + b_painted={ + name="Painted Deck", + text={ + "{C:attention}+#1#{} hand size,", + "{C:red}#2#{} Joker slot", + }, + }, + b_plasma={ + name="Plasma Deck", + text={ + "Balance {C:blue}Chips{} and", + "{C:red}Mult{} when calculating", + "score for played hand", + "{C:red}X#1#{} base Blind size", + }, + }, + b_red={ + name="Red Deck", + text={ + "{C:red}+#1#{} discard", + "every round", + }, + }, + b_yellow={ + name="Yellow Deck", + text={ + "Start with", + "extra {C:money}$#1#", + }, + }, + b_zodiac={ + name="Zodiac Deck", + text={ + "Start run with", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "and {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="The Arm", + text={ + "Decrease level of", + "played poker hand", + }, + }, + bl_big={ + name="Big Blind", + text={ + }, + }, + bl_club={ + name="The Club", + text={ + "All Club cards", + "are debuffed", + }, + }, + bl_eye={ + name="The Eye", + text={ + "No repeat hand", + "types this round", + }, + }, + bl_final_acorn={ + name="Amber Acorn", + text={ + "Flips and shuffles", + "all Joker cards", + }, + }, + bl_final_bell={ + name="Cerulean Bell", + text={ + "Forces 1 card to", + "always be selected", + }, + }, + bl_final_heart={ + name="Crimson Heart", + text={ + "One random Joker", + "disabled every hand", + }, + }, + bl_final_leaf={ + name="Verdant Leaf", + text={ + "All cards debuffed", + "until 1 Joker sold", + }, + }, + bl_final_vessel={ + name="Violet Vessel", + text={ + "Very large blind", + }, + }, + bl_fish={ + name="The Fish", + text={ + "Cards drawn face down", + "after each hand played", + }, + }, + bl_flint={ + name="The Flint", + text={ + "Base Chips and", + "Mult are halved", + }, + }, + bl_goad={ + name="The Goad", + text={ + "All Spade cards", + "are debuffed", + }, + }, + bl_head={ + name="The Head", + text={ + "All Heart cards", + "are debuffed", + }, + }, + bl_hook={ + name="The Hook", + text={ + "Discards 2 random", + "cards per hand played", + }, + }, + bl_house={ + name="The House", + text={ + "First hand is", + "drawn face down", + }, + }, + bl_manacle={ + name="The Manacle", + text={ + "-1 Hand Size", + }, + }, + bl_mark={ + name="The Mark", + text={ + "All face cards are", + "drawn face down", + }, + }, + bl_mouth={ + name="The Mouth", + text={ + "Play only 1 hand", + "type this round", + }, + }, + bl_needle={ + name="The Needle", + text={ + "Play only 1 hand", + }, + }, + bl_ox={ + name="The Ox", + text={ + "Playing a #1#", + "sets money to $0", + }, + }, + bl_pillar={ + name="The Pillar", + text={ + "Cards played previously", + "this Ante are debuffed", + }, + }, + bl_plant={ + name="The Plant", + text={ + "All face cards", + "are debuffed", + }, + }, + bl_psychic={ + name="The Psychic", + text={ + "Must play 5 cards", + }, + }, + bl_serpent={ + name="The Serpent", + text={ + "After Play or Discard,", + "always draw 3 cards", + }, + }, + bl_small={ + name="Small Blind", + text={ + }, + }, + bl_tooth={ + name="The Tooth", + text={ + "Lose $1 per", + "card played", + }, + }, + bl_wall={ + name="The Wall", + text={ + "Extra large blind", + }, + }, + bl_water={ + name="The Water", + text={ + "Start with", + "0 discards", + }, + }, + bl_wheel={ + name="The Wheel", + text={ + " in 7 cards get", + "drawn face down", + }, + }, + bl_window={ + name="The Window", + text={ + "All Diamond cards", + "are debuffed", + }, + }, + }, + Edition={ + e_base={ + name="Base", + text={ + "No extra effects", + }, + }, + e_foil={ + name="Foil", + text={ + "{C:chips}+#1#{} chips", + }, + }, + e_holo={ + name="Holographic", + text={ + "{C:mult}+#1#{} Mult", + }, + }, + e_negative={ + name="Negative", + text={ + "{C:dark_edition}+#1#{} Joker slot", + }, + }, + e_negative_consumable={ + name="Negative", + text={ + "{C:dark_edition}+#1#{} consumable slot", + }, + }, + e_polychrome={ + name="Polychrome", + text={ + "{X:mult,C:white} X#1# {} Mult", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Bonus Card", + text={ + }, + }, + m_glass={ + name="Glass Card", + text={ + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2# in #3#{} chance to", + "destroy card", + }, + }, + m_gold={ + name="Gold Card", + text={ + "{C:money}$#1#{} if this", + "card is held in hand", + "at end of round", + }, + }, + m_lucky={ + name="Lucky Card", + text={ + "{C:green}#1# in #3#{} chance", + "for {C:mult}+#2#{} Mult", + "{C:green}#1# in #5#{} chance", + "to win {C:money}$#4#", + }, + }, + m_mult={ + name="Mult Card", + text={ + "{C:mult}+#1#{} Mult", + }, + }, + m_steel={ + name="Steel Card", + text={ + "{X:mult,C:white} X#1# {} Mult", + "while this card", + "stays in hand", + }, + }, + m_stone={ + name="Stone Card", + text={ + "{C:chips}+#1#{} Chips", + "no rank or suit", + }, + }, + m_wild={ + name="Wild Card", + text={ + "Can be used", + "as any suit", + }, + }, + }, + Joker={ + j_8_ball={ + name="8 Ball", + text={ + "{C:green}#1# in #2#{} chance for each", + "played {C:attention}8{} to create a", + "{C:tarot}Tarot{} card when scored", + "{C:inactive}(Must have room)", + }, + }, + j_abstract={ + name="Abstract Joker", + text={ + "{C:mult}+#1#{} Mult for", + "each {C:attention}Joker{} card", + "{C:inactive}(Currently {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_acrobat={ + name="Acrobat", + text={ + "{X:red,C:white} X#1# {} Mult on {C:attention}final", + "{C:attention}hand{} of round", + }, + unlock={ + "Play {C:attention,E:1}#1#{} hands", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Ancient Joker", + text={ + "Each played card with", + "{V:1}#2#{} suit gives", + "{X:mult,C:white} X#1# {} Mult when scored,", + "{s:0.8}suit changes at end of round", + }, + }, + j_arrowhead={ + name="Arrowhead", + text={ + "Played cards with", + "{C:spades}Spade{} suit give", + "{C:chips}+#1#{} Chips when scored", + }, + unlock={ + "Have at least {E:1,C:attention}#1#", + "cards with {E:1,C:attention}#2#", + "suit in your deck", + }, + }, + j_astronomer={ + name="Astronomer", + text={ + "All {C:planet}Planet{} cards and", + "{C:planet}Celestial Packs{} in", + "the shop are {C:attention}free", + }, + unlock={ + "Discover every", + "{E:1,C:planet}Planet{} card", + }, + }, + j_banner={ + name="Banner", + text={ + "{C:chips}+#1#{} Chips for", + "each remaining", + "{C:attention}discard", + }, + }, + j_baron={ + name="Baron", + text={ + "Each {C:attention}King{}", + "held in hand", + "gives {X:mult,C:white} X#1# {} Mult", + }, + }, + j_baseball={ + name="Baseball Card", + text={ + "{C:green}Uncommon{} Jokers", + "each give {X:mult,C:white} X#1# {} Mult", + }, + }, + j_blackboard={ + name="Blackboard", + text={ + "{X:red,C:white} X#1# {} Mult if all", + "cards held in hand", + "are {C:spades}#2#{} or {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Bloodstone", + text={ + "{C:green}#1# in #2#{} chance for", + "played cards with", + "{C:hearts}Heart{} suit to give", + "{X:mult,C:white} X#3# {} Mult when scored", + }, + unlock={ + "Have at least {E:1,C:attention}#1#", + "cards with {E:1,C:attention}#2#", + "suit in your deck", + }, + }, + j_blue_joker={ + name="Blue Joker", + text={ + "{C:chips}+#1#{} Chips for each", + "remaining card in {C:attention}deck", + "{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)", + }, + }, + j_blueprint={ + name="Blueprint", + text={ + "Copies ability of", + "{C:attention}Joker{} to the right", + }, + unlock={ + "Win a run", + }, + }, + j_bootstraps={ + name="Bootstraps", + text={ + "{C:mult}+#1#{} Mult for every", + "{C:money}$#2#{} you have", + "{C:inactive}(Currently {C:mult}+#3#{C:inactive} Mult)", + }, + unlock={ + "Have at least {E:1,C:attention}#1#", + "{C:dark_edition}Polychrome{} Jokers", + }, + }, + j_brainstorm={ + name="Brainstorm", + text={ + "Copies the ability", + "of leftmost {C:attention}Joker", + }, + unlock={ + "Discard a", + "{E:1,C:attention}Royal Flush", + }, + }, + j_bull={ + name="Bull", + text={ + "{C:chips}+#1#{} Chips for", + "each {C:money}$1{} you have", + "{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)", + }, + }, + j_burglar={ + name="Burglar", + text={ + "When {C:attention}Blind{} is selected,", + "gain {C:blue}+#1#{} Hands and", + "{C:attention}lose all discards", + }, + }, + j_burnt={ + name="Burnt Joker", + text={ + "Upgrade the level of", + "the first {C:attention}discarded", + "poker hand each round", + }, + unlock={ + "Sell a total", + "of {E:1,C:attention}#1#{} cards", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Business Card", + text={ + "Played {C:attention}face{} cards have", + "a {C:green}#1# in #2#{} chance to", + "give {C:money}$2{} when scored", + }, + }, + j_caino={ + name="Canio", + text={ + "This Joker gains {X:mult,C:white} X#1# {} Mult", + "when a {C:attention}face{} card", + "is destroyed", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Campfire", + text={ + "This Joker gains {X:mult,C:white}X#1#{} Mult", + "for each card {C:attention}sold{}, resets", + "when {C:attention}Boss Blind{} is defeated", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_card_sharp={ + name="Card Sharp", + text={ + "{X:mult,C:white} X#1# {} Mult if played", + "{C:attention}poker hand{} has already", + "been played this round", + }, + }, + j_cartomancer={ + name="Cartomancer", + text={ + "Create a {C:tarot}Tarot{} card", + "when {C:attention}Blind{} is selected", + "{C:inactive}(Must have room)", + }, + unlock={ + "Discover every", + "{E:1,C:tarot}Tarot{} card", + }, + }, + j_castle={ + name="Castle", + text={ + "This Joker gains {C:chips}+#1#{} Chips", + "per discarded {V:1}#2#{} card,", + "suit changes every round", + "{C:inactive}(Currently {C:chips}+#3#{C:inactive} Chips)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2# in #3#{} chance this", + "card is destroyed", + "at end of round", + }, + }, + j_ceremonial={ + name="Ceremonial Dagger", + text={ + "When {C:attention}Blind{} is selected,", + "destroy Joker to the right", + "and permanently add {C:attention}double", + "its sell value to this {C:red}Mult", + "{C:inactive}(Currently {C:mult}+#1#{C:inactive} Mult)", + }, + }, + j_certificate={ + name="Certificate", + text={ + "When round begins,", + "add a random {C:attention}playing", + "{C:attention}card{} with a random", + "{C:attention}seal{} to your hand", + }, + unlock={ + "Have a Gold", + "playing card with", + "a {C:attention,E:1}Gold Seal", + }, + }, + j_chaos={ + name="Chaos the Clown", + text={ + "{C:attention}#1#{} free {C:green}Reroll", + "per shop", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Disables effect of", + "every {C:attention}Boss Blind", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Clever Joker", + text={ + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_cloud_9={ + name="Cloud 9", + text={ + "Earn {C:money}$#1#{} for each", + "{C:attention}9{} in your {C:attention}full deck", + "at end of round", + "{C:inactive}(Currently {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="Constellation", + text={ + "This Joker gains", + "{X:mult,C:white} X#1# {} Mult every time", + "a {C:planet}Planet{} card is used", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_crafty={ + name="Crafty Joker", + text={ + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_crazy={ + name="Crazy Joker", + text={ + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_credit_card={ + name="Credit Card", + text={ + "Go up to", + "{C:red}-$#1#{} in debt", + }, + }, + j_delayed_grat={ + name="Delayed Gratification", + text={ + "Earn {C:money}$#1#{} per {C:attention}discard{} if", + "no discards are used", + "by end of the round", + }, + }, + j_devious={ + name="Devious Joker", + text={ + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_diet_cola={ + name="Diet Cola", + text={ + "Sell this card to", + "create a free", + "{C:attention}#1#", + }, + }, + j_dna={ + name="DNA", + text={ + "If {C:attention}first hand{} of round", + "has only {C:attention}1{} card, add a", + "permanent copy to deck", + "and draw it to {C:attention}hand", + }, + }, + j_drivers_license={ + name="Driver's License", + text={ + "{X:mult,C:white} X#1# {} Mult if you have", + "at least {C:attention}16{} Enhanced", + "cards in your full deck", + "{C:inactive}(Currently {C:attention}#2#{C:inactive})", + }, + unlock={ + "Enhance {E:1,C:attention}#1#{} cards", + "in your deck", + }, + }, + j_droll={ + name="Droll Joker", + text={ + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_drunkard={ + name="Drunkard", + text={ + "{C:red}+#1#{} discard", + "each round", + }, + }, + j_duo={ + name="The Duo", + text={ + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + unlock={ + "Win a run", + "without playing", + "a {E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Dusk", + text={ + "Retrigger all played", + "cards in {C:attention}final", + "{C:attention}hand{} of round", + }, + }, + j_egg={ + name="Egg", + text={ + "Gains {C:money}$#1#{} of", + "{C:attention}sell value{} at", + "end of round", + }, + }, + j_erosion={ + name="Erosion", + text={ + "{C:red}+#1#{} Mult for each", + "card below {C:attention}#3#{}", + "in your full deck", + "{C:inactive}(Currently {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_even_steven={ + name="Even Steven", + text={ + "Played cards with", + "{C:attention}even{} rank give", + "{C:mult}+#1#{} Mult when scored", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Faceless Joker", + text={ + "Earn {C:money}$#1#{} if {C:attention}#2#{} or", + "more {C:attention}face cards{}", + "are discarded", + "at the same time", + }, + }, + j_family={ + name="The Family", + text={ + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + unlock={ + "Win a run", + "without playing", + "a {E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "Each played {C:attention}Ace{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{}, or {C:attention}8{} gives", + "{C:mult}+#1#{} Mult when scored", + }, + }, + j_flash={ + name="Flash Card", + text={ + "This Joker gains {C:mult}+#1#{} Mult", + "per {C:attention}reroll{} in the shop", + "{C:inactive}(Currently {C:mult}+#2#{C:inactive} Mult)", + }, + }, + j_flower_pot={ + name="Flower Pot", + text={ + "{X:mult,C:white} X#1# {} Mult if poker", + "hand contains a", + "{C:diamonds}Diamond{} card, {C:clubs}Club{} card,", + "{C:hearts}Heart{} card, and {C:spades}Spade{} card", + }, + unlock={ + "Reach Ante", + "level {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Fortune Teller", + text={ + "{C:red}+#1#{} Mult per {C:purple}Tarot{}", + "card used this run", + "{C:inactive}(Currently {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Four Fingers", + text={ + "All {C:attention}Flushes{} and", + "{C:attention}Straights{} can be", + "made with {C:attention}4{} cards", + }, + }, + j_gift={ + name="Gift Card", + text={ + "Add {C:money}$#1#{} of {C:attention}sell value", + "to every {C:attention}Joker{} and", + "{C:attention}Consumable{} card at", + "end of round", + }, + }, + j_glass={ + name="Glass Joker", + text={ + "This Joker gains {X:mult,C:white} X#1# {} Mult", + "for every {C:attention}Glass Card", + "that is destroyed", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Have at least {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} in", + "your deck", + }, + }, + j_gluttenous_joker={ + name="Gluttonous Joker", + text={ + "Played cards with", + "{C:clubs}#2#{} suit give", + "{C:mult}+#1#{} Mult when scored", + }, + }, + j_golden={ + name="Golden Joker", + text={ + "Earn {C:money}$#1#{} at", + "end of round", + }, + }, + j_greedy_joker={ + name="Greedy Joker", + text={ + "Played cards with", + "{C:diamonds}#2#{} suit give", + "{C:mult}+#1#{} Mult when scored", + }, + }, + j_green_joker={ + name="Green Joker", + text={ + "{C:mult}+#1#{} Mult per hand played", + "{C:mult}-#2#{} Mult per discard", + "{C:inactive}(Currently {C:mult}+#3#{C:inactive} Mult)", + }, + }, + j_gros_michel={ + name="Gros Michel", + text={ + "{C:mult}+#1#{} Mult", + "{C:green}#2# in #3#{} chance this", + "card is destroyed", + "at end of round", + }, + }, + j_hack={ + name="Hack", + text={ + "Retrigger", + "each played", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{}, or {C:attention}5{}", + }, + }, + j_half={ + name="Half Joker", + text={ + "{C:red}+#1#{} Mult if played", + "hand contains", + "{C:attention}#2#{} or fewer cards", + }, + }, + j_hallucination={ + name="Hallucination", + text={ + "{C:green}#1# in #2#{} chance to create", + "a {C:tarot}Tarot{} card when any", + "{C:attention}Booster Pack{} is opened", + "{C:inactive}(Must have room)", + }, + }, + j_hanging_chad={ + name="Hanging Chad", + text={ + "Retrigger {C:attention}first{} played", + "card used in scoring", + "{C:attention}#1#{} additional times", + }, + unlock={ + "Beat a Boss Blind", + "with a {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Hiker", + text={ + "Every played {C:attention}card{}", + "permanently gains", + "{C:chips}+#1#{} Chips when scored", + }, + }, + j_hit_the_road={ + name="Hit the Road", + text={ + "This Joker gains {X:mult,C:white} X#1# {} Mult", + "for every {C:attention}Jack{}", + "discarded this round", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Discard {E:1,C:attention}5", + "{E:1,C:attention}Jacks{} at the", + "same time", + }, + }, + j_hologram={ + name="Hologram", + text={ + "This Joker gains {X:mult,C:white} X#1# {} Mult", + "every time a {C:attention}playing card{}", + "is added to your deck", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_ice_cream={ + name="Ice Cream", + text={ + "{C:chips}+#1#{} Chips", + "{C:chips}-#2#{} Chips for", + "every hand played", + }, + }, + j_idol={ + name="The Idol", + text={ + "Each played {C:attention}#2#", + "of {V:1}#3#{} gives", + "{X:mult,C:white} X#1# {} Mult when scored", + "{s:0.8}Card changes every round", + }, + unlock={ + "In one hand,", + "earn at least", + "{E:1,C:attention}#1#{} chips", + }, + }, + j_invisible={ + name="Invisible Joker", + text={ + "After {C:attention}#1#{} rounds,", + "sell this card to", + "{C:attention}Duplicate{} a random Joker", + "{C:inactive}(Currently {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Win a run without", + "ever having more", + "than {E:1,C:attention}4 Jokers{}", + }, + }, + j_joker={ + name="Joker", + text={ + "{C:red,s:1.1}+#1#{} Mult", + }, + }, + j_jolly={ + name="Jolly Joker", + text={ + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_juggler={ + name="Juggler", + text={ + "{C:attention}+#1#{} hand size", + }, + }, + j_loyalty_card={ + name="Loyalty Card", + text={ + "{X:red,C:white} X#1# {} Mult every", + "{C:attention}#2#{} hands played", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Sell this card to", + "disable the current", + "{C:attention}Boss Blind{}", + }, + }, + j_lucky_cat={ + name="Lucky Cat", + text={ + "This Joker gains {X:mult,C:white} X#1# {} Mult", + "every time a {C:attention}Lucky{} card", + "{C:green}successfully{} triggers", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_lusty_joker={ + name="Lusty Joker", + text={ + "Played cards with", + "{C:hearts}#2#{} suit give", + "{C:mult}+#1#{} Mult when scored", + }, + }, + j_mad={ + name="Mad Joker", + text={ + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_madness={ + name="Madness", + text={ + "When {C:attention}Small Blind{} or {C:attention}Big Blind{}", + "is selected, gain {X:mult,C:white} X#1# {} Mult", + "and {C:attention}destroy{} a random Joker", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_mail={ + name="Mail-In Rebate", + text={ + "Earn {C:money}$#1#{} for each", + "discarded {C:attention}#2#{}, rank", + "changes every round", + }, + }, + j_marble={ + name="Marble Joker", + text={ + "Adds one {C:attention}Stone{} card", + "to deck when", + "{C:attention}Blind{} is selected", + }, + }, + j_matador={ + name="Matador", + text={ + "Earn {C:money}$#1#{} if played", + "hand triggers the", + "{C:attention}Boss Blind{} ability", + }, + unlock={ + "Defeat a Boss Blind", + "in {E:1,C:attention}1 hand{} without", + "using any discards", + }, + }, + j_merry_andy={ + name="Merry Andy", + text={ + "{C:red}+#1#{} discards", + "each round,", + "{C:red}#2#{} hand size", + }, + unlock={ + "Win a run in {E:1,C:attention}#1#", + "or fewer rounds", + }, + }, + j_midas_mask={ + name="Midas Mask", + text={ + "All played {C:attention}face{} cards", + "become {C:attention}Gold{} cards", + "when scored", + }, + }, + j_mime={ + name="Mime", + text={ + "Retrigger all", + "card {C:attention}held in", + "{C:attention}hand{} abilities", + }, + }, + j_misprint={ + name="Misprint", + text={ + "", + }, + }, + j_mr_bones={ + name="Mr. Bones", + text={ + "Prevents Death", + "if chips scored", + "are at least {C:attention}25%", + "of required chips", + "{S:1.1,C:red,E:2}self destructs{}", + }, + unlock={ + "Lose {C:attention,E:1}#1#{} runs", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Mystic Summit", + text={ + "{C:mult}+#1#{} Mult when", + "{C:attention}#2#{} discards", + "remaining", + }, + }, + j_obelisk={ + name="Obelisk", + text={ + "This Joker gains {X:mult,C:white} X#1# {} Mult", + "per {C:attention}consecutive{} hand played", + "without playing your", + "most played {C:attention}poker hand", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_odd_todd={ + name="Odd Todd", + text={ + "Played cards with", + "{C:attention}odd{} rank give", + "{C:chips}+#1#{} Chips when scored", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Onyx Agate", + text={ + "Played cards with", + "{C:clubs}Club{} suit give", + "{C:mult}+#1#{} Mult when scored", + }, + unlock={ + "Have at least {E:1,C:attention}#1#", + "cards with {E:1,C:attention}#2#", + "suit in your deck", + }, + }, + j_oops={ + name="Oops! All 6s", + text={ + "Doubles all {C:attention}listed", + "{C:green,E:1,S:1.1}probabilities", + "{C:inactive}(ex: {C:green}1 in 3{C:inactive} -> {C:green}2 in 3{C:inactive})", + }, + unlock={ + "In one hand,", + "earn at least", + "{E:1,C:attention}#1#{} chips", + }, + }, + j_order={ + name="The Order", + text={ + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + unlock={ + "Win a run", + "without playing", + "a {E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Pareidolia", + text={ + "All cards are", + "considered", + "{C:attention}face{} cards", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Creates a {C:dark_edition}Negative{} copy of", + "{C:attention}1{} random {C:attention}consumable{}", + "card in your possession", + "at the end of the {C:attention}shop", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Photograph", + text={ + "First played {C:attention}face", + "card gives {X:mult,C:white} X#1# {} Mult", + "when scored", + }, + }, + j_popcorn={ + name="Popcorn", + text={ + "{C:mult}+#1#{} Mult", + "{C:mult}-#2#{} Mult per", + "round played", + }, + }, + j_raised_fist={ + name="Raised Fist", + text={ + "Adds {C:attention}double{} the rank", + "of {C:attention}lowest{} ranked card", + "held in hand to Mult", + }, + }, + j_ramen={ + name="Ramen", + text={ + "{X:mult,C:white} X#1# {} Mult,", + "loses {X:mult,C:white} X#2# {} Mult", + "per {C:attention}card{} discarded", + }, + }, + j_red_card={ + name="Red Card", + text={ + "This Joker gains", + "{C:red}+#1#{} Mult when any", + "{C:attention}Booster Pack{} is skipped", + "{C:inactive}(Currently {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_reserved_parking={ + name="Reserved Parking", + text={ + "Each {C:attention}face{} card", + "held in hand has", + "a {C:green}#2# in #3#{} chance", + "to give {C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="Ride the Bus", + text={ + "This Joker gains {C:mult}+#1#{} Mult", + "per {C:attention}consecutive{} hand", + "played without a", + "scoring {C:attention}face{} card", + "{C:inactive}(Currently {C:mult}+#2#{C:inactive} Mult)", + }, + }, + j_riff_raff={ + name="Riff-Raff", + text={ + "When {C:attention}Blind{} is selected,", + "create {C:attention}#1# {C:blue}Common{C:attention} Jokers", + "{C:inactive}(Must have room)", + }, + }, + j_ring_master={ + name="Showman", + text={ + "{C:attention}Joker{}, {C:tarot}Tarot{}, {C:planet}Planet{},", + "and {C:spectral}Spectral{} cards may", + "appear multiple times", + }, + unlock={ + "Reach Ante", + "level {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Rocket", + text={ + "Earn {C:money}$#1#{} at end of round", + "Payout increases by {C:money}$#2#{}", + "when {C:attention}Boss Blind{} is defeated", + }, + }, + j_rough_gem={ + name="Rough Gem", + text={ + "Played cards with", + "{C:diamonds}Diamond{} suit earn", + "{C:money}$#1#{} when scored", + }, + unlock={ + "Have at least {E:1,C:attention}#1#", + "cards with {E:1,C:attention}#2#", + "suit in your deck", + }, + }, + j_runner={ + name="Runner", + text={ + "Gains {C:chips}+#2#{} Chips", + "if played hand", + "contains a {C:attention}Straight{}", + "{C:inactive}(Currently {C:chips}+#1#{C:inactive} Chips)", + }, + }, + j_satellite={ + name="Satellite", + text={ + "Earn {C:money}$#1#{} at end of", + "round per unique {C:planet}Planet", + "card used this run", + "{C:inactive}(Currently {C:money}$#2#{C:inactive})", + }, + unlock={ + "Have {E:1,C:money}$#1#", + "or more", + }, + }, + j_scary_face={ + name="Scary Face", + text={ + "Played {C:attention}face{} cards", + "give {C:chips}+#1#{} Chips", + "when scored", + }, + }, + j_scholar={ + name="Scholar", + text={ + "Played {C:attention}Aces{}", + "give {C:chips}+#2#{} Chips", + "and {C:mult}+#1#{} Mult", + "when scored", + }, + }, + j_seance={ + name="Séance", + text={ + "If {C:attention}poker hand{} is a", + "{C:attention}#1#{}, create a", + "random {C:spectral}Spectral{} card", + "{C:inactive}(Must have room)", + }, + }, + j_seeing_double={ + name="Seeing Double", + text={ + "{X:mult,C:white} X#1# {} Mult if played", + "hand has a scoring", + "{C:clubs}Club{} card and a scoring", + "card of any other {C:attention}suit", + }, + unlock={ + "Play a hand", + "that contains", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Seltzer", + text={ + "Retrigger all", + "cards played for", + "the next {C:attention}#1#{} hands", + }, + }, + j_shoot_the_moon={ + name="Shoot the Moon", + text={ + "Each {C:attention}Queen{}", + "held in hand", + "gives {C:mult}+#1#{} Mult", + }, + unlock={ + "Play every {E:1,C:attention}Heart", + "in your deck in", + "a single round", + }, + }, + j_shortcut={ + name="Shortcut", + text={ + "Allows {C:attention}Straights{} to be", + "made with gaps of {C:attention}1 rank", + "{C:inactive}(ex: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Sixth Sense", + text={ + "If {C:attention}first hand{} of round is", + "a single {C:attention}6{}, destroy it and", + "create a {C:spectral}Spectral{} card", + "{C:inactive}(Must have room)", + }, + }, + j_sly={ + name="Sly Joker", + text={ + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_smeared={ + name="Smeared Joker", + text={ + "{C:hearts}Hearts{} and {C:diamonds}Diamonds", + "count as the same suit,", + "{C:spades}Spades{} and {C:clubs}Clubs", + "count as the same suit", + }, + unlock={ + "Have at least {C:attention}#1#", + "{E:1,C:attention}#2#{} in", + "your deck", + }, + }, + j_smiley={ + name="Smiley Face", + text={ + "Played {C:attention}face{} cards", + "give {C:mult}+#1#{} Mult", + "when scored", + }, + }, + j_sock_and_buskin={ + name="Sock and Buskin", + text={ + "Retrigger all", + "played {C:attention}face{} cards", + }, + unlock={ + "Play a total of", + "{C:attention,E:1}#1#{} face cards", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Space Joker", + text={ + "{C:green}#1# in #2#{} chance to", + "upgrade level of", + "played {C:attention}poker hand{}", + }, + }, + j_splash={ + name="Splash", + text={ + "Every {C:attention}played card", + "counts in scoring", + }, + }, + j_square={ + name="Square Joker", + text={ + "This Joker gains {C:chips}+#2#{} Chips", + "if played hand has", + "exactly {C:attention}4{} cards", + "{C:inactive}(Currently {C:chips}#1#{C:inactive} Chips)", + }, + }, + j_steel_joker={ + name="Steel Joker", + text={ + "Gives {X:mult,C:white} X#1# {} Mult", + "for each {C:attention}Steel Card", + "in your {C:attention}full deck", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_stencil={ + name="Joker Stencil", + text={ + "{X:red,C:white} X1 {} Mult for each", + "empty {C:attention}Joker{} slot", + "{s:0.8}Joker Stencil included", + "{C:inactive}(Currently {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Stone Joker", + text={ + "Gives {C:chips}+#1#{} Chips for", + "each {C:attention}Stone Card", + "in your {C:attention}full deck", + "{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)", + }, + }, + j_stuntman={ + name="Stuntman", + text={ + "{C:chips}+#1#{} Chips,", + "{C:attention}-#2#{} hand size", + }, + unlock={ + "In one hand,", + "earn at least", + "{E:1,C:attention}#1#{} chips", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Adds the number of times", + "{C:attention}poker hand{} has been", + "played this run to Mult", + }, + }, + j_superposition={ + name="Superposition", + text={ + "Create a {C:tarot}Tarot{} card if", + "poker hand contains an", + "{C:attention}Ace{} and a {C:attention}Straight{}", + "{C:inactive}(Must have room)", + }, + }, + j_swashbuckler={ + name="Swashbuckler", + text={ + "Adds the sell value", + "of all other owned", + "{C:attention}Jokers{} to Mult", + "{C:inactive}(Currently {C:mult}+#1#{C:inactive} Mult)", + }, + unlock={ + "Sell a total of", + "{C:attention,E:1}#1#{} Joker cards", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Throwback", + text={ + "{X:mult,C:white} X#1# {} Mult for each", + "{C:attention}Blind{} skipped this run", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Continue a saved run", + "from the main menu", + }, + }, + j_ticket={ + name="Golden Ticket", + text={ + "Played {C:attention}Gold{} cards", + "earn {C:money}$#1#{} when scored", + }, + unlock={ + "Play a 5 card hand", + "that contains only", + "{C:attention,E:1}Gold{} cards", + }, + }, + j_to_the_moon={ + name="To the Moon", + text={ + "Earn an extra {C:money}$#1#{} of", + "{C:attention}interest{} for every {C:money}$5{} you", + "have at end of round", + }, + }, + j_todo_list={ + name="To Do List", + text={ + "Earn {C:money}$#1#{} if {C:attention}poker hand{}", + "is a {C:attention}#2#{},", + "poker hand changes", + "at end of round", + }, + }, + j_trading={ + name="Trading Card", + text={ + "If {C:attention}first discard{} of round", + "has only {C:attention}1{} card, destroy", + "it and earn {C:money}$#1#", + }, + }, + j_tribe={ + name="The Tribe", + text={ + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + unlock={ + "Win a run", + "without playing", + "a {E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "Played {C:attention}Kings{} and", + "{C:attention}Queens{} each give", + "{X:mult,C:white} X#1# {} Mult when scored", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="The Trio", + text={ + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + unlock={ + "Win a run", + "without playing", + "a {E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Troubadour", + text={ + "{C:attention}+#1#{} hand size,", + "{C:blue}-#2#{} hand each round", + }, + unlock={ + "Win {C:attention,E:1}#1#{} consecutive", + "rounds by playing", + "only 1 hand", + }, + }, + j_trousers={ + name="Spare Trousers", + text={ + "This Joker gains {C:mult}+#1#{} Mult", + "if played hand contains", + "a {C:attention}#2#", + "{C:inactive}(Currently {C:red}+#3#{C:inactive} Mult)", + }, + }, + j_turtle_bean={ + name="Turtle Bean", + text={ + "{C:attention}+#1#{} hand size,", + "reduces by", + "{C:red}#2#{} every round", + }, + }, + j_vagabond={ + name="Vagabond", + text={ + "Create a {C:purple}Tarot{} card", + "if hand is played", + "with {C:money}$#1#{} or less", + }, + }, + j_vampire={ + name="Vampire", + text={ + "This Joker gains {X:mult,C:white} X#1# {} Mult", + "per scoring {C:attention}Enhanced card{} played,", + "removes card {C:attention}Enhancement", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_walkie_talkie={ + name="Walkie Talkie", + text={ + "Each played {C:attention}10{} or {C:attention}4", + "gives {C:chips}+#1#{} Chips and", + "{C:mult}+#2#{} Mult when scored", + }, + }, + j_wee={ + name="Wee Joker", + text={ + "This Joker gains", + "{C:chips}+#2#{} Chips when each", + "played {C:attention}2{} is scored", + "{C:inactive}(Currently {C:chips}+#1#{C:inactive} Chips)", + }, + unlock={ + "Win a run in {E:1,C:attention}#1#", + "or fewer rounds", + }, + }, + j_wily={ + name="Wily Joker", + text={ + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Wrathful Joker", + text={ + "Played cards with", + "{C:spades}#2#{} suit give", + "{C:mult}+#1#{} Mult when scored", + }, + }, + j_yorick={ + name="Yorick", + text={ + "This Joker gains", + "{X:mult,C:white} X#1# {} Mult every {C:attention}#2#{C:inactive} [#3#]{}", + "cards discarded", + "{C:inactive}(Currently {X:mult,C:white} X#4# {C:inactive} Mult)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Zany Joker", + text={ + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Black Sticker", + text={ + "Used this Joker", + "to win on {C:attention}Black", + "{C:attention}Stake{} difficulty", + }, + }, + blue_seal={ + name="Blue Seal", + text={ + "Creates the {C:planet}Planet{} card", + "for final played {C:attention}poker hand{}", + "of round if {C:attention}held{} in hand", + "{C:inactive}(Must have room)", + }, + }, + blue_sticker={ + name="Blue Sticker", + text={ + "Used this Joker", + "to win on {C:attention}Blue", + "{C:attention}Stake{} difficulty", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} chips", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} extra chips", + }, + }, + challenge_locked={ + name="Locked", + text={ + "Win a run with at least", + "#1# different decks to unlock", + "Challenge mode", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Debuffed", + text={ + "All abilities", + "are disabled", + }, + }, + debuffed_playing_card={ + name="Debuffed", + text={ + "Scores no chips", + "and all abilities", + "are disabled", + }, + }, + deck_locked_discover={ + name="Locked", + text={ + "Discover at least", + "{C:attention}#1#{} items from", + "your collection", + }, + }, + deck_locked_stake={ + name="Locked", + text={ + "Win a run with any", + "deck on at least", + "{V:1}#1#{} difficulty", + }, + }, + deck_locked_win={ + name="Locked", + text={ + "Win a run with", + "{C:attention}#1#{}", + "on any difficulty", + }, + }, + demo_locked={ + name="Locked", + text={ + "Not available", + "in this demo", + }, + }, + demo_shop_locked={ + name="Locked", + text={ + "Card from {C:attention}Jimbo's", + "personal collection,", + "available in the full", + "version of {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Eternal", + text={ + "Can't be sold", + "or destroyed", + }, + }, + gold_seal={ + name="Gold Seal", + text={ + "Earn {C:money}$3{} when this", + "card is played", + "and scores", + }, + }, + gold_sticker={ + name="Gold Sticker", + text={ + "Used this Joker", + "to win on {C:attention}Gold", + "{C:attention}Stake{} difficulty", + }, + }, + green_sticker={ + name="Green Sticker", + text={ + "Used this Joker", + "to win on {C:attention}Green", + "{C:attention}Stake{} difficulty", + }, + }, + joker_locked_legendary={ + name="Locked", + text={ + "Find this Joker", + "from the {C:spectral}Soul{} card", + }, + }, + locked={ + name="Locked", + text={ + }, + }, + orange_sticker={ + name="Orange Sticker", + text={ + "Used this Joker", + "to win on {C:attention}Orange", + "{C:attention}Stake{} difficulty", + }, + }, + p_arcana_jumbo={ + name="Jumbo Arcana Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:tarot} Tarot{} cards to", + "be used immediately", + }, + }, + p_arcana_mega={ + name="Mega Arcana Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:tarot} Tarot{} cards to", + "be used immediately", + }, + }, + p_arcana_normal={ + name="Arcana Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:tarot} Tarot{} cards to", + "be used immediately", + }, + }, + p_buffoon_jumbo={ + name="Jumbo Buffoon Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:joker} Joker{} cards", + }, + }, + p_buffoon_mega={ + name="Mega Buffoon Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:joker} Joker{} cards", + }, + }, + p_buffoon_normal={ + name="Buffoon Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:joker} Joker{} cards", + }, + }, + p_celestial_jumbo={ + name="Jumbo Celestial Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:planet} Planet{} cards to", + "be used immediately", + }, + }, + p_celestial_mega={ + name="Mega Celestial Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:planet} Planet{} cards to", + "be used immediately", + }, + }, + p_celestial_normal={ + name="Celestial Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:planet} Planet{} cards to", + "be used immediately", + }, + }, + p_spectral_jumbo={ + name="Jumbo Spectral Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:spectral} Spectral{} cards to", + "be used immediately", + }, + }, + p_spectral_mega={ + name="Mega Spectral Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:spectral} Spectral{} cards to", + "be used immediately", + }, + }, + p_spectral_normal={ + name="Spectral Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:spectral} Spectral{} cards to", + "be used immediately", + }, + }, + p_standard_jumbo={ + name="Jumbo Standard Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:attention} Playing{} cards to", + "add to your deck", + }, + }, + p_standard_mega={ + name="Mega Standard Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:attention} Playing{} cards to", + "add to your deck", + }, + }, + p_standard_normal={ + name="Standard Pack", + text={ + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:attention} Playing{} cards to", + "add to your deck", + }, + }, + perishable={ + name="Perishable", + text={ + "Debuffed after", + "{C:attention}#1#{} rounds", + "{C:inactive}({C:attention}#2#{C:inactive} remaining)", + }, + }, + pinned_left={ + name="Pinned", + text={ + "This Joker stays", + "pinned to the", + "leftmost position", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# of {V:1}#2# ", + }, + }, + purple_seal={ + name="Purple Seal", + text={ + "Creates a {C:tarot}Tarot{} card", + "when {C:attention}discarded", + "{C:inactive}(Must have room)", + }, + }, + purple_sticker={ + name="Purple Sticker", + text={ + "Used this Joker", + "to win on {C:attention}Purple", + "{C:attention}Stake{} difficulty", + }, + }, + red_seal={ + name="Red Seal", + text={ + "Retrigger this", + "card {C:attention}1{} time", + }, + }, + red_sticker={ + name="Red Sticker", + text={ + "Used this Joker", + "to win on {C:attention}Red", + "{C:attention}Stake{} difficulty", + }, + }, + remove_negative={ + name="n", + text={ + "{C:inactive,s:0.9}(Removes {C:dark_edition,s:0.9}Negative{C:inactive,s:0.9} from copy)", + }, + }, + rental={ + name="Rental", + text={ + "Lose {C:money}$#1#{} at", + "end of round", + }, + }, + undiscovered_booster={ + name="Not Discovered", + text={ + "Open this pack", + "in an unseeded run", + "to learn what it does", + }, + }, + undiscovered_edition={ + name="Not Discovered", + text={ + "Find this edition", + "in an unseeded run", + "to learn what it does", + }, + }, + undiscovered_joker={ + name="Not Discovered", + text={ + "Purchase or use", + "this card in an", + "unseeded run to", + "learn what it does", + }, + }, + undiscovered_planet={ + name="Not Discovered", + text={ + "Purchase or use", + "this card in an", + "unseeded run to", + "learn what it does", + }, + }, + undiscovered_spectral={ + name="Not Discovered", + text={ + "Purchase or use", + "this card in an", + "unseeded run to", + "learn what it does", + }, + }, + undiscovered_tag={ + name="Not Discovered", + text={ + "Use this tag in", + "an unseeded run to", + "learn what it does", + }, + }, + undiscovered_tarot={ + name="Not Discovered", + text={ + "Purchase or use", + "this card in an", + "unseeded run to", + "learn what it does", + }, + }, + undiscovered_voucher={ + name="Not Discovered", + text={ + "Redeem this", + "voucher in an", + "unseeded run to", + "learn what it does", + }, + }, + white_sticker={ + name="White Sticker", + text={ + "Used this Joker", + "to win on {C:attention}White", + "{C:attention}Stake{} difficulty", + }, + }, + wip_locked={ + name="Locked", + text={ + "Work in", + "progress", + }, + }, + }, + Planet={ + c_ceres={ + name="Ceres", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_earth={ + name="Earth", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_jupiter={ + name="Jupiter", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_mars={ + name="Mars", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_mercury={ + name="Mercury", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_neptune={ + name="Neptune", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_planet_x={ + name="Planet X", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_pluto={ + name="Pluto", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_saturn={ + name="Saturn", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_uranus={ + name="Uranus", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + c_venus={ + name="Venus", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips", + }, + }, + }, + Spectral={ + c_ankh={ + name="Ankh", + text={ + "Create a copy of a", + "random {C:attention}Joker{}, destroy", + "all other Jokers", + }, + }, + c_aura={ + name="Aura", + text={ + "Add {C:dark_edition}Foil{}, {C:dark_edition}Holographic{},", + "or {C:dark_edition}Polychrome{} effect to", + "{C:attention}1{} selected card in hand", + }, + }, + c_black_hole={ + name="Black Hole", + text={ + "Upgrade every", + "{C:legendary,E:1}poker hand", + "by {C:attention}1{} level", + }, + }, + c_cryptid={ + name="Cryptid", + text={ + "Create {C:attention}#1#{} copies of", + "{C:attention}1{} selected card", + "in your hand", + }, + }, + c_deja_vu={ + name="Deja Vu", + text={ + "Add a {C:red}Red Seal{}", + "to {C:attention}1{} selected", + "card in your hand", + }, + }, + c_ectoplasm={ + name="Ectoplasm", + text={ + "Add {C:dark_edition}Negative{} to", + "a random {C:attention}Joker,", + "{C:red}-#1#{} hand size", + }, + }, + c_familiar={ + name="Familiar", + text={ + "Destroy {C:attention}1{} random", + "card in your hand, add", + "{C:attention}#1#{} random {C:attention}Enhanced face", + "{C:attention}cards{} to your hand", + }, + }, + c_grim={ + name="Grim", + text={ + "Destroy {C:attention}1{} random", + "card in your hand,", + "add {C:attention}#1#{} random {C:attention}Enhanced", + "{C:attention}Aces{} to your hand", + }, + }, + c_hex={ + name="Hex", + text={ + "Add {C:dark_edition}Polychrome{} to a", + "random {C:attention}Joker{}, destroy", + "all other Jokers", + }, + }, + c_immolate={ + name="Immolate", + text={ + "Destroys {C:attention}#1#{} random", + "cards in hand,", + "gain {C:money}$#2#", + }, + }, + c_incantation={ + name="Incantation", + text={ + "Destroy {C:attention}1{} random", + "card in your hand, add {C:attention}#1#", + "random {C:attention}Enhanced numbered", + "{C:attention}cards{} to your hand", + }, + }, + c_medium={ + name="Medium", + text={ + "Add a {C:purple}Purple Seal{}", + "to {C:attention}1{} selected", + "card in your hand", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Converts all cards", + "in hand to a single", + "random {C:attention}rank", + "{C:red}-1{} hand size", + }, + }, + c_sigil={ + name="Sigil", + text={ + "Converts all cards", + "in hand to a single", + "random {C:attention}suit", + }, + }, + c_soul={ + name="The Soul", + text={ + "Creates a", + "{C:legendary,E:1}Legendary{} Joker", + "{C:inactive}(Must have room)", + }, + }, + c_talisman={ + name="Talisman", + text={ + "Add a {C:attention}Gold Seal{}", + "to {C:attention}1{} selected", + "card in your hand", + }, + }, + c_trance={ + name="Trance", + text={ + "Add a {C:blue}Blue Seal{}", + "to {C:attention}1{} selected", + "card in your hand", + }, + }, + c_wraith={ + name="Wraith", + text={ + "Creates a random", + "{C:red}Rare{C:attention} Joker{},", + "sets money to {C:money}$0", + }, + }, + }, + Stake={ + stake_black={ + name="Black Stake", + text={ + "Shop can have {C:attention}Eternal{} Jokers", + "{C:inactive,s:0.8}(Can't be sold or destroyed)", + "{s:0.8}Applies all previous Stakes", + }, + }, + stake_blue={ + name="Blue Stake", + text={ + "{C:red}-1{} Discard", + "{s:0.8}Applies all previous Stakes", + }, + }, + stake_gold={ + name="Gold Stake", + text={ + "Shop can have {C:attention}Rental{} Jokers", + "{C:inactive,s:0.8}(Costs {C:money,s:0.8}$3{C:inactive,s:0.8} per round)", + "{s:0.8}Applies all previous Stakes", + }, + }, + stake_green={ + name="Green Stake", + text={ + "Required score scales", + "faster for each {C:attention}Ante", + "{s:0.8}Applies all previous Stakes", + }, + }, + stake_orange={ + name="Orange Stake", + text={ + "Shop can have {C:attention}Perishable{} Jokers", + "{C:inactive,s:0.8}(Debuffed after 5 Rounds)", + "{s:0.8}Applies all previous Stakes", + }, + }, + stake_purple={ + name="Purple Stake", + text={ + "Required score scales", + "faster for each {C:attention}Ante", + "{s:0.8}Applies all previous Stakes", + }, + }, + stake_red={ + name="Red Stake", + text={ + "{C:attention}Small Blind{} gives", + "no reward money", + "{s:0.8}Applies all previous Stakes", + }, + }, + stake_white={ + name="White Stake", + text={ + "Base Difficulty", + }, + }, + }, + Tag={ + tag_boss={ + name="Boss Tag", + text={ + "Rerolls the", + "{C:attention}Boss Blind", + }, + }, + tag_buffoon={ + name="Buffoon Tag", + text={ + "Gives a free", + "{C:attention}Mega Buffoon Pack", + }, + }, + tag_charm={ + name="Charm Tag", + text={ + "Gives a free", + "{C:tarot}Mega Arcana Pack", + }, + }, + tag_coupon={ + name="Coupon Tag", + text={ + "Initial cards and", + "booster packs in next", + "shop are free", + }, + }, + tag_d_six={ + name="D6 Tag", + text={ + "Rerolls in next shop", + "start at {C:money}$0", + }, + }, + tag_double={ + name="Double Tag", + text={ + "Gives a copy of the", + "next selected {C:attention}Tag{}", + "{s:0.8,C:attention}Double Tag{s:0.8} excluded", + }, + }, + tag_economy={ + name="Economy Tag", + text={ + "Doubles your money", + "{C:inactive}(Max of {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="Ethereal Tag", + text={ + "Gives a free", + "{C:spectral}Spectral Pack", + }, + }, + tag_foil={ + name="Foil Tag", + text={ + "Next base edition shop", + "Joker is free and", + "becomes {C:dark_edition}Foil", + }, + }, + tag_garbage={ + name="Garbage Tag", + text={ + "Gives {C:money}$#1#{} per unused", + "{C:red}discard{} this run", + "{C:inactive}(Will give {C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="Handy Tag", + text={ + "Gives {C:money}$#1#{} per played", + "{C:blue}hand{} this run", + "{C:inactive}(Will give {C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="Holographic Tag", + text={ + "Next base edition shop", + "Joker is free and", + "becomes {C:dark_edition}Holographic", + }, + }, + tag_investment={ + name="Investment Tag", + text={ + "After defeating", + "the Boss Blind,", + "gain {C:money}$#1#", + }, + }, + tag_juggle={ + name="Juggle Tag", + text={ + "{C:attention}+#1#{} hand size", + "next round", + }, + }, + tag_meteor={ + name="Meteor Tag", + text={ + "Gives a free", + "{C:planet}Mega Celestial Pack", + }, + }, + tag_negative={ + name="Negative Tag", + text={ + "Next base edition shop", + "Joker is free and", + "becomes {C:dark_edition}Negative", + }, + }, + tag_orbital={ + name="Orbital Tag", + text={ + "Upgrade {C:attention}#1#", + "by {C:attention}#2# levels", + }, + }, + tag_polychrome={ + name="Polychrome Tag", + text={ + "Next base edition shop", + "Joker is free and", + "becomes {C:dark_edition}Polychrome", + }, + }, + tag_rare={ + name="Rare Tag", + text={ + "Shop has a free", + "{C:red}Rare Joker", + }, + }, + tag_skip={ + name="Speed Tag", + text={ + "Gives {C:money}$#1#{} per skipped", + "Blind this run", + "{C:inactive}(Will give {C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="Standard Tag", + text={ + "Gives a free", + "{C:attention}Mega Standard Pack", + }, + }, + tag_top_up={ + name="Top-up Tag", + text={ + "Create up to {C:attention}#1#", + "{C:blue}Common{} Jokers", + "{C:inactive}(Must have room)", + }, + }, + tag_uncommon={ + name="Uncommon Tag", + text={ + "Shop has a free", + "{C:green}Uncommon Joker", + }, + }, + tag_voucher={ + name="Voucher Tag", + text={ + "Adds one {C:voucher}Voucher", + "to the next shop", + }, + }, + }, + Tarot={ + c_chariot={ + name="The Chariot", + text={ + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#", + }, + }, + c_death={ + name="Death", + text={ + "Select {C:attention}#1#{} cards,", + "convert the {C:attention}left{} card", + "into the {C:attention}right{} card", + "{C:inactive}(Drag to rearrange)", + }, + }, + c_devil={ + name="The Devil", + text={ + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="The Emperor", + text={ + "Creates up to {C:attention}#1#", + "random {C:tarot}Tarot{} cards", + "{C:inactive}(Must have room)", + }, + }, + c_empress={ + name="The Empress", + text={ + "Enhances {C:attention}#1#", + "selected cards to", + "{C:attention}#2#s", + }, + }, + c_fool={ + name="The Fool", + text={ + "Creates the last", + "{C:tarot}Tarot{} or {C:planet}Planet{} card", + "used during this run", + "{s:0.8,C:tarot}The Fool{s:0.8} excluded", + }, + }, + c_hanged_man={ + name="The Hanged Man", + text={ + "Destroys up to", + "{C:attention}#1#{} selected cards", + }, + }, + c_heirophant={ + name="The Hierophant", + text={ + "Enhances {C:attention}#1#", + "selected cards to", + "{C:attention}#2#s", + }, + }, + c_hermit={ + name="The Hermit", + text={ + "Doubles money", + "{C:inactive}(Max of {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="The High Priestess", + text={ + "Creates up to {C:attention}#1#", + "random {C:planet}Planet{} cards", + "{C:inactive}(Must have room)", + }, + }, + c_judgement={ + name="Judgement", + text={ + "Creates a random", + "{C:attention}Joker{} card", + "{C:inactive}(Must have room)", + }, + }, + c_justice={ + name="Justice", + text={ + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="The Lovers", + text={ + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#", + }, + }, + c_magician={ + name="The Magician", + text={ + "Enhances {C:attention}#1#{}", + "selected cards to", + "{C:attention}#2#s", + }, + }, + c_moon={ + name="The Moon", + text={ + "Converts up to", + "{C:attention}#1#{} selected cards", + "to {V:1}#2#{}", + }, + }, + c_star={ + name="The Star", + text={ + "Converts up to", + "{C:attention}#1#{} selected cards", + "to {V:1}#2#{}", + }, + }, + c_strength={ + name="Strength", + text={ + "Increases rank of", + "up to {C:attention}#1#{} selected", + "cards by {C:attention}1", + }, + }, + c_sun={ + name="The Sun", + text={ + "Converts up to", + "{C:attention}#1#{} selected cards", + "to {V:1}#2#{}", + }, + }, + c_temperance={ + name="Temperance", + text={ + "Gives the total sell", + "value of all current", + "Jokers {C:inactive}(Max of {C:money}$#1#{C:inactive})", + "{C:inactive}(Currently {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="The Tower", + text={ + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="The Wheel of Fortune", + text={ + "{C:green}#1# in #2#{} chance to add", + "{C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, or", + "{C:dark_edition}Polychrome{} edition", + "to a random {C:attention}Joker", + }, + }, + c_world={ + name="The World", + text={ + "Converts up to", + "{C:attention}#1#{} selected cards", + "to {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimatter", + text={ + "{C:dark_edition}+1{} Joker Slot", + }, + unlock={ + "Redeem {C:voucher}Blank{}", + "{C:attention}#1#{} total times", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="Blank", + text={ + "{C:inactive}Does nothing?", + }, + }, + v_clearance_sale={ + name="Clearance Sale", + text={ + "All cards and packs in", + "shop are {C:attention}#1#%{} off", + }, + }, + v_crystal_ball={ + name="Crystal Ball", + text={ + "{C:attention}+1{} consumable slot", + }, + }, + v_directors_cut={ + name="Director's Cut", + text={ + "Reroll Boss Blind", + "{C:attention}1{} time per Ante,", + "{C:money}$#1#{} per roll", + }, + }, + v_glow_up={ + name="Glow Up", + text={ + "{C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, and", + "{C:dark_edition}Polychrome{} cards", + "appear {C:attention}#1#X{} more often", + }, + unlock={ + "Have at least {C:attention}#1#", + "{C:attention}Joker{} cards with", + "{C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, or", + "{C:dark_edition}Polychrome{} edition", + }, + }, + v_grabber={ + name="Grabber", + text={ + "Permanently", + "gain {C:blue}+#1#{} hand", + "per round", + }, + }, + v_hieroglyph={ + name="Hieroglyph", + text={ + "{C:attention}-#1#{} Ante,", + "{C:blue}-#1#{} hand", + "each round", + }, + }, + v_hone={ + name="Hone", + text={ + "{C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, and", + "{C:dark_edition}Polychrome{} cards", + "appear {C:attention}#1#X{} more often", + }, + }, + v_illusion={ + name="Illusion", + text={ + "{C:attention}Playing cards{} in shop", + "may have an {C:enhanced}Enhancement{},", + "{C:dark_edition}Edition{}, and/or a {C:attention}Seal{}", + }, + unlock={ + "Buy a total of", + "{C:attention}#1#{} playing cards", + "from the shop", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Liquidation", + text={ + "All cards and packs in", + "shop are {C:attention}#1#%{} off", + }, + unlock={ + "Redeem at least", + "{C:attention}#1#{C:voucher} Voucher{} cards", + "in one run", + }, + }, + v_magic_trick={ + name="Magic Trick", + text={ + "{C:attention}Playing cards{} can", + "be purchased", + "from the {C:attention}shop", + }, + }, + v_money_tree={ + name="Money Tree", + text={ + "Raise the cap on", + "interest earned in", + "each round to {C:money}$#1#{}", + }, + unlock={ + "Max out the interest", + "per round earnings for", + "{C:attention}#1#{} consecutive rounds", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Nacho Tong", + text={ + "Permanently", + "gain {C:blue}+#1#{} hand", + "per round", + }, + unlock={ + "Play a total", + "of {C:attention}#1#{} cards", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Observatory", + text={ + "{C:planet}Planet{} cards in your", + "{C:attention}consumable{} area give", + "{X:red,C:white} X#1# {} Mult for their", + "specified {C:attention}poker hand", + }, + unlock={ + "Use a total of {C:attention}#1#", + "{C:planet}Planet{} cards from any", + "{C:planet}Celestial Pack", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Omen Globe", + text={ + "{C:spectral}Spectral{} cards may", + "appear in any of", + "the {C:attention}Arcana Packs", + }, + unlock={ + "Use a total of {C:attention}#1#", + "{C:tarot}Tarot{} cards from any", + "{C:tarot}Arcana Pack", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Overstock", + text={ + "{C:attention}+1{} card slot", + "available in shop", + }, + }, + v_overstock_plus={ + name="Overstock Plus", + text={ + "{C:attention}+1{} card slot", + "available in shop", + }, + unlock={ + "Spend a total of", + "{C:money}$#1#{} at the shop", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="Paint Brush", + text={ + "{C:attention}+#1#{} hand size", + }, + }, + v_palette={ + name="Palette", + text={ + "{C:attention}+#1#{} hand size", + }, + unlock={ + "Reduce hand size", + "down to {C:attention}#1#{} cards", + }, + }, + v_petroglyph={ + name="Petroglyph", + text={ + "{C:attention}-#1#{} Ante,", + "{C:red}-#1#{} discard", + "each round", + }, + unlock={ + "Reach Ante", + "level {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Planet Merchant", + text={ + "{C:planet}Planet{} cards appear", + "{C:attention}#1#X{} more frequently", + "in the shop", + }, + }, + v_planet_tycoon={ + name="Planet Tycoon", + text={ + "{C:planet}Planet{} cards appear", + "{C:attention}#1#X{} more frequently", + "in the shop", + }, + unlock={ + "Buy a total of", + "{C:attention}#1#{C:planet} Planet{} cards", + "from the shop", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Recyclomancy", + text={ + "Permanently", + "gain {C:red}+#1#{} discard", + "each round", + }, + unlock={ + "Discard a total", + "of {C:attention}#1#{} cards", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Reroll Glut", + text={ + "Rerolls cost", + "{C:money}$#1#{} less", + }, + unlock={ + "Reroll the shop a", + "total of {C:attention}#1#{} times", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Reroll Surplus", + text={ + "Rerolls cost", + "{C:money}$#1#{} less", + }, + }, + v_retcon={ + name="Retcon", + text={ + "Reroll Boss Blind", + "{C:attention}unlimited{} times,", + "{C:money}$#1#{} per roll", + }, + unlock={ + "Discover", + "{C:attention}#1#{} Blinds", + }, + }, + v_seed_money={ + name="Seed Money", + text={ + "Raise the cap on", + "interest earned in", + "each round to {C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="Tarot Merchant", + text={ + "{C:tarot}Tarot{} cards appear", + "{C:attention}#1#X{} more frequently", + "in the shop", + }, + }, + v_tarot_tycoon={ + name="Tarot Tycoon", + text={ + "{C:tarot}Tarot{} cards appear", + "{C:attention}#1#X{} more frequently", + "in the shop", + }, + unlock={ + "Buy a total of", + "{C:attention}#1#{C:tarot} Tarot{} cards", + "from the shop", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Telescope", + text={ + "{C:attention}Celestial Packs{} always", + "contain the {C:planet}Planet{}", + "card for your most", + "played {C:attention}poker hand", + }, + }, + v_wasteful={ + name="Wasteful", + text={ + "Permanently", + "gain {C:red}+#1#{} discard", + "each round", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Score 100,000,000 Chips in a single hand", + _1000k="Score 1,000,000 Chips in a single hand", + _10k="Score 10,000 Chips in a single hand", + ante_up="Reach Ante 4", + ante_upper="Reach Ante 8", + astronomy="Discover every Planet card", + big_hands="Have 80 or more cards in your deck", + card_discarder="Discard at least 2500 Cards", + card_player="Play at least 2500 Cards", + cartomancy="Discover every Tarot card", + clairvoyance="Discover every Spectral card", + completionist="Discover 100% of your collection", + completionist_plus="Win with every deck on Gold Stake difficulty", + completionist_plus_plus="Earn a Gold Sticker on every Joker", + extreme_couponer="Discover every Voucher", + flushed="Play a Flush with 5 Wild Cards", + heads_up="Win a Run", + high_stakes="Win a run on at least Gold Stake difficulty", + legendary="Discover a Legendary Joker", + low_stakes="Win a run on at least Red Stake difficulty", + mid_stakes="Win a run on at least Black Stake difficulty", + nest_egg="Have $400 or more during a single run", + retrograde="Get any poker hand to level 10", + roi="Buy 5 Vouchers by Ante 4", + royale="Play a Royal Flush", + rule_bender="Complete any challenge run", + rule_breaker="Complete every challenge run", + shattered="Break 2 Glass Cards in a single hand", + speedrunner="Win a run in 12 or fewer rounds", + tiny_hands="Thin your deck down to 20 or fewer cards", + you_get_what_you_get="Win a run without rerolling the shop", + }, + achievement_names={ + _100000k="100,000K", + _1000k="1,000K", + _10k="10K", + ante_up="Ante Up!", + ante_upper="Ante Upper!", + astronomy="Astronomy", + big_hands="Big Hands", + card_discarder="Card Discarder", + card_player="Card Player", + cartomancy="Cartomancy", + clairvoyance="Clairvoyance", + completionist="Completionist", + completionist_plus="Completionist+", + completionist_plus_plus="Completionist++", + extreme_couponer="Extreme Couponer", + flushed="Flushed", + heads_up="Heads Up", + high_stakes="High Stakes", + legendary="Legendary", + low_stakes="Low Stakes", + mid_stakes="Mid Stakes", + nest_egg="Nest Egg", + retrograde="Retrograde", + roi="ROI", + royale="Royale", + rule_bender="Rule Bender", + rule_breaker="Rule Breaker", + shattered="Shattered", + speedrunner="Speedrunner", + tiny_hands="Tiny Hands", + you_get_what_you_get="You Get What You Get", + }, + blind_states={ + Current="Current", + Defeated="Defeated", + Select="Select", + Selected="Selected", + Skipped="Skipped", + Upcoming="Upcoming", + }, + challenge_names={ + c_blast_off_1="Blast Off", + c_bram_poker_1="Bram Poker", + c_city_1="15 Minute City", + c_cruelty_1="Cruelty", + c_double_nothing_1="Double or Nothing", + c_five_card_1="Five-Card Draw", + c_fragile_1="Fragile", + c_golden_needle_1="Golden Needle", + c_inflation_1="Inflation", + c_jokerless_1="Jokerless", + c_knife_1="On a Knife's Edge", + c_luxury_1="Luxury Tax", + c_mad_world_1="Mad World", + c_medusa_1="Medusa", + c_monolith_1="Monolith", + c_non_perishable_1="Non-Perishable", + c_omelette_1="The Omelette", + c_rich_1="Rich get Richer", + c_typecast_1="Typecast", + c_xray_1="X-ray Vision", + }, + collabs={ + Clubs={ + ["1"]="Default", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Default", + ["2"]="Dave the Diver", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Default", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Default", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="FAQ", + b_and_use="& USE", + b_back="Back", + b_blinds="Blinds", + b_booster_packs="Booster Packs", + b_buy="BUY", + b_cash_out="Cash Out", + b_challenges="Challenges", + b_collection="Collection", + b_collection_cap="COLLECTION", + b_continue="Continue", + b_copy="Copy", + b_copy_seed="Copy Seed", + b_create_profile="Create Profile", + b_credits="Credits", + b_current_profile="Current Profile", + b_customize_deck="Customize Deck", + b_deck="Deck", + b_decks="Decks", + b_delete_profile="Delete Profile", + b_discard="Discard", + b_editions="Editions", + b_endless="Endless Mode", + b_enhanced_cards="Enhanced Cards", + b_full_deck="Full Deck", + b_high_contrast_cards="High Contrast Cards", + b_how_to_play="How to play", + b_imagery="Imagery", + b_jokers="Jokers", + b_load_profile="Load Profile", + b_main_menu="Main Menu", + b_music="Music", + b_new_challenge="Start New Challenge", + b_new_run="New Run", + b_next="Next", + b_next_round_1="Next", + b_next_round_2="Round", + b_open="OPEN", + b_options="Options", + b_options_cap="OPTIONS", + b_planet_cards="Planet Cards", + b_play_cap="PLAY", + b_play_hand="Play Hand", + b_playbalatro="Visit playbalatro.com", + b_poker_hands="Poker Hands", + b_quit_cap="QUIT", + b_redeem="REDEEM", + b_reduced_motion="Reduced Motion", + b_remaining="Remaining", + b_reroll_boss="Reroll Boss", + b_reset_profile="Reset Profile", + b_restrictions="Restrictions", + b_retry="Retry", + b_rules="Rules", + b_run_info_1="Run", + b_run_info_2="Info", + b_seals="Seals", + b_seed="Seed", + b_select="SELECT", + b_sell="SELL", + b_set_CRT="CRT", + b_set_CRT_bloom="CRT Bloom", + b_set_apply="Apply", + b_set_audio="Audio", + b_set_crash_reports="Crash Reports", + b_set_game="Game", + b_set_game_vol="Game Volume", + b_set_gamespeed="Game Speed", + b_set_graphics="Graphics", + b_set_master_vol="Master Volume", + b_set_monitor="Display Monitor", + b_set_music_vol="Music Volume", + b_set_pixel_smoothing="Pixel Art Smoothing", + b_set_play_discard_pos="Play/Discard Button Position", + b_set_rumble="Controller Rumble", + b_set_screenshake="Screenshake", + b_set_shadows="Shadows", + b_set_vibration="Vibration", + b_set_video="Video", + b_set_windowmode="Window Mode", + b_settings="Settings", + b_skip="Skip", + b_skip_blind="Skip Blind", + b_skip_reward="Skip Reward", + b_sort_hand="Sort Hand", + b_sounds="Sounds", + b_spectral_cards="Spectral Cards", + b_stake="Stake", + b_start_new_run="New Run", + b_stat_consumables="Consumables", + b_stat_jokers="Jokers", + b_stat_planets="Planets", + b_stat_spectrals="Spectrals", + b_stat_tarots="Tarots", + b_stat_vouchers="Vouchers", + b_stats="Stats", + b_tags="Tags", + b_tarot_cards="Tarot Cards", + b_unlock_all="Unlock All", + b_use="USE", + b_vouchers="Vouchers", + b_wishlist="Wishlist on Steam", + k_aces="Aces", + k_achievement="Achievement", + k_achievements_disabled="Achievements Disabled", + k_active="active", + k_active_ex="Active!", + k_again_ex="Again!", + k_all_hands="All Hands", + k_also_applied="Also applied", + k_ante="Ante", + k_ante_cap="ANTE", + k_arcana_pack="Arcana Pack", + k_balanced="Balanced", + k_banned_cards="Banned Cards", + k_banned_tags="Banned Tags", + k_base_cap="BASE", + k_base_cards="Base Cards", + k_best_hand="Best Hand", + k_booster="Booster", + k_buffoon_pack="Buffoon Pack", + k_cap_consumables="CONSUMABLES", + k_card_stats="Card Stats", + k_celestial_pack="Celestial Pack", + k_challenge_mode="Challenge Mode", + k_challenges="Challenges", + k_choose="Choose", + k_collection="Collection", + k_common="Common", + k_compatible="compatible", + k_copied_ex="Copied!", + k_custom_rules="Custom Rules", + k_daily_run="Daily Run", + k_debuffed="Debuffed", + k_deck="Deck", + k_deck_stake_wins="Deck Stake Wins", + k_defeated_by="Defeated By", + k_demo_version_ex="Demo Version!", + k_disabled_ex="Disabled!", + k_drank_ex="Drank!", + k_duplicated_ex="Duplicated!", + k_dwarf_planet="Dwarf Planet", + k_eaten_ex="Eaten!", + k_edition="Edition", + k_effective="Effective", + k_empty_caps="EMPTY", + k_enter_name="Enter Name", + k_enter_seed="Enter Seed", + k_enter_text="Enter Text", + k_eroded_ex="Eroded!", + k_extinct_ex="Extinct!", + k_face_cards="Face Cards", + k_game_modifiers="Game Modifiers", + k_gold="Gold", + k_high_score_ex="High Score!", + k_hud_discards="Discards", + k_hud_hands="Hands", + k_incompatible="incompatible", + k_joker="Joker", + k_joker_stickers="Joker Stickers", + k_jokers_cap="JOKERS", + k_legendary="Legendary", + k_level_prefix="lvl.", + k_level_up_ex="Level Up!", + k_locked="Locked", + k_lower_score="score", + k_lvl="lvl.", + k_melted_ex="Melted!", + k_money="Money", + k_mult="Mult", + k_no_other_jokers="No other Jokers!", + k_no_reward="No Reward", + k_no_room_ex="No Room!", + k_no_space_ex="No Space!", + k_none="None", + k_nope_ex="Nope!", + k_not_allowed_ex="Not Allowed!", + k_not_discovered="Not Discovered", + k_numbered_cards="Numbered Cards", + k_or="or", + k_other="Other", + k_page="Page", + k_planet="Planet", + k_planet_q="Planet?", + k_playing_as="Playing as", + k_plus_joker="+1 Joker", + k_plus_planet="+1 Planet", + k_plus_spectral="+1 Spectral", + k_plus_stone="+1 Stone", + k_plus_tarot="+1 Tarot", + k_poker_hand="poker hand", + k_profile="Profile", + k_progress="Progress", + k_rank="Rank", + k_rare="Rare", + k_redeemed_ex="Redeemed!", + k_reroll="Reroll", + k_reset="Reset", + k_reward="Reward", + k_round="Round", + k_safe_ex="Safe!", + k_saved_ex="Saved!", + k_seed="Seed", + k_seeded_run="Seeded Run", + k_skipped_cap="SKIPPED", + k_spectral="Spectral", + k_spectral_pack="Spectral Pack", + k_stake="Stake", + k_stake_level="Stake Level", + k_standard_pack="Standard Pack", + k_suit="Suit", + k_swapped_ex="Swapped!", + k_tarot="Tarot", + k_trophies_disabled="Trophies Disabled", + k_trophy="Trophy", + k_uncommon="Uncommon", + k_undisovered="Undiscovered", + k_unknown="?????", + k_unlocked_ex="Unlocked!", + k_upgrade_ex="Upgrade!", + k_val_up="Value Up!", + k_view="View", + k_voucher="Voucher", + k_vouchers_cap="VOUCHERS", + k_wins="Wins", + k_x_base="X Base", + ml_bloom_opt={ + "Off", + "On", + }, + ml_buy_and_use_target={ + "Buy", + "and Use", + }, + ml_buy_target={ + "Buy", + }, + ml_card_stats={ + "Card", + "Stats", + }, + ml_controller_required={ + "A game controller is required to play.", + "Please connect a controller to continue.", + }, + ml_crash_report_info={ + "Crash reports will be sent to the developer", + "to help reduce issues in the future. No", + "identifying or personal info will be sent.", + }, + ml_demo_thanks_message={ + "Please consider wishlisting", + "Balatro on Steam and sign up for", + "the newsletter at playbalatro.com", + }, + ml_disabled_seed={ + "All Unlocks and", + "Discoveries disabled", + }, + ml_edition_seal_enhancement_explanation={ + "Playing cards may each have one", + "Enhancement, Edition, and Seal", + }, + ml_eternal={ + "Eternal", + "Can't be sold", + "or destroyed", + }, + ml_gold_seal_desc={ + "Gold Seal", + "returns to hand", + "when played", + }, + ml_offline_message={ + "This device is offline.", + "The current save may be out of date.", + }, + ml_open_target={ + "Open", + }, + ml_paste_seed={ + "Paste", + "Seed", + }, + ml_play_discard_pos_opt={ + "Discard/Play", + "Play/Discard", + }, + ml_redeem_target={ + "Redeem", + }, + ml_sell_target={ + "Sell", + }, + ml_shadow_opt={ + "On", + "Off", + }, + ml_smoothing_opt={ + "Off", + "On", + }, + ml_unlock_all_explanation={ + "WARNING! Unlocking the complete Collection", + "will disable achievements for this profile!", + }, + ml_unlock_all_trophies={ + "WARNING! Unlocking the complete Collection", + "will disable trophies for this profile!", + }, + ml_vsync_opt={ + "VSync On", + "VSync Off", + }, + ml_windowmode_opt={ + "Windowed", + "Fullscreen", + "Borderless", + }, + ph_1_level="+1 Level", + ph_4_7_of_clubs="four 7 of Clubs", + ph_alert_debuff_confirm="Press 'Play' again to confirm", + ph_all_poker_hand="All Poker Hands", + ph_blind_reward="Reward: ", + ph_blind_score_at_least="Score at least", + ph_boss_disabled="Boss Disabled!", + ph_choose_blind_1="Choose your", + ph_choose_blind_2="next Blind", + ph_click_confirm="Select again to confirm", + ph_deck_preview_effective="Effective total due to Jokers, Blinds, and card enhancements", + ph_deck_preview_stones="Stones", + ph_defeat_the_boss="Defeat the Boss Blind", + ph_defeat_this_blind_1="Defeat this blind", + ph_defeat_this_blind_2="to discover it", + ph_demo_thanks_1="Thanks for playing the", + ph_demo_thanks_2="BALATRO DEMO", + ph_display_stickers="Display Stake Stickers during Run", + ph_game_over="GAME OVER", + ph_improve_run="Improve your run!", + ph_most_played="(most played hand)", + ph_mr_bones="Saved by Mr. Bones", + ph_no_boss_active="no boss active", + ph_no_vouchers="No vouchers redeemed this run", + ph_score_at_least="Score at least", + ph_score_cards_discarded="Cards Discarded", + ph_score_cards_played="Cards Played", + ph_score_cards_purchased="Cards Purchased", + ph_score_furthest_ante="Ante", + ph_score_furthest_round="Round", + ph_score_hand="Best Hand", + ph_score_new_collection="New Discoveries", + ph_score_poker_hand="Most Played Hand", + ph_score_times_rerolled="Times Rerolled", + ph_select_challenge="Select a Challenge", + ph_sneak_peek="Sneak Peek", + ph_stat_consumable="Number of times this card has been used", + ph_stat_joker="Total completed rounds with this card", + ph_stat_voucher="Number of times this Voucher has been redeemed", + ph_unscored_hand="Hand will not score", + ph_up_ante_1="Up the Ante", + ph_up_ante_2="Raise all Blinds", + ph_up_ante_3="Refresh Blinds", + ph_vouchers_redeemed="Vouchers redeemed this run", + ph_you_win="YOU WIN!", + ph_you_win_demo="YOU WIN THE DEMO!", + }, + high_scores={ + boss_streak="Most Bosses in a Row", + collection="Collection", + current_streak="", + furthest_ante="Highest Ante", + furthest_round="Highest Round", + hand="Best Hand", + most_money="Most Money", + poker_hand="Most Played Hand", + win_streak="Best Win Streak", + }, + labels={ + blue_seal="Blue Seal", + common="Common", + eternal="Eternal", + foil="Foil", + gold_seal="Gold Seal", + holographic="Holographic", + legendary="Legendary", + locked="Locked", + negative="Negative", + perishable="Perishable", + pinned_left="Pinned", + planet="Planet", + pluto_planet="Dwarf Planet", + polychrome="Polychrome", + purple_seal="Purple Seal", + rare="Rare", + red_seal="Red Seal", + rental="Rental", + tarot="Tarot", + uncommon="Uncommon", + voucher="Voucher", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 cards with the same rank", + }, + Flush={ + "5 cards that share the same suit", + }, + ["Flush Five"]={ + "5 cards with the same rank and suit", + }, + ["Flush House"]={ + "A Three of a Kind and a Pair with", + "all cards sharing the same suit", + }, + ["Four of a Kind"]={ + "4 cards with the same rank. They may", + "be played with 1 other unscored card", + }, + ["Full House"]={ + "A Three of a Kind and a Pair", + }, + ["High Card"]={ + "If the played hand is not any of the above", + "hands, only the highest ranked card scores", + }, + Pair={ + "2 cards that share the same rank. They may", + "be played with up to 3 other unscored cards", + }, + ["Royal Flush"]={ + "5 cards in a row (consecutive ranks) with", + "all cards sharing the same suit", + }, + Straight={ + "5 cards in a row (consecutive ranks)", + }, + ["Straight Flush"]={ + "5 cards in a row (consecutive ranks) with", + "all cards sharing the same suit", + }, + ["Three of a Kind"]={ + "3 cards with the same rank. They may be", + "played with up to 2 other unscored cards", + }, + ["Two Pair"]={ + "2 pairs of cards with different ranks, may", + "be played with 1 other unscored card", + }, + }, + poker_hands={ + ["Five of a Kind"]="Five of a Kind", + Flush="Flush", + ["Flush Five"]="Flush Five", + ["Flush House"]="Flush House", + ["Four of a Kind"]="Four of a Kind", + ["Full House"]="Full House", + ["High Card"]="High Card", + Pair="Pair", + ["Royal Flush"]="Royal Flush", + Straight="Straight", + ["Straight Flush"]="Straight Flush", + ["Three of a Kind"]="Three of a Kind", + ["Two Pair"]="Two Pair", + }, + quips={ + dq_1={ + "Yikes! I hope you", + "have a few tricks", + "up your sleeve for", + "this final challenge!", + }, + lq_1={ + "Maybe Go Fish", + "is more our", + "speed...", + }, + lq_10={ + "What a flop!", + }, + lq_2={ + "We folded like", + "a cheap suit!", + }, + lq_3={ + "Time for us", + "to shuffle off", + "and try again!", + }, + lq_4={ + "You know what", + "they say, the", + "house always wins!", + }, + lq_5={ + "Looks like we", + "found out who", + "the real Joker is!", + }, + lq_6={ + "Oh no, were you", + "bluffing too?", + }, + lq_7={ + "Looks like the", + "joke's on us!", + }, + lq_8={ + "If I had hands", + "I would have", + "covered my eyes!", + }, + lq_9={ + "I'm literally", + "a fool, what's", + "your excuse?", + }, + wq_1={ + "You Aced it!", + }, + wq_2={ + "You dealt with", + "that pretty well!", + }, + wq_3={ + "Looks like you", + "weren't bluffing!", + }, + wq_4={ + "Too bad these", + "chips are all", + "virtual...", + }, + wq_5={ + "Looks like I've", + "taught you well!", + }, + wq_6={ + "You made some", + "heads up plays!", + }, + wq_7={ + "Good thing", + "I didn't bet", + "against you!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="Ace", + Jack="Jack", + King="King", + Queen="Queen", + }, + suits_plural={ + Clubs="Clubs", + Diamonds="Diamonds", + Hearts="Hearts", + Spades="Spades", + }, + suits_singular={ + Clubs="Club", + Diamonds="Diamond", + Hearts="Heart", + Spades="Spade", + }, + tutorial={ + bb_1={ + "Selecting the {C:attention}Big Blind", + "will earn some cash", + }, + bb_2={ + "Or choose to {C:attention}skip it", + "to get a {C:attention}Tag{}! Each", + "{C:attention}Tag{} has a unique effect", + }, + bb_3={ + "But keep an eye on", + "the {C:attention}Boss Blind{}. It", + "has an ability you'll", + "need to plan around.", + }, + bb_4={ + "if you beat it, then the", + "{C:attention}Ante{} goes up and all", + "{C:attention}Blinds{} become harder", + }, + bb_5={ + "Beat {C:attention}Ante{} #1# to win.", + "Now choose your path!", + }, + fh_1={ + "You earn chips by", + "playing {C:attention}Poker hands", + }, + fh_2={ + "Each {C:attention}Poker hand{} earns a", + "base amount of {C:blue}Chips", + "multiplied by some {C:red}Mult", + }, + fh_3={ + "See your {C:attention}Poker hands", + "in the {C:attention}Run Info{} area,", + "along with other info", + "about your current run", + }, + fh_4={ + "Cards also earn", + "you some {C:blue}Chips{},", + "hover over to see!", + }, + fh_4_touch={ + "Cards also earn", + "you some {C:blue}Chips{},", + "press and hold to see!", + }, + fh_5={ + "Now select up to", + "{C:attention}5{} cards to play", + "and press {C:blue}'Play Hand'", + }, + fh_5_touch={ + "Now tap up to", + "{C:attention}5{} cards to play", + "and press {C:blue}'Play Hand'", + }, + fh_6={ + "You can also {C:red}'Discard'{} up", + "to {C:attention}5{} selected cards", + "to try and make even", + "stronger hands. Try it!", + }, + fh_7={ + "Careful! You only have a", + "limited number of {C:blue}Hands", + "and {C:red}Discards{} per round", + }, + fh_8={ + "Earn {C:attention}300 Chips{} before", + "you run out of {C:blue}Hands", + "to win this round.", + "Good luck!", + }, + s_1={ + "Nicely done! Now that", + "you're {E:1}flush{} with {C:money}Cash{},", + "you can buy some new", + "cards from the {C:attention}Shop", + }, + s_10={ + "{C:attention}Vouchers{} are restocked", + "after you defeat the", + "{C:attention}Boss Blind{}.", + }, + s_11={ + "And check out both of", + "the {C:booster}Booster Packs{} in", + "every shop. They're", + "full of goodies!", + }, + s_12={ + "Let's move on to", + "the {C:attention}next round{}.", + }, + s_2={ + "Try buying this", + "handsome Devil", + }, + s_2_touch={ + "Try buying this", + "handsome Devil!", + "Drag it from the shop", + "into the {C:attention}'BUY'{} area", + }, + s_3={ + "This is one of the {C:attention}#1#", + "{C:attention}Jokers{} you can add to", + "your run. Every {C:attention}Joker", + "does something different", + }, + s_4={ + "This one adds {C:red}+4 Mult{} to", + "every hand you play!", + }, + s_5={ + "Be picky, you can only", + "carry {C:attention}5 Joker{} cards", + "at a time", + }, + s_6={ + "Now buy the other", + "card from the {C:attention}Shop", + }, + s_7={ + "This {C:tarot}Tarot{} card is a", + "{C:attention}consumable{}. This one will", + "enhance your playing", + "cards! Hold on to it.", + }, + s_8={ + "You can carry up to", + "{C:attention}2 consumable{} cards", + "with you at a time", + }, + s_9={ + "If you save up enough,", + "you can buy a {C:attention}Voucher{}.", + "{C:attention}Vouchers{} passively", + "upgrade your run!", + }, + sb_1={ + "Hello there! My name is", + "{C:attention}Jimbo{}, I'm here to help", + "you learn how to play!", + }, + sb_2={ + "Your goal is to earn", + "{C:blue}Chips{} to defeat", + "the enemy {C:attention}Blind", + }, + sb_3={ + "This here is a {C:blue}Small Blind{},", + "you only need to score", + "{C:attention}300 Chips{} to beat it.", + }, + sb_4={ + "Select the {C:blue}Small Blind", + "to start the round!", + }, + sh_1={ + "When you get more cards,", + "remember you can rearrange", + "them. {C:attention}Jokers{} trigger in", + "order from left to right", + }, + sh_2={ + "And make sure that you", + "{C:attention}USE{} your consumables!", + }, + sh_3={ + "Select up to {C:attention}2{} cards", + "in your hand and press", + "{C:attention}'USE'{} on the {C:tarot}Tarot{} card", + "to enhance them!", + }, + sh_3_touch={ + "Select up to {C:attention}2{} cards", + "in your hand and drag", + "the {C:tarot}Tarot{} card into the {C:attention}'USE'{}", + "area to enhance them!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Hands", + a_handsize="+#1# Hand Size", + a_handsize_minus="-#1# Hand Size", + a_mult="+#1# Mult", + a_mult_minus="-#1# Mult", + a_remaining="#1# Remaining", + a_sold_tally="#1#/#2# Sold", + a_xmult="X#1# Mult", + a_xmult_minus="-X#1# Mult", + ante_x_voucher="ANTE #1# VOUCHER", + challenges_completed="Completed #1#/#2# Challenges", + completed="#1#/#2# Completed", + deck_preview_wheel_plural="Numbers may be lower due to the #1# cards drawn face down", + deck_preview_wheel_singular="Numbers may be lower due to the #1# card drawn face down", + interest="#1# interest per $#2# (#3# max)", + loyalty_active="Active!", + loyalty_inactive="#1# remaining", + ml_foil_desc={ + "Foil", + "+#1# Chips", + }, + ml_holo_desc={ + "Holographic", + "+#1# Mult", + }, + ml_negative_consumable_desc={ + "Negative", + "+#1# consumable Slot", + }, + ml_negative_desc={ + "Negative", + "+#1# Joker Slot", + }, + ml_polychrome_desc={ + "Polychrome", + "X#1# Mult", + }, + remaining_discard_money="Remaining Discards ($#1# each)", + remaining_hand_money="Remaining Hands ($#1# each)", + unlocked="#1#/#2# Unlocked", + }, + v_text={ + ch_c_all_eternal={ + "All Jokers are {C:eternal}Eternal{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}Chips{} cannot exceed the current {C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Daily Challenge!", + }, + ch_c_debuff_played_cards={ + "All {C:attention}Played{} cards become {C:attention}debuffed{} after scoring", + }, + ch_c_discard_cost={ + "Discards each cost {C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "{C:green}1 in #1#{} cards are drawn face down", + }, + ch_c_inflation={ + "Permanently raise prices by {C:money}$1{} on every purchase", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Hold {C:red}-1{} cards in hand for every {C:money}$#1#{} you have", + }, + ch_c_no_extra_hand_money={ + "Extra {C:blue}Hands{} no longer earn money", + }, + ch_c_no_interest={ + "Earn no {C:attention}Interest{} at end of round", + }, + ch_c_no_reward={ + "All {C:attention}Blinds{} give no reward money", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# Blinds{} give no reward money", + }, + ch_c_no_shop_jokers={ + "Jokers no longer appear in the {C:attention}shop", + }, + ch_c_none={ + "{C:inactive}None", + }, + ch_c_set_eternal_ante={ + "When ante {C:attention}#1#{} boss is defeated, all Jokers become {C:attention}eternal", + }, + ch_c_set_joker_slots_ante={ + "When ante {C:attention}#1#{} boss is defeated, set Joker slots to {C:attention}0", + }, + ch_c_set_seed={ + "1 attempt with set Seed: {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} Consumable Slots", + }, + ch_m_discards={ + "{C:red}#1#{} discards per round", + }, + ch_m_dollars={ + "Start with {C:money}$#1#", + }, + ch_m_hand_size={ + "{C:attention}#1#{} hand size", + }, + ch_m_hands={ + "{C:blue}#1#{} hands per round", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} Joker Slots", + }, + ch_m_none={ + "{C:inactive}None", + }, + }, + }, +} diff --git a/src/localization/es_419.lua b/src/localization/es_419.lua new file mode 100644 index 0000000..8235bdb --- /dev/null +++ b/src/localization/es_419.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Baraja abandonada", + text={ + "Comienza la partida sin", + "ninguna carta de {C:attention}figura", + "en tu baraja", + }, + }, + b_anaglyph={ + name="Baraja anaglifo", + text={ + "Después de derrotar a cada", + "{C:attention}ciega jefe{}, gana 1", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Baraja negra", + text={ + "{C:attention}+#1#{} ranura(s) de comodín", + "", + "{C:blue}-#2#{} mano", + "en cada ronda", + }, + }, + b_blue={ + name="Baraja azul", + text={ + "{C:blue}+#1#{} mano", + "en cada ronda", + }, + }, + b_challenge={ + name="Baraja desafío", + text={ + "", + }, + }, + b_checkered={ + name="Baraja a cuadros", + text={ + "Comienza la partida con", + "{C:attention}26{C:spades} espadas{} y", + "{C:attention}26{C:hearts} corazones{} en la baraja", + }, + }, + b_erratic={ + name="Baraja errática", + text={ + "Todas las {C:attention}categorías{} y", + "los {C:attention}palos{} en la baraja", + "se aleatorizan", + }, + }, + b_ghost={ + name="Baraja fantasma", + text={ + "Las cartas {C:spectral}espectrales{} pueden", + "aparecer en la tienda,", + "comienza con una carta de {C:spectral,T:c_hex}maleficio{}", + }, + }, + b_green={ + name="Baraja verde", + text={ + "Al final de cada ronda:", + "{C:money}#1# ${s:0.85} por {C:blue}mano restante", + "{C:money}#2# ${s:0.85} por {C:red}descarte restante", + "No ganas {C:attention}interés", + }, + }, + b_magic={ + name="Baraja mágica", + text={ + "Comienza la partida", + "con el vale {C:tarot,T:v_crystal_ball}#1#{}", + "y {C:attention}2{} copias", + "de {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Baraja nébula", + text={ + "Comienza la partida", + "con el vale {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} ranura de consumible", + }, + }, + b_painted={ + name="Baraja pintada", + text={ + "{C:attention}+#1#{} tamaño de mano", + "{C:red}#2#{} ranuras de comodín", + }, + }, + b_plasma={ + name="Baraja plasmática", + text={ + "Equilibra las {C:blue}fichas{} y", + "el {C:red}multi{} cuando calcula", + "los puntos de cada mano jugada", + "{C:red}X#1#{} tamaño base de la ciega", + }, + }, + b_red={ + name="Baraja roja", + text={ + "{C:red}+#1#{} descarte", + "en cada ronda", + }, + }, + b_yellow={ + name="Baraja amarilla", + text={ + "Comienza con", + "{C:money}#1# $ extra", + }, + }, + b_zodiac={ + name="Baraja zodiacal", + text={ + "Comienza la partida con", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "y {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="El brazo", + text={ + "Disminuye el nivel", + "de la mano de póker jugada", + }, + }, + bl_big={ + name="Ciega grande", + text={ + }, + }, + bl_club={ + name="El garrote", + text={ + "Todos los tréboles", + "se debilitan", + }, + }, + bl_eye={ + name="El ojo", + text={ + "Los tipos de manos", + "no se repiten en esta ronda", + }, + }, + bl_final_acorn={ + name="Bellota ambarina", + text={ + "Voltea y mezcla", + "todos los comodines", + }, + }, + bl_final_bell={ + name="Campana cerúlea", + text={ + "Fuerza 1 carta", + "a que se seleccione siempre", + }, + }, + bl_final_heart={ + name="Corazón carmesí", + text={ + "Se inhabilita un comodín", + "al azar en cada mano", + }, + }, + bl_final_leaf={ + name="Hoja verde", + text={ + "Todas las cartas se debilitan", + "hasta que se venda 1 comodín", + }, + }, + bl_final_vessel={ + name="Contenedor violeta", + text={ + "Ciega muy grande", + }, + }, + bl_fish={ + name="El pez", + text={ + "Las cartas se sacan boca abajo", + "tras cada mano jugada", + }, + }, + bl_flint={ + name="El pedernal", + text={ + "Las fichas base y el multi", + "se dividen a la mitad", + }, + }, + bl_goad={ + name="La provocación", + text={ + "Todas las espadas", + "se debilitan", + }, + }, + bl_head={ + name="La cabeza", + text={ + "Todos los corazones", + "se debilitan", + }, + }, + bl_hook={ + name="El garfio", + text={ + "Descarta 2 cartas al azar", + "por cada mano jugada", + }, + }, + bl_house={ + name="La casa", + text={ + "La primera mano", + "se saca boca abajo", + }, + }, + bl_manacle={ + name="El grillete", + text={ + "-1 de tamaño de mano", + }, + }, + bl_mark={ + name="La marca", + text={ + "Todas las cartas de figuras", + "boca abajo", + }, + }, + bl_mouth={ + name="La boca", + text={ + "Juega 1 solo tipo", + "de mano en esta ronda", + }, + }, + bl_needle={ + name="La aguja", + text={ + "Juega una sola mano", + }, + }, + bl_ox={ + name="El buey", + text={ + "Si se juega 1 #1#,", + "deja el dinero en 0 $", + }, + }, + bl_pillar={ + name="El pilar", + text={ + "Las cartas que se jugaron antes", + "en esta apuesta inicial se debilitan", + }, + }, + bl_plant={ + name="La planta", + text={ + "Todas las cartas de figuras", + "se debilitan", + }, + }, + bl_psychic={ + name="El psíquico", + text={ + "Debes jugar 5 cartas", + }, + }, + bl_serpent={ + name="La serpiente", + text={ + "Después de jugar o descartar,", + "siempre saca 3 cartas", + }, + }, + bl_small={ + name="Ciega pequeña", + text={ + }, + }, + bl_tooth={ + name="El diente", + text={ + "Pierde 1 $", + "por carta jugada", + }, + }, + bl_wall={ + name="El muro", + text={ + "Ciega extra grande", + }, + }, + bl_water={ + name="El agua", + text={ + "Comienza con", + "0 descartes", + }, + }, + bl_wheel={ + name="La rueda", + text={ + " en 7 cartas se saca", + "boca abajo", + }, + }, + bl_window={ + name="La ventana", + text={ + "Todos los diamantes", + "se debilitan", + }, + }, + }, + Edition={ + e_base={ + name="Base", + text={ + "Sin efectos adicionales", + }, + }, + e_foil={ + name="Laminada", + text={ + "{C:chips}+#1#{} fichas", + }, + }, + e_holo={ + name="Holográfica", + text={ + "Multi {C:mult}+#1#{}", + }, + }, + e_negative={ + name="Negativa", + text={ + "{C:dark_edition}+#1#{} ranura de comodín", + }, + }, + e_negative_consumable={ + name="Negativa", + text={ + "{C:dark_edition}+#1#{} ranura de consumible", + }, + }, + e_polychrome={ + name="Polícroma", + text={ + "Multi {X:mult,C:white} X#1#{}", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Carta adicional", + text={ + }, + }, + m_glass={ + name="Carta de vidrio", + text={ + "{X:mult,C:white} X#1# {} multi", + "{C:green}#2# en #3#{} probabilidades", + "de destruir la carta", + }, + }, + m_gold={ + name="Carta de oro", + text={ + "{C:money}#1# ${} si esta", + "carta está en tu mano", + "al final de la ronda", + }, + }, + m_lucky={ + name="Carta de la suerte", + text={ + "{C:green}#1# en #3#{} probabilidades", + "de {C:mult}+#2#{} multi", + "{C:green}#1# en #5#{} probabilidades", + "de ganar {C:money}#4# $", + }, + }, + m_mult={ + name="Carta multi", + text={ + "{C:mult}+#1#{} multi", + }, + }, + m_steel={ + name="Carta de acero", + text={ + "Multi {X:mult,C:white}X#1#{}", + "mientras esta carta", + "esté en tu mano", + }, + }, + m_stone={ + name="Carta de piedra", + text={ + "{C:chips}+#1#{} fichas", + "sin categoría ni palo", + }, + }, + m_wild={ + name="Carta versátil", + text={ + "Puede usarse", + "como cualquier palo", + }, + }, + }, + Joker={ + j_8_ball={ + name="Bola 8", + text={ + "{C:green}#1# en #2#{} probabilidades por cada", + "{C:attention}8{} jugado de crear una carta de", + "{C:tarot}tarot{} cuando anota", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_abstract={ + name="Comodín abstracto", + text={ + "{C:mult}+#1#{} multi por cada", + "carta de {C:attention}comodín{}", + "{C:inactive}(Actual: multi {C:red}+#2#{C:inactive})", + }, + }, + j_acrobat={ + name="Acróbata", + text={ + "{X:red,C:white} X#1# {} multi en la {C:attention}última", + "{C:attention}mano{} de la ronda", + }, + unlock={ + "Juega {C:attention,E:1}#1#{} manos", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Comodín antiguo", + text={ + "Cada carta jugada con el palo", + "{V:1}#2#{} otorga", + "multi {X:mult,C:white} X#1# {} cuando anota,", + "{s:0.8}el palo cambia al final de la ronda", + }, + }, + j_arrowhead={ + name="Punta de flecha", + text={ + "Las cartas jugadas", + "de {C:spades}espadas{} otorgan", + "{C:chips}+#1#{} fichas cuando anotan", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja", + }, + }, + j_astronomer={ + name="Astrónomo", + text={ + "Todas las cartas de{C:planet}planeta{}", + "y los {C:planet}paquetes celestiales{} en", + "la tienda son {C:attention}gratis", + }, + unlock={ + "Descubre todas", + "las cartas de{E:1,C:planet}planeta{}", + }, + }, + j_banner={ + name="Estandarte", + text={ + "{C:chips}+#1#{} fichas", + "por cada", + "{C:attention}descarte restante", + }, + }, + j_baron={ + name="Barón", + text={ + "Cada {C:attention}rey{}", + "en tu mano", + "otorga multi {X:mult,C:white} X#1# {}", + }, + }, + j_baseball={ + name="Carta de béisbol", + text={ + "Cada comodín {C:green}inusual{}", + "otorga multi {X:mult,C:white} X#1# {}", + }, + }, + j_blackboard={ + name="Pizarrón", + text={ + "{X:red,C:white} X#1# {} multi si todas", + "las cartas que tienes en la mano", + "son {C:spades}#2#{} o {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Heliotropo", + text={ + "{C:green}#1# in #2#{} probabilidades", + "de que las cartas jugadas", + "de {C:hearts}corazones{} otorguen", + "multi {X:mult,C:white} X#3# {} cuando anotan,", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja", + }, + }, + j_blue_joker={ + name="Comodín azul", + text={ + "{C:chips}+#1#{} fichas por cada", + "carta restante en la {C:attention}baraja", + "{C:inactive}(Actual {C:chips}+#2#{C:inactive} fichas)", + }, + }, + j_blueprint={ + name="Plano", + text={ + "Copia la habilidad del", + "{C:attention}comodín{} de la derecha", + }, + unlock={ + "Gana una partida", + }, + }, + j_bootstraps={ + name="Botas", + text={ + "{C:mult}+#1#{} multi por cada", + "{C:money}$#2#{} que tienes", + "{C:inactive}(Actual {C:mult}+#3#{C:inactive} multi)", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "comodines {C:dark_edition}polícromos{}", + }, + }, + j_brainstorm={ + name="Lluvia de ideas", + text={ + "Copia la habilidad del", + "{C:attention}comodín del extremo izquierdo", + }, + unlock={ + "Descarta una", + "{E:1,C:attention}Escalera real", + }, + }, + j_bull={ + name="Toro", + text={ + "{C:chips}+#1#{} fichas por", + "cada {C:money}$1{} que tengas", + "{C:inactive}(Actual {C:chips}+#2#{C:inactive} fichas)", + }, + }, + j_burglar={ + name="Ladrón", + text={ + "Cuando se selecciona la {C:attention}ciega{},", + "gana {C:blue}+#1#{} manos y", + "{C:attention}pierde todos los descartes", + }, + }, + j_burnt={ + name="Comodín quemado", + text={ + "Mejora el nivel", + "de la primera mano de póker", + "{C:attention}descartada en cada ronda", + }, + unlock={ + "Vende un total", + "de {E:1,C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Tarjeta de presentación", + text={ + "Las cartas de {C:attention}figuras{} tienen", + "{C:green}#1# en #2#{} probabilidades", + "de otorgar {C:money}2 ${} cuando anotan", + }, + }, + j_caino={ + name="Canio", + text={ + "Este comodín obtiene {X:mult,C:white} X#1# {} multi", + "cuando se destruye", + "una carta de {C:attention}figura{}", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_campfire={ + name="Fogata", + text={ + "Este comodín gana multi {X:mult,C:white}X#1#{}", + "por cada carta {C:attention}vendida{}, se restablece", + "cuando se derrota a la {C:attention}ciega jefe{}", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_card_sharp={ + name="Carta filosa", + text={ + "{X:mult,C:white} X#1#{} multi si", + "se jugó la {C:attention}mano de póker{}", + "en esta ronda", + }, + }, + j_cartomancer={ + name="Cartomante", + text={ + "Genera una carta de {C:tarot}tarot{}", + "cuando se selecciona la {C:attention}ciega{},", + "{C:inactive}(Debe haber espacio)", + }, + unlock={ + "Descubre todas", + "las cartas de {E:1,C:tarot}tarot{}", + }, + }, + j_castle={ + name="Castillo", + text={ + "Este comodín gana {C:chips}+#1#{} fichas", + "por carta {V:1}#2#{} descartada,", + "el palo cambia en cada ronda", + "{C:inactive}(Actual {C:chips}+#3#{C:inactive} fichas)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "{X:mult,C:white} X#1# {} multi", + "{C:green}#2# en #3#{} probabilidades", + "de que la carta se destruya", + "al final de la ronda", + }, + }, + j_ceremonial={ + name="Daga ceremonial", + text={ + "Cuando se selecciona la {C:attention}ciega{},", + "destruye al comodín de la derecha", + "y agrega para siempre el {C:attention}doble", + "del valor de venta a este {C:red}multi", + "{C:inactive}(Actual {C:mult}+#1#{C:inactive} multi)", + }, + }, + j_certificate={ + name="Certificado", + text={ + "Cuando comienza la ronda,", + "agrega una {C:attention}carta{} de {C:attention}juego", + "aleatoria con 1 al azar", + "{C:attention}sello{} a tu mano", + }, + unlock={ + "Debes tener una carta", + "de oro", + "con un {C:attention,E:1}Sello de oro", + }, + }, + j_chaos={ + name="Caos el payaso", + text={ + "{C:attention}#1#{} {C:green}cambio gratuito", + "por tienda", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Inhabilita el efecto de", + "cada {C:attention}ciega jefe", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_clever={ + name="Comodín astuto", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_cloud_9={ + name="La 9º puerta", + text={ + "Gana {C:money}#1# ${} por cada", + "{C:attention}9{} en tu {C:attention}baraja completa", + "al final de la ronda", + "{C:inactive}(Actual {C:money}#2# ${}{C:inactive})", + }, + }, + j_constellation={ + name="Constelación", + text={ + "Este comodín obtiene", + "{X:mult,C:white} X#1# {} multi cada vez", + "que se usa una carta de {C:planet}planeta{}", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + }, + j_crafty={ + name="Comodín mañoso", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_crazy={ + name="Comodín loco", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + j_credit_card={ + name="Tarjeta de crédito", + text={ + "Adquiere hasta", + "{C:red}-#1# ${} de deuda", + }, + }, + j_delayed_grat={ + name="Satisfacción demorada", + text={ + "Gana {C:money}#1# ${} por {C:attention}descarte{}", + "si no se usó ninguno", + "al final de la ronda", + }, + }, + j_devious={ + name="Comodín ladino", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_diet_cola={ + name="Refresco dietético", + text={ + "Vende esta carta", + "para crear 1 {C:attention}#1#", + "gratis", + }, + }, + j_dna={ + name="ADN", + text={ + "Si la {C:attention}primera mano{} de la ronda", + "tiene solo {C:attention}1{} carta, se agrega", + "una copia permanente a la baraja", + "y se saca a la {C:attention}mano", + }, + }, + j_drivers_license={ + name="Licencia de conducir", + text={ + "Multi {X:mult,C:white} X#1# {} si la baraja", + "tiene al menos {C:attention}16", + "cartas mejoradas", + "{C:inactive}(Actual {C:attention}#2#{C:inactive})", + }, + unlock={ + "Mejora {E:1,C:attention}#1#{} cartas", + "en tu baraja", + }, + }, + j_droll={ + name="Comodín gracioso", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + j_drunkard={ + name="Borracho", + text={ + "{C:red}+#1#{} descarte", + "cada ronda", + }, + }, + j_duo={ + name="El dúo", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Atardecer", + text={ + "Reactiva las", + "cartas de puntos en la {C:attention}última", + "{C:attention}mano{} de la ronda", + }, + }, + j_egg={ + name="Huevo", + text={ + "Gana {C:money}#1# ${}", + "del {C:attention}valor de venta{}", + "al final de la ronda", + }, + }, + j_erosion={ + name="Erosión", + text={ + "Multi {C:red}+#1#{} por cada", + "carta debajo de {C:attention}#3#{}", + "en la baraja completa", + "{C:inactive}(Actual: multi {C:red}+#2#{C:inactive})", + }, + }, + j_even_steven={ + name="El par", + text={ + "Las cartas jugadas", + "de categoría {C:attention}par{} otorgan", + "multi {C:mult}+#1#{} cuando anotan", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Comodín sin cara", + text={ + "Gana {C:money}#1# ${} si {C:attention}#2#{}", + "o más {C:attention}cartas de figuras{}", + "se descartan", + "al mismo tiempo", + }, + }, + j_family={ + name="La familia", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "Cada {C:attention}as{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} u {C:attention}8{} jugado", + "otorga multi {C:mult}+#1#{} cuando anota", + }, + }, + j_flash={ + name="Carta sorpresa", + text={ + "Este comodín obtiene {C:mult}+#1#{} multi", + "por {C:attention}renovar{} en la tienda", + "{C:inactive}(Actual {C:mult}+#2#{C:inactive} multi)", + }, + }, + j_flower_pot={ + name="Florero", + text={ + "{X:mult,C:white} X#1# {} multi si la mano", + "de póker contiene una", + "carta de {C:diamonds}diamante{}, una carta de {C:clubs}trébol{},", + "una carta de {C:hearts}corazón{} y una carta de {C:spades}picas{}", + }, + unlock={ + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Adivino", + text={ + "{C:red}+#1#{} multi por cada", + "carta de {C:purple}tarot{} usada", + "{C:inactive}(Actual {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Cuatro dedos", + text={ + "Los {C:attention}colores{}", + "y las {C:attention}escaleras{} pueden", + "hacerse con {C:attention}4{} cartas", + }, + }, + j_gift={ + name="Carta de regalo", + text={ + "Agrega {C:money}#1# ${} del {C:attention}valor de venta", + "a cada {C:attention}comodín{}", + "y cada carta {C:attention}consumible{} en", + "al final de la ronda", + }, + }, + j_glass={ + name="Comodín de vidrio", + text={ + "Este comodín obtiene {X:mult,C:white} X#1# {} multi", + "por cada {C:attention}carta de vidrio", + "que se destruya", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} en", + "tu baraja", + }, + }, + j_gluttenous_joker={ + name="Comodín glotón", + text={ + "Las cartas jugadas", + "del palo {C:clubs}#2#{} otorgan", + "multi {C:mult}+#1#{} cuando anotan", + }, + }, + j_golden={ + name="Comodín dorado", + text={ + "Gana {C:money}#1# ${}", + "al final de la ronda", + }, + }, + j_greedy_joker={ + name="Comodín codicioso", + text={ + "Las cartas jugadas", + "del palo {C:diamonds}#2#{} otorgan", + "multi {C:mult}+#1#{} cuando anotan", + }, + }, + j_green_joker={ + name="Comodín verde", + text={ + "{C:mult}+#1#{} multi por mano jugada", + "{C:mult}-#2#{} multi por descarte", + "{C:inactive}(Actual {C:mult}+#3#{C:inactive} multi)", + }, + }, + j_gros_michel={ + name="Gros Michel", + text={ + "{C:mult}+#1#{} multi", + "{C:green}#2# en #3#{} probabilidades", + "de que la carta se destruya", + "al final de la ronda", + }, + }, + j_hack={ + name="Comediante", + text={ + "Reactiva", + "cada {C:attention}2{}, {C:attention}3{},", + "{C:attention}4{} o {C:attention}5{} jugado", + }, + }, + j_half={ + name="Medio comodín", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "{C:attention}#2#{} o menos cartas", + }, + }, + j_hallucination={ + name="Alucinación", + text={ + "{C:green}#1# en #2#{} probabilidades de crear", + "una carta de {C:tarot}tarot{} cuando se abre", + "cualquier {C:attention}paquete potenciador{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_hanging_chad={ + name="Papel perforado", + text={ + "Reactiva la {C:attention}primera{} carta", + "jugada al anotar", + "{C:attention}#1#{} veces adicionales", + }, + unlock={ + "Derrota a una ciega jefe", + "con 1 {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Excursionista", + text={ + "Todas las {C:attention}cartas{} jugadas", + "ganan para siempre", + "{C:chips}+#1#{} fichas cuando anotan", + }, + }, + j_hit_the_road={ + name="Al camino", + text={ + "Este comodín obtiene {X:mult,C:white} X#1# {} multi", + "por cada {C:attention}jota{}", + "descartada esta ronda", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + unlock={ + "Descarta {E:1,C:attention}5", + "{E:1,C:attention}jotas{}", + "al mismo tiempo", + }, + }, + j_hologram={ + name="Holograma", + text={ + "Este comodín obtiene {X:mult,C:white} X#1# {} multi", + "cada vez que agregas una {C:attention}carta de juego{}", + "a tu baraja", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + }, + j_ice_cream={ + name="Helado", + text={ + "{C:chips}+#1#{} fichas", + "{C:chips}-#2#{} fichas por", + "cada mano jugada", + }, + }, + j_idol={ + name="El ídolo", + text={ + "Cada {C:attention}#2# jugado", + "de {V:1}#3#{} otorga", + "multi {X:mult,C:white} X#1# {} cuando anota", + "{s:0.8}La carta cambia en cada ronda", + }, + unlock={ + "En una mano,", + "gana al menos", + "{E:1,C:attention}+#1#{} fichas", + }, + }, + j_invisible={ + name="Comodín invisible", + text={ + "Después de {C:attention}#1#{} rondas,", + "vende esta carta para", + "{C:attention}duplicar{} un comodín aleatorio", + "{C:inactive}(actual {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Gana una partida sin", + "haber tenido más de", + "{E:1,C:attention}4 comodines{}", + }, + }, + j_joker={ + name="Comodín", + text={ + "{C:red,s:1.1}+#1#{} multi", + }, + }, + j_jolly={ + name="Comodín alegre", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + j_juggler={ + name="Malabarista", + text={ + "{C:attention}+#1#{} tamaño de mano", + }, + }, + j_loyalty_card={ + name="Tarjeta de lealtad", + text={ + "{X:red,C:white} X#1# {} multi cada", + "{C:attention}#2#{} manos jugadas", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Vende esta carta", + "para desactivar", + "la {C:attention}ciega jefe{} actual", + }, + }, + j_lucky_cat={ + name="Gato de la suerte", + text={ + "Este comodín obtiene {X:mult,C:white} X#1# {} multi", + "cada vez que una carta de la {C:attention}suerte{}", + "se activa {C:green}con éxito{}", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + }, + j_lusty_joker={ + name="Comodín lujurioso", + text={ + "Las cartas jugadas", + "del palo {C:hearts}#2#{} otorgan", + "multi {C:mult}+#1#{} cuando anotan", + }, + }, + j_mad={ + name="Comodín demente", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + j_madness={ + name="Locura", + text={ + "Cuando se selecciona la {C:attention}ciega pequeña{} o", + "la {C:attention}ciega grande{}, obtiene {X:mult,C:white} X#1# {} multi", + "y {C:attention}destruye{} un comodín al azar", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + }, + j_mail={ + name="Reembolso por correo", + text={ + "Gana {C:money}#1# ${} por cada", + "{C:attention}#2#{} que descartes, la categoría", + "cambia en cada ronda", + }, + }, + j_marble={ + name="Comodín de mármol", + text={ + "Agrega una carta de {C:attention}piedra{}", + "a tu baraja cuando", + "se selecciona la {C:attention}ciega{}", + }, + }, + j_matador={ + name="Matador", + text={ + "Gana {C:money}#1# ${} si la mano", + "jugada activa la", + "habilidad de {C:attention}ciega jefe{}", + }, + unlock={ + "Derrota a una ciega jefe", + "en {E:1,C:attention}1 mano{} sin usar", + "ningún descarte", + }, + }, + j_merry_andy={ + name="Andy el alegre", + text={ + "{C:red}+#1#{} descarte", + "cada ronda,", + "{C:red}#2#{} tamaño de la mano", + }, + unlock={ + "Gana una partida en {E:1,C:attention}#1#", + "rondas o menos", + }, + }, + j_midas_mask={ + name="Máscara de Midas", + text={ + "Todas las cartas de {C:attention}figura{} jugadas", + "se vuelven cartas {C:attention}de oro{}", + "cuando anotan", + }, + }, + j_mime={ + name="Mimo", + text={ + "Reactiva todas", + "las habilidades de las cartas", + "{C:attention}en {C:attention}la mano{}", + }, + }, + j_misprint={ + name="Mala impresión", + text={ + "", + }, + }, + j_mr_bones={ + name="Sr. Huesos", + text={ + "Evita la muerte", + "si las fichas obtenidas son", + "al menos un {C:attention}25 %", + "de lo requerido,", + "se {S:1.1,C:red,E:2}autodestruye{}", + }, + unlock={ + "Pierde {C:attention,E:1}#1#{} partidas", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Cumbre mística", + text={ + "{C:mult}+#1#{} multi cuando hay", + "{C:attention}+#2#{} descartes", + "restantes", + }, + }, + j_obelisk={ + name="Obelisco", + text={ + "Este comodín obtiene {X:mult,C:white} X#1# {} multi", + "por {C:attention}mano{} consecutiva jugada", + "sin jugar", + "tu {C:attention}mano de póker{C:inactive} más jugada", + "(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + }, + j_odd_todd={ + name="El impar", + text={ + "Las cartas jugadas", + "de categoría {C:attention}impar{} otorgan", + "{C:chips}+#1#{} fichas cuando anotan", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Ágata ónix", + text={ + "Las cartas jugadas", + "de {C:clubs}tréboles{} otorgan", + "multi {C:mult}+#1#{} cuando anotan", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja", + }, + }, + j_oops={ + name="Solo seises", + text={ + "Duplica {C:attention}todas las", + "las {C:green,E:1,S:1.1}probabilidades", + "{C:inactive}(ejemplo: {C:green}1 de 3{C:inactive} -> {C:green}2 de 3{C:inactive})", + }, + unlock={ + "En una mano,", + "gana al menos", + "{E:1,C:attention}+#1#{} fichas", + }, + }, + j_order={ + name="La orden", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Pareidolia", + text={ + "Todas las cartas", + "se consideran", + "de {C:attention}figuras{}", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Genera una copia {C:dark_edition}negativa{}", + "de {C:attention}1{} carta {C:attention}consumible{}", + "aleatoria que tengas", + "al final de la {C:attention}tienda", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_photograph={ + name="Fotografía", + text={ + "La primera carta de {C:attention}figura", + "jugada otorga multi {X:mult,C:white} X#1# {}", + "cuando anota", + }, + }, + j_popcorn={ + name="Palomitas de maíz", + text={ + "Multi {C:mult}+#1#{}", + "Multi {C:mult}-#2#{} por cada", + "ronda jugada", + }, + }, + j_raised_fist={ + name="Puño elevado", + text={ + "Agrega {C:attention}el doble{} de la categoría", + "de la carta más {C:attention}baja{}", + "que tienes en la mano a multi", + }, + }, + j_ramen={ + name="Ramen", + text={ + "Multi {X:mult,C:white} X#1# {},", + "pierde multi {X:mult,C:white} X#2# {}", + "por cada {C:attention}carta{} descartada", + }, + }, + j_red_card={ + name="Carta roja", + text={ + "Este comodín obtiene", + "{C:red}+#1#{} multi cuando se omite", + "cualquier{C:attention}paquete potenciador{}", + "{C:inactive}(Actual {C:red}+#2#{C:inactive} multi)", + }, + }, + j_reserved_parking={ + name="Estacionamiento reservado", + text={ + "Cada carta de {C:attention}figura{}", + "en tu mano tiene", + "{C:green}#2# en #3#{} probabilidades", + "que otorgue {C:money}#1# ${}", + }, + }, + j_ride_the_bus={ + name="Al autobús", + text={ + "Este comodín obtiene {C:mult}+#1#{} multi", + "por mano {C:attention}consecutiva{}", + "jugada sin", + "una carta de {C:attention}figura{} con puntuación", + "{C:inactive}(Actual {C:mult}+#2#{C:inactive} multi)", + }, + }, + j_riff_raff={ + name="La chusma", + text={ + "Cuando se selecciona la {C:attention}ciega{},", + "crea {C:attention}#1# {C:attention} comodines {C:blue}comunes", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_ring_master={ + name="Director de circo", + text={ + "Las cartas de {C:attention}comodines{}, {C:tarot}tarot{} y", + "{C:spectral}espectrales{} pueden", + "aparecer varias veces", + }, + unlock={ + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Cohete", + text={ + "Gana {C:money}$#1#{} al final de la ronda", + "El pago aumenta en {C:money}$#2#{}", + "cuando derrotas a la {C:attention}ciega jefe{}", + }, + }, + j_rough_gem={ + name="Gema en bruto", + text={ + "Las cartas jugadas", + "de {C:diamonds}diamantes{}", + "ganan {C:money}#1# ${} cuando anotan", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja", + }, + }, + j_runner={ + name="Corredor", + text={ + "Gana {C:chips}+#2#{} fichas", + "si la mano jugada", + "contiene una {C:attention}escalera{}", + "{C:inactive}(Actual {C:chips}+#1#{C:inactive} fichas)", + }, + }, + j_satellite={ + name="Satélite", + text={ + "Gana {C:money}#1# ${} al final de la ronda", + "por cada carta de {C:planet}planeta", + "única usada en esta partida", + "{C:inactive}(Actual {C:money}#2# ${C:inactive})", + }, + unlock={ + "Debes tener {E:1,C:money}#1# $", + "o más", + }, + }, + j_scary_face={ + name="Cara aterradora", + text={ + "Las cartas de {C:attention}figuras{} jugadas", + "otorgan {C:chips}+#1#{} fichas", + "cuando anotan", + }, + }, + j_scholar={ + name="Erudito", + text={ + "Los {C:attention}ases{} jugados", + "otorgan {C:chips}+#2#{} fichas", + "y multi {C:mult}+#1#{}", + "cuando anotan", + }, + }, + j_seance={ + name="Espiritismo", + text={ + "Si {C:attention}la mano de póker{} es una", + "{C:attention}#1#{}, genera una", + "carta {C:spectral}espectral{} al azar", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_seeing_double={ + name="Visión doble", + text={ + "Multi {X:mult,C:white} X#1# {} si la mano", + "jugada anota", + "una carta de {C:clubs}tréboles{} y una carta", + "de cualquier otro {C:attention}palo que anota", + }, + unlock={ + "Juega una mano", + "que contenga", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Refresco", + text={ + "Reactiva todas", + "las cartas jugadas", + "por las próximas {C:attention}#1#{} manos", + }, + }, + j_shoot_the_moon={ + name="Disparo a la luna", + text={ + "Cada {C:attention}reina{}", + "que tienes en la mano", + "otorga {C:mult}+#1#{} multi", + }, + unlock={ + "Juega todos los {E:1,C:attention}corazones", + "en tu baraja en", + "una sola ronda", + }, + }, + j_shortcut={ + name="Atajo", + text={ + "Permite hacer {C:attention}escaleras{} con", + "espacios de {C:attention}1 categoría", + "{C:inactive}(ej.: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Sexto sentido", + text={ + "Si la {C:attention}primera mano{} de la ronda es", + "un solo {C:attention}6{}, lo destruye", + "y genera una carta {C:spectral}espectral{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_sly={ + name="Comodín artero", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_smeared={ + name="Comodín borroso", + text={ + "{C:hearts}Corazones{} y {C:diamonds}diamantes", + "cuentan como un mismo palo,", + "{C:spades}espadas{} y {C:clubs}tréboles", + "cuentan como un mismo palo,", + }, + unlock={ + "Debes tener al menos {C:attention}#1#", + "{E:1,C:attention}#2#{} en", + "tu baraja", + }, + }, + j_smiley={ + name="Cara sonriente", + text={ + "Las cartas de {C:attention}figuras{} jugadas", + "otorgan multi {C:mult}+#1#{}", + "cuando anotan", + }, + }, + j_sock_and_buskin={ + name="Tragedia y comedia", + text={ + "Reactiva todas las cartas", + "de {C:attention}figuras{} jugadas", + }, + unlock={ + "Juega un total de", + "{C:attention,E:1}#1#{} cartas de figuras", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Comodín espacial", + text={ + "{C:green}#1# en #2#{} probabilidades de", + "mejorar el nivel", + "de la {C:attention}mano de póker{} jugada", + }, + }, + j_splash={ + name="Salpicadura", + text={ + "Cada {C:attention}carta jugada", + "cuenta para la puntuación", + }, + }, + j_square={ + name="Comodín cuadrado", + text={ + "Este comodín obtiene {C:chips}+#2#{} fichas", + "si la mano jugada tiene", + "exactamente {C:attention}4{} cartas", + "{C:inactive}(Actual {C:chips}#1#{C:inactive} fichas)", + }, + }, + j_steel_joker={ + name="Comodín de acero", + text={ + "Otorga {X:mult,C:white} X#1# {} multi", + "por cada {C:attention}carta de acero", + "en tu {C:attention}bajara completa", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + }, + j_stencil={ + name="Plantilla de comodín", + text={ + "Multi {X:red,C:white} X#1# {} por cada", + "ranura de {C:attention}comodín{} vacía", + "Se incluye {s:0.8}plantilla de comodín", + "{C:inactive}(Actual {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Comodín de piedra", + text={ + "Otorga {C:chips}+#1#{} fichas por", + "cada {C:attention}carta de piedra", + "en tu {C:attention}baraja completa", + "{C:inactive}(Actual {C:chips}+#2#{C:inactive} fichas)", + }, + }, + j_stuntman={ + name="Doble de riesgo", + text={ + "{C:chips}+#1#{} fichas,", + "{C:attention}-#2#{} tamaño de mano", + }, + unlock={ + "En una mano,", + "gana al menos", + "{E:1,C:attention}#1#{} fichas", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Agrega el número de veces que la", + "{C:attention}mano de póker{} se", + "jugó en esta partida a multi", + }, + }, + j_superposition={ + name="Superposición", + text={ + "Genera una carta de {C:tarot}tarot{}", + "si la mano de póker contiene", + "un {C:attention}as{} y una {C:attention}escalera{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_swashbuckler={ + name="Aventurero", + text={ + "Agrega el valor de venta", + "de todos los demás", + "{C:attention}comodines{} que posees a multi", + "{C:inactive}(Actual {C:mult}+#1#{C:inactive} multi)", + }, + unlock={ + "Vende un total de", + "{C:attention,E:1}#1#{} cartas de comodín", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Retro", + text={ + "Multi {X:mult,C:white}X#1#{} por cada", + "{C:attention}ciega{} omitida en esta partida", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + unlock={ + "Continúa una partida guardada", + "del menú principal", + }, + }, + j_ticket={ + name="Boleto dorado", + text={ + "Las cartas de {C:attention}oro{} jugadas", + "ganan {C:money}#1#${} cuando anotan", + }, + unlock={ + "Juega una mano de 5 cartas", + "que contiene solo", + "cartas de {C:attention,E:1}oro{}", + }, + }, + j_to_the_moon={ + name="A la luna", + text={ + "Gana {C:money}#1# ${} extra", + "de {C:attention}interés{} por cada {C:money}5 ${}", + "que tengas al final de la ronda", + }, + }, + j_todo_list={ + name="Lista de pendientes", + text={ + "Gana {C:money}$#1#{} si la {C:attention}mano de póker{}", + "es una {C:attention}#2#{},", + "la mano de póker cambia", + "al final de la ronda", + }, + }, + j_trading={ + name="Carta de colección", + text={ + "Si el {C:attention}primer descarte{} de la ronda", + "tiene solo {C:attention}1{} carta, destrúyela", + "y gana {C:money}#1# $", + }, + }, + j_tribe={ + name="La tribu", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "Los {C:attention}reyes{} y las", + "{C:attention}reinas{} jugados otorgan", + "multi {X:mult,C:white} X#1# {} cuando anotan,", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_trio={ + name="El trío", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Trovador", + text={ + "{C:attention}+#1#{} tamaño de la mano,", + "{C:blue}-#2#{} mano en cada ronda", + }, + unlock={ + "Gana {C:attention,E:1}#1#{} rondas", + "consecutivas al jugar", + "1 sola mano", + }, + }, + j_trousers={ + name="Pantalones de repuesto", + text={ + "Este comodín obtiene {C:mult}+#1#{} multi", + "si la mano jugada tiene", + "un {C:attention}#2#", + "{C:inactive}(Actual {C:red}+#3#{C:inactive} multi)", + }, + }, + j_turtle_bean={ + name="Frijol negro", + text={ + "{C:attention}+#1#{} tamaño de mano,", + "se reduce", + "en {C:red}#2#{} en cada ronda", + }, + }, + j_vagabond={ + name="Vagabundo", + text={ + "Crea una carta de {C:purple}tarot{}", + "si se juega una mano", + "con {C:money}#1# ${} o menos", + }, + }, + j_vampire={ + name="Vampiro", + text={ + "Este comodín obtiene {X:mult,C:white} X#1# {} multi", + "por cada {C:attention}carta mejorada{} jugada con puntuación,", + "elimina la carta {C:attention}mejorada", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + }, + j_walkie_talkie={ + name="Walkie-talkie", + text={ + "Cada {C:attention}10{} o {C:attention}4{}", + "jugado otorga {C:chips}+#1#{} fichas", + "y multi {C:mult}+#2#{} cuando anota", + }, + }, + j_wee={ + name="Comodín pequeño", + text={ + "Este comodín gana", + "{C:chips}+#2#{} fichas cuando cada", + "{C:attention}2{} jugado anota", + "{C:inactive}(Actual {C:chips}+#1#{C:inactive} fichas)", + }, + unlock={ + "Gana una partida en {E:1,C:attention}#1#", + "rondas o menos", + }, + }, + j_wily={ + name="Comodín taimado", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Comodín irascible", + text={ + "Las cartas jugadas", + "del palo {C:spades}#2#{} otorgan", + "multi {C:mult}+#1#{} cuando anotan", + }, + }, + j_yorick={ + name="Yorick", + text={ + "Este comodín obtiene", + "{X:mult,C:white} X#1# {} multi cada {C:attention}#2#{C:inactive} [#3#]{}", + "cartas descartadas", + "{C:inactive}(Actual {X:mult,C:white} X#4# {C:inactive} multi)", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_zany={ + name="Comodín chiflado", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Sticker negro", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}negro{}", + }, + }, + blue_seal={ + name="Sello azul", + text={ + "Crea la carta de {C:planet}planeta{}", + "para la última {C:attention}mano de póker{}", + "de la ronda jugada si {C:attention}la tienes{} en la mano", + "{C:inactive}(Debe haber espacio)", + }, + }, + blue_sticker={ + name="Sticker azul", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}azul{}", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} fichas", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1# fichas{} extra", + }, + }, + challenge_locked={ + name="Bloqueada", + text={ + "Gana una partida con al menos", + "#1# barajas diferentes para desbloquear", + "Modo desafío", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Debilitada", + text={ + "Todas las habilidades", + "están inhabilitadas", + }, + }, + debuffed_playing_card={ + name="Debilitada", + text={ + "No gana ninguna ficha", + "y todas las habilidades", + "están inhabilitadas", + }, + }, + deck_locked_discover={ + name="Bloqueada", + text={ + "Descubre al menos", + "{C:attention}#1#{} objetos de", + "tu colección", + }, + }, + deck_locked_stake={ + name="Bloqueada", + text={ + "Gana una partida con cualquier", + "baraja en al menos", + "dificultad {V:1}#1#{}", + }, + }, + deck_locked_win={ + name="Bloqueada", + text={ + "Gana una partida", + "con {C:attention}#1#{}", + "en cualquier dificultad", + }, + }, + demo_locked={ + name="Bloqueada", + text={ + "No está disponible", + "en esta demo", + }, + }, + demo_shop_locked={ + name="Bloqueada", + text={ + "Carta de la colección personal", + "de {C:attention}Jimbo, ", + "disponible en la versión", + "completa de {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Eterno", + text={ + "No se puede vender", + "ni destruir", + }, + }, + gold_seal={ + name="Sello de oro", + text={ + "Gana {C:money}3 ${} cuando", + "se juega esta carta", + "y anota puntos", + }, + }, + gold_sticker={ + name="Sticker de oro", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}de oro{}", + }, + }, + green_sticker={ + name="Sticker verde", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}verde{}", + }, + }, + joker_locked_legendary={ + name="Bloqueada", + text={ + "Encuentra este comodín", + "en la carta {C:spectral}El alma{}", + }, + }, + locked={ + name="Bloqueada", + text={ + }, + }, + orange_sticker={ + name="Sticker naranja", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}naranja{}", + }, + }, + p_arcana_jumbo={ + name="Paquete arcano jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{}", + "para usar de inmediato", + }, + }, + p_arcana_mega={ + name="Paquete arcano mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{}", + "para usar de inmediato", + }, + }, + p_arcana_normal={ + name="Paquete arcano", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{} para", + "usar de inmediato", + }, + }, + p_buffoon_jumbo={ + name="Paquete de bufón jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}", + }, + }, + p_buffoon_mega={ + name="Paquete de bufón mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}", + }, + }, + p_buffoon_normal={ + name="Paquete de bufón", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}", + }, + }, + p_celestial_jumbo={ + name="Paquete celestial jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato", + }, + }, + p_celestial_mega={ + name="Paquete celestial mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato", + }, + }, + p_celestial_normal={ + name="Paquete celestial", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato", + }, + }, + p_spectral_jumbo={ + name="Paquete espectral jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato", + }, + }, + p_spectral_mega={ + name="Paquete espectral mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato", + }, + }, + p_spectral_normal={ + name="Paquete espectral", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato", + }, + }, + p_standard_jumbo={ + name="Paquete estándar jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja", + }, + }, + p_standard_mega={ + name="Paquete estándar mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja", + }, + }, + p_standard_normal={ + name="Paquete estándar", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja", + }, + }, + perishable={ + name="Perecedero", + text={ + "Debilitada luego de", + "{C:attention}#1#{} rondas", + "{C:inactive}({C:attention}#2#{C:inactive} restantes)", + }, + }, + pinned_left={ + name="Fijada", + text={ + "Este comodín se queda", + "fijado a la posición", + "del extremo izquierdo", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# de {V:1}#2# ", + }, + }, + purple_seal={ + name="Sello morado", + text={ + "Crea una carta de {C:tarot}tarot{}", + "cuando {C:attention}se descarta", + "{C:inactive}(Debe haber espacio)", + }, + }, + purple_sticker={ + name="Sticker morado", + text={ + "Usaste este comodín", + "Para ganar en la dificultad {C:attention}Pozo", + "{C:attention}negro{}", + }, + }, + red_seal={ + name="Sello rojo", + text={ + "Reactiva esta", + "carta {C:attention}1{} vez", + }, + }, + red_sticker={ + name="Sticker rojo", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}rojo{}", + }, + }, + remove_negative={ + name="Negativo", + text={ + "{C:inactive,s:0.9}(Elimina el {C:dark_edition,s:0.9}Negativo{C:inactive,s:0.9} de la copia)", + }, + }, + rental={ + name="Alquiler", + text={ + "Pierde {C:money}$#1#{} al", + "final de la ronda", + }, + }, + undiscovered_booster={ + name="No se descubrió", + text={ + "Abre este paquete", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_edition={ + name="No se descubrió", + text={ + "Encuentra esta edición", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_joker={ + name="No se descubrió", + text={ + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_planet={ + name="No se descubrió", + text={ + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_spectral={ + name="No se descubrió", + text={ + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_tag={ + name="No se descubrió", + text={ + "Usa esta etiqueta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_tarot={ + name="No se descubrió", + text={ + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_voucher={ + name="No se descubrió", + text={ + "Canjea este vale", + "en una partida", + "sin códigos para saber", + "lo que hace", + }, + }, + white_sticker={ + name="Sticker blanco", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}blanco{}", + }, + }, + wip_locked={ + name="Bloqueada", + text={ + "Trabajo", + "en curso", + }, + }, + }, + Planet={ + c_ceres={ + name="Ceres", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_earth={ + name="Tierra", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_jupiter={ + name="Júpiter", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_mars={ + name="Marte", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_mercury={ + name="Mercurio", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_neptune={ + name="Neptuno", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_planet_x={ + name="Planeta X", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_pluto={ + name="Plutón", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_saturn={ + name="Saturno", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_uranus={ + name="Urano", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_venus={ + name="Venus", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + }, + Spectral={ + c_ankh={ + name="Anj", + text={ + "Crea una copia de un", + "{C:attention}comodín{} aleatorio,", + "destruye los demás", + }, + }, + c_aura={ + name="Aura", + text={ + "Agrega efectos de {C:dark_edition}laminado{}, {C:dark_edition}holográfico{}", + "o {C:dark_edition}polícromo{} a", + "{C:attention}1{} carta seleccionada de tu mano", + }, + }, + c_black_hole={ + name="Agujero negro", + text={ + "Aumenta todas", + "las {C:legendary,E:1}manos de póker", + "{C:attention}1{} nivel", + }, + }, + c_cryptid={ + name="Críptido", + text={ + "Crea {C:attention}#1#{} copias de", + "{C:attention}1{} carta seleccionada", + "en tu mano", + }, + }, + c_deja_vu={ + name="Déjà vu", + text={ + "Agrega un {C:red}sello rojo{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar", + }, + }, + c_ectoplasm={ + name="Ectoplasma", + text={ + "Agrega {C:dark_edition}negativo{}", + "a un {C:attention}comodín al azar", + "{C:red}-1{} de tamaño de mano", + }, + }, + c_familiar={ + name="Familiar", + text={ + "Destruye {C:attention}1{} carta", + "de tu mano al azar,", + "agrega {C:attention}#1#{} {C:attention}cartas {C:attention}de figura{} mejoradas", + "al azar a tu mano", + }, + }, + c_grim={ + name="Lúgubre", + text={ + "Destruye {C:attention}1{} carta", + "de tu mano al azar,", + "agrega {C:attention}#1#{} {C:attention}ases{} {C:attention}mejorados{}", + "a tu mano al azar", + }, + }, + c_hex={ + name="Maleficio", + text={ + "Agrega {C:dark_edition}policromía{} a un", + "{C:attention}comodín{} aleatorio,", + "destruye los demás", + }, + }, + c_immolate={ + name="Inmolación", + text={ + "Destruye {C:attention}#1#{} cartas", + "de tu mano al azar,", + "gana {C:money}#2# $", + }, + }, + c_incantation={ + name="Encantamiento", + text={ + "Destruye {C:attention}1{} carta", + "de tu mano al azar, agrega {C:attention}#1#", + "carta {C:attention}mejorada numerada", + "a tu mano al azar", + }, + }, + c_medium={ + name="Médium", + text={ + "Agrega un {C:purple}sello morado{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Convierte todas las cartas", + "de tu mano en una sola", + "{C:attention}categoría al azar", + "{C:red}-1{} de tamaño de mano", + }, + }, + c_sigil={ + name="Sigilo", + text={ + "Convierte todas las cartas", + "de tu mano en un solo", + "{C:attention}palo al azar", + }, + }, + c_soul={ + name="El alma", + text={ + "Crea un", + "comodín {C:legendary,E:1}legendario{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + c_talisman={ + name="Talismán", + text={ + "Agrega un {C:attention}sello de oro{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar", + }, + }, + c_trance={ + name="Trance", + text={ + "Agrega un {C:blue}sello azul{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar", + }, + }, + c_wraith={ + name="Espectro", + text={ + "Genera una carta", + "de {C:attention}comodín{} {C:red}rara{} al azar,", + "deja el dinero en {C:money}0 $", + }, + }, + }, + Stake={ + stake_black={ + name="Pozo negro", + text={ + "La tienda puede tener comodines {C:attention}eternos{}", + "{C:inactive,s:0.8}(No se pueden vender ni destruir)", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_blue={ + name="Pozo azul", + text={ + "{C:red}-1{} descarte", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_gold={ + name="Pozo de oro", + text={ + "La tienda puede tener comodines {C:attention}de alquiler{}", + "{C:inactive,s:0.8}(Cuesta {C:money,s:0.8}$3{C:inactive,s:0.8} por ronda)", + "{s:0.8}Aplica en todas las apuestas anteriores", + }, + }, + stake_green={ + name="Pozo verde", + text={ + "Escalas de puntos requeridas más rápidas", + "para cada {C:attention}apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_orange={ + name="Pozo naranja", + text={ + "La tienda puede tener comodines {C:attention}perecederos{}", + "{C:inactive,s:0.8}(Debilitados luego de 5 rondas)", + "{s:0.8}Aplica en todas las apuestas anteriores", + }, + }, + stake_purple={ + name="Pozo morado", + text={ + "Escalas de puntos requeridas más rápidas", + "para cada {C:attention}apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_red={ + name="Pozo rojo", + text={ + "La {C:attention}ciega pequeña{} no otorga", + "ninguna recompensa monetaria", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_white={ + name="Pozo blanco", + text={ + "Dificultad básica", + }, + }, + }, + Tag={ + tag_boss={ + name="Etiqueta de jefe", + text={ + "Renueva", + "la {C:attention}ciega jefe", + }, + }, + tag_buffoon={ + name="Etiqueta de bufón", + text={ + "Otorga gratis un", + "{C:attention}paquete de bufón", + }, + }, + tag_charm={ + name="Etiqueta encantada", + text={ + "Otorga gratis un", + "{C:tarot}paquete arcano mega", + }, + }, + tag_coupon={ + name="Etiqueta de cupón", + text={ + "Las cartas iniciales", + "y los paquetes potenciadores", + "en la próxima tienda son gratis", + }, + }, + tag_d_six={ + name="Etiqueta D6", + text={ + "Las renovaciones en la tienda siguiente", + "comienzan en {C:money}0 $", + }, + }, + tag_double={ + name="Etiqueta doble", + text={ + "Otorga una copia de", + "la {C:attention}etiqueta{} siguiente seleccionada", + "{s:0.8}a excepción de {s:0.8,C:attention}Etiqueta doble", + }, + }, + tag_economy={ + name="Etiqueta de economía", + text={ + "Duplica el dinero", + "{C:inactive}(Máx. de {C:money}#1# ${C:inactive})", + }, + }, + tag_ethereal={ + name="Etiqueta etérea", + text={ + "Otorga gratis", + "un {C:planet}paquete espectral", + }, + }, + tag_foil={ + name="Etiqueta laminada", + text={ + "El próximo comodín de la", + "tienda de la edición base es gratis y", + "se vuelve {C:dark_edition}laminado", + }, + }, + tag_garbage={ + name="Etiqueta de basura", + text={ + "Otorga {C:money}#1# ${} por cada", + "{C:red}descarte{} sin usar en esta partida", + "{C:inactive}(Otorgará {C:money}#2# ${C:inactive})", + }, + }, + tag_handy={ + name="Etiqueta manual", + text={ + "Otorga {C:money}#1# ${} por cada", + "{C:blue}mano{} jugada en esta partida", + "{C:inactive}(Otorgará {C:money}#2# ${C:inactive})", + }, + }, + tag_holo={ + name="Etiqueta holográfica", + text={ + "El próximo comodín de la", + "tienda de la edición base es gratis y", + "se vuelve {C:dark_edition}holográfico", + }, + }, + tag_investment={ + name="Etiqueta de inversión", + text={ + "Después de derrotar", + "a la ciega jefe,", + "gana {C:money}#1# $", + }, + }, + tag_juggle={ + name="Etiqueta de malabar", + text={ + "{C:attention}+#1#{} tamaño de mano", + "en la ronda siguiente", + }, + }, + tag_meteor={ + name="Etiqueta de meteoro", + text={ + "Otorga gratis un", + "{C:planet}paquete celestial mega", + }, + }, + tag_negative={ + name="Etiqueta negativa", + text={ + "El próximo comodín de la", + "tienda de la edición base es gratis y", + "se vuelve {C:dark_edition}negativo", + }, + }, + tag_orbital={ + name="Etiqueta orbital", + text={ + "Aumenta {C:attention}#1#", + "en {C:attention}#2# niveles", + }, + }, + tag_polychrome={ + name="Etiqueta polícroma", + text={ + "El próximo comodín de la", + "tienda de la edición base es gratis y", + "se vuelve {C:dark_edition}polícromo", + }, + }, + tag_rare={ + name="Etiqueta rara", + text={ + "La tienda tiene un", + "{C:red}comodín raro gratis", + }, + }, + tag_skip={ + name="Etiqueta veloz", + text={ + "Otorga {C:money}#1# ${} por ciega", + "omitida en esta partida", + "{C:inactive}(Otorgará {C:money}#2# ${C:inactive})", + }, + }, + tag_standard={ + name="Etiqueta estándar", + text={ + "Otorga gratis un", + "{C:attention}megapaquete estándar", + }, + }, + tag_top_up={ + name="Etiqueta de recarga", + text={ + "Genera hasta {C:attention}#1#", + "comodines {C:blue}comunes{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + tag_uncommon={ + name="Etiqueta inusual", + text={ + "La tienda tiene un", + "{C:green}comodín inusual gratis", + }, + }, + tag_voucher={ + name="Etiqueta de vale", + text={ + "Agrega un {C:voucher}vale", + "en la siguiente tienda", + }, + }, + }, + Tarot={ + c_chariot={ + name="El carro", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_death={ + name="La muerte", + text={ + "Selecciona {C:attention}#1#{} cartas,", + "convierte la carta {C:attention}izquierda{}", + "en la carta {C:attention}derecha{}", + "{C:inactive}(Arrastra para acomodar)", + }, + }, + c_devil={ + name="El diablo", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="El emperador", + text={ + "Genera hasta {C:attention}#1#", + "cartas de {C:tarot}tarot{} al azar", + "{C:inactive}(Debe haber espacio)", + }, + }, + c_empress={ + name="La emperatriz", + text={ + "Mejora {C:attention}#1# cartas", + "seleccionadas a", + "{C:attention}#2#s", + }, + }, + c_fool={ + name="El loco", + text={ + "Genera la última", + "carta de {C:tarot}tarot{} o de {C:planet}planeta{}", + "usada en esta partida", + "a excepción de {s:0.8,C:tarot}El loco{s:0.8}", + }, + }, + c_hanged_man={ + name="El colgado", + text={ + "Destruye hasta", + "{C:attention}#1#{} cartas seleccionadas", + }, + }, + c_heirophant={ + name="El hierofante", + text={ + "Mejora {C:attention}#1# cartas", + "seleccionadas a", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="El ermitaño", + text={ + "Duplica el dinero", + "{C:inactive}(Máx. de {C:money}#1# ${C:inactive})", + }, + }, + c_high_priestess={ + name="La sacerdotisa", + text={ + "Genera hasta {C:attention}#1#", + "cartas de {C:planet}planeta{} al azar", + "{C:inactive}(Debe haber espacio)", + }, + }, + c_judgement={ + name="El juicio", + text={ + "Genera una carta", + "de {C:attention}comodín{} al azar", + "{C:inactive}(Debe haber espacio)", + }, + }, + c_justice={ + name="La justicia", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="Los enamorados", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_magician={ + name="El mago", + text={ + "Mejora {C:attention}#1#{}", + "carta(s) seleccionada(s) a", + "{C:attention}#2#", + }, + }, + c_moon={ + name="La luna", + text={ + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}", + }, + }, + c_star={ + name="La estrella", + text={ + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}", + }, + }, + c_strength={ + name="La fuerza", + text={ + "Aumenta la categoría de", + "hasta {C:attention}#1#{} cartas", + "elegidas en {C:attention}1", + }, + }, + c_sun={ + name="El sol", + text={ + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}", + }, + }, + c_temperance={ + name="La templanza", + text={ + "Otorga el valor total de venta", + "de todos los comodines", + "actuales {C:inactive}(Máx. de {C:money}#1# ${C:inactive})", + "{C:inactive}(Actual {C:money}#2# ${C:inactive})", + }, + }, + c_tower={ + name="La torre", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="La rueda de la fortuna", + text={ + "{C:green}#1# en #2#{} probabilidades de agregar", + "que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o", + "{C:dark_edition}polícromas{}", + "a un {C:attention}comodín al azar", + }, + }, + c_world={ + name="El mundo", + text={ + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimateria", + text={ + "{C:dark_edition}+1{} ranura de comodín", + }, + unlock={ + "Canjea {C:voucher}En blanco{}", + "un total de {C:attention}#1#{} veces", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="En blanco", + text={ + "{C:inactive}¿No hace nada?", + }, + }, + v_clearance_sale={ + name="Venta de saldos", + text={ + "Todas las cartas y paquetes", + "en la tienda a {C:attention}#1# %{} menos", + }, + }, + v_crystal_ball={ + name="Bola de cristal", + text={ + "{C:attention}+1{} ranura de consumible", + }, + }, + v_directors_cut={ + name="Versión del director", + text={ + "Renueva la ciega jefe", + "{C:attention}1{} vez por apuesta inicial,", + "{C:money}#1# ${} por cambio", + }, + }, + v_glow_up={ + name="Brillo", + text={ + "Las cartas {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} y", + "{C:dark_edition}polícromas{}", + "aparecen {C:attention}#1#X{} más veces", + }, + unlock={ + "Debes tener al menos {C:attention}#1#", + "cartas de {C:attention}comodín{}", + "que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o", + "{C:dark_edition}polícromas{}", + }, + }, + v_grabber={ + name="Agarrador", + text={ + "Gana para siempre", + "{C:blue}+#1#{} mano(s)", + "por ronda", + }, + }, + v_hieroglyph={ + name="Jeroglífico", + text={ + "{C:attention}-#1#{} apuesta inicial,", + "{C:blue}-#1#{} mano", + "cada ronda", + }, + }, + v_hone={ + name="Perfección", + text={ + "Las cartas {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} y", + "{C:dark_edition}polícromas{}", + "aparecen {C:attention}#1#X{} más veces", + }, + }, + v_illusion={ + name="Ilusión", + text={ + "Las {C:attention}cartas de juego{} en la tienda", + "pueden tener una {C:enhanced}mejora{},", + "{C:dark_edition}edición{} y/o un {C:attention}sello{}", + }, + unlock={ + "Compra un total", + "de {C:attention}#1#{} cartas de juego", + "en la tienda", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Liquidación", + text={ + "Todas las cartas y paquetes", + "en la tienda a {C:attention}#1# %{} menos", + }, + unlock={ + "Canjea al menos", + "{C:attention}#1# cartas de{C:voucher} vale{}", + "en una partida", + }, + }, + v_magic_trick={ + name="Truco de magia", + text={ + "Las {C:attention}cartas de juego{} pueden", + "comprarse", + "en la {C:attention}tienda", + }, + }, + v_money_tree={ + name="Árbol de dinero", + text={ + "Aumenta el tope de", + "interés ganado en", + "cada ronda a {C:money}$#1#{}", + }, + unlock={ + "Maximiza la ganancia", + "de interés por ronda durante", + "{C:attention}#1# rondas{} consecutivas", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Pinza para nachos", + text={ + "Gana para siempre", + "{C:blue}+#1#{} mano(s)", + "por ronda", + }, + unlock={ + "Juega un total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Observatorio", + text={ + "Las cartas de {C:planet}planeta{} en", + "el área de {C:attention}consumibles{} otorgan", + "{X:red,C:white} X#1# {} multi para su", + "{C:attention}mano de póker específica", + }, + unlock={ + "Usa un total de {C:attention}#1#", + "cartas de {C:planet}planeta{} de cualquier", + "{C:planet}paquete celestial", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Orbe profético", + text={ + "Las cartas {C:spectral}espectrales{} pueden", + "aparecer en cualquier", + "{C:attention}paquete arcano", + }, + unlock={ + "Usa un total de {C:attention}#1#", + "cartas de {C:tarot}tarot{} de cualquier", + "{C:tarot}paquete arcano", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Excedente", + text={ + "{C:attention}+1{} ranura de carta", + "disponible en la tienda", + }, + }, + v_overstock_plus={ + name="Excedente plus", + text={ + "{C:attention}+1{} ranura de carta", + "disponible en la tienda", + }, + unlock={ + "Gasta un total", + "de {C:money}#1# ${} en la tienda", + "{C:inactive}(#2# $)", + }, + }, + v_paint_brush={ + name="Brocha", + text={ + "{C:attention}+#1#{} tamaño de mano", + }, + }, + v_palette={ + name="Paleta", + text={ + "{C:attention}+#1#{} tamaño de mano", + }, + unlock={ + "Reduce el tamaño", + "de mano a {C:attention}#1#{} cartas", + }, + }, + v_petroglyph={ + name="Petroglifo", + text={ + "{C:attention}-#1#{} apuesta inicial,", + "{C:red}-#1#{} descarte", + "cada ronda", + }, + unlock={ + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Mercader de planetas", + text={ + "Las cartas de {C:planet}planeta{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda", + }, + }, + v_planet_tycoon={ + name="Magnate de planetas", + text={ + "Las cartas de {C:planet}planeta{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda", + }, + unlock={ + "Compra un total", + "{C:attention}#1# cartas de {C:planet}planeta{}", + "en la tienda", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Reciclomancia", + text={ + "Gana", + "para siempre {C:red}+#1#{} descarte", + "cada ronda", + }, + unlock={ + "Descarta un total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Gula de renovaciones", + text={ + "Las renovaciones cuestan", + "{C:money}#1# ${} menos", + }, + unlock={ + "Renueva la tienda", + "un total de {C:attention}#1#{} veces", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Excedente de renovaciones", + text={ + "Las renovaciones cuestan", + "{C:money}#1# ${} menos", + }, + }, + v_retcon={ + name="Retrocontinuidad", + text={ + "Renueva la ciega jefe", + "{C:attention}ilimitadas{} veces,", + "{C:money}#1# ${} por cambio", + }, + unlock={ + "Descubre", + "{C:attention}#1#{} ciegas", + }, + }, + v_seed_money={ + name="Siembra dinero", + text={ + "Aumenta el tope de", + "interés ganado en", + "cada ronda a {C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="Mercader de tarot", + text={ + "Las cartas de {C:tarot}tarot{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda", + }, + }, + v_tarot_tycoon={ + name="Magnate del tarot", + text={ + "Las cartas de {C:tarot}tarot{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda", + }, + unlock={ + "Compra un total", + "de {C:attention}#1# cartas de{C:tarot} tarot{}", + "en la tienda", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Telescopio", + text={ + "Los {C:attention}paquetes celestiales{} siempre", + "contienen la carta de {C:planet}planeta{}", + "para tu {C:attention}mano de póker", + "más jugada", + }, + }, + v_wasteful={ + name="Desperdiciador", + text={ + "Gana", + "para siempre {C:red}+#1#{} descarte", + "cada ronda", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Consigue 100 000 000 de fichas en una sola mano", + _1000k="Consigue 1 000 000 de fichas en una sola mano", + _10k="Consigue 10 000 fichas en una sola mano", + ante_up="Llega a la apuesta inicial 4", + ante_upper="Llega a la apuesta inicial 8", + astronomy="Descubre todas las cartas de planeta", + big_hands="Haz que tu baraja tenga 80 cartas o más", + card_discarder="Descarta al menos 2500 cartas", + card_player="Juega al menos 2500 cartas", + cartomancy="Descubre todas las cartas de tarot", + clairvoyance="Descubre todas las cartas espectrales", + completionist="Descubre 100 % de tu colección", + completionist_plus="Gana con todas las barajas en dificultad Pozo de oro", + completionist_plus_plus="Gana un sticker de oro en cada comodín", + extreme_couponer="Descubre todos los vales", + flushed="Juega un color con 5 cartas versátiles", + heads_up="Gana una partida", + high_stakes="Gana una partida en dificultad Pozo de oro como mínimo", + legendary="Descubre un comodín legendario", + low_stakes="Gana una partida en dificultad Pozo rojo como mínimo", + mid_stakes="Gana una partida en dificultad Pozo negro como mínimo", + nest_egg="Consigue 400 $ o más en una sola partida", + retrograde="Lleva cualquier mano de póker a nivel 10", + roi="Compra 5 vales para la apuesta inicial 4", + royale="Juega una escalera real", + rule_bender="Completa cualquier desafío", + rule_breaker="Completa todos los desafíos", + shattered="Rompe 2 cartas de vidrio en una sola mano", + speedrunner="Gana una partida en 12 rondas o menos", + tiny_hands="Quédate con 20 cartas o menos en la baraja", + you_get_what_you_get="Gana una partida sin renovar la tienda", + }, + achievement_names={ + _100000k="100 000 K", + _1000k="1000 K", + _10k="10K", + ante_up="¡Aumento de apuesta inicial!", + ante_upper="¡Aumentador de apuesta inicial!", + astronomy="Astronomía", + big_hands="Manotas", + card_discarder="Descartador de cartas", + card_player="Jugador de cartas", + cartomancy="Cartomancia", + clairvoyance="Clarividencia", + completionist="Completista", + completionist_plus="Completista+", + completionist_plus_plus="Completista++", + extreme_couponer="Cupones extremos", + flushed="Colorado", + heads_up="Aviso", + high_stakes="Apuestas altas", + legendary="Legendario", + low_stakes="Apuestas bajas", + mid_stakes="Apuestas medias", + nest_egg="Ahorros", + retrograde="Retrógrada", + roi="Rendimiento de inversión", + royale="Real", + rule_bender="Cambiar las reglas", + rule_breaker="Romper las reglas", + shattered="Destrozo", + speedrunner="Velocista", + tiny_hands="Manitas", + you_get_what_you_get="Te toca lo que te toca", + }, + blind_states={ + Current="Actual", + Defeated="Derrotada", + Select="Seleccionar", + Selected="Seleccionada", + Skipped="Omitida", + Upcoming="Siguiente", + }, + challenge_names={ + c_blast_off_1="Estallido", + c_bram_poker_1="Bram Póker", + c_city_1="Ciudad de los 15 minutos", + c_cruelty_1="Crueldad", + c_double_nothing_1="Doble o nada", + c_five_card_1="Saca cinco cartas", + c_fragile_1="Frágil", + c_golden_needle_1="Aguja dorada", + c_inflation_1="Inflación", + c_jokerless_1="Sin comodines", + c_knife_1="Al filo de la navaja", + c_luxury_1="Impuesto al lujo", + c_mad_world_1="Mundo loco", + c_medusa_1="Medusa", + c_monolith_1="Monolito", + c_non_perishable_1="No perecedero", + c_omelette_1="El omelet", + c_rich_1="Los ricos se enriquecen", + c_typecast_1="Encasillado", + c_xray_1="Visión de rayos X", + }, + collabs={ + Clubs={ + ["1"]="Por defecto", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Por defecto", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Por defecto", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Por defecto", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="Preguntas frecuentes", + b_and_use="Y USAR", + b_back="Atrás", + b_blinds="Ciegas", + b_booster_packs="Paquetes potenciadores", + b_buy="COMPRAR", + b_cash_out="Cobrar", + b_challenges="Desafíos", + b_collection="Colección", + b_collection_cap="COLECCIÓN", + b_continue="Continuar", + b_copy="Copiar", + b_copy_seed="Copiar código", + b_create_profile="Crear perfil", + b_credits="Créditos", + b_current_profile="Perfil actual", + b_customize_deck="Personalizar baraja", + b_deck="Baraja", + b_decks="Barajas", + b_delete_profile="Eliminar perfil", + b_discard="Descartar", + b_editions="Ediciones", + b_endless="Modo infinito", + b_enhanced_cards="Cartas mejoradas", + b_full_deck="Baraja completa", + b_high_contrast_cards="Cartas de alto contraste", + b_how_to_play="Cómo jugar", + b_imagery="Imágenes", + b_jokers="Comodines", + b_load_profile="Cargar perfil", + b_main_menu="Menú principal", + b_music="Música", + b_new_challenge="Iniciar desafío nuevo", + b_new_run="Partida nueva", + b_next="Siguiente", + b_next_round_1="Ronda", + b_next_round_2="siguiente", + b_open="ABRIR", + b_options="Opciones", + b_options_cap="OPCIONES", + b_planet_cards="Cartas de planeta", + b_play_cap="JUGAR", + b_play_hand="Jugar mano", + b_playbalatro="Visita playbalatro.com", + b_poker_hands="Manos de póker", + b_quit_cap="SALIR", + b_redeem="CANJEAR", + b_reduced_motion="Movimiento reducido", + b_remaining="Restantes", + b_reroll_boss="Renovar jefe", + b_reset_profile="Restablecer perfil", + b_restrictions="Restricciones", + b_retry="Reintentar", + b_rules="Reglas", + b_run_info_1="Partida", + b_run_info_2="Info", + b_seals="Sellos", + b_seed="Código", + b_select="SELECCIONAR", + b_sell="VENDER", + b_set_CRT="CRT", + b_set_CRT_bloom="Dispersión CRT", + b_set_apply="Aplicar", + b_set_audio="Audio", + b_set_crash_reports="Informes de errores", + b_set_game="Juego", + b_set_game_vol="Volumen juego", + b_set_gamespeed="Velocidad del juego", + b_set_graphics="Gráficos", + b_set_master_vol="Volumen principal", + b_set_monitor="Configuración de pantalla", + b_set_music_vol="Volumen música", + b_set_pixel_smoothing="Suavizado de pixeles", + b_set_play_discard_pos="Posición del botón jugar/descartar", + b_set_rumble="Vibración del control", + b_set_screenshake="Temblor de pantalla", + b_set_shadows="Sombras", + b_set_vibration="Vibración", + b_set_video="Video", + b_set_windowmode="Modo ventana", + b_settings="Configuración", + b_skip="Omitir", + b_skip_blind="Omitir ciega", + b_skip_reward="Omitir ciega", + b_sort_hand="Ordenar mano", + b_sounds="Sonidos", + b_spectral_cards="Cartas espectrales", + b_stake="Pozo", + b_start_new_run="Partida nueva", + b_stat_consumables="Consumibles", + b_stat_jokers="Comodines", + b_stat_planets="Planetas", + b_stat_spectrals="Espectrales", + b_stat_tarots="Tarot", + b_stat_vouchers="Vales", + b_stats="Estadísticas", + b_tags="Etiquetas", + b_tarot_cards="Cartas de tarot", + b_unlock_all="Desbloquear todo", + b_use="USAR", + b_vouchers="Vales", + b_wishlist="Lista de deseos en Steam", + k_aces="Ases", + k_achievement="Logro", + k_achievements_disabled="Logros desactivados", + k_active="activa", + k_active_ex="¡Se activó!", + k_again_ex="¡De nuevo!", + k_all_hands="Todas las manos", + k_also_applied="También se aplica", + k_ante="Apuesta inicial", + k_ante_cap="APUESTA INICIAL", + k_arcana_pack="Paquete arcano", + k_balanced="Equilibrado", + k_banned_cards="Cartas prohibidas", + k_banned_tags="Etiquetas prohibidas", + k_base_cap="BASE", + k_base_cards="Cartas base", + k_best_hand="Mejor mano", + k_booster="Potenciador", + k_buffoon_pack="Paquete de bufón", + k_cap_consumables="CONSUMIBLES", + k_card_stats="Estadísticas de cartas", + k_celestial_pack="Paquete celestial", + k_challenge_mode="Modo desafío", + k_challenges="Desafíos", + k_choose="Elegir", + k_collection="Colección", + k_common="Común", + k_compatible="compatible", + k_copied_ex="¡Se copió!", + k_custom_rules="Reglas personalizadas", + k_daily_run="Partida diaria", + k_debuffed="Debilitada", + k_deck="Baraja", + k_deck_stake_wins="Victorias de pozo de baraja", + k_defeated_by="Derrotada por", + k_demo_version_ex="¡Versión demo!", + k_disabled_ex="¡Se desactivó!", + k_drank_ex="¡Consumido!", + k_duplicated_ex="¡Se duplicó!", + k_dwarf_planet="Planeta enano", + k_eaten_ex="¡Se devoró!", + k_edition="Edición", + k_effective="Total efectivo", + k_empty_caps="VACÍA", + k_enter_name="Escribir nombre", + k_enter_seed="Escribir código", + k_enter_text="Escribir texto", + k_eroded_ex="¡Se erosionó!", + k_extinct_ex="¡Se extinguió!", + k_face_cards="Cartas de figuras", + k_game_modifiers="Modificadores de juego", + k_gold="Oro", + k_high_score_ex="¡Récord!", + k_hud_discards="Descartes", + k_hud_hands="Manos", + k_incompatible="incompatible", + k_joker="Comodín", + k_joker_stickers="Stickers de comodín", + k_jokers_cap="COMODINES", + k_legendary="Legendaria", + k_level_prefix="Nvl.", + k_level_up_ex="¡Aumento de nivel!", + k_locked="Bloqueada", + k_lower_score="puntuación", + k_lvl="Nvl.", + k_melted_ex="¡Se derritió!", + k_money="Dinero", + k_mult="Multi", + k_no_other_jokers="¡No hay más comodines!", + k_no_reward="Sin recompensa", + k_no_room_ex="¡No hay espacio!", + k_no_space_ex="¡Sin espacio!", + k_none="Ninguno", + k_nope_ex="¡No!", + k_not_allowed_ex="¡No está permitido!", + k_not_discovered="No se descubrió", + k_numbered_cards="Cartas numeradas", + k_or="o", + k_other="Otros", + k_page="Página", + k_planet="Planeta", + k_planet_q="¿Planeta?", + k_playing_as="Jugando como", + k_plus_joker="+1 comodín", + k_plus_planet="+1 Planeta", + k_plus_spectral="+1 Espectral", + k_plus_stone="+1 Piedras", + k_plus_tarot="+1 Tarot", + k_poker_hand="mano de póker", + k_profile="Perfil", + k_progress="Progreso", + k_rank="Categoría", + k_rare="Rara", + k_redeemed_ex="¡Se canjeó!", + k_reroll="Cambiar", + k_reset="Restablecer", + k_reward="Recompensa", + k_round="Ronda", + k_safe_ex="¡A salvo!", + k_saved_ex="¡Te salvaste!", + k_seed="Código", + k_seeded_run="Partida con códigos", + k_skipped_cap="SE OMITIÓ", + k_spectral="Espectral", + k_spectral_pack="Paquete espectral", + k_stake="Pozo", + k_stake_level="Nivel de pozo", + k_standard_pack="Paquete estándar", + k_suit="Palo", + k_swapped_ex="¡Se cambió!", + k_tarot="Tarot", + k_trophies_disabled="Trofeos desactivados", + k_trophy="Trofeo", + k_uncommon="Inusual", + k_undisovered="No se descubrió", + k_unknown="¿?", + k_unlocked_ex="¡Se desbloqueó!", + k_upgrade_ex="¡Mejora!", + k_val_up="¡Aumento de valor!", + k_view="Ver", + k_voucher="Vale", + k_vouchers_cap="VALES", + k_wins="Victorias", + k_x_base="Base X", + ml_bloom_opt={ + "No", + "Sí", + }, + ml_buy_and_use_target={ + "COMPRAR", + "Y USAR", + }, + ml_buy_target={ + "COMPRAR", + }, + ml_card_stats={ + "Carta", + "Estadísticas", + }, + ml_controller_required={ + "Se requiere un mando para jugar.", + "Conecta un mando para continuar.", + }, + ml_crash_report_info={ + "Los informes de errores se enviarán al desarrollador", + "para reducir los problemas en el futuro.", + "No se enviará información de identificación personal.", + }, + ml_demo_thanks_message={ + "Considera la posibilidad de agregar Balatro", + "a tu lista de deseos en Steam y suscríbete", + "al boletín de noticias en playbalatro.com", + }, + ml_disabled_seed={ + "Todos los desbloqueos", + "y descubrimientos inhabilitados", + }, + ml_edition_seal_enhancement_explanation={ + "Las cartas de juego pueden tener 1", + "mejora, edición y sello cada una", + }, + ml_eternal={ + "Eterno", + "No se puede vender", + "ni destruir", + }, + ml_gold_seal_desc={ + "Sello de oro", + "regresa a tu mano", + "cuando se juega", + }, + ml_offline_message={ + "Este dispositivo está fuera de línea.", + "Es posible que el guardado actual esté desactualizado.", + }, + ml_open_target={ + "ABRIR", + }, + ml_paste_seed={ + "Pegar", + "código", + }, + ml_play_discard_pos_opt={ + "Descartar/jugar", + "Jugar/descartar", + }, + ml_redeem_target={ + "CANJEAR", + }, + ml_sell_target={ + "VENDER", + }, + ml_shadow_opt={ + "Sí", + "No", + }, + ml_smoothing_opt={ + "No", + "Sí", + }, + ml_unlock_all_explanation={ + "¡ATENCIÓN! Si desbloqueas la colección completa,", + "se desactivarán los logros para este perfil", + }, + ml_unlock_all_trophies={ + "¡ATENCIÓN! Si desbloqueas la colección completa,", + "Se desactivarán los trofeos para este perfil", + }, + ml_vsync_opt={ + "Con VSync", + "Sin VSync", + }, + ml_windowmode_opt={ + "Modo ventana", + "Pantalla completa", + "Sin bordes", + }, + ph_1_level="+1 nivel", + ph_4_7_of_clubs="cuatro 7 de tréboles", + ph_alert_debuff_confirm="Pulsa Jugar de nuevo para confirmar", + ph_all_poker_hand="Todas las manos de póker", + ph_blind_reward="Recompensa: ", + ph_blind_score_at_least="Anota al menos", + ph_boss_disabled="¡Jefe inhabilitado!", + ph_choose_blind_1="Elige tu", + ph_choose_blind_2="próxima ciega", + ph_click_confirm="Presione de nuevo para confirmar", + ph_deck_preview_effective="Total efectivo debido a comodines, ciegas y mejoras de cartas", + ph_deck_preview_stones="Piedras", + ph_defeat_the_boss="Derrota a la ciega jefe", + ph_defeat_this_blind_1="Derrota a esta ciega", + ph_defeat_this_blind_2="para descubrirla", + ph_demo_thanks_1="Gracias por jugar la", + ph_demo_thanks_2="DEMO DE BALATRO", + ph_display_stickers="Mostrar stickers de pozo durante la partida", + ph_game_over="FIN DE PARTIDA", + ph_improve_run="¡Mejora tu partida!", + ph_most_played="(mano más jugada)", + ph_mr_bones="Te salvó el Sr. Huesos", + ph_no_boss_active="no hay jefe activo", + ph_no_vouchers="No se canjearon vales en esta partida", + ph_score_at_least="Anota al menos", + ph_score_cards_discarded="Cartas descartadas", + ph_score_cards_played="Cartas jugadas", + ph_score_cards_purchased="Cartas compradas", + ph_score_furthest_ante="Apuesta inicial", + ph_score_furthest_round="Ronda", + ph_score_hand="Mejor mano", + ph_score_new_collection="Descubrimientos", + ph_score_poker_hand="Mano más jugada", + ph_score_times_rerolled="Renovaciones", + ph_select_challenge="Selecciona un desafío", + ph_sneak_peek="Vistazo", + ph_stat_consumable="Cantidad de veces que se usó la carta", + ph_stat_joker="Total de rondas completadas con esta carta", + ph_stat_voucher="Cantidad de veces que se canjeó el vale", + ph_unscored_hand="La mano no anota puntos", + ph_up_ante_1="Aumentar apuesta inicial", + ph_up_ante_2="Aumentar todas las ciegas", + ph_up_ante_3="Actualizar las ciegas", + ph_vouchers_redeemed="Vales canjeados en esta partida", + ph_you_win="¡GANASTE!", + ph_you_win_demo="¡GANASTE EN LA DEMO!", + }, + high_scores={ + boss_streak="Más jefes seguidos", + collection="Colección", + current_streak="", + furthest_ante="Apuesta inicial más alta", + furthest_round="Ronda más alta", + hand="Mejor mano", + most_money="Más dinero", + poker_hand="Mano más jugada", + win_streak="Mejor racha de victorias", + }, + labels={ + blue_seal="Sello azul", + common="Común", + eternal="Eterno", + foil="Laminada", + gold_seal="Sello de oro", + holographic="Holográfica", + legendary="Legendaria", + locked="Bloqueada", + negative="Negativa", + perishable="Perecedero", + pinned_left="Fijada", + planet="Planeta", + pluto_planet="Planeta enano", + polychrome="Polícroma", + purple_seal="Sello morado", + rare="Rara", + red_seal="Sello rojo", + rental="Alquiler", + tarot="Tarot", + uncommon="Inusual", + voucher="Vale", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 cartas de la misma categoría", + }, + Flush={ + "5 cartas del mismo palo", + }, + ["Flush Five"]={ + "5 cartas de la misma categoría y palo", + }, + ["Flush House"]={ + "Una tercia y par con", + "todas las cartas del mismo palo", + }, + ["Four of a Kind"]={ + "4 cartas de la misma categoría. Pueden", + "jugarse con 1 otra carta que no cuenta", + }, + ["Full House"]={ + "Una tercia y un par", + }, + ["High Card"]={ + "Si la mano jugada no es ninguna de las anteriores,", + "sólo cuenta la carta más alta", + }, + Pair={ + "2 cartas de la misma categoría. Pueden", + "jugarse con otras 3 cartas que no cuentan", + }, + ["Royal Flush"]={ + "5 cartas seguidas {valores consecutivos} con", + "todas las cartas del mismo palo", + }, + Straight={ + "5 cartas seguidas {valores consecutivos}", + }, + ["Straight Flush"]={ + "5 cartas seguidas {valores consecutivos} con", + "todas las cartas del mismo palo", + }, + ["Three of a Kind"]={ + "3 cartas de la misma categoría. Pueden", + "jugarse con otras 2 cartas que no cuentan", + }, + ["Two Pair"]={ + "2 pares de cartas de categorías diferentes, pueden", + "jugarse con 1 otra carta que no cuenta", + }, + }, + poker_hands={ + ["Five of a Kind"]="Quintilla", + Flush="Color", + ["Flush Five"]="Cinco de color", + ["Flush House"]="Full de color", + ["Four of a Kind"]="Póker", + ["Full House"]="Full house", + ["High Card"]="Carta más alta", + Pair="Par", + ["Royal Flush"]="Escalera real", + Straight="Escalera", + ["Straight Flush"]="Escalera corrida", + ["Three of a Kind"]="Tercia", + ["Two Pair"]="Doble par", + }, + quips={ + dq_1={ + "¡Uy! Espero", + "que tengas", + "algún truco guardado", + "para el desafío final!", + }, + lq_1={ + "Quizá sea mejor", + "que juguemos", + "a la pesca...", + }, + lq_10={ + "¡Qué desastre!", + }, + lq_2={ + "¡Perdimos", + "casi sin jugar!", + }, + lq_3={ + "¡Llegó la hora", + "de barajar", + "y dar de nuevo!", + }, + lq_4={ + "¡Sabes lo que dicen,", + "la casa", + "siempre gana!", + }, + lq_5={ + "¡Parece que", + "alguien es", + "un chiste!", + }, + lq_6={ + "¿Tú también", + "estabas mintiendo?", + }, + lq_7={ + "¡Parece que", + "somos un chiste!", + }, + lq_8={ + "Si tuviera manos,", + "me hubiera", + "tapado los ojos", + }, + lq_9={ + "Soy un bufón", + "de verdad,", + "¿cuál es tu excusa?", + }, + wq_1={ + "¡Eres un as!", + }, + wq_2={ + "¡Lidiaste muy bien", + "con eso!", + }, + wq_3={ + "¡Parece que no era", + "un engaño!", + }, + wq_4={ + "Qué lástima", + "que estas fichas", + "sean virtuales...", + }, + wq_5={ + "¡Parece que", + "aprendiste bien!", + }, + wq_6={ + "¡Hiciste jugadas", + "muy adelantadas!", + }, + wq_7={ + "¡Qué bueno", + "que no aposté", + "contra ti!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="As", + Jack="Jota", + King="Rey", + Queen="Reina", + }, + suits_plural={ + Clubs="Tréboles", + Diamonds="Diamantes", + Hearts="Corazones", + Spades="Espadas", + }, + suits_singular={ + Clubs="Trébol", + Diamonds="Diamante", + Hearts="Corazón", + Spades="Espada", + }, + tutorial={ + bb_1={ + "Cuando elijas la {C:attention}ciega grande,", + "ganarás un poco de dinero.", + }, + bb_2={ + "Puedes {C:attention}omitirla", + "para conseguir una {C:attention}etiqueta{}. Cada", + "{C:attention}etiqueta{} tiene un efecto único.", + }, + bb_3={ + "No dejes de vigilar", + "a la {C:attention}ciega jefe{}. Tiene", + "una habilidad para la cual", + "deberás prepararte.", + }, + bb_4={ + "Si la derrotas, aumenta", + "la {C:attention}apuesta inicial{} y todas", + "las{C:attention}ciegas{} se vuelven más difíciles.", + }, + bb_5={ + "Derrota a la {C:attention}apuesta inicial{} #1# para ganar.", + "¡Elige tu camino!", + }, + fh_1={ + "Ganas fichas por jugar", + "{C:attention}manos de póker.", + }, + fh_2={ + "Cada {C:attention}mano de póker{} gana", + "una cantidad base de {C:blue}fichas", + "multiplicadas por algunos {C:red}multi.", + }, + fh_3={ + "Consulta tus {C:attention}manos de póker", + "en el área de {C:attention}info{}", + "junto con otros datos", + "sobre la partida actual.", + }, + fh_4={ + "Las cartas también ganan", + "algunas {C:blue}fichas{},", + "coloca el cursor sobre ellas para ver.", + }, + fh_4_touch={ + "¡Las cartas también ganan", + "algunas {C:blue}fichas{},", + "mantenlas presionadas para ver!", + }, + fh_5={ + "Ahora selecciona hasta", + "{C:attention}5{} cartas para jugar", + "y pulsa {C:blue}Jugar mano.", + }, + fh_5_touch={ + "Ahora selecciona hasta", + "{C:attention}5{} cartas para jugar", + "y pulsa {C:blue}«Jugar mano»", + }, + fh_6={ + "También puedes {C:red}Descartar{} hasta", + "{C:attention}5{} cartas seleccionadas", + "para tratar de conseguir", + "manos mejores. ¡Inténtalo!", + }, + fh_7={ + "¡Cuidado! Solo tienes una", + "cantidad limitada de {C:blue}manos", + "y {C:red}descartes{} por ronda.", + }, + fh_8={ + "Gana {C:attention}300 fichas{} antes de", + "que se terminen las {C:blue}manos", + "para ganar esta ronda.", + "¡Buena suerte!", + }, + s_1={ + "¡Bien hecho! Ahora que tienes", + "{E:1}un poco{} de {C:money}dinero{},", + "puedes comprar cartas", + "nuevas en la {C:attention}tienda.", + }, + s_10={ + "Los {C:attention}vales{} se reabastecen", + "después de que derrotas", + "a la {C:attention}ciega jefe{}.", + }, + s_11={ + "No dejes de dar un vistazo", + "a los {C:booster}paquetes potenciadores{}", + "en cada tienda. ¡Están", + "llenos de sorpresas!", + }, + s_12={ + "Pasemos", + "a la {C:attention}ronda siguiente{}.", + }, + s_2={ + "Intenta comprar a este", + "pícaro apuesto.", + }, + s_2_touch={ + "¡Intenta comprar", + "a este apuesto pícaro!", + "Arrástralo desde la tienda", + "a la zona de {C:attention}«COMPRAR»{}", + }, + s_3={ + "Este es uno de los {C:attention}#1#", + "{C:attention}comodines{} que puedes agregar", + "a tu partida. Cada {C:attention}comodín", + "hace algo diferente.", + }, + s_4={ + "Este agrega {C:red}+4 multi{}", + "a cada mano jugada.", + }, + s_5={ + "Elige bien, solo puedes", + "tener {C:attention}5 comodines{}", + "al mismo tiempo.", + }, + s_6={ + "Ahora compra la otra", + "carta en la {C:attention}tienda.", + }, + s_7={ + "Esta carta de {C:tarot}tarot{} es", + "{C:attention}consumible{}.", + "Sirve para mejorar tus cartas", + "de juego. Cuídala bien.", + }, + s_8={ + "Puedes tener hasta", + "{C:attention}2 consumibles{}", + "al mismo tiempo.", + }, + s_9={ + "Si ahorras lo suficiente,", + "puedes comprar un {C:attention}vale{}.", + "Los {C:attention}vales{} mejoran", + "la partida de forma pasiva.", + }, + sb_1={ + "¡Hola! Me llamo", + "{C:attention}Jimbo{}, te enseñaré", + "a jugar.", + }, + sb_2={ + "Tu meta es ganar", + "{C:blue}fichas{} para derrotar", + "a la {C:attention}ciega enemiga", + }, + sb_3={ + "Esta es una {C:blue}ciega pequeña{},", + "solo debes ganar", + "{C:attention}300 fichas{} para derrotarla.", + }, + sb_4={ + "Elige la {C:blue}ciega pequeña", + "para comenzar la ronda.", + }, + sh_1={ + "Cuando consigas más cartas,", + "recuerda que puedes reordenarlas.", + "Los {C:attention}comodines{} se activan", + "de izquierda a derecha", + }, + sh_2={ + "Asegúrate de", + "{C:attention}USAR{} los consumibles.", + }, + sh_3={ + "Selecciona hasta {C:attention}2{} cartas", + "de tu mano y pulsa", + "{C:attention}USAR{} en la carta de {C:tarot}tarot{}", + "para mejorarlas.", + }, + sh_3_touch={ + "Selecciona hasta {C:attention}2{} cartas", + "de tu mano y arrastra la carta", + "de {C:tarot}tarot{} a la zona de {C:attention}«USAR»{}", + "para mejorarlas.", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Manos", + a_handsize="+#1# de tamaño de mano", + a_handsize_minus="Tamaño de mano -#1#", + a_mult="+#1# множ.", + a_mult_minus="Multi -#1#", + a_remaining="#1# restantes", + a_sold_tally="#1#/#2# vendidas", + a_xmult="X#1# multi", + a_xmult_minus="-X#1# multi", + ante_x_voucher="VALE DE APUESTA INICIAL #1#", + challenges_completed="Completaste #1#/#2# desafíos", + completed="Completaste #1#/#2#", + deck_preview_wheel_plural="Los números pueden ser inferiores debido a las cartas #1# que se sacan boca abajo", + deck_preview_wheel_singular="Las cantidades pueden ser inferiores debido a la carta #1# que se saca boca abajo", + interest="#1# de interés por cada #2# $ (#3# máx.)", + loyalty_active="¡Se activó!", + loyalty_inactive="#1# restantes", + ml_foil_desc={ + "Laminada", + "+#1# fichas", + }, + ml_holo_desc={ + "Holográfica", + "+#1# multi", + }, + ml_negative_consumable_desc={ + "Negativa", + "+#1# ranura de consumibles", + }, + ml_negative_desc={ + "Negativa", + "+#1# ranura de comodín", + }, + ml_polychrome_desc={ + "Polícroma", + "X#1# multi", + }, + remaining_discard_money="Descartes restantes (#1# $ cada uno)", + remaining_hand_money="Manos restantes (#1# $ cada una)", + unlocked="Desbloqueaste #1#/#2#", + }, + v_text={ + ch_c_all_eternal={ + "Todos los comodines en la tienda son {C:eternal}eternos{}", + }, + ch_c_chips_dollar_cap={ + "Las {C:blue}fichas{} no pueden superar {C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}¡Desafío diario!", + }, + ch_c_debuff_played_cards={ + "Todas las cartas {C:attention}jugadas{} quedan {C:attention}debilitadas{} cuando anotan puntos", + }, + ch_c_discard_cost={ + "Cada descarte cuesta {C:money}#1# ${}", + }, + ch_c_flipped_cards={ + "{C:green}1 en #1#{} cartas se sacan boca abajo", + }, + ch_c_inflation={ + "Eleva los precios en {C:money}1 ${} para cada compra de forma permanente", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Tienes {C:red}-1{} cartas en la mano por cada {C:money}#1# ${} que tengas", + }, + ch_c_no_extra_hand_money={ + "Las {C:blue}manos{} extra ya no ganan dinero", + }, + ch_c_no_interest={ + "No ganas {C:attention}interés{} al final de la ronda", + }, + ch_c_no_reward={ + "Ninguna {C:attention}ciega{} otorga dinero de recompensa", + }, + ch_c_no_reward_specific={ + "Las ciegas {C:attention}#1#{} no otorgan dinero de recompensa", + }, + ch_c_no_shop_jokers={ + "Los comodines ya no pueden aparecer en la {C:attention}tienda", + }, + ch_c_none={ + "{C:inactive}Ninguna", + }, + ch_c_set_eternal_ante={ + "Cuando derrotas al jefe de la apuesta inicial {C:attention}#1#{}, todos los comodines se vuelven {C:attention}eternos", + }, + ch_c_set_joker_slots_ante={ + "Cuando derrotas al jefe de la apuesta inicial {C:attention}#1#{}, todas las ranuras de comodín quedan en {C:attention}0", + }, + ch_c_set_seed={ + "1 intento con código establecido: {C:inactive}{Oculto}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} ranuras de consumibles", + }, + ch_m_discards={ + "{C:red}#1#{} descartes por ronda", + }, + ch_m_dollars={ + "Empieza con {C:money}#1# $", + }, + ch_m_hand_size={ + "{C:attention}#1#{} tamaño de mano", + }, + ch_m_hands={ + "{C:blue}#1#{} manos por ronda", + }, + ch_m_joker_slots={ + "{C:attention}#1# ranuras de {}comodín", + }, + ch_m_none={ + "{C:inactive}Ninguna", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/es_ES.lua b/src/localization/es_ES.lua new file mode 100644 index 0000000..5639881 --- /dev/null +++ b/src/localization/es_ES.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Baraja abandonada", + text={ + "Comienza la partida sin", + "ninguna carta de {C:attention}figura", + "en tu baraja", + }, + }, + b_anaglyph={ + name="Baraja anaglifo", + text={ + "Después de derrotar a cada", + "{C:attention}ciega jefe{}, gana 1", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Baraja negra", + text={ + "{C:attention}+#1#{} ranura(s) de comodín", + "", + "{C:blue}-#2#{} mano", + "en cada ronda", + }, + }, + b_blue={ + name="Baraja azul", + text={ + "{C:blue}+#1#{} mano", + "en cada ronda", + }, + }, + b_challenge={ + name="Baraja desafío", + text={ + "", + }, + }, + b_checkered={ + name="Baraja cuadriculada", + text={ + "Comienza la partida con", + "{C:attention}26{C:spades} picas{} y", + "{C:attention}26{C:hearts} corazones{} en la baraja", + }, + }, + b_erratic={ + name="Baraja errática", + text={ + "Todas las {C:attention}categorías{} y", + "los {C:attention}palos{} en la baraja", + "se aleatorizan", + }, + }, + b_ghost={ + name="Baraja fantasma", + text={ + "Las cartas {C:spectral}espectrales{} pueden", + "aparecer en la tienda,", + "comienza con una carta {C:spectral,T:c_hex}maleficio{}", + }, + }, + b_green={ + name="Baraja verde", + text={ + "Al final de cada ronda:", + "{C:money}$#1#{s:0.85} por {C:blue}mano restante", + "{C:money}$#2#{s:0.85} por {C:red}descarte restante", + "No ganas {C:attention}interés", + }, + }, + b_magic={ + name="Baraja mágica", + text={ + "Comienza la partida", + "con el vale {C:tarot,T:v_crystal_ball}#1#{}", + "y {C:attention}2{} copias", + "de {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Baraja nébula", + text={ + "Comienza la partida", + "con el vale {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} ranura de consumible", + }, + }, + b_painted={ + name="Baraja pintada", + text={ + "{C:attention}+#1#{} tamaño de mano", + "{C:red}#2#{} ranura de comodín", + }, + }, + b_plasma={ + name="Baraja plasmática", + text={ + "Equilibra las {C:blue}fichas{} y", + "el {C:red}multi{} cuando calcula", + "los puntos de cada mano jugada", + "{C:red}X#1#{} tamaño de ciegas base", + }, + }, + b_red={ + name="Baraja roja", + text={ + "{C:red}+#1#{} descarte", + "en cada ronda", + }, + }, + b_yellow={ + name="Baraja amarilla", + text={ + "Comienza con", + "{C:money}$#1# extra", + }, + }, + b_zodiac={ + name="Baraja del zodiaco", + text={ + "Comienza la partida con", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "y {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="El brazo", + text={ + "Disminuye el nivel", + "de la mano de póker jugada", + }, + }, + bl_big={ + name="Ciega grande", + text={ + }, + }, + bl_club={ + name="El garrote", + text={ + "Todos los tréboles", + "se debilitan", + }, + }, + bl_eye={ + name="El ojo", + text={ + "Los tipos de manos", + "no se repiten en esta ronda", + }, + }, + bl_final_acorn={ + name="Bellota ambarina", + text={ + "Voltea y mezcla", + "todos los comodines", + }, + }, + bl_final_bell={ + name="Campana cerúlea", + text={ + "Fuerza 1 carta", + "a que se seleccione siempre", + }, + }, + bl_final_heart={ + name="Corazón carmesí", + text={ + "Se inhabilita un comodín", + "al azar en cada mano", + }, + }, + bl_final_leaf={ + name="Hoja verde", + text={ + "Todas las cartas se debilitan", + "hasta que se venda 1 comodín", + }, + }, + bl_final_vessel={ + name="Contenedor violeta", + text={ + "Ciega muy grande", + }, + }, + bl_fish={ + name="El pez", + text={ + "Saca las cartas boca abajo", + "tras cada mano jugada", + }, + }, + bl_flint={ + name="El pedernal", + text={ + "Las fichas base y el multi", + "se dividen a la mitad", + }, + }, + bl_goad={ + name="La provocación", + text={ + "Todas las picas", + "se debilitan", + }, + }, + bl_head={ + name="La cabeza", + text={ + "Todos los corazones", + "se debilitan", + }, + }, + bl_hook={ + name="El garfio", + text={ + "Descarta 2 cartas al azar", + "por cada mano jugada", + }, + }, + bl_house={ + name="La casa", + text={ + "La primera mano", + "se saca boca abajo", + }, + }, + bl_manacle={ + name="El grillete", + text={ + "-1 de tamaño de mano", + }, + }, + bl_mark={ + name="La marca", + text={ + "Todas las cartas de figuras", + "boca abajo", + }, + }, + bl_mouth={ + name="La boca", + text={ + "Juega 1 solo tipo", + "de mano en esta ronda", + }, + }, + bl_needle={ + name="La aguja", + text={ + "Juega una sola mano", + }, + }, + bl_ox={ + name="El buey", + text={ + "Si se juega 1 #1#,", + "deja el dinero en $0", + }, + }, + bl_pillar={ + name="El pilar", + text={ + "Las cartas que se jugaron antes", + "en esta apuesta inicial se debilitan", + }, + }, + bl_plant={ + name="La planta", + text={ + "Todas las cartas de figuras", + "se debilitan", + }, + }, + bl_psychic={ + name="El psíquico", + text={ + "Debes jugar 5 cartas", + }, + }, + bl_serpent={ + name="La serpiente", + text={ + "Después de jugar o descartar,", + "siempre saca 3 cartas", + }, + }, + bl_small={ + name="Ciega pequeña", + text={ + }, + }, + bl_tooth={ + name="El diente", + text={ + "Pierde $1", + "por carta jugada", + }, + }, + bl_wall={ + name="El muro", + text={ + "Ciega extra grande", + }, + }, + bl_water={ + name="El agua", + text={ + "Comienza con", + "0 descartes", + }, + }, + bl_wheel={ + name="La rueda", + text={ + " en 7 cartas se saca", + "boca abajo", + }, + }, + bl_window={ + name="La ventana", + text={ + "Todos los diamantes", + "se debilitan", + }, + }, + }, + Edition={ + e_base={ + name="Base", + text={ + "Sin efectos adicionales", + }, + }, + e_foil={ + name="Laminada", + text={ + "{C:chips}+#1#{} fichas", + }, + }, + e_holo={ + name="Holográfica", + text={ + "Multi {C:mult}+#1#{}", + }, + }, + e_negative={ + name="Negativa", + text={ + "{C:dark_edition}+#1#{} ranura de comodín", + }, + }, + e_negative_consumable={ + name="Negativa", + text={ + "{C:dark_edition}+#1#{} ranura de consumible", + }, + }, + e_polychrome={ + name="Polícroma", + text={ + "Multi {X:mult,C:white} X#1#{}", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Carta adicional", + text={ + }, + }, + m_glass={ + name="Carta de vidrio", + text={ + "{X:mult,C:white} X#1# {} multi", + "Probabilidad de {C:green}#2# entre #3#{}", + "de que la carta se destruya", + }, + }, + m_gold={ + name="Carta de oro", + text={ + "{C:money}$#1#{} si esta", + "carta está en tu mano", + "al final de la ronda", + }, + }, + m_lucky={ + name="Carta de la suerte", + text={ + "{C:green}#1# en #3#{} probabilidades", + "de {C:mult}+#2#{} multi", + "{C:green}#1# en #5#{} probabilidades", + "de ganar {C:money}$#4#", + }, + }, + m_mult={ + name="Carta multi", + text={ + "{C:mult}+#1#{} multi", + }, + }, + m_steel={ + name="Carta de acero", + text={ + "{X:mult,C:white} X#1# {} multi", + "mientras esta carta", + "esté en tu mano", + }, + }, + m_stone={ + name="Carta de piedra", + text={ + "{C:chips}+#1#{} fichas", + "sin categoría ni palo", + }, + }, + m_wild={ + name="Carta versátil", + text={ + "Puede usarse", + "como cualquier palo", + }, + }, + }, + Joker={ + j_8_ball={ + name="Bola 8", + text={ + "{C:green}#1# de #2#{} probabilidades por cada", + "{C:attention}8{} jugado de crear una carta", + "de {C:tarot}tarot{} al puntuar", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_abstract={ + name="Comodín abstracto", + text={ + "{C:mult}+#1#{} multi por cada", + "carta de {C:attention}comodín{}", + "{C:inactive}(Actual: multi {C:red}+#2#{C:inactive})", + }, + }, + j_acrobat={ + name="Acróbata", + text={ + "{X:red,C:white} X#1# {} multi en la {C:attention}última", + "{C:attention}mano{} de la ronda", + }, + unlock={ + "Juega {C:attention,E:1}#1#{} manos", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Comodín antiguo", + text={ + "Cada carta jugada con el palo", + "{V:1}#2#{} otorga", + "multi {X:mult,C:white} X#1# {} cuando anota,", + "{s:0.8}el palo cambia al final de la ronda", + }, + }, + j_arrowhead={ + name="Punta de flecha", + text={ + "{C:chips}+#1#{} fichas por cada", + "carta jugada con el palo", + "de {C:spades}picas{} cuando anota", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja", + }, + }, + j_astronomer={ + name="Astrónomo", + text={ + "Todas las cartas de {C:planet}planeta{} y", + "{C:planet}paquetes celestiales{C:attention} en", + "la tienda son {C:attention}gratis", + }, + unlock={ + "Descubre todas", + "las cartas de{E:1,C:planet}planeta{}", + }, + }, + j_banner={ + name="Estandarte", + text={ + "{C:chips}+#1#{} fichas", + "por cada", + "{C:attention}descarte restante", + }, + }, + j_baron={ + name="Barón", + text={ + "Cada {C:attention}rey{}", + "en tu mano", + "otorga multi {X:mult,C:white} X#1# {}", + }, + }, + j_baseball={ + name="Carta de béisbol", + text={ + "Cada comodín {C:green}inusual{}", + "otorga multi {X:mult,C:white} X#1# {}", + }, + }, + j_blackboard={ + name="Pizarrón", + text={ + "{X:red,C:white} X#1# {} multi si todas", + "las cartas en tu mano", + "son {C:spades}#2#{} o {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Heliotropo", + text={ + "{C:green}#1# en #2#{} probabilidades de que", + "las cartas jugadas con el palo", + "de {C:hearts}corazones{} otorguen", + "multi {X:mult,C:white} X#3# {} cuando anotan,", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja", + }, + }, + j_blue_joker={ + name="Comodín azul", + text={ + "{C:chips}+#1#{} fichas por cada", + "carta restante en la {C:attention}baraja", + "{C:inactive}(Actual {C:chips}+#2#{C:inactive} fichas)", + }, + }, + j_blueprint={ + name="Plano", + text={ + "Copia la habilidad del", + "{C:attention}comodín{} de la derecha", + }, + unlock={ + "Gana una partida", + }, + }, + j_bootstraps={ + name="Botas", + text={ + "{C:mult}+#1#{} de multi por cada", + "{C:money}#2#${} que tengas", + "{C:inactive}(Actual: {C:mult}+#3#{C:inactive} de multi)", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "comodines {C:dark_edition}polícromos{}", + }, + }, + j_brainstorm={ + name="Lluvia de ideas", + text={ + "Copia la habilidad del", + "{C:attention}comodín del extremo izquierdo", + }, + unlock={ + "Descarta una", + "{E:1,C:attention}Escalera real", + }, + }, + j_bull={ + name="Toro", + text={ + "{C:chips}+#1#{} fichas", + "por cada {C:money}1${} que tengas", + "{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)", + }, + }, + j_burglar={ + name="Ladrón", + text={ + "Cuando se selecciona la {C:attention}ciega{},", + "gana {C:blue}+#1#{} manos y", + "{C:attention}pierde todos los descartes", + }, + }, + j_burnt={ + name="Comodín quemado", + text={ + "Aumenta el nivel de", + "la primera mano de póker {C:attention}descartada", + "en cada ronda", + }, + unlock={ + "Vende un total", + "de {E:1,C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Tarjeta de presentación", + text={ + "Las cartas de {C:attention}figuras{} tienen", + "{C:green}#1# en #2#{} probabilidades", + "de otorgar {C:money}$2{} cuando anotan", + }, + }, + j_caino={ + name="Canio", + text={ + "Este comodín consigue un multi {X:mult,C:white}x#1#{}", + "cuando una carta de {C:attention}figura{}", + "queda destruida", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_campfire={ + name="Fogata", + text={ + "Este comodín gana multi {X:mult,C:white}X#1#{}", + "por cada carta {C:attention}vendida{}, se restablece", + "cuando se derrota a la {C:attention}ciega jefe{}", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_card_sharp={ + name="Fullero", + text={ + "{X:mult,C:white} X#1#{} multi si ya", + "se jugó la {C:attention}mano de póker{}", + "en esta ronda", + }, + }, + j_cartomancer={ + name="Cartomante", + text={ + "Genera una carta de {C:tarot}tarot{}", + "cuando se selecciona la {C:attention}ciega{},", + "{C:inactive}(Debe haber espacio)", + }, + unlock={ + "Descubre cada", + "carta de {E:1,C:tarot}tarot{}", + }, + }, + j_castle={ + name="Castillo", + text={ + "Este comodín gana {C:chips}+#1#{} fichas", + "por carta {V:1}#2#{} descartada,", + "el palo cambia en cada ronda", + "{C:inactive}(Actual {C:chips}+#3#{C:inactive} fichas)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "{X:mult,C:white} X#1# {} multi", + "{C:green}#2# en #3#{} probabilidades", + "de que la carta se destruya", + "al final de la ronda", + }, + }, + j_ceremonial={ + name="Daga ceremonial", + text={ + "Cuando se selecciona la {C:attention}ciega{},", + "destruye al comodín de la derecha", + "y agrega para siempre el {C:attention}doble", + "de valor de venta a este {C:red}multi", + "{C:inactive}(Actual {C:mult}+#1#{C:inactive} multi)", + }, + }, + j_certificate={ + name="Certificado", + text={ + "Al comienzo de la ronda,", + "añade una {C:attention}carta{}", + "{C:attention}de juego{} al azar con", + "un {C:attention}sello{} al azar a tu mano", + }, + unlock={ + "Debes tener una carta", + "de oro", + "con un {C:attention,E:1}Sello de oro", + }, + }, + j_chaos={ + name="Caos el payaso", + text={ + "{C:attention}#1#{} {C:green}cambios gratuitos", + "por tienda", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Inhabilita el efecto de", + "cada {C:attention}ciega jefe", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_clever={ + name="Comodín astuto", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_cloud_9={ + name="La 9º puerta", + text={ + "Gana {C:money}$#1#{} por cada", + "{C:attention}9{} en tu {C:attention}baraja completa", + "al final de la ronda", + "{C:inactive}(Actual {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="Constelación", + text={ + "Este comodín consigue", + "un multi {X:mult,C:white}x#1#{} cada vez", + "que se use una carta de {C:planet}planeta{}", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + }, + j_crafty={ + name="Comodín mañoso", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_crazy={ + name="Comodín loco", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + j_credit_card={ + name="Tarjeta de crédito", + text={ + "Adquiere hasta", + "{C:red}-$#1#{} de deuda", + }, + }, + j_delayed_grat={ + name="Satisfacción retrasada", + text={ + "Gana {C:money}$#1#{} por {C:attention}descarte{}", + "si no se usó ninguno", + "al final de la ronda", + }, + }, + j_devious={ + name="Comodín ladino", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_diet_cola={ + name="Cola sin azucar", + text={ + "Vende esta carta", + "para crear 1 {C:attention}#1#", + "gratis", + }, + }, + j_dna={ + name="ADN", + text={ + "Si la {C:attention}primera mano{} de la ronda", + "tiene solo {C:attention}1{} carta, se agrega", + "una copia permanente a la baraja", + "y se saca a la {C:attention}mano", + }, + }, + j_drivers_license={ + name="Permiso de conducir", + text={ + "{X:mult,C:white} X#1# {} multi si", + "tienes al menos {C:attention}16", + "cartas mejoradas", + "{C:inactive}(Actual {C:attention}#2#{C:inactive})", + }, + unlock={ + "Mejora {E:1,C:attention}#1#{} cartas", + "en tu baraja", + }, + }, + j_droll={ + name="Comodín gracioso", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + j_drunkard={ + name="Borracho", + text={ + "{C:red}+#1#{} descarte", + "en cada ronda", + }, + }, + j_duo={ + name="El dúo", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Atardecer", + text={ + "Reactiva todas las", + "cartas de puntos en la {C:attention}última", + "{C:attention}mano{} de la ronda", + }, + }, + j_egg={ + name="Huevo", + text={ + "Gana {C:money}$#1#{}", + "del {C:attention}valor de venta{}", + "al final de la ronda", + }, + }, + j_erosion={ + name="Erosión", + text={ + "Multi {C:red}+#1#{} por cada", + "carta debajo de {C:attention}#3#{}", + "en la baraja completa", + "{C:inactive}(Actual: multi {C:red}+#2#{C:inactive})", + }, + }, + j_even_steven={ + name="Pares", + text={ + "{C:mult}+#1#{} multi por cada", + "carta de categoría {C:attention}par{}", + "cuando anota", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Comodín sin cara", + text={ + "Gana {C:money}$#1#{} si {C:attention}#2#{}", + "o más {C:attention}cartas de figuras{}", + "se descartan", + "al mismo tiempo", + }, + }, + j_family={ + name="La familia", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "{C:mult}+#1#{} multi por cada", + "{C:attention}as{}, {C:attention}2{}, {C:attention}3{}, {C:attention}5{}, u {C:attention}8{}", + "cuando anotan", + }, + }, + j_flash={ + name="Carta sorpresa", + text={ + "Este comodín consigue {C:mult}+#1#{} de multi", + "por cada {C:attention}renovación{} de la tienda", + "{C:inactive}(Actual: {C:mult}+#2#{C:inactive} de multi)", + }, + }, + j_flower_pot={ + name="Florero", + text={ + "Multi {X:mult,C:white}x#1#{} si la mano", + "de póker contiene una carta", + "de {C:diamonds}diamantes{}, de {C:clubs}tréboles{},", + "de {C:hearts}corazones{} y de {C:spades}picas{}", + }, + unlock={ + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Adivino", + text={ + "{C:red}+#1#{} multi por cada", + "carta de {C:purple}tarot{} usada", + "{C:inactive}(Actual {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Cuatro dedos", + text={ + "Los {C:attention}colores{}", + "y las {C:attention}escaleras{} pueden", + "hacerse con {C:attention}4{} cartas", + }, + }, + j_gift={ + name="Carta de regalo", + text={ + "Agrega {C:money}$#1#{} del {C:attention}valor de venta", + "a cada {C:attention}comodín{} y", + "carta {C:attention}consumible{}", + "al final de la ronda", + }, + }, + j_glass={ + name="Comodín de vidrio", + text={ + "Este comodín consigue un multi {X:mult,C:white}x#1#{}", + "por cada {C:attention}carta de vidrio", + "que se destruya", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} en", + "tu baraja", + }, + }, + j_gluttenous_joker={ + name="Comodín glotón", + text={ + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:clubs}#2#{} cuando anota", + }, + }, + j_golden={ + name="Comodín dorado", + text={ + "Gana {C:money}$#1#{}", + "al final de la ronda", + }, + }, + j_greedy_joker={ + name="Comodín codicioso", + text={ + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:diamonds}#2#{} cuando anota", + }, + }, + j_green_joker={ + name="Comodín verde", + text={ + "{C:mult}+#1#{} multi por mano jugada", + "{C:mult}-#2#{} multi por descarte", + "{C:inactive}(Actual {C:mult}+#3#{C:inactive} multi)", + }, + }, + j_gros_michel={ + name="Banano", + text={ + "{C:mult}+#1#{} multi", + "{C:green}#2# en #3#{} probabilidades", + "de que la carta se destruya", + "al final de la ronda", + }, + }, + j_hack={ + name="Comediante", + text={ + "Reactiva", + "todas las cartas", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} y {C:attention}5{} cuando se juegan", + }, + }, + j_half={ + name="Medio comodín", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "{C:attention}#2#{} o menos cartas", + }, + }, + j_hallucination={ + name="Alucinación", + text={ + "{C:green}#1# en #2#{} probabilidades de crear", + "una carta de {C:tarot}tarot{} cuando se abre", + "cualquier {C:attention}paquete potenciador{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_hanging_chad={ + name="Papel perforado", + text={ + "Reactiva la {C:attention}primera{} carta", + "jugada que uses para puntuar", + "{C:attention}#1#{} veces más", + }, + unlock={ + "Derrota a una ciega jefe", + "con 1 {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Senderista", + text={ + "Cada {C:attention}carta{} jugada", + "otorga de forma permanente", + "{C:chips}+#1#{} fichas cuando anota", + }, + }, + j_hit_the_road={ + name="Al camino", + text={ + "Este comodín consigue un multi {X:mult,C:white}x#1#{}", + "por cada {C:attention}jota{}", + "que se descarte en esta ronda", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + unlock={ + "Descarta {E:1,C:attention}5", + "{E:1,C:attention}jotas{}", + "al mismo tiempo", + }, + }, + j_hologram={ + name="Holograma", + text={ + "Este comodín consigue un multi {X:mult,C:white}x#1#{} cada vez", + "que se añada una {C:attention}carta de juego{}", + "a tu baraja", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + }, + j_ice_cream={ + name="Helado", + text={ + "{C:chips}+#1#{} fichas", + "{C:chips}-#2#{} fichas por", + "cada mano jugada", + }, + }, + j_idol={ + name="El ídolo", + text={ + "{X:mult,C:white} X#1# {} multi por cada", + "{C:attention}#2# de {V:1}#3#{}", + "cuando anota,", + "la {s:0.8}carta cambia en cada ronda", + }, + unlock={ + "En una mano,", + "gana al menos", + "{E:1,C:attention}+#1#{} fichas", + }, + }, + j_invisible={ + name="Comodín invisible", + text={ + "Después de {C:attention}#1#{} rondas,", + "vende esta carta para", + "{C:attention}duplicar{} un comodín aleatorio", + "{C:inactive}(actual {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Gana una partida sin", + "haber tenido más de", + "{E:1,C:attention}4 comodines{}", + }, + }, + j_joker={ + name="Comodín", + text={ + "{C:red,s:1.1}+#1#{} multi", + }, + }, + j_jolly={ + name="Comodín contento", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + j_juggler={ + name="Malabarista", + text={ + "{C:attention}+#1#{} tamaño de mano", + }, + }, + j_loyalty_card={ + name="Tarjeta de fidelización", + text={ + "{X:red,C:white} X#1# {} multi cada", + "{C:attention}#2#{} manos jugadas", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Vende esta carta", + "para desactivar", + "la {C:attention}ciega jefe{} actual", + }, + }, + j_lucky_cat={ + name="Gato de la suerte", + text={ + "Este comodín consigue un multi {X:mult,C:white}x#1#{} cada vez", + "que se active una carta de la {C:attention}suerte{}", + "{C:green}con éxito{}", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + }, + j_lusty_joker={ + name="Comodín lujurioso", + text={ + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:hearts}#2#{} cuando anota", + }, + }, + j_mad={ + name="Comodín demente", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + j_madness={ + name="Locura", + text={ + "Al seleccionar una {C:attention}ciega pequeña{} o", + "{C:attention}grande{}, consigues un multi {X:mult,C:white}x#1#{}", + "y {C:attention}destruyes{} un comodín al azar", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + }, + j_mail={ + name="Reembolso por correo", + text={ + "Gana {C:money}$#1#{} por cada", + "{C:attention}#2#{} que descartes, la categoría", + "cambia en cada ronda", + }, + }, + j_marble={ + name="Comodín de mármol", + text={ + "Agrega una carta de {C:attention}piedra{}", + "a tu baraja al", + "seleccionar la {C:attention}ciega{}", + }, + }, + j_matador={ + name="Torero", + text={ + "Gana {C:money}$#1#{} si la mano", + "jugada activa la", + "habilidad de {C:attention}ciega jefe{}", + }, + unlock={ + "Derrota a una ciega jefe", + "en {E:1,C:attention}1 mano{} sin usar", + "ningún descarte", + }, + }, + j_merry_andy={ + name="Loco por el circo", + text={ + "{C:red}+#1#{} descartes", + "en cada ronda,", + "{C:red}#2#{} de tamaño de mano", + }, + unlock={ + "Gana una partida en {E:1,C:attention}#1#", + "rondas o menos", + }, + }, + j_midas_mask={ + name="Máscara de Midas", + text={ + "Todas las cartas de {C:attention}figuras{} jugadas", + "se convierten en cartas de {C:attention}oro{}", + "al puntuar", + }, + }, + j_mime={ + name="Mimo", + text={ + "Reactiva todas", + "las habilidades de las cartas", + "{C:attention}en {C:attention}la mano{}", + }, + }, + j_misprint={ + name="Error de imprenta", + text={ + "", + }, + }, + j_mr_bones={ + name="Sr. Huesos", + text={ + "Evita la muerte", + "si las fichas obtenidas son", + "al menos un {C:attention}25 %", + "de lo requerido,", + "se {S:1.1,C:red,E:2}autodestruye{}", + }, + unlock={ + "Pierde {C:attention,E:1}#1#{} partidas", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Cumbre mística", + text={ + "{C:mult}+#1#{} multi cuando hay", + "{C:attention}+#2#{} descartes", + "restantes", + }, + }, + j_obelisk={ + name="Obelisco", + text={ + "El comodín consigue un multi {X:mult,C:white}x#1#{}", + "por cada mano {C:attention}consecutiva{} jugada", + "sin usar tu {C:attention}mano de póker", + "que hayas jugado más", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + }, + j_odd_todd={ + name="Nones", + text={ + "{C:chips}+#1#{} fichas por cada", + "carta de categoría {C:attention}impar{}", + "cuando anota", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Ágata ónix", + text={ + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:clubs}tréboles{} cuando anota", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja", + }, + }, + j_oops={ + name="Solo seises", + text={ + "Duplica la {C:attention}lista de", + "las {C:green,E:1,S:1.1}probabilidades", + "{C:inactive}(ejemplo: {C:green}1 de cada 3{C:inactive} -> {C:green}2 de cada 3{C:inactive})", + }, + unlock={ + "En una mano,", + "gana al menos", + "{E:1,C:attention}+#1#{} fichas", + }, + }, + j_order={ + name="La orden", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Pareidolia", + text={ + "Todas las cartas", + "se consideran", + "de {C:attention}figuras{}", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Genera una copia {C:dark_edition}negativa{} de", + "{C:attention}1{} carta {C:attention}consumible{} al azar", + "que tengas", + "al final de la {C:attention}tienda", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_photograph={ + name="Fotografía", + text={ + "{X:mult,C:white} X#1# {} multi para", + "la primera carta de {C:attention}figura{}", + "cuando anota", + }, + }, + j_popcorn={ + name="Palomitas de maíz", + text={ + "Multi {C:mult}+#1#{}", + "Multi {C:mult}-#2#{} por cada", + "ronda jugada", + }, + }, + j_raised_fist={ + name="Puño en alto", + text={ + "Añade el {C:attention}doble{} de la categoría", + "de la carta con la categoría {C:attention}más baja{}", + "que tengas en la mano al multi", + }, + }, + j_ramen={ + name="Ramen", + text={ + "Multi {X:mult,C:white} X#1# {},", + "pierde multi {X:mult,C:white} X#2# {}", + "por cada {C:attention}carta{} descartada", + }, + }, + j_red_card={ + name="Tarjeta roja", + text={ + "Este comodín consigue", + "{C:red}+#1#{} de multi cuando te saltes", + "un {C:attention}paquete potenciador{}", + "{C:inactive}(Actual: {C:red}+#2#{C:inactive} de multi)", + }, + }, + j_reserved_parking={ + name="Estacionamiento reservado", + text={ + "Cada carta de {C:attention}figura{}", + "en tu mano tiene", + "una probabilidad de {C:green}#2# en #3#{}", + "de otorgar {C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="Al autobús", + text={ + "Este comodín consigue {C:mult}+#1#{} de multi", + "por cada mano {C:attention}consecutiva{}", + "que se haya jugado", + "sin una carta de {C:attention}figura{} que puntúe", + "{C:inactive}(Actual: {C:mult}+#2#{C:inactive} de multi)", + }, + }, + j_riff_raff={ + name="Gentuza", + text={ + "Cuando se selecciona la {C:attention}ciega{},", + "crea {C:attention}#1# {C:attention} comodines {C:blue}comunes", + "{C:inactive}(Debes tener espacio)", + }, + }, + j_ring_master={ + name="Jefe de pista", + text={ + "Las cartas de {C:attention}comodines{}, {C:tarot}tarot{}, {C:planet}planeta{}", + "y {C:spectral}espectrales{} pueden aparecen", + "varias veces", + }, + unlock={ + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Cohete", + text={ + "Gana {C:money}#1#${}al final de la ronda", + "El pago aumenta en {C:money}#2#${}", + "al derrotar a la {C:attention}ciega jefe{}", + }, + }, + j_rough_gem={ + name="Gema en bruto", + text={ + "{C:money}$#1#{} por cada", + "carta jugada con el palo", + "de {C:diamonds}diamantes{} cuando anota", + }, + unlock={ + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja", + }, + }, + j_runner={ + name="Corredor", + text={ + "{C:chips}+#2#{} fichas", + "si la mano jugada", + "contiene una {C:attention}escalera{}", + "{C:inactive}(Actual {C:chips}+#1#{C:inactive} fichas)", + }, + }, + j_satellite={ + name="Satélite", + text={ + "Gana {C:money}$#1#{} al final de", + "la ronda por cada carta de {C:planet}planeta", + "única usada en esta partida", + "{C:inactive}(Actual {C:money}$#2#{C:inactive})", + }, + unlock={ + "Debes tener {E:1,C:money}$#1#", + "o más", + }, + }, + j_scary_face={ + name="Cara aterradora", + text={ + "Las cartas de {C:attention}figuras{}", + "otorgan {C:chips}+#1#{} fichas", + "cuando anotan", + }, + }, + j_scholar={ + name="Erudito", + text={ + "Cada {C:attention}as{} otorga", + "{C:chips}+#2#{} fichas", + "y {C:mult}+#1#{} multi", + "cuando anota", + }, + }, + j_seance={ + name="Espiritismo", + text={ + "Si {C:attention}la mano de póker{} es una", + "{C:attention}#1#{}, genera una", + "carta {C:spectral}espectral{} al azar", + "{C:inactive}(Debes tener espacio)", + }, + }, + j_seeing_double={ + name="Visión doble", + text={ + "{X:mult,C:white} X#1# {} multi si", + "la mano jugada tiene", + "una carta de {C:clubs}tréboles{} y una carta", + "de cualquier otro {C:attention}palo que anota", + }, + unlock={ + "Juega una mano", + "que contenga", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Agua con gas", + text={ + "Reactiva todas", + "las cartas jugadas", + "por las próximas {C:attention}#1#{} manos", + }, + }, + j_shoot_the_moon={ + name="Disparo a la luna", + text={ + "Cada {C:attention}reina{}", + "que tengas en la mano", + "otorga {C:mult}+#1#{} de multi", + }, + unlock={ + "Juega todos los {E:1,C:attention}corazones", + "en tu baraja en", + "una sola ronda", + }, + }, + j_shortcut={ + name="Atajo", + text={ + "Permite que las {C:attention}escaleras{}", + "se hagan con saltos de {C:attention}1 categoría", + "{C:inactive}(ej: {C:attention}10, 8, 6, 5 y 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Sexto sentido", + text={ + "Si la {C:attention}primera mano{} de la ronda es", + "un solo {C:attention}6{}, destrúyela y", + "genera una carta {C:spectral}espectral{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_sly={ + name="Comodín artero", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_smeared={ + name="Comodín borroso", + text={ + "{C:hearts}corazones{} y {C:diamonds}diamantes", + "cuentan como un mismo palo,", + "{C:spades}picas{} y {C:clubs}tréboles", + "cuentan como un mismo palo,", + }, + unlock={ + "Debes tener al menos {C:attention}#1#", + "{E:1,C:attention}#2#{} en", + "tu baraja", + }, + }, + j_smiley={ + name="Cara sonriente", + text={ + "Las cartas de {C:attention}figuras{} jugadas", + "otorgan multi {C:mult}+#1#{}", + "cuando anotan", + }, + }, + j_sock_and_buskin={ + name="Tragicomedia", + text={ + "Reactiva todas", + "las cartas de {C:attention}figuras{} jugadas", + }, + unlock={ + "Juega un total de", + "{C:attention,E:1}#1#{} cartas de figuras", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Comodín espacial", + text={ + "{C:green}#1# en #2#{} probabilidades de", + "aumento de nivel", + "de la {C:attention}mano de póker{} jugada", + }, + }, + j_splash={ + name="Salpicadura", + text={ + "Cada {C:attention}carta jugada", + "cuenta para la puntuación", + }, + }, + j_square={ + name="Comodín cuadriculado", + text={ + "Este comodín consigue {C:chips}+#2#{} fichas", + "si la mano jugada tiene", + "{C:attention}4{} cartas justas", + "{C:inactive}(Actual: {C:chips}#1#{C:inactive} fichas)", + }, + }, + j_steel_joker={ + name="Comodín de acero", + text={ + "Otorga un multi {X:mult,C:white}x#1#{}", + "por cada {C:attention}carta de acero", + "en la {C:attention}baraja completa", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + }, + j_stencil={ + name="Plantilla de comodín", + text={ + "{X:red,C:white} X1 {} multi por cada", + "ranura de {C:attention}comodín{} vacía", + "{s:0.8}Plantilla de comodín incluida", + "{C:inactive}(Actual {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Comodín de piedra", + text={ + "Otorga {C:chips}+#1#{} fichas por", + "cada {C:attention}carta de piedra", + "en la {C:attention}baraja completa", + "{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)", + }, + }, + j_stuntman={ + name="Doble de riesgo", + text={ + "{C:chips}+#1#{} fichas,", + "{C:attention}-#2#{} tamaño de mano", + }, + unlock={ + "En una mano,", + "gana al menos", + "{E:1,C:attention}#1#{} fichas", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Añade al multi el número de veces", + "que se haya jugado una {C:attention}mano de póker{}", + "en esta partida", + }, + }, + j_superposition={ + name="Superposición", + text={ + "Si la mano de póker contiene", + "un {C:attention}as{} y una {C:attention}escalera{},", + "genera una carta de {C:tarot}tarot{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + j_swashbuckler={ + name="Aventurero", + text={ + "Añade el valor de venta al multi", + "de todos los ", + "{C:attention}comodines{} que tengas", + "{C:inactive}(Actual: {C:mult}+#1#{C:inactive} de multi)", + }, + unlock={ + "Vende un total de", + "{C:attention,E:1}#1#{} cartas de comodín", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Retro", + text={ + "Gana {X:mult,C:white} X#1# {} multi por cada", + "{C:attention}ciega{} omitida en esta partida", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)", + }, + unlock={ + "Continúa una partida guardada", + "del menú principal", + }, + }, + j_ticket={ + name="Billete dorado", + text={ + "Las cartas de {C:attention}oro{} jugadas", + "ganan {C:money}#1#${} cuando anotan", + }, + unlock={ + "Juega una mano de 5 cartas", + "que contiene solo", + "cartas de {C:attention,E:1}oro{}", + }, + }, + j_to_the_moon={ + name="Hasta la luna", + text={ + "Gana {C:money}$#1#{} extra", + "de {C:attention}interés{} por cada {C:money}$5{}", + "que tengas al final de la ronda", + }, + }, + j_todo_list={ + name="Lista de tareas", + text={ + "Gana {C:money}#1#${} si la {C:attention}mano de póker{}", + "es un {C:attention}#2#{}.", + "La mano de póker cambia", + "al final de la ronda", + }, + }, + j_trading={ + name="Carta de colección", + text={ + "Si el {C:attention}primer descarte{} de la ronda", + "tiene solo {C:attention}1{} carta, destrúyela", + "y gana {C:money}$#1#", + }, + }, + j_tribe={ + name="La tribu", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "Los {C:attention}reyes{} y las", + "{C:attention}reinas{} jugados otorgan", + "multi {X:mult,C:white} X#1# {} cuando anotan,", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_trio={ + name="El trío", + text={ + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + unlock={ + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Trovador", + text={ + "Sujeta {C:attention}+#1#{} cartas en la mano,", + "{C:blue}-#2#{} de mano en cada ronda", + }, + unlock={ + "Gana {C:attention,E:1}#1#{} rondas", + "consecutivas al jugar", + "1 sola mano", + }, + }, + j_trousers={ + name="Pantalones de repuesto", + text={ + "Este comodín consigue {C:mult}+#1#{} de multi", + "si la mano jugada contiene", + "{C:attention}#2#", + "{C:inactive}(Actual: {C:red}+#3#{C:inactive} de multi)", + }, + }, + j_turtle_bean={ + name="Habichuela negra", + text={ + "Sujeta {C:attention}+#1#{} cartas en la mano,", + "se reduce", + "en {C:red}#2#{} en cada ronda", + }, + }, + j_vagabond={ + name="Vagabundo", + text={ + "Crea una carta de {C:purple}tarot{}", + "si se juega una mano", + "con {C:money}$#1#{} o menos", + }, + }, + j_vampire={ + name="Vampiro", + text={ + "Este comodín consigue un multi {X:mult,C:white}x#1#{}", + "por cada {C:attention}carta mejorada{}que puntúe en juego", + "y elimina la {C:attention}mejora de la carta", + "{C:inactive}(Actual: multi {X:mult,C:white}x#2# {C:inactive})", + }, + }, + j_walkie_talkie={ + name="Walkie-talkie", + text={ + "Cada {C:attention}10{} o {C:attention}4{}", + "jugado otorga {C:chips}+#1#{} fichas", + "y multi {C:mult}+#2#{} cuando anota", + }, + }, + j_wee={ + name="Comodín pequeño", + text={ + "Este comodín otorga", + "{C:chips}+#2#{} fichas si", + "anota cada {C:attention}2{} que se juega", + "{C:inactive}(Actual {C:chips}+#1#{C:inactive} fichas)", + }, + unlock={ + "Gana una partida en {E:1,C:attention}#1#", + "rondas o menos", + }, + }, + j_wily={ + name="Comodín taimado", + text={ + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Comodín irascible", + text={ + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:spades}#2#{} cuando anota", + }, + }, + j_yorick={ + name="Yorick", + text={ + "Este comodín consigue", + "un multi {X:mult,C:white}x#1#{} por cada", + "{C:attention}#2#{C:inactive} [#3#]{}cartas que descartes", + "{C:inactive}(Actual: multi {X:mult,C:white}x#4# {C:inactive})", + }, + unlock={ + "{E:1,s:1.3}¿?", + }, + }, + j_zany={ + name="Comodín chiflado", + text={ + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Sticker negro", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}negro{}", + }, + }, + blue_seal={ + name="Sello azul", + text={ + "Crea la carta de {C:planet}planeta{}", + "para la última {C:attention}mano de póker{} jugada", + "de la ronda si la {C:attention}tienes{} en la mano", + "{C:inactive}(Debe haber espacio)", + }, + }, + blue_sticker={ + name="Sticker azul", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}azul{}", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} fichas", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1# fichas{} extra", + }, + }, + challenge_locked={ + name="Bloqueada", + text={ + "Gana una partida con al menos", + "#1# barajas diferentes para desbloquear", + "Modo desafío", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Debilitada", + text={ + "Todas las habilidades", + "están inhabilitadas", + }, + }, + debuffed_playing_card={ + name="Debilitada", + text={ + "No gana ninguna ficha", + "y todas las habilidades", + "están inhabilitadas", + }, + }, + deck_locked_discover={ + name="Bloqueada", + text={ + "Descubre al menos", + "{C:attention}#1#{} objetos de", + "tu colección", + }, + }, + deck_locked_stake={ + name="Bloqueada", + text={ + "Gana una partida con cualquier", + "baraja en al menos", + "dificultad {V:1}#1#{}", + }, + }, + deck_locked_win={ + name="Bloqueada", + text={ + "Gana una partida", + "con {C:attention}#1#{}", + "en cualquier dificultad", + }, + }, + demo_locked={ + name="Bloqueada", + text={ + "No está disponible", + "en esta demo", + }, + }, + demo_shop_locked={ + name="Bloqueada", + text={ + "Carta de la colección personal", + "de {C:attention}Jimbo, ", + "disponible en la versión", + "completa de {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Eterno", + text={ + "No se puede vender", + "ni destruir", + }, + }, + gold_seal={ + name="Sello de oro", + text={ + "Gana {C:money}$3{} cuando", + "se juega esta carta", + "y anota", + }, + }, + gold_sticker={ + name="Sticker de oro", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}de oro{}", + }, + }, + green_sticker={ + name="Sticker verde", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}verde{}", + }, + }, + joker_locked_legendary={ + name="Bloqueada", + text={ + "Encuentra este comodín", + "en la carta {C:spectral}El alma{}", + }, + }, + locked={ + name="Bloqueada", + text={ + }, + }, + orange_sticker={ + name="Sticker naranja", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}naranja{}", + }, + }, + p_arcana_jumbo={ + name="Paquete arcano jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{}", + "para usar de inmediato", + }, + }, + p_arcana_mega={ + name="Paquete arcano mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{}", + "parausar de inmediato", + }, + }, + p_arcana_normal={ + name="Paquete arcano", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{} para", + "usar de inmediato", + }, + }, + p_buffoon_jumbo={ + name="Paquete de bufón jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}", + }, + }, + p_buffoon_mega={ + name="Paquete de bufón mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}", + }, + }, + p_buffoon_normal={ + name="Paquete de bufón", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}", + }, + }, + p_celestial_jumbo={ + name="Paquete celestial jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato", + }, + }, + p_celestial_mega={ + name="Paquete celestial mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato", + }, + }, + p_celestial_normal={ + name="Paquete celestial", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato", + }, + }, + p_spectral_jumbo={ + name="Paquete espectral jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato", + }, + }, + p_spectral_mega={ + name="Paquete espectral mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato", + }, + }, + p_spectral_normal={ + name="Paquete espectral", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato", + }, + }, + p_standard_jumbo={ + name="Paquete estándar jumbo", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja", + }, + }, + p_standard_mega={ + name="Paquete estándar mega", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja", + }, + }, + p_standard_normal={ + name="Paquete estándar", + text={ + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja", + }, + }, + perishable={ + name="Perecedero", + text={ + "Se agota al cabo de ", + "{C:attention}#1#{} rondas", + "{C:inactive}({C:attention}#2#{C:inactive} restantes)", + }, + }, + pinned_left={ + name="Fijada", + text={ + "Este comodín se queda", + "fijado a la posición", + "del extremo izquierdo", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# de {V:1}#2# ", + }, + }, + purple_seal={ + name="Sello morado", + text={ + "Crea una carta de {C:tarot}tarot{}", + "cuando {C:attention}se descarta", + "{C:inactive}(Debe haber espacio)", + }, + }, + purple_sticker={ + name="Sticker morado", + text={ + "Usaste este comodín", + "Para ganar en la dificultad {C:attention}Pozo", + "{C:attention}negro{}", + }, + }, + red_seal={ + name="Sello rojo", + text={ + "Reactiva esta", + "carta {C:attention}1{} vez", + }, + }, + red_sticker={ + name="Sticker rojo", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}rojo{}", + }, + }, + remove_negative={ + name="Negativo", + text={ + "{C:inactive,s:0.9}(Elimina el {C:dark_edition,s:0.9}Negativo{C:inactive,s:0.9} de la copia)", + }, + }, + rental={ + name="De alquiler", + text={ + "Pierdes {C:money}#1#${}", + "al final de la ronda", + }, + }, + undiscovered_booster={ + name="Por descubrir", + text={ + "Abre este paquete", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_edition={ + name="Por descubrir", + text={ + "Encuentra esta edición", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_joker={ + name="Por descubrir", + text={ + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_planet={ + name="Por descubrir", + text={ + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_spectral={ + name="Por descubrir", + text={ + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_tag={ + name="Por descubrir", + text={ + "Usa esta etiqueta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_tarot={ + name="Por descubrir", + text={ + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace", + }, + }, + undiscovered_voucher={ + name="Por descubrir", + text={ + "Canjea este vale", + "en una partida", + "sin códigos para saber", + "lo que hace", + }, + }, + white_sticker={ + name="Sticker blanco", + text={ + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}blanco{}", + }, + }, + wip_locked={ + name="Bloqueada", + text={ + "Trabajo", + "en curso", + }, + }, + }, + Planet={ + c_ceres={ + name="Ceres", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_earth={ + name="Tierra", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_eris={ + name="Eris", + text={ + "Aumento de nivel {S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){}", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "y {C:chips}+#4#{} fichas", + }, + }, + c_jupiter={ + name="Júpiter", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_mars={ + name="Marte", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_mercury={ + name="Mercurio", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_neptune={ + name="Neptuno", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_planet_x={ + name="Planeta X", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_pluto={ + name="Plutón", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_saturn={ + name="Saturno", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_uranus={ + name="Urano", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + c_venus={ + name="Venus", + text={ + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas", + }, + }, + }, + Spectral={ + c_ankh={ + name="Anj", + text={ + "Crea una copia de un", + "{C:attention}comodín{} aleatorio,", + "destruye los demás", + }, + }, + c_aura={ + name="Aura", + text={ + "Agrega efectos de {C:dark_edition}laminado{}, {C:dark_edition}holográfico{}", + "o {C:dark_edition}polícromo{} a", + "{C:attention}1{} carta de tu mano seleccionada", + }, + }, + c_black_hole={ + name="Agujero negro", + text={ + "Aumenta todas", + "las {C:legendary,E:1}manos de póker", + "{C:attention}1{} nivel", + }, + }, + c_cryptid={ + name="Críptido", + text={ + "Crea {C:attention}#1#{} copias de", + "{C:attention}1{} carta seleccionada", + "en tu mano", + }, + }, + c_deja_vu={ + name="Déjà vu", + text={ + "Agrega un {C:red}sello rojo{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar", + }, + }, + c_ectoplasm={ + name="Ectoplasma", + text={ + "Agrega {C:dark_edition}negativo{}", + "a un {C:attention}comodín al azar", + "{C:red}-1{} de tamaño de mano", + }, + }, + c_familiar={ + name="Familiar", + text={ + "Destruye {C:attention}1{} carta al azar", + "de tu mano, agrega", + "{C:attention}#1#{} {C:attention}cartas {C:attention}de figura mejoradas", + "al azar a tu mano", + }, + }, + c_grim={ + name="Lúgubre", + text={ + "Destruye {C:attention}1{} carta", + "de tu mano al azar,", + "{C:attention}#1#{} {C:attention}ases mejorados", + "a tu mano al azar", + }, + }, + c_hex={ + name="Maleficio", + text={ + "Agrega {C:dark_edition}policromía{} a un", + "{C:attention}comodín{} aleatorio,", + "destruye los demás", + }, + }, + c_immolate={ + name="Inmolación", + text={ + "Destruye {C:attention}#1#{} cartas", + "de tu mano al azar,", + "gana {C:money}$#2#", + }, + }, + c_incantation={ + name="Encantamiento", + text={ + "Destruye {C:attention}1{} carta", + "de tu mano al azar, agrega {C:attention}#1#", + "{C:attention}cartas{} {C:attention}numeradas mejoradas", + "a tu mano al azar", + }, + }, + c_medium={ + name="Médium", + text={ + "Agrega un {C:purple}sello morado{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Convierte todas las cartas", + "de tu mano en una sola", + "{C:attention}categoría al azar", + "{C:red}-1{} de tamaño de mano", + }, + }, + c_sigil={ + name="Sigilo", + text={ + "Convierte todas las cartas", + "de tu mano en un solo", + "{C:attention}palo al azar", + }, + }, + c_soul={ + name="El alma", + text={ + "Crea un", + "comodín {C:legendary,E:1}legendario{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + c_talisman={ + name="Talismán", + text={ + "Agrega {C:attention}Sello de oro{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano", + }, + }, + c_trance={ + name="Trance", + text={ + "Agrega un {C:blue}sello azul{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar", + }, + }, + c_wraith={ + name="Espectro", + text={ + "Genera una carta", + "de {C:attention}comodín{} {C:red}rara{} al azar,", + "deja el dinero en {C:money}$0", + }, + }, + }, + Stake={ + stake_black={ + name="Pozo negro", + text={ + "La tienda puede tener comodines {C:attention}eternos{}", + "{C:inactive,s:0.8}(No se pueden vender ni destruir)", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_blue={ + name="Pozo azul", + text={ + "{C:red}-1{} descarte", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_gold={ + name="Pozo de oro", + text={ + "En la tienda puede haber comodines {C:attention}de alquiler{}", + "{C:inactive,s:0.8}(Cuestan {C:money,s:0.8}3${C:inactive,s:0.8} por ronda)", + "{s:0.8}Se aplica a las apuestas ya realizadas", + }, + }, + stake_green={ + name="Pozo verde", + text={ + "Escalas de puntos requeridas más rápidas", + "para cada {C:attention}apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_orange={ + name="Pozo naranja", + text={ + "En la tienda puede haber comodines {C:attention}perecederos{}", + "{C:inactive,s:0.8}(Se agotan al cabo de 5 rondas)", + "{s:0.8}Se aplica a los pozos ya realizados", + }, + }, + stake_purple={ + name="Pozo morado", + text={ + "Escalas de puntos requeridas más rápidas", + "para cada {C:attention}apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_red={ + name="Pozo rojo", + text={ + "La {C:attention}ciega pequeña{} no otorga", + "ninguna recompensa monetaria", + "{s:0.8}Se aplica a todos los pozos anteriores", + }, + }, + stake_white={ + name="Pozo blanco", + text={ + "Dificultad básica", + }, + }, + }, + Tag={ + tag_boss={ + name="Etiqueta de jefe", + text={ + "Renueva", + "la {C:attention}ciega jefe", + }, + }, + tag_buffoon={ + name="Etiqueta de bufón", + text={ + "Otorga gratis un", + "{C:attention}paquete de bufón", + }, + }, + tag_charm={ + name="Etiqueta encantada", + text={ + "Otorga gratis un", + "{C:tarot}paquete arcano mega", + }, + }, + tag_coupon={ + name="Etiqueta de cupón", + text={ + "Las cartas iniciales", + "y los paquetes potenciadores", + "en la próxima tienda son gratis", + }, + }, + tag_d_six={ + name="Etiqueta D6", + text={ + "Las renovaciones en la tienda siguiente", + "comienzan en {C:money}$0", + }, + }, + tag_double={ + name="Etiqueta doble", + text={ + "Otorga una copia de", + "la {C:attention}etiqueta{} siguiente seleccionada", + "{s:0.8}a excepción de {s:0.8,C:attention}Etiqueta doble", + }, + }, + tag_economy={ + name="Etiqueta de economía", + text={ + "Duplica el dinero", + "{C:inactive}(Máx. de {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="Etiqueta etérea", + text={ + "Otorga gratis", + "un {C:planet}paquete espectral", + }, + }, + tag_foil={ + name="Etiqueta laminada", + text={ + "El siguiente comodín de la tienda", + "de la edición base es gratuito", + "y se convierte en{C:dark_edition}laminado", + }, + }, + tag_garbage={ + name="Etiqueta de basura", + text={ + "Otorga {C:money}$#1#{} por cada", + "{C:red}descarte{} sin usar en esta partida", + "{C:inactive}(Otorgará {C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="Etiqueta manual", + text={ + "Otorga {C:money}$#1#{} por cada", + "{C:blue}mano{} en esta partida", + "{C:inactive}(Otorgará {C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="Etiqueta holográfica", + text={ + "El siguiente comodín de la tienda", + "de la edición base es gratuito", + "y se convierte en{C:dark_edition}holográfico", + }, + }, + tag_investment={ + name="Etiqueta de inversión", + text={ + "Después de derrotar", + "a la ciega jefe,", + "gana {C:money}$#1#", + }, + }, + tag_juggle={ + name="Etiqueta de malabar", + text={ + "Sujeta {C:attention}+#1#{} cartas en", + "la mano en la ronda siguiente", + }, + }, + tag_meteor={ + name="Etiqueta de meteoro", + text={ + "Otorga gratis un", + "{C:planet}paquete celestial mega", + }, + }, + tag_negative={ + name="Etiqueta negativa", + text={ + "El siguiente comodín de la tienda", + "de edición base es gratuito", + "y se convierte en{C:dark_edition}negativo", + }, + }, + tag_orbital={ + name="Etiqueta orbital", + text={ + "Aumenta {C:attention}#1#", + "en {C:attention}#2# niveles", + }, + }, + tag_polychrome={ + name="Etiqueta polícroma", + text={ + "El siguiente comodín de la tienda", + "de la edición base es gratuito", + "y se convierte en{C:dark_edition}polícromo", + }, + }, + tag_rare={ + name="Etiqueta rara", + text={ + "En la tienda hay", + "un {C:red}comodín raro", + }, + }, + tag_skip={ + name="Etiqueta de velocidad", + text={ + "Otorga {C:money}$#1#{} por ciega", + "omitida en esta partida", + "{C:inactive}(Otorgará {C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="Etiqueta estándar", + text={ + "Otorga gratis un", + "{C:attention}paquete estándar mega", + }, + }, + tag_top_up={ + name="Etiqueta de recarga", + text={ + "Genera hasta {C:attention}#1#", + "comodines {C:blue}comunes{}", + "{C:inactive}(Debe haber espacio)", + }, + }, + tag_uncommon={ + name="Etiqueta inusual", + text={ + "En la tienda hay", + "un {C:green}comodín inusual", + }, + }, + tag_voucher={ + name="Etiqueta de vale", + text={ + "Agrega un {C:voucher}vale", + "en la siguiente tienda", + }, + }, + }, + Tarot={ + c_chariot={ + name="El carro", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_death={ + name="La muerte", + text={ + "Selecciona {C:attention}#1#{} cartas,", + "convierte la carta {C:attention}izquierda{}", + "en la carta {C:attention}derecha{}", + "{C:inactive}(Arrastra para acomodar)", + }, + }, + c_devil={ + name="El diablo", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="El emperador", + text={ + "Genera hasta {C:attention}#1#", + "cartas de {C:tarot}tarot{} al azar", + "{C:inactive}(Debe haber espacio)", + }, + }, + c_empress={ + name="La emperatriz", + text={ + "Mejora {C:attention}#1# cartas", + "seleccionadas a", + "{C:attention}#2#s", + }, + }, + c_fool={ + name="El loco", + text={ + "Genera la última", + "carta de {C:tarot}tarot{} o de {C:planet}planeta{}", + "usada en esta partida", + "a excepción de {s:0.8,C:tarot}El loco{s:0.8}", + }, + }, + c_hanged_man={ + name="El colgado", + text={ + "Destruye hasta", + "{C:attention}#1#{} cartas seleccionadas", + }, + }, + c_heirophant={ + name="El hierofante", + text={ + "Mejora {C:attention}#1# cartas", + "seleccionadas a", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="El ermitaño", + text={ + "Duplica el dinero", + "{C:inactive}(Máx. de {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="La sacerdotisa", + text={ + "Genera hasta {C:attention}#1#", + "cartas de {C:planet}planeta{} al azar", + "{C:inactive}(Debe haber espacio)", + }, + }, + c_judgement={ + name="El juicio", + text={ + "Genera una carta", + "de {C:attention}comodín{} al azar", + "{C:inactive}(Debe haber espacio)", + }, + }, + c_justice={ + name="La justicia", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="Los enamorados", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_magician={ + name="El mago", + text={ + "Mejora {C:attention}#1# cartas{}", + "seleccionadas a", + "{C:attention}#2#", + }, + }, + c_moon={ + name="La luna", + text={ + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}", + }, + }, + c_star={ + name="La estrella", + text={ + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}", + }, + }, + c_strength={ + name="La fuerza", + text={ + "Aumenta la categoría de", + "hasta {C:attention}#1#{} cartas", + "elegidas en {C:attention}1", + }, + }, + c_sun={ + name="El sol", + text={ + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}", + }, + }, + c_temperance={ + name="La templanza", + text={ + "Otorga el valor total de venta", + "de todos los comodines", + "actuales {C:inactive}(Máx. de {C:money}#1# ${C:inactive})", + "{C:inactive}(Actual {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="La torre", + text={ + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="La rueda de la fortuna", + text={ + "{C:green}#1# en #2#{} probabilidades de agregar", + "que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o", + "{C:dark_edition}polícromas{}", + "a un {C:attention}comodín al azar", + }, + }, + c_world={ + name="El mundo", + text={ + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimateria", + text={ + "{C:dark_edition}+1{} ranura de comodín", + }, + unlock={ + "Canjea {C:voucher}En blanco{}", + "un total de {C:attention}#1#{} veces", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="En blanco", + text={ + "{C:inactive}¿No hace nada?", + }, + }, + v_clearance_sale={ + name="Rebajas", + text={ + "Todas las cartas y paquetes", + "en la tienda a {C:attention}#1# %{} menos", + }, + }, + v_crystal_ball={ + name="Bola de cristal", + text={ + "{C:attention}+1{} ranura de consumible", + }, + }, + v_directors_cut={ + name="Versión del director", + text={ + "Renueva la ciega jefe", + "{C:attention}1{} vez por apuesta inicial,", + "{C:money}$#1#{} por cambio", + }, + }, + v_glow_up={ + name="Brillo", + text={ + "Las cartas {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} y", + "{C:dark_edition}polícromas{}", + "aparecen {C:attention}#1#X{} más veces", + }, + unlock={ + "Debes tener al menos {C:attention}#1#", + "cartas de {C:attention}comodín{}", + "que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o", + "{C:dark_edition}polícromas{}", + }, + }, + v_grabber={ + name="Acaparador", + text={ + "Gana para siempre", + "{C:blue}+#1#{} mano(s)", + "por ronda", + }, + }, + v_hieroglyph={ + name="Jeroglífico", + text={ + "Rebaja {C:attention}-#1#{} la apuesta inicial,", + "{C:blue}-#1#{} de mano", + "en cada ronda", + }, + }, + v_hone={ + name="Perfección", + text={ + "Las cartas {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} y", + "{C:dark_edition}polícromas{}", + "aparecen {C:attention}#1#X{} más veces", + }, + }, + v_illusion={ + name="Ilusión", + text={ + "Las {C:attention}cartas de juego{} en la tienda", + "puede que tengan una {C:enhanced}mejora{},", + "una {C:dark_edition}edición{}, y/o un {C:dark_edition}sello", + }, + unlock={ + "Compra un total", + "de {C:attention}#1#{} cartas de juego", + "en la tienda", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Liquidación", + text={ + "Todas las cartas y paquetes", + "en la tienda a {C:attention}#1# %{} menos", + }, + unlock={ + "Canjea al menos", + "{C:attention}#1# cartas de{C:voucher} vale{}", + "en una partida", + }, + }, + v_magic_trick={ + name="Truco de magia", + text={ + "Las {C:attention}cartas de juego{} pueden", + "comprarse", + "en la {C:attention}tienda", + }, + }, + v_money_tree={ + name="Árbol del dinero", + text={ + "Aumenta el límite", + "del interés obtenido en cada ronda", + "hasta {C:money}#1#${}", + }, + unlock={ + "Maximiza la ganancia", + "de interés por ronda durante", + "{C:attention}#1# rondas{} consecutivas", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Pinza para nachos", + text={ + "Gana para siempre", + "{C:blue}+#1#{} mano(s)", + "por ronda", + }, + unlock={ + "Juega un total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Observatorio", + text={ + "Las cartas de {C:planet}planeta{} en", + "el área de {C:attention}consumibles{} otorgan", + "{X:red,C:white} X#1# {} multi para su", + "{C:attention}mano de póker específica", + }, + unlock={ + "Usa un total de {C:attention}#1#", + "cartas de {C:planet}planeta{} de cualquier", + "{C:planet}paquete celestial", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Orbe profético", + text={ + "Las cartas {C:spectral}espectrales{} pueden", + "aparecer en cualquier", + "{C:attention}paquete arcano", + }, + unlock={ + "Usa un total de {C:attention}#1#", + "cartas de {C:tarot}tarot{} de cualquier", + "{C:tarot}paquete arcano", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Excedente", + text={ + "{C:attention}+1{} ranura de carta", + "disponible en la tienda", + }, + }, + v_overstock_plus={ + name="Excedente plus", + text={ + "{C:attention}+1{} ranura de carta", + "disponible en la tienda", + }, + unlock={ + "Gasta un total", + "de {C:money}$#1#{} en la tienda", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="Brocha", + text={ + "{C:attention}+#1#{} tamaño de mano", + }, + }, + v_palette={ + name="Paleta", + text={ + "{C:attention}+#1#{} tamaño de mano", + }, + unlock={ + "Reduce el tamaño", + "de mano a {C:attention}#1#{} cartas", + }, + }, + v_petroglyph={ + name="Petroglifo", + text={ + "Rebaja {C:attention}-#1#{} la apuesta inicial,", + "{C:red}-#1#{} descarte", + "en cada ronda", + }, + unlock={ + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Mercader de planetas", + text={ + "Las cartas de {C:planet}planeta{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda", + }, + }, + v_planet_tycoon={ + name="Magnate de planetas", + text={ + "Las cartas de {C:planet}planeta{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda", + }, + unlock={ + "Compra un total", + "{C:attention}#1# cartas de {C:planet}planeta{}", + "en la tienda", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Reciclomancia", + text={ + "Consigue {C:red}+#1#{}", + "descartes en cada ronda", + "de forma permanente", + }, + unlock={ + "Descarta un total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Gula de renovaciones", + text={ + "Las renovaciones cuestan", + "{C:money}$#1#{} menos", + }, + unlock={ + "Renueva la tienda", + "un total de {C:attention}#1#{} veces", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Excedente de renovaciones", + text={ + "Las renovaciones cuestan", + "{C:money}$#1#{} menos", + }, + }, + v_retcon={ + name="Retrocontinuidad", + text={ + "Renueva la ciega jefe", + "de forma {C:attention}ilimitada{},", + "{C:money}$#1#{} por cambio", + }, + unlock={ + "Descubre", + "{C:attention}#1#{} ciegas", + }, + }, + v_seed_money={ + name="Capital inicial", + text={ + "Aumenta el límite", + "del interés obtenido en cada ronda", + "hasta {C:money}#1#${}", + }, + }, + v_tarot_merchant={ + name="Mercader de tarot", + text={ + "Las cartas de {C:tarot}tarot{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda", + }, + }, + v_tarot_tycoon={ + name="Magnate del tarot", + text={ + "Las cartas de {C:tarot}tarot{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda", + }, + unlock={ + "Compra un total", + "de {C:attention}#1# cartas de{C:tarot} tarot{}", + "en la tienda", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Telescopio", + text={ + "Los {C:attention}paquetes celestiales{} siempre", + "contienen la carta de {C:planet}planeta{}", + "para tu {C:attention}mano de póker", + "más jugada", + }, + }, + v_wasteful={ + name="Derrochador", + text={ + "Consigue {C:red}+#1#{}", + "descartes en cada ronda", + "de forma permanente", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Consigue 100 000 000 de fichas en una sola mano", + _1000k="Consigue 1 000 000 de fichas en una sola mano", + _10k="Consigue 10 000 fichas en una sola mano", + ante_up="Llega a la apuesta inicial 4", + ante_upper="Llega a la apuesta inicial 8", + astronomy="Descubre todas las cartas de planeta", + big_hands="Haz que tu baraja tenga 80 cartas o más", + card_discarder="Descarta al menos 2500 cartas", + card_player="Juega al menos 2500 cartas", + cartomancy="Descubre todas las cartas de tarot", + clairvoyance="Descubre todas las cartas espectrales", + completionist="Descubre 100 % de tu colección", + completionist_plus="Gana con todas las barajas en dificultad Pozo de oro", + completionist_plus_plus="Gana un sticker de oro en cada comodín", + extreme_couponer="Descubre todos los vales", + flushed="Juega un color con 5 cartas versátiles", + heads_up="Gana una partida", + high_stakes="Gana una partida en dificultad Pozo de oro como mínimo", + legendary="Descubre un comodín legendario", + low_stakes="Gana una partida en dificultad Pozo rojo como mínimo", + mid_stakes="Gana una partida en dificultad Pozo negro como mínimo", + nest_egg="Consigue $400 o más en una sola partida", + retrograde="Lleva cualquier mano de póker a nivel 10", + roi="Compra 5 vales para la apuesta inicial 4", + royale="Juega una escalera real", + rule_bender="Completa cualquier desafío", + rule_breaker="Completa todos los desafíos", + shattered="Rompe 2 cartas de vidrio en una sola mano", + speedrunner="Gana una partida en 12 rondas o menos", + tiny_hands="Quédate con 20 cartas o menos en la baraja", + you_get_what_you_get="Gana una partida sin renovar la tienda", + }, + achievement_names={ + _100000k="100 000 K", + _1000k="1000 K", + _10k="10K", + ante_up="¡Aumento de apuesta inicial!", + ante_upper="¡Aumentador de apuesta inicial!", + astronomy="Astronomía", + big_hands="Manotas", + card_discarder="Descartador de cartas", + card_player="Jugador de cartas", + cartomancy="Cartomancia", + clairvoyance="Clarividencia", + completionist="Completista", + completionist_plus="Completista+", + completionist_plus_plus="Completista++", + extreme_couponer="Cupones extremos", + flushed="Colorado", + heads_up="Aviso", + high_stakes="Apuestas altas", + legendary="Legendario", + low_stakes="Apuestas bajas", + mid_stakes="Apuestas medias", + nest_egg="Ahorros", + retrograde="Retrógrada", + roi="Rendimiento de inversión", + royale="Real", + rule_bender="Cambiar las reglas", + rule_breaker="Romper las reglas", + shattered="Destrozo", + speedrunner="Velocista", + tiny_hands="Manitas", + you_get_what_you_get="Te toca lo que te toca", + }, + blind_states={ + Current="Actual", + Defeated="Derrotada", + Select="Seleccionar", + Selected="Seleccionada", + Skipped="Omitida", + Upcoming="Siguiente", + }, + challenge_names={ + c_blast_off_1="Explosión", + c_bram_poker_1="Bram Poker", + c_city_1="Ciudad de 15 minutos", + c_cruelty_1="Crueldad", + c_double_nothing_1="Doble o nada", + c_five_card_1="Retirada de cinco cartas", + c_fragile_1="Frágil", + c_golden_needle_1="Aguja dorada", + c_inflation_1="Inflación", + c_jokerless_1="Sin comodines", + c_knife_1="Al filo de la navaja", + c_luxury_1="Impuesto de lujo", + c_mad_world_1="Mundo loco", + c_medusa_1="Medusa", + c_monolith_1="Monolito", + c_non_perishable_1="No perecedero", + c_omelette_1="La tortilla", + c_rich_1="Asquerosamente rico", + c_typecast_1="Encasillado", + c_xray_1="Visión de rayos X", + }, + collabs={ + Clubs={ + ["1"]="Por defecto", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Por defecto", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Por defecto", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Por defecto", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="Preguntas frecuentes", + b_and_use="Y USAR", + b_back="Atrás", + b_blinds="Ciegas", + b_booster_packs="Paquetes potenciadores", + b_buy="COMPRAR", + b_cash_out="Cobrar", + b_challenges="Desafíos", + b_collection="Colección", + b_collection_cap="COLECCIÓN", + b_continue="Continuar", + b_copy="Copiar", + b_copy_seed="Copiar código", + b_create_profile="Crear perfil", + b_credits="Créditos", + b_current_profile="Perfil actual", + b_customize_deck="Personalizar baraja", + b_deck="Baraja", + b_decks="Barajas", + b_delete_profile="Eliminar perfil", + b_discard="Descartar", + b_editions="Ediciones", + b_endless="Modo infinito", + b_enhanced_cards="Cartas mejoradas", + b_full_deck="Baraja completa", + b_high_contrast_cards="Cartas de alto contraste", + b_how_to_play="Cómo jugar", + b_imagery="Imágenes", + b_jokers="Comodines", + b_load_profile="Cargar perfil", + b_main_menu="Menú principal", + b_music="Música", + b_new_challenge="Iniciar desafío nuevo", + b_new_run="Nueva partida", + b_next="Siguiente", + b_next_round_1="Ronda", + b_next_round_2="siguiente", + b_open="ABRIR", + b_options="Opciones", + b_options_cap="OPCIONES", + b_planet_cards="Cartas de planeta", + b_play_cap="JUGAR", + b_play_hand="Jugar mano", + b_playbalatro="Visita playbalatro.com", + b_poker_hands="Manos de póker", + b_quit_cap="SALIR", + b_redeem="CANJEAR", + b_reduced_motion="Movimiento reducido", + b_remaining="Restantes", + b_reroll_boss="Renovar jefe", + b_reset_profile="Restablecer perfil", + b_restrictions="Restricciones", + b_retry="Reintentar", + b_rules="Reglas", + b_run_info_1="Info", + b_run_info_2="Partida", + b_seals="Sellos", + b_seed="Código", + b_select="SELECCIONAR", + b_sell="VENDER", + b_set_CRT="CRT", + b_set_CRT_bloom="Dispersión CRT", + b_set_apply="Aplicar", + b_set_audio="Audio", + b_set_crash_reports="Informes de errores", + b_set_game="Juego", + b_set_game_vol="Volumen juego", + b_set_gamespeed="Velocidad del juego", + b_set_graphics="Gráficos", + b_set_master_vol="Volumen principal", + b_set_monitor="Configuración de pantalla", + b_set_music_vol="Volumen música", + b_set_pixel_smoothing="Suavizado de pixeles", + b_set_play_discard_pos="Posición del botón jugar/descartar", + b_set_rumble="Vibración del control", + b_set_screenshake="Temblor de pantalla", + b_set_shadows="Sombras", + b_set_vibration="Vibración", + b_set_video="Video", + b_set_windowmode="Modo ventana", + b_settings="Configuración", + b_skip="Omitir", + b_skip_blind="Omitir ciega", + b_skip_reward="Omitir ciega", + b_sort_hand="Ordenar mano", + b_sounds="Sonidos", + b_spectral_cards="Cartas espectrales", + b_stake="Pozo", + b_start_new_run="Nueva partida", + b_stat_consumables="Consumibles", + b_stat_jokers="Comodines", + b_stat_planets="Planetas", + b_stat_spectrals="Espectrales", + b_stat_tarots="Tarot", + b_stat_vouchers="Vales", + b_stats="Estadísticas", + b_tags="Etiquetas", + b_tarot_cards="Cartas de tarot", + b_unlock_all="Desbloquear todo", + b_use="USAR", + b_vouchers="Vales", + b_wishlist="Lista de deseos en Steam", + k_aces="Ases", + k_achievement="Logro", + k_achievements_disabled="Logros desactivados", + k_active="activa", + k_active_ex="¡Activada!", + k_again_ex="¡Otra vez!", + k_all_hands="Todas las manos", + k_also_applied="También se aplica", + k_ante="Apuesta inicial", + k_ante_cap="APUESTA INICIAL", + k_arcana_pack="Paquete arcano", + k_balanced="Equilibrado", + k_banned_cards="Cartas prohibidas", + k_banned_tags="Etiquetas prohibidas", + k_base_cap="BASE", + k_base_cards="Cartas base", + k_best_hand="Mejor mano", + k_booster="Potenciador", + k_buffoon_pack="Paquete de bufón", + k_cap_consumables="CONSUMIBLES", + k_card_stats="Estadísticas de cartas", + k_celestial_pack="Paquete celestial", + k_challenge_mode="Modo desafío", + k_challenges="Desafíos", + k_choose="Elegir", + k_collection="Colección", + k_common="Común", + k_compatible="compatible", + k_copied_ex="¡Se copió!", + k_custom_rules="Reglas personalizadas", + k_daily_run="Partida diaria", + k_debuffed="Debilitada", + k_deck="Baraja", + k_deck_stake_wins="Victorias de pozo de baraja", + k_defeated_by="Derrotada por", + k_demo_version_ex="¡Versión demo!", + k_disabled_ex="¡Inhabilitado!", + k_drank_ex="¡Consumido!", + k_duplicated_ex="¡Duplicada!", + k_dwarf_planet="Planeta enano", + k_eaten_ex="¡Se devoró!", + k_edition="Edición", + k_effective="Total efectivo", + k_empty_caps="VACÍA", + k_enter_name="Escribir nombre", + k_enter_seed="Escribir código", + k_enter_text="Escribir texto", + k_eroded_ex="¡Se erosionó!", + k_extinct_ex="¡Se extinguió!", + k_face_cards="Cartas de figuras", + k_game_modifiers="Modificadores de juego", + k_gold="Oro", + k_high_score_ex="¡Récord!", + k_hud_discards="Descartes", + k_hud_hands="Manos", + k_incompatible="incompatible", + k_joker="Comodín", + k_joker_stickers="Stickers de comodín", + k_jokers_cap="COMODINES", + k_legendary="Legendaria", + k_level_prefix="Nvl.", + k_level_up_ex="¡Aumento de nivel!", + k_locked="Bloqueada", + k_lower_score="puntuación", + k_lvl="Nvl.", + k_melted_ex="¡Se derritió!", + k_money="Dinero", + k_mult="Multi", + k_no_other_jokers="¡No hay más comodines!", + k_no_reward="Sin recompensa", + k_no_room_ex="¡No hay espacio!", + k_no_space_ex="¡Sin espacio!", + k_none="Ninguno", + k_nope_ex="¡No!", + k_not_allowed_ex="¡No está permitido!", + k_not_discovered="Por descubrir", + k_numbered_cards="Cartas numeradas", + k_or="o", + k_other="Otros", + k_page="Página", + k_planet="Planeta", + k_planet_q="¿Planeta?", + k_playing_as="Jugando como", + k_plus_joker="+1 comodín", + k_plus_planet="+1 Planeta", + k_plus_spectral="+1 Espectral", + k_plus_stone="+1 Piedras", + k_plus_tarot="+1 Tarot", + k_poker_hand="mano de póker", + k_profile="Perfil", + k_progress="Progreso", + k_rank="Categoría", + k_rare="Rara", + k_redeemed_ex="¡Canjeada!", + k_reroll="Cambiar", + k_reset="Restablecer", + k_reward="Recompensa", + k_round="Ronda", + k_safe_ex="¡A salvo!", + k_saved_ex="¡Te salvaste!", + k_seed="Código", + k_seeded_run="Partida con códigos", + k_skipped_cap="OMITIDA", + k_spectral="Espectral", + k_spectral_pack="Paquete espectral", + k_stake="Pozo", + k_stake_level="Nivel de pozo", + k_standard_pack="Paquete estándar", + k_suit="Palo", + k_swapped_ex="¡Se cambió!", + k_tarot="Tarot", + k_trophies_disabled="Trofeos deshabilitados", + k_trophy="Trofeo", + k_uncommon="Inusual", + k_undisovered="No se descubrió", + k_unknown="¿?", + k_unlocked_ex="¡Desbloqueado!", + k_upgrade_ex="¡Mejora!", + k_val_up="¡Aumento de valor!", + k_view="Ver", + k_voucher="Vale", + k_vouchers_cap="VALES", + k_wins="Victorias", + k_x_base="Base X", + ml_bloom_opt={ + "No", + "Sí", + }, + ml_buy_and_use_target={ + "COMPRAR", + "Y USAR", + }, + ml_buy_target={ + "COMPRAR", + }, + ml_card_stats={ + "Carta", + "Estadísticas", + }, + ml_controller_required={ + "Se requiere un mando para jugar.", + "Conecta un mando para continuar.", + }, + ml_crash_report_info={ + "Los informes de errores se enviarán al desarrollador", + "para reducir los problemas en el futuro.", + "No se enviará información de identificación personal.", + }, + ml_demo_thanks_message={ + "Considera la posibilidad de agregar Balatro", + "a tu lista de deseos en Steam y suscríbete", + "al boletín de noticias en playbalatro.com", + }, + ml_disabled_seed={ + "Todos los desbloqueos", + "y descubrimientos inhabilitados", + }, + ml_edition_seal_enhancement_explanation={ + "Las cartas de juego pueden tener 1", + "mejora, edición y sello cada una", + }, + ml_eternal={ + "Eterno", + "No se puede vender", + "ni destruir", + }, + ml_gold_seal_desc={ + "Sello de oro", + "regresa a tu mano", + "cuando se juega", + }, + ml_offline_message={ + "Este dispositivo está desconectado.", + "La partida guardada actual podría estar desactualizada.", + }, + ml_open_target={ + "ABRIR", + }, + ml_paste_seed={ + "Pegar", + "código", + }, + ml_play_discard_pos_opt={ + "Descartar/jugar", + "Jugar/descartar", + }, + ml_redeem_target={ + "CANJEAR", + }, + ml_sell_target={ + "VENDER", + }, + ml_shadow_opt={ + "Sí", + "No", + }, + ml_smoothing_opt={ + "No", + "Sí", + }, + ml_unlock_all_explanation={ + "¡ATENCIÓN! Si desbloqueas la colección completa,", + "se desactivarán los logros para este perfil", + }, + ml_unlock_all_trophies={ + "¡ATENCIÓN! Si desbloqueas la colección completa,", + "¡se deshabilitarán todos los trofeos para este perfil!", + }, + ml_vsync_opt={ + "Con VSync", + "Sin VSync", + }, + ml_windowmode_opt={ + "Modo ventana", + "Pantalla completa", + "Sin bordes", + }, + ph_1_level="+1 nivel", + ph_4_7_of_clubs="cuatro 7 de tréboles", + ph_alert_debuff_confirm="Vuelve a pulsar «Jugar» para confirmar", + ph_all_poker_hand="Todas las manos de póker", + ph_blind_reward="Recompensa ", + ph_blind_score_at_least="Anota al menos", + ph_boss_disabled="¡Jefe inhabilitado!", + ph_choose_blind_1="Elige tu", + ph_choose_blind_2="próxima ciega", + ph_click_confirm="Presione de nuevo para confirmar", + ph_deck_preview_effective="Total efectivo debido a comodines, ciegas y mejoras de cartas", + ph_deck_preview_stones="Piedras", + ph_defeat_the_boss="Derrota a la ciega jefe", + ph_defeat_this_blind_1="Derrota a esta ciega", + ph_defeat_this_blind_2="para descubrirla", + ph_demo_thanks_1="Gracias por jugar la", + ph_demo_thanks_2="DEMO DE BALATRO", + ph_display_stickers="Mostrar stickers de pozo durante la partida", + ph_game_over="FIN DE LA PARTIDA", + ph_improve_run="¡Mejora tu partida!", + ph_most_played="(most played hand)", + ph_mr_bones="Te salvó el Sr. Huesos", + ph_no_boss_active="no hay jefe activo", + ph_no_vouchers="No se canjearon vales en esta partida", + ph_score_at_least="Anota al menos", + ph_score_cards_discarded="Cartas descartadas", + ph_score_cards_played="Cartas jugadas", + ph_score_cards_purchased="Cartas compradas", + ph_score_furthest_ante="Apuesta inicial", + ph_score_furthest_round="Ronda", + ph_score_hand="Mejor mano", + ph_score_new_collection="Descubrimientos", + ph_score_poker_hand="Mano más jugada", + ph_score_times_rerolled="Renovaciones", + ph_select_challenge="Selecciona un desafío", + ph_sneak_peek="Vistazo", + ph_stat_consumable="Cantidad de veces que se usó la carta", + ph_stat_joker="Total de rondas completadas con esta carta", + ph_stat_voucher="Cantidad de veces que se canjeó el vale", + ph_unscored_hand="La mano no anotará", + ph_up_ante_1="Aumentar apuesta inicial", + ph_up_ante_2="Aumentar todas las ciegas", + ph_up_ante_3="Actualizar las ciegas", + ph_vouchers_redeemed="Vales canjeados en esta partida", + ph_you_win="¡GANASTE!", + ph_you_win_demo="¡GANASTE EN LA DEMO!", + }, + high_scores={ + boss_streak="Más jefes seguidos", + collection="Colección", + current_streak="", + furthest_ante="Apuesta inicial más alta", + furthest_round="Ronda más alta", + hand="Mejor mano", + most_money="Más dinero", + poker_hand="Mano más jugada", + win_streak="Mejor racha de victorias", + }, + labels={ + blue_seal="Sello azul", + common="Común", + eternal="Eterno", + foil="Laminada", + gold_seal="Sello de oro", + holographic="Holográfica", + legendary="Legendaria", + locked="Bloqueada", + negative="Negativa", + perishable="Perecedero", + pinned_left="Fijada", + planet="Planeta", + pluto_planet="Planeta enano", + polychrome="Polícroma", + purple_seal="Sello morado", + rare="Rara", + red_seal="Sello rojo", + rental="De alquiler", + tarot="Tarot", + uncommon="Inusual", + voucher="Vale", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 cartas de la misma categoría", + }, + Flush={ + "5 cartas del mismo palo", + }, + ["Flush Five"]={ + "5 cartas de la misma categoría y palo", + }, + ["Flush House"]={ + "Una trío y una pareja con", + "todas las cartas del mismo palo", + }, + ["Four of a Kind"]={ + "4 cartas de la misma categoría. Pueden", + "jugarse con 1 otra carta que no cuenta", + }, + ["Full House"]={ + "Una trío y una pareja", + }, + ["High Card"]={ + "Si la mano jugada no es ninguna de las anteriores,", + "sólo cuenta la carta más alta", + }, + Pair={ + "2 cartas de la misma categoría. Pueden", + "jugarse con otras 3 cartas que no cuentan", + }, + ["Royal Flush"]={ + "5 cartas seguidas {valores consecutivos} con", + "todas las cartas del mismo palo", + }, + Straight={ + "5 cartas seguidas {valores consecutivos}", + }, + ["Straight Flush"]={ + "5 cartas seguidas {valores consecutivos} con", + "todas las cartas del mismo palo", + }, + ["Three of a Kind"]={ + "3 cartas de la misma categoría. Pueden", + "jugarse con otras 2 cartas que no cuentan", + }, + ["Two Pair"]={ + "2 pares de cartas de categorías diferentes, pueden", + "jugarse con 1 otra carta que no cuenta", + }, + }, + poker_hands={ + ["Five of a Kind"]="Repóquer", + Flush="Color", + ["Flush Five"]="Cinco de color", + ["Flush House"]="Full de color", + ["Four of a Kind"]="Póker", + ["Full House"]="Full", + ["High Card"]="Carta más alta", + Pair="Pareja", + ["Royal Flush"]="Escalera real", + Straight="Escalera", + ["Straight Flush"]="Escalera de color", + ["Three of a Kind"]="Trío", + ["Two Pair"]="Doble pareja", + }, + quips={ + dq_1={ + "¡Uy! Espero", + "que tengas", + "algún truco guardado", + "para el desafío final!", + }, + lq_1={ + "Quizá sea mejor", + "que juguemos", + "a la pesca...", + }, + lq_10={ + "¡Qué desastre!", + }, + lq_2={ + "¡Perdimos", + "casi sin jugar!", + }, + lq_3={ + "¡Llegó la hora", + "de barajar", + "y empezar de nuevo!", + }, + lq_4={ + "¡Sabes lo que dicen,", + "la casa", + "siempre gana!", + }, + lq_5={ + "¡Parece que", + "alguien es", + "un chiste!", + }, + lq_6={ + "¿Tú también", + "estabas mintiendo?", + }, + lq_7={ + "¡Parece que", + "somos un chiste!", + }, + lq_8={ + "Si tuviera manos,", + "me hubiera", + "tapado los ojos", + }, + lq_9={ + "Soy un bufón", + "de verdad,", + "¿cuál es tu excusa?", + }, + wq_1={ + "¡Eres un as!", + }, + wq_2={ + "¡Lidiaste muy bien", + "con eso!", + }, + wq_3={ + "¡Parece que no era", + "un engaño!", + }, + wq_4={ + "Qué lástima", + "que estas fichas", + "sean virtuales...", + }, + wq_5={ + "¡Parece que", + "aprendiste bien!", + }, + wq_6={ + "¡Hiciste jugadas", + "muy adelantadas!", + }, + wq_7={ + "¡Qué bueno", + "que no aposté", + "contra ti!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="As", + Jack="Jota", + King="Rey", + Queen="Reina", + }, + suits_plural={ + Clubs="Tréboles", + Diamonds="Diamantes", + Hearts="Corazones", + Spades="Picas", + }, + suits_singular={ + Clubs="Trébol", + Diamonds="Diamante", + Hearts="Corazón", + Spades="Pica", + }, + tutorial={ + bb_1={ + "Cuando elijas la {C:attention}ciega grande,", + "ganarás un poco de dinero.", + }, + bb_2={ + "Puedes {C:attention}omitirla", + "para conseguir una {C:attention}etiqueta{}. Cada", + "{C:attention}etiqueta{} tiene un efecto único.", + }, + bb_3={ + "No dejes de vigilar", + "a la {C:attention}ciega jefe{}. Tiene", + "una habilidad para la cual", + "deberás prepararte.", + }, + bb_4={ + "Si la derrotas, aumenta", + "la {C:attention}apuesta inicial{} y todas", + "las{C:attention}ciegas{} se vuelven más difíciles.", + }, + bb_5={ + "Derrota a la {C:attention}apuesta inicial{} #1# para ganar.", + "¡Elige tu camino!", + }, + fh_1={ + "Ganas fichas por jugar", + "{C:attention}manos de póker.", + }, + fh_2={ + "Cada {C:attention}mano de póker{} gana", + "una cantidad base de {C:blue}fichas", + "multiplicadas por algunos {C:red}multi.", + }, + fh_3={ + "Consulta tus {C:attention}manos de póker", + "en el área de {C:attention}info{}", + "junto con otros datos", + "sobre la partida actual.", + }, + fh_4={ + "Las cartas también ganan", + "algunas {C:blue}fichas{},", + "coloca el cursor sobre ellas para ver.", + }, + fh_4_touch={ + "¡Las cartas también ganan", + "algunas {C:blue}fichas{},", + "mantenlas presionadas para ver!", + }, + fh_5={ + "Ahora selecciona hasta", + "{C:attention}5{} cartas para jugar", + "y pulsa {C:blue}«Jugar mano».", + }, + fh_5_touch={ + "Ahora selecciona hasta", + "{C:attention}5{} cartas para jugar", + "y pulsa {C:blue}«Jugar mano»", + }, + fh_6={ + "También puedes {C:red}«Descartar»{} hasta", + "{C:attention}5{} cartas seleccionadas", + "para tratar de conseguir", + "manos mejores. ¡Inténtalo!", + }, + fh_7={ + "¡Cuidado! Solo tienes una", + "cantidad limitada de {C:blue}manos", + "y {C:red}descartes{} por ronda.", + }, + fh_8={ + "Gana {C:attention}300 fichas{} antes de", + "que se terminen las {C:blue}manos", + "para ganar esta ronda.", + "¡Buena suerte!", + }, + s_1={ + "¡Bien hecho! Ahora que tienes", + "{E:1}un montonazo{} de {C:money}dinero{},", + "puedes comprar cartas", + "nuevas en la {C:attention}tienda.", + }, + s_10={ + "Los {C:attention}vales{} se reabastecen", + "después de que derrotas", + "a la {C:attention}ciega jefe{}.", + }, + s_11={ + "No dejes de dar un vistazo", + "a los {C:booster}paquetes potenciadores{}", + "en cada tienda. ¡Están", + "llenos de sorpresas!", + }, + s_12={ + "Pasemos", + "a la {C:attention}ronda siguiente{}.", + }, + s_2={ + "Intenta comprar a este", + "apuesto pícaro.", + }, + s_2_touch={ + "¡Intenta comprar", + "a este apuesto pícaro!", + "Arrástralo desde la tienda", + "a la zona de {C:attention}«COMPRAR»{}", + }, + s_3={ + "Este es uno de los {C:attention}#1#", + "{C:attention}comodines{} que puedes agregar", + "a tu partida. Cada {C:attention}comodín", + "hace algo diferente.", + }, + s_4={ + "Este agrega {C:red}+4 multi{}", + "a cada mano jugada.", + }, + s_5={ + "Elige bien, solo puedes", + "tener {C:attention}5 comodines{}", + "al mismo tiempo.", + }, + s_6={ + "Ahora compra la otra", + "carta en la {C:attention}tienda.", + }, + s_7={ + "Esta carta de {C:tarot}tarot{} es", + "{C:attention}consumible{}.", + "Sirve para mejorar tus cartas", + "de juego. Cuídala bien.", + }, + s_8={ + "Puedes tener hasta", + "{C:attention}2 consumibles{}", + "al mismo tiempo.", + }, + s_9={ + "Si ahorras lo suficiente,", + "puedes comprar un {C:attention}vale{}.", + "Los {C:attention}vales{} mejoran", + "la partida de forma pasiva.", + }, + sb_1={ + "¡Hola! Me llamo", + "{C:attention}Jimbo{}, te enseñaré", + "a jugar.", + }, + sb_2={ + "Tu meta es ganar", + "{C:blue}fichas{} para derrotar", + "a la {C:attention}ciega enemiga", + }, + sb_3={ + "Esta es una {C:blue}ciega pequeña{},", + "solo debes ganar", + "{C:attention}300 fichas{} para derrotarla.", + }, + sb_4={ + "Elige la {C:blue}ciega pequeña", + "para comenzar la ronda.", + }, + sh_1={ + "Cuando consigas más cartas,", + "recuerda que puedes reordenarlas.", + "Los {C:attention}comodines{} se activan", + "de izquierda a derecha", + }, + sh_2={ + "Asegúrate de", + "{C:attention}USAR{} los consumibles.", + }, + sh_3={ + "Selecciona hasta {C:attention}2{} cartas", + "de tu mano y pulsa", + "{C:attention}«USAR»{} en la carta de {C:tarot}tarot{}", + "para mejorarlas.", + }, + sh_3_touch={ + "Selecciona hasta {C:attention}2{} cartas", + "de tu mano y arrastra la carta", + "de {C:tarot}tarot{} a la zona de {C:attention}«USAR»{}", + "para mejorarlas.", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Manos", + a_handsize="+#1# de tamaño de mano", + a_handsize_minus="Tamaño de mano -#1#", + a_mult="+#1# Multi.", + a_mult_minus="Multi -#1#", + a_remaining="#1# restantes", + a_sold_tally="#1#/#2# vendidas", + a_xmult="X#1# multi", + a_xmult_minus="-X#1# multi", + ante_x_voucher="VALE DE APUESTA INICIAL #1#", + challenges_completed="Completaste #1#/#2# desafíos", + completed="#1#/#2# completados", + deck_preview_wheel_plural="Los números pueden ser inferiores debido a las cartas #1# que se sacan boca abajo", + deck_preview_wheel_singular="Las cantidades pueden ser inferiores debido a la carta #1# que se saca boca abajo", + interest="#1# de interés por cada $#2# (#3# máx.)", + loyalty_active="¡Se activó!", + loyalty_inactive="#1# restantes", + ml_foil_desc={ + "Laminada", + "+#1# fichas", + }, + ml_holo_desc={ + "Holográfica", + "+#1# multi", + }, + ml_negative_consumable_desc={ + "Negativa", + "+#1# ranura de consumibles", + }, + ml_negative_desc={ + "Negativa", + "+#1# ranura de comodín", + }, + ml_polychrome_desc={ + "Polícroma", + "X#1# multi", + }, + remaining_discard_money="Descartes restantes ($#1# cada uno)", + remaining_hand_money="Manos restantes ($#1# cada una)", + unlocked="#1#/#2# desbloqueados", + }, + v_text={ + ch_c_all_eternal={ + "Todos los comodines en la tienda son {C:eternal}eternos{}", + }, + ch_c_chips_dollar_cap={ + "Las {C:blue}fichas{} no pueden superar {C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}¡Desafío diario!", + }, + ch_c_debuff_played_cards={ + "Todas las cartas {C:attention}jugadas{} se {C:attention}debilitan{} tras anotar", + }, + ch_c_discard_cost={ + "Cada descarte cuesta {C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "{C:green}1 en #1#{} cartas se sacan boca abajo", + }, + ch_c_inflation={ + "Eleva los precios en {C:money}$1{} para cada compra de forma permanente", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Tienes {C:red}-1{} cartas en la mano por cada {C:money}$#1#{} que tengas", + }, + ch_c_no_extra_hand_money={ + "Las {C:blue}manos{} extra ya no ganan dinero", + }, + ch_c_no_interest={ + "No ganas {C:attention}interés{} al final de la ronda", + }, + ch_c_no_reward={ + "Ninguna {C:attention}ciega{} otorga dinero de recompensa", + }, + ch_c_no_reward_specific={ + "Las ciegas {C:attention}#1#{} no otorgan dinero de recompensa", + }, + ch_c_no_shop_jokers={ + "Los comodines ya no aparecen en la {C:attention}tienda", + }, + ch_c_none={ + "{C:inactive}Ninguna", + }, + ch_c_set_eternal_ante={ + "Al derrotar al jefe ante {C:attention}#1#{}, todos los comodines se vuelven {C:attention}eternos", + }, + ch_c_set_joker_slots_ante={ + "Al derrotar al jefe ante {C:attention}#1#{}, las ranuras de comodín pasan a {C:attention}0", + }, + ch_c_set_seed={ + "1 intento con código establecido: {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} ranuras de consumibles", + }, + ch_m_discards={ + "{C:red}#1#{} descartes por ronda", + }, + ch_m_dollars={ + "Empieza con {C:money}$#1#", + }, + ch_m_hand_size={ + "Sujeta {C:attention}#1#{} cartas en la mano", + }, + ch_m_hands={ + "{C:blue}#1#{} manos por ronda", + }, + ch_m_joker_slots={ + "{C:attention}#1# ranuras de {}comodín", + }, + ch_m_none={ + "{C:inactive}Ninguna", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/fr.lua b/src/localization/fr.lua new file mode 100644 index 0000000..1e905c2 --- /dev/null +++ b/src/localization/fr.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Jeu abandonné", + text={ + "Commencez la partie", + "sans {C:attention}cartes Figure", + "dans votre jeu", + }, + }, + b_anaglyph={ + name="Jeu anaglyphe", + text={ + "Après avoir battu chaque", + "{C:attention}Blinde Boss{}, gagnez", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Jeu noir", + text={ + "{C:attention}+#1#{} emplacement Joker", + "", + "{C:blue}-#2#{} main", + "à chaque manche", + }, + }, + b_blue={ + name="Jeu bleu", + text={ + "{C:blue}+#1#{} main", + "à chaque manche", + }, + }, + b_challenge={ + name="Jeu du défi", + text={ + "", + }, + }, + b_checkered={ + name="Jeu en damier", + text={ + "Commencez la partie avec", + "{C:attention}26 cartes de{C:spades} Pique{} et", + "{C:attention}26 cartes de{C:hearts} Cœur{} dans votre jeu", + }, + }, + b_erratic={ + name="Jeu erratique", + text={ + "Toutes les {C:attention}Valeurs{} et", + "les {C:attention}Couleurs{} du jeu", + "sont aléatoires", + }, + }, + b_ghost={ + name="Jeu fantôme", + text={ + "Les cartes {C:spectral}Spectrales{} peuvent", + "apparaître dans le magasin,", + "et commencez avec une carte {C:spectral,T:c_hex}Maléfice{}", + }, + }, + b_green={ + name="Jeu vert", + text={ + "À la fin de la manche :", + "{C:money}#1# ${s:0.85} par {C:blue}main restante", + "{C:money}#2# ${s:0.85} par {C:red}défausse restante", + "Vous ne percevez pas d'{C:attention}intérêts", + }, + }, + b_magic={ + name="Jeu magique", + text={ + "Commencez la partie avec le", + "coupon {C:tarot,T:v_crystal_ball}#1#{}", + "et {C:attention}2{} copies", + "de {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Jeu nébuleux", + text={ + "Commencez la partie avec le", + "coupon {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} emplacement de consommable", + }, + }, + b_painted={ + name="Jeu peint", + text={ + "{C:attention}+#1#{} à la taille de la main", + "{C:red}#2#{} emplacement Joker", + }, + }, + b_plasma={ + name="Jeu plasmique", + text={ + "Équilibrez les {C:blue}Jetons{} et le", + "{C:red}Multi.{} lors du calcul du", + "score de la main jouée", + "Taille de la Blinde de base {C:attention}x#1#{}", + }, + }, + b_red={ + name="Jeu rouge", + text={ + "{C:red}+#1#{} défausse", + "à chaque manche", + }, + }, + b_yellow={ + name="Jeu jaune", + text={ + "Commencez avec", + "{C:money}#1# $ supplémentaires", + }, + }, + b_zodiac={ + name="Jeu Zodiac", + text={ + "Commencez la partie avec", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "et {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="Le bras", + text={ + "Diminue le niveau de", + "la main de poker jouée", + }, + }, + bl_big={ + name="Grosse Blinde", + text={ + }, + }, + bl_club={ + name="Le club", + text={ + "Toutes les cartes Trèfle", + "perdent leurs bonus", + }, + }, + bl_eye={ + name="L'œil", + text={ + "Pas de types de main", + "répétés cette manche-ci", + }, + }, + bl_final_acorn={ + name="Gland ambre", + text={ + "Retourne et mélange", + "toutes les cartes Joker", + }, + }, + bl_final_bell={ + name="Cloche céruléenne", + text={ + "Force la sélection", + "systématique d'une carte", + }, + }, + bl_final_heart={ + name="Cœur écarlate", + text={ + "Un Joker aléatoire", + "annulé à chaque main", + }, + }, + bl_final_leaf={ + name="Feuille verte", + text={ + "Toutes les cartes perdent leurs bonus", + "jusqu'à ce qu'un Joker soit vendu", + }, + }, + bl_final_vessel={ + name="Vase violet", + text={ + "Très grosse Blinde", + }, + }, + bl_fish={ + name="Le poisson", + text={ + "Les cartes sont tirées face cachée", + "après chaque main jouée", + }, + }, + bl_flint={ + name="Le silex", + text={ + "Les Jetons de base et le", + "Multi. sont réduits de moitié", + }, + }, + bl_goad={ + name="L'aiguillon", + text={ + "Toutes les cartes Pique", + "perdent leurs bonus", + }, + }, + bl_head={ + name="La tête", + text={ + "Toutes les cartes Cœur", + "perdent leurs bonus", + }, + }, + bl_hook={ + name="L'hameçon", + text={ + "Défausse 2 cartes aléatoires", + "par main jouée", + }, + }, + bl_house={ + name="La maison", + text={ + "La première main est", + "tirée face cachée", + }, + }, + bl_manacle={ + name="Les menottes", + text={ + "Taille de la main -1", + }, + }, + bl_mark={ + name="La marque", + text={ + "Toutes les cartes Figure sont", + "tirées face cachée", + }, + }, + bl_mouth={ + name="La bouche", + text={ + "Ne jouez qu'un seul type", + "de main cette manche-ci", + }, + }, + bl_needle={ + name="L'aiguille", + text={ + "Ne jouez qu'une main", + }, + }, + bl_ox={ + name="Le bœuf", + text={ + "Jouer #1#", + "fixe l'argent à 0 $", + }, + }, + bl_pillar={ + name="Le pilier", + text={ + "Les cartes jouées avant cette", + "mise initiale perdent leurs bonus", + }, + }, + bl_plant={ + name="La plante", + text={ + "Toutes les cartes Figure", + "perdent leurs bonus", + }, + }, + bl_psychic={ + name="Le médium", + text={ + "5 cartes doivent être jouées", + }, + }, + bl_serpent={ + name="Le serpent", + text={ + "Après avoir joué ou défaussé,", + "tirez toujours 3 cartes", + }, + }, + bl_small={ + name="Petite Blinde", + text={ + }, + }, + bl_tooth={ + name="La dent", + text={ + "Perdez 1 $ par", + "carte jouée", + }, + }, + bl_wall={ + name="Le mur", + text={ + "Super grosse Blinde", + }, + }, + bl_water={ + name="L'eau", + text={ + "Commencez sans", + "aucune défausse", + }, + }, + bl_wheel={ + name="La roue", + text={ + " carte sur 7 est", + "tirée face cachée", + }, + }, + bl_window={ + name="La fenêtre", + text={ + "Toutes les cartes Carreau", + "perdent leurs bonus", + }, + }, + }, + Edition={ + e_base={ + name="Base", + text={ + "Aucun effet supplémentaire", + }, + }, + e_foil={ + name="Brillante", + text={ + "{C:chips}+#1#{} Jetons", + }, + }, + e_holo={ + name="Holographique", + text={ + "{C:mult}+#1#{} au Multi.", + }, + }, + e_negative={ + name="Négatif", + text={ + "{C:dark_edition}+#1#{} emplacement Joker", + }, + }, + e_negative_consumable={ + name="Négatif", + text={ + "{C:dark_edition}+#1#{} emplacement de consommable", + }, + }, + e_polychrome={ + name="Polychrome", + text={ + "Ajoute {X:mult,C:white} x#1# {} au Multi.", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Carte bonus", + text={ + }, + }, + m_glass={ + name="Carte Verre", + text={ + "Multi. {X:mult,C:white}x#1#{}", + "{C:green}#2# chance(s) sur #3#{} de", + "détruire la carte", + }, + }, + m_gold={ + name="Carte Or", + text={ + "{C:money}#1# ${} si cette", + "carte est en main", + "à la fin de la manche", + }, + }, + m_lucky={ + name="Carte Chance", + text={ + "{C:green}#1# chance(s) sur #3#{}", + "d'obtenir {C:mult}+#2#{} au Multi.", + "{C:green}#1# chance(s) sur #5#{}", + "de gagner {C:money}#4# $", + }, + }, + m_mult={ + name="Carte Multi.", + text={ + "Multi. {C:mult}+#1#{}", + }, + }, + m_steel={ + name="Carte Acier", + text={ + "Multi. {X:mult,C:white} x#1# {}", + "tant que cette carte", + "reste en main", + }, + }, + m_stone={ + name="Carte Pierre", + text={ + "{C:chips}+#1#{} Jetons", + "sans valeur ni couleur", + }, + }, + m_wild={ + name="Carte Sauvage", + text={ + "Peut être utilisée", + "comme n'importe quelle couleur", + }, + }, + }, + Joker={ + j_8_ball={ + name="N° 8", + text={ + "{C:green}#1# chance(s) sur #2#{} pour chaque", + " {C:attention}8{} joué de créer une carte de", + "{C:tarot}Tarot{} en marquant des points", + "{C:inactive}(Selon la place disponible)", + }, + }, + j_abstract={ + name="Joker abstrait", + text={ + "Multi. {C:mult}+#1#{} pour", + "chaque carte {C:attention}Joker{}", + "{C:inactive}(Actuellement Multi. {C:red}+#2#{C:inactive})", + }, + }, + j_acrobat={ + name="Acrobate", + text={ + "Multi. {X:red,C:white}x#1#{} sur la main", + "{C:attention}finale{C:attention}{} de la manche", + }, + unlock={ + "Jouez {C:attention,E:1}#1#{} mains", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Joker antique", + text={ + "Chaque carte jouée avec", + "une couleur de {V:1}#2#{} octroie", + "{X:mult,C:white} x#1# {} au Multi. lorsqu'elle marque des points,", + "{s:0.8}la couleur change à la fin de la manche", + }, + }, + j_arrowhead={ + name="Pointe de flèche", + text={ + "Les cartes jouées avec", + "une couleur {C:spades}Pique{} octroient", + "{C:chips}+#1#{} Jetons en marquant des points", + }, + unlock={ + "Vous devez avoir au moins {E:1,C:attention}#1#", + "cartes de couleur {E:1,C:attention}#2#", + "dans votre jeu", + }, + }, + j_astronomer={ + name="Astronome", + text={ + "Toutes les cartes {C:planet}Planète{} et les", + "{C:planet}Paquets Céleste{} dans", + "le magasin sont {C:attention}gratuits", + }, + unlock={ + "Découvrez toutes les", + "cartes {E:1,C:planet}Planète{}", + }, + }, + j_banner={ + name="Bannière", + text={ + "{C:chips}+#1#{} Jetons pour", + "chaque {C:attention}défausse", + "restante", + }, + }, + j_baron={ + name="Baron", + text={ + "Chaque {C:attention}Roi{}", + "que vous avez en main", + "ajoute {X:mult,C:white} x#1# {} au Multi.", + }, + }, + j_baseball={ + name="Carte de baseball", + text={ + "Les Jokers {C:green}peu communs{}", + "ajoutent chacun {X:mult,C:white} x#1# {} au Multi.", + }, + }, + j_blackboard={ + name="Tableau noir", + text={ + "Multi. {X:red,C:white}x#1#{} si toutes", + "les cartes en main", + "sont de type {C:spades}#2#{} ou {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Pierre de sang", + text={ + "{C:green}#1# chance(s) sur #2#{} pour que", + "les cartes jouées avec", + "une couleur {C:hearts}Cœur{} octroient", + "{X:mult,C:white} x#3# {} au Multi. lorsqu'elles marquent des points", + }, + unlock={ + "Vous devez avoir au moins {E:1,C:attention}#1#", + "cartes de couleur {E:1,C:attention}#2#", + "dans votre jeu", + }, + }, + j_blue_joker={ + name="Joker bleu", + text={ + "{C:chips}+#1#{} Jetons pour chaque", + "carte restante dans le {C:attention}jeu", + "{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jetons)", + }, + }, + j_blueprint={ + name="Modèle", + text={ + "Copie les capacités du", + "{C:attention}Joker{} sur la droite", + }, + unlock={ + "Gagnez une partie", + }, + }, + j_bootstraps={ + name="Débrouillardise", + text={ + "{C:mult}+#1#{} Multi. pour chaque", + "{C:money}#2# ${} que vous avez", + "{C:inactive}(Actuellement : {C:mult}+#3#{C:inactive} Multi.)", + }, + unlock={ + "Vous devez avoir au moins {E:1,C:attention}#1#", + "Jokers {C:dark_edition}Polychromes{}", + }, + }, + j_brainstorm={ + name="Remue-méninges", + text={ + "Copie les capacités du", + "{C:attention}Joker{} le plus à gauche", + }, + unlock={ + "Défaussez une", + "{E:1,C:attention}Quinte flush royale", + }, + }, + j_bull={ + name="Bull run", + text={ + "{C:chips}+#1#{} jetons pour", + "chaque {C:money}1 ${} que vous avez", + "{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} jetons)", + }, + }, + j_burglar={ + name="Cambrioleur", + text={ + "Lorsque la {C:attention}Blinde{} est choisie,", + "gagnez {C:red}+#1#{} mains et", + "{C:attention}perdez toutes les défausses", + }, + }, + j_burnt={ + name="Joker calciné", + text={ + "Augmente le niveau de", + "la première main de poker {C:attention}défaussée", + "à chaque manche", + }, + unlock={ + "Vendez un total", + "de {E:1,C:attention}#1#{} cartes", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Carte de visite", + text={ + "Les cartes {C:attention}Figure{} jouées ont", + "{C:green}#1# chance(s) sur #2#{}", + "d'octroyer {C:money}2 ${} en marquant des points", + }, + }, + j_caino={ + name="Caino", + text={ + "Ce Joker octroie Multi. {X:mult,C:white} x#1# {} ", + "quand une carte {C:attention}Figure{}", + "est détruite", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Feu de camp", + text={ + "Ce Joker ajoute {X:mult,C:white}x#1#{} au Multi.", + "pour chaque carte {C:attention}vendue{}, mais ce multi. est réinitialisé", + "lorsque la {C:attention}Blinde Boss{} est vaincue", + "{C:inactive}(Actuellement Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_card_sharp={ + name="Maître des cartes", + text={ + "Multi. {X:mult,C:white}x#1#{} si", + "la {C:attention}main de poker{} jouée a déjà", + "été jouée dans cette manche", + }, + }, + j_cartomancer={ + name="Cartomancien", + text={ + "Crée une carte {C:tarot}Tarot{}", + "lorsque la {C:attention}Blinde{} est sélectionnée", + "{C:inactive}(Selon la place disponible)", + }, + unlock={ + "Découvrez chaque", + "carte {E:1,C:tarot}Tarot{}", + }, + }, + j_castle={ + name="Château", + text={ + "Ce Joker octroie {C:chips}+#1#{} Jetons", + "par carte {V:1}#2#{} défaussée,", + "la couleur change à chaque manche", + "{C:inactive}(Actuellement {C:chips}+#3#{C:inactive} Jetons)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "Multi. {X:mult,C:white}x#1#{}", + "{C:green}#2# chance(s) sur #3#{} que cette", + "carte soit détruite", + "à la fin de la manche", + }, + }, + j_ceremonial={ + name="Dague de cérémonie", + text={ + "Lorsque la {C:attention}Blinde{} est sélectionnée,", + "détruit le Joker situé à sa droite", + "et ajoute de manière permanente le {C:attention}double", + "de sa valeur de vente à ce {C:attention}Multi.", + "{C:inactive}(Actuellement Multi. {C:mult}+#1#{C:inactive})", + }, + }, + j_certificate={ + name="Certificat", + text={ + "Au début de la manche,", + "ajoute une {C:attention}carte{} à {C:attention}jouer", + "aléatoire avec un", + "{C:attention}sceau{} aléatoire dans votre main", + }, + unlock={ + "Vous devez avoir une carte", + "à jouer Or", + "sur laquelle figure un {C:attention,E:1}Sceau d'or", + }, + }, + j_chaos={ + name="Chaos le clown", + text={ + "{C:attention}#1#{} {C:green}Renouvellement gratuit", + "par magasin", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Annule l'effet de", + "chaque {C:attention}Blinde Boss", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Joker futé", + text={ + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "un {C:attention}#2#", + }, + }, + j_cloud_9={ + name="Neuvième ciel", + text={ + "Gagnez {C:money}#1# ${} pour chaque", + "{C:attention}9{} dans votre {C:attention}jeu complet", + "à la fin de la manche", + "{C:inactive}(Actuellement {C:money}#2# ${}{C:inactive})", + }, + }, + j_constellation={ + name="Constellation", + text={ + "Ce Joker octroie Multi. ", + "{X:mult,C:white} x#1# {} chaque fois", + "qu'une carte {C:planet}Planète{} est utilisée", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_crafty={ + name="Joker roublard", + text={ + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "une {C:attention}#2#", + }, + }, + j_crazy={ + name="Joker déjanté", + text={ + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "une {C:attention}#2#", + }, + }, + j_credit_card={ + name="Carte de crédit", + text={ + "Vous pouvez accumuler", + "{C:red}-#1# ${} de dettes", + }, + }, + j_delayed_grat={ + name="Récompense différée", + text={ + "Gagnez {C:money}#1# ${} par {C:attention}défausse{} si", + "aucune défausse n'est utilisée", + "avant la fin de la manche", + }, + }, + j_devious={ + name="Joker sournois", + text={ + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "une {C:attention}#2#", + }, + }, + j_diet_cola={ + name="Cola zéro", + text={ + "Vendez cette carte pour", + "créer une", + "carte {C:attention}#1# gratuite", + }, + }, + j_dna={ + name="ADN", + text={ + "Si la {C:attention}première main{} de la manche", + "ne contient qu'{C:attention}une{} carte, ajoutez-en une", + "copie permanente au jeu", + "et placez-la dans la {C:attention}main", + }, + }, + j_drivers_license={ + name="Permis de conduire", + text={ + "Multi. {X:mult,C:white}x#1#{} si vous", + "possédez au moins {C:attention}16", + "cartes améliorées", + "{C:inactive}(Actuellement {C:attention}#2#{C:inactive})", + }, + unlock={ + "Améliorez {E:1,C:attention}#1#{} cartes", + "dans votre jeu", + }, + }, + j_droll={ + name="Joker plaisantin", + text={ + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "une {C:attention}#2#", + }, + }, + j_drunkard={ + name="Ivrogne", + text={ + "{C:red}+#1#{} défausse", + "à chaque manche", + }, + }, + j_duo={ + name="Le duo", + text={ + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "une {C:attention}#2#", + }, + unlock={ + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Crépuscule", + text={ + "Déclenche à nouveau toutes les", + "cartes marquantes dans la main", + "{C:attention}finale{C:attention}{} de la manche", + }, + }, + j_egg={ + name="Œuf", + text={ + "Gagnez {C:money}#1# ${} de", + "la {C:attention}valeur de vente{} à", + "la fin de la manche", + }, + }, + j_erosion={ + name="Érosion", + text={ + "Multi. {C:red}+#1#{} pour chaque", + "carte en dessous de {C:attention}#3#{}", + "dans votre jeu complet", + "{C:inactive}(Actuellement Multi. {C:red}+#2#{C:inactive})", + }, + }, + j_even_steven={ + name="Pair gagnant", + text={ + "Les cartes jouées", + "de valeur {C:attention}paire{} octroient", + "{C:mult}+#1#{} au Multi. lorsque ces cartes marquent des points", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Joker sans visage", + text={ + "Gagnez {C:money}#1# ${} si {C:attention}#2#{}", + "{C:attention}cartes Figure{} ou plus", + "sont défaussées", + "en même temps", + }, + }, + j_family={ + name="La famille", + text={ + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "un {C:attention}#2#", + }, + unlock={ + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "Chaque {C:attention}As{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{}, ou {C:attention}8{} joué octroie", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points", + }, + }, + j_flash={ + name="Carte mémoire", + text={ + "Ce Joker octroie {C:mult}+#1#{} Multi.", + "par {C:attention}renouvellement{} dans le magasin", + "{C:inactive}(Actuellement : {C:mult}+#2#{C:inactive} Multi.)", + }, + }, + j_flower_pot={ + name="Pot de fleurs", + text={ + "Multi. {X:mult,C:white} x#1# {} si la", + "main de poker contient une carte", + "{C:diamonds}Carreau{}, une carte {C:clubs}Trèfle{},", + "une carte {C:hearts}Cœur{} et une carte {C:spades}Pique{}", + }, + unlock={ + "Atteignez la mise initiale", + "niveau {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Voyant", + text={ + "Multi. {C:red}+#1#{} par", + "carte de {C:purple}Tarot{} utilisée", + "{C:inactive}(Actuellement {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Quatre doigts", + text={ + "Toutes les {C:attention}Couleurs{} et les", + "{C:attention}Suites{} peuvent être", + "effectuées avec {C:attention}4{} cartes", + }, + }, + j_gift={ + name="Carte cadeau", + text={ + "Ajoute {C:money}#1# ${} à la {C:attention}valeur de vente", + "de chaque carte {C:attention}Joker{} et", + "carte {C:attention}Consommable{} à", + "la fin de la manche", + }, + }, + j_glass={ + name="Joker de verre", + text={ + "Ce Joker octroie Multi. {X:mult,C:white} x#1# {} ", + "pour chaque carte {C:attention}Verre", + "détruite", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + unlock={ + "Vous devez avoir au moins {E:1,C:attention}#1#", + "{E:1,C:attention}#2#{} dans", + "votre jeu", + }, + }, + j_gluttenous_joker={ + name="Joker glouton", + text={ + "Les cartes jouées avec", + "une couleur {C:clubs}#2#{} octroient", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points", + }, + }, + j_golden={ + name="Joker d'or", + text={ + "Gagnez {C:money}#1# ${} à", + "la fin de la manche", + }, + }, + j_greedy_joker={ + name="Joker avide", + text={ + "Les cartes jouées avec", + "une couleur {C:diamonds}#2#{} octroient", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points", + }, + }, + j_green_joker={ + name="Joker vert", + text={ + "Multi. {C:mult}+#1#{} par main jouée", + "Multi. {C:mult}-#2#{} par défausse", + "{C:inactive}(Actuellement Multi. {C:mult}+#3#{C:inactive})", + }, + }, + j_gros_michel={ + name="Gros Michel", + text={ + "Multi. {C:mult}+#1#{}", + "{C:green}#2# chance(s) sur #3#{} que cette", + "carte soit détruite", + "à la fin de la manche", + }, + }, + j_hack={ + name="Imposteur", + text={ + "Déclenche à nouveau", + "chaque", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} ou {C:attention}5{} joué", + }, + }, + j_half={ + name="Demi-joker", + text={ + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "{C:attention}#2#{} cartes ou moins", + }, + }, + j_hallucination={ + name="Hallucination", + text={ + "{C:green}#1# chance sur #2#{} de créer", + "une carte de {C:tarot}Tarot{} lors de l'ouverture", + "de n'importe quel {C:attention}Paquet Booster{}", + "{C:inactive}(Selon la place disponible)", + }, + }, + j_hanging_chad={ + name="Carte de vote", + text={ + "Déclenche à nouveau la {C:attention}première{} carte", + "jouée pour marquer des points", + "{C:attention}#1#{} fois supplémentaires", + }, + unlock={ + "Battez une Boss Blinde", + "avec 1 {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Randonneur", + text={ + "Chaque {C:attention}carte{} jouée", + "gagne de façon permanente", + "{C:chips}+#1#{} Jetons en marquant des points", + }, + }, + j_hit_the_road={ + name="Prendre la route", + text={ + "Ce Joker octroie Multi. {X:mult,C:white} x#1# {} ", + "pour chaque {C:attention}Joker{}", + "défaussé lors de cette manche", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + unlock={ + "Défaussez {E:1,C:attention}5", + "{E:1,C:attention}Valets{} en", + "même temps", + }, + }, + j_hologram={ + name="Hologramme", + text={ + "Ce Joker octroie Multi. {X:mult,C:white} x#1# {} ", + "chaque fois qu'une {C:attention}carte à jouer{}", + "est ajoutée à votre jeu", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_ice_cream={ + name="Crème glacée", + text={ + "{C:chips}+#1#{} Jetons", + "{C:chips}-#2#{} Jetons pour", + "chaque main jouée", + }, + }, + j_idol={ + name="L'idole", + text={ + "Chaque {C:attention}#2#", + "de {V:1}#3#{} joué octroie", + "{X:mult,C:white} x#1# {} au Multi. en marquant des points", + "{s:0.8}La carte change à chaque manche", + }, + unlock={ + "Dans une main,", + "gagnez au moins", + "{E:1,C:attention}#1#{} Jetons", + }, + }, + j_invisible={ + name="Joker invisible", + text={ + "Après {C:attention}#1#{} manches,", + "vendez cette carte pour", + "{C:attention}Dupliquer{} un Joker aléatoire", + "{C:inactive}(Actuellement {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Gagnez une partie sans", + "jamais avoir plus", + "de {E:1,C:attention}4 Jokers{}", + }, + }, + j_joker={ + name="Joker", + text={ + "Multi. {C:red,s:1.1}+#1#{}", + }, + }, + j_jolly={ + name="Joker joyeux", + text={ + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "une {C:attention}#2#", + }, + }, + j_juggler={ + name="Jongleur", + text={ + "{C:attention}+#1#{} à la taille de la main", + }, + }, + j_loyalty_card={ + name="Carte de fidélité", + text={ + "Multi. {X:red,C:white}x#1#{} toutes les", + "{C:attention}#2#{} mains jouées", + "{C:inactive}#3#e", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Vendez cette carte pour", + "désactiver la", + "{C:attention}Blinde Boss{} actuelle", + }, + }, + j_lucky_cat={ + name="Porte-bonheur", + text={ + "Ce Joker octroie Multi. {X:mult,C:white} x#1# {} ", + "à chaque fois qu'une carte {C:attention}Chance{}", + " est déclenchée avec {C:green}succès{}", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_lusty_joker={ + name="Joker lubrique", + text={ + "Les cartes jouées avec", + "une couleur {C:hearts}#2#{} octroient", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points", + }, + }, + j_mad={ + name="Joker fêlé", + text={ + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "un {C:attention}#2#", + }, + }, + j_madness={ + name="Folie", + text={ + "Lorsqu'une {C:attention}petite blinde{} ou une {C:attention}grosse blinde{}", + "est sélectionnée, gagnez Multi. {X:mult,C:white} x#1# {} ", + "et {C:attention}détruisez{} un Joker aléatoire", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_mail={ + name="Remise par courrier", + text={ + "Gagnez {C:money}#1# ${} pour chaque", + "carte {C:attention}#2#{} défaussée, la valeur", + "change à chaque manche", + }, + }, + j_marble={ + name="Joker de marbre", + text={ + "Ajoute une carte {C:attention}Pierre{}", + "au jeu lorsque la", + "{C:attention}Blinde{} est sélectionnée", + }, + }, + j_matador={ + name="Matador", + text={ + "Gagnez {C:money}#1# ${} si la main jouée", + "déclenche la capacité", + "{C:attention}Blinde Boss{}", + }, + unlock={ + "Battez une Blinde Boss", + "en {E:1,C:attention}une main{} sans", + "utiliser aucune défausse", + }, + }, + j_merry_andy={ + name="Andy le gentil", + text={ + "{C:red}+#1#{} défausses", + "à chaque manche,", + "{C:red}#2#{} à la taille de la main", + }, + unlock={ + "Gagnez une partie en {E:1,C:attention}#1#", + "manches ou moins", + }, + }, + j_midas_mask={ + name="Masque de Midas", + text={ + "Toutes les cartes {C:attention}Figure{} jouées", + "deviennent des cartes {C:attention}Or{} ", + "en marquant des points", + }, + }, + j_mime={ + name="Mime", + text={ + "Déclenche à nouveau toutes", + "les capacités", + "des{C:attention} cartes {C:attention}en main{}", + }, + }, + j_misprint={ + name="Erreur d'impression", + text={ + "", + }, + }, + j_mr_bones={ + name="Défaucheuse", + text={ + "Empêche la mort", + "si les Jetons marqués", + "constituent au minimum {C:attention}25 %", + "des Jetons nécessaires.", + "{S:1.1,C:red,E:2}S'autodétruit{}", + }, + unlock={ + "Perdez {C:attention,E:1}#1#{} parties", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Sommet mystique", + text={ + "Multi. {C:mult}+#1#{} lorsqu'il y a", + "{C:attention}#2#{} défausse", + "restante(s)", + }, + }, + j_obelisk={ + name="Obélisque", + text={ + "Ce Joker octroie Multi. {X:mult,C:white} x#1# {} ", + "par main {C:attention}consécutive{} jouée", + "sans votre", + "{C:attention}main de poker", + " la plus jouée{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_odd_todd={ + name="Impair pépère", + text={ + "Les cartes jouées", + "de valeur {C:attention}impaire{} octroient", + "{C:chips}+#1#{} Jetons lorsque ces cartes marquent des points", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Pierre Onyx", + text={ + "Les cartes jouées avec", + "une couleur {C:clubs}Trèfle{} octroient", + "{C:mult}+#1#{} au Multi. en marquant des points", + }, + unlock={ + "Vous devez avoir au moins {E:1,C:attention}#1#", + "cartes de couleur {E:1,C:attention}#2#", + "dans votre jeu", + }, + }, + j_oops={ + name="Oups ! Que des 6", + text={ + "Double toutes les", + "{C:green,E:1,S:1.1}probabilités", + "{C:inactive}(ex. : {C:green}1 sur 3{C:inactive} -> {C:green}2 sur 3{C:inactive})", + }, + unlock={ + "Dans une main,", + "gagnez au moins", + "{E:1,C:attention}#1#{} Jetons", + }, + }, + j_order={ + name="L'Ordre", + text={ + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "une {C:attention}#2#", + }, + unlock={ + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Paréidolie", + text={ + "Toutes les cartes", + "sont considérées comme", + "des cartes {C:attention}Figure{}", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Crée une copie {C:dark_edition}Négative{}", + "d'{C:attention}1{} carte {C:attention}consommable{} aléatoire", + "en votre possession", + "à la fin du {C:attention}magasin", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Photographie", + text={ + "La première carte {C:attention}Figure", + "octroie {X:mult,C:white} x#1# {} au Multi.", + "en marquant des points", + }, + }, + j_popcorn={ + name="Popcorn", + text={ + "{C:mult}+#1#{} au Multi.", + "{C:mult}-#2#{} au Multi. par", + "manche jouée", + }, + }, + j_raised_fist={ + name="Poing levé", + text={ + "Ajoute le {C:attention}double{} de la valeur", + "de la carte à la valeur", + "la plus {C:attention}faible{} de votre main au Multi.", + }, + }, + j_ramen={ + name="Ramen", + text={ + "Ajoute {X:mult,C:white} x#1# {} au Multi.", + "mais retire {X:mult,C:white} x#2# {} au Multi.", + "par {C:attention}carte{} défaussée", + }, + }, + j_red_card={ + name="Carton rouge", + text={ + "Ce Joker octroie ", + "{C:red}+#1#{} Multi. lorsqu'un", + "{C:attention}Paquet Booster{} est passé", + "{C:inactive}(Actuellement : {C:red}+#2#{C:inactive} Multi.)", + }, + }, + j_reserved_parking={ + name="Place réservée", + text={ + "Chaque carte {C:attention}Figure{}", + "tenue en main a", + "{C:green}#2# chance(s) sur #3#{}", + "d'octroyer {C:money}#1# ${}", + }, + }, + j_ride_the_bus={ + name="Tour en bus", + text={ + "Ce Joker octroie {C:mult}+#1#{} Multi.", + "par main {C:attention}consécutive{} ", + "jouée sans", + "une carte {C:attention}Figure{} marquant des points", + "{C:inactive}(Actuellement : {C:mult}+#2#{C:inactive} Multi.)", + }, + }, + j_riff_raff={ + name="Racaille", + text={ + "Lorsque la {C:attention}Blinde{} est sélectionnée,", + "crée {C:money}#1# {C:blue}Joker Commun{C:attention}", + "{C:inactive}(Selon la place disponible)", + }, + }, + j_ring_master={ + name="Maître du jeu", + text={ + "Les cartes {C:attention}Joker{}, {C:tarot}Tarot{}, {C:planet}Planète{}", + "et {C:spectral}Spectrales{} peuvent", + "apparaître plusieurs fois", + }, + unlock={ + "Atteignez la mise initiale", + "niveau {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Fusée", + text={ + "Gagnez {C:money}#1# ${} à la fin de la manche", + "Les gains augmentent de {C:money}#2# ${}", + "quand une {C:attention}grosse blinde{} est vaincue", + }, + }, + j_rough_gem={ + name="Gemme brute", + text={ + "Les cartes jouées avec", + "Une couleur {C:diamonds}Carreau{} octroient", + "{C:money}#1# ${} en marquant des points", + }, + unlock={ + "Vous devez avoir au moins {E:1,C:attention}#1#", + "cartes de couleur {E:1,C:attention}#2#", + "dans votre jeu", + }, + }, + j_runner={ + name="Coureur", + text={ + "Octroie {C:chips}+#2#{} Jetons", + "si la main jouée", + "contient une {C:attention}Suite{}", + "{C:inactive}(Actuellement {C:chips}+#1#{C:inactive} Jetons)", + }, + }, + j_satellite={ + name="Satellite", + text={ + "Gagnez {C:money}#1# ${} à la fin de la manche", + "pour chaque carte {C:planet}Planète unique", + "utilisée dans cette partie", + "{C:inactive}(Actuellement {C:money}#2# ${C:inactive})", + }, + unlock={ + "Vous devez posséder {E:1,C:money}#1# $", + "ou plus", + }, + }, + j_scary_face={ + name="Figures d'effroi", + text={ + "Les cartes {C:attention}Figure{} jouées", + "octroient {C:chips}+#1#{} Jetons", + "en marquant des points", + }, + }, + j_scholar={ + name="Érudit", + text={ + "Les {C:attention}As{} joués", + "octroient {C:chips}+#2#{} Jetons", + "et {C:mult}+#1#{} au Multi.", + "en marquant des points", + }, + }, + j_seance={ + name="Séance", + text={ + "Si la {C:attention}main de poker{} est de type", + "{C:attention}#1#{}, crée", + "une carte {C:spectral}Spectrale{} aléatoire", + "{C:inactive}(Selon la place disponible)", + }, + }, + j_seeing_double={ + name="Vision double", + text={ + "{X:mult,C:white} x#1# {} au Multi. si", + "la main jouée contient", + "une carte {C:clubs}Trèfle{} et une carte marquante", + "de n'importe quelle {C:attention}couleur", + }, + unlock={ + "Jouez une main", + "contenant", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Seltz", + text={ + "Déclenche à nouveau toutes les", + "cartes jouées pour", + "les {C:attention}#1#{} prochaines mains", + }, + }, + j_shoot_the_moon={ + name="Objectif lune", + text={ + "Chaque {C:attention}Dame{}", + "que vous avez en main", + "ajoute {C:mult}+#1#{} Multi.", + }, + unlock={ + "Jouez tous les {E:1,C:attention}Cœurs", + "de votre jeu en", + "une seule manche", + }, + }, + j_shortcut={ + name="Raccourci", + text={ + "Permet que les {C:attention}Suites{} soient", + "comptabilisées avec des intervalles de {C:attention}1 valeur", + "{C:inactive}(ex : {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Sixième sens", + text={ + "Si la {C:attention}première main{} de la manche est", + "un {C:attention}6{} simple, détruisez-la et", + "créez une carte {C:spectral}Spectrale{}", + "{C:inactive}(Selon la place disponible)", + }, + }, + j_sly={ + name="Joker rusé", + text={ + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "une {C:attention}#2#", + }, + }, + j_smeared={ + name="Joker barbouillé", + text={ + "Les {C:hearts}Cœurs{} et les {C:diamonds}Carreaux", + "comptent comme des cartes de même couleur,", + "et les {C:spades}Piques{} et {C:spades}Trèfles", + "comptent comme des cartes de même couleur", + }, + unlock={ + "Vous devez avoir au moins {C:attention}#1#", + "{E:1,C:attention}#2#{} dans", + "votre jeu", + }, + }, + j_smiley={ + name="Figures souriantes", + text={ + "Les cartes {C:attention}Figure{} jouées", + "octroient {C:mult}+#1#{} au Multi.", + "lorsqu'elles marquent des points", + }, + }, + j_sock_and_buskin={ + name="Tragicomédie", + text={ + "Déclenche à nouveau toutes les", + "cartes {C:attention}Figure{} jouées", + }, + unlock={ + "Jouez un total de", + "{C:attention,E:1}#1#{} cartes Figure", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Joker de l'espace", + text={ + "{C:green}#1# chance(s) sur #2#{}", + "d'augmenter le niveau", + "de la {C:attention}main de poker{} jouée", + }, + }, + j_splash={ + name="Plouf", + text={ + "Chaque {C:attention}carte jouée", + "compte dans l'attribution des points", + }, + }, + j_square={ + name="Joker carré", + text={ + "Ce Joker octroie {C:chips}+#2#{} jetons", + "si la main jouée possède", + "exactement {C:attention}4{} cartes", + "{C:inactive}(Actuellement : {C:chips}#1#{C:inactive} jetons)", + }, + }, + j_steel_joker={ + name="Joker d'acier", + text={ + "Octroie Multi. {X:mult,C:white}x#1# {}.", + "pour chaque {C:attention}carte Acier", + " dans votre {C:attention}jeu complet", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white}x#2#{C:inactive})", + }, + }, + j_stencil={ + name="Pochoir de joker", + text={ + "Multi. {X:red,C:white}x#1#{} pour chaque", + "emplacement {C:attention}Joker{} vide", + "{s:0.8}Pochoir de Joker inclus", + "{C:inactive}(Actuellement {X:red,C:white} x#1# {C:inactive})", + }, + }, + j_stone={ + name="Joker de pierre", + text={ + "Octroie {C:chips}+#1#{} jetons pour", + "chaque {C:attention}carte Pierre", + "restante dans votre {C:attention}jeu complet", + "{C:inactive}(Actuellement : {C:chips}+#2#{C:inactive} jetons)", + }, + }, + j_stuntman={ + name="Cascadeur", + text={ + "{C:chips}+#1#{} Jetons,", + "{C:attention}-#2#{} à la taille de la main", + }, + unlock={ + "Dans une main,", + "gagnez au moins", + "{E:1,C:attention}#1#{} Jetons", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Le Multi. augmente d'une valeur égale au nombre de fois qu'une", + "{C:attention}main de poker{} a été", + "jouée durant cette partie", + }, + }, + j_superposition={ + name="Superposition", + text={ + "Crée une carte {C:tarot}Tarot{} si", + "la main de poker contient un", + "{C:attention}As{} et une {C:attention}Suite{}", + "{C:inactive}(Selon la place disponible)", + }, + }, + j_swashbuckler={ + name="Cape et épée", + text={ + "Ajoute la valeur de vente", + "de tous les", + "{C:attention}Jokers{} possédés au Multi.", + "{C:inactive}(Actuellement : {C:mult}+#1#{C:inactive} Multi.)", + }, + unlock={ + "Vendez un total de", + "{C:attention,E:1}#1#{} Cartes Joker", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Rappel", + text={ + "{X:mult,C:white} x#1# {} au Multi. pour chaque", + "{C:attention}Blinde{} passée dans cette partie", + "{C:inactive}(Actuellement Multi. {X:mult,C:white}x#2#{C:inactive})", + }, + unlock={ + "Reprenez une partie sauvegardée", + "depuis le menu principal", + }, + }, + j_ticket={ + name="Ticket d'or", + text={ + "Les cartes {C:attention}Or{} jouées", + "octroient {C:money}#1# ${} en marquant des points", + }, + unlock={ + "Jouez une main à 5 cartes", + "qui ne contient que des", + "cartes {C:attention,E:1}Or{}", + }, + }, + j_to_the_moon={ + name="Vers les étoiles", + text={ + "Gagnez {C:money}#1# ${} d'{C:attention}intérêt{}", + "supplémentaire par tranche de {C:money}5 ${}", + "possédée à la fin de la manche", + }, + }, + j_todo_list={ + name="Liste des tâches", + text={ + "Gagnez {C:money}#1# ${} si la {C:attention}main de poker{}", + "est de type {C:attention}#2#{} ;", + "la main de poker change", + "à la fin de la manche", + }, + }, + j_trading={ + name="Carte à collectionner", + text={ + "Si la {C:attention}première défausse{} de la manche", + "ne contient qu'{C:attention}une{} carte, détruisez-la", + "et gagnez {C:money}#1# $", + }, + }, + j_tribe={ + name="La tribu", + text={ + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "une {C:attention}#2#", + }, + unlock={ + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "Les {C:attention}Rois{} et les", + "{C:attention}Dames{} jouées octroient chacun", + "{X:mult,C:white} x#1# {} au Multi. lorsqu'ils marquent des points", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="Le trio", + text={ + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "un {C:attention}#2#", + }, + unlock={ + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Troubadour", + text={ + "{C:attention}+#1#{} à la taille de la main,", + "{C:blue}-#2#{} main à chaque manche", + }, + unlock={ + "Gagnez {C:attention,E:1}#1#{} manches", + "consécutives en ne jouant", + "qu'une seule main", + }, + }, + j_trousers={ + name="Pantalon de rechange", + text={ + "Ce Joker octroie {C:mult}+#1#{} Multi.", + "si la main jouée contient", + "1 {C:attention}#2#", + "{C:inactive}(Actuellement : {C:red}+#3#{C:inactive} Multi.)", + }, + }, + j_turtle_bean={ + name="Haricot noir", + text={ + "{C:attention}+#1#{} à la taille de la main,", + "mais ce nombre est réduit de", + "{C:red}#2#{} à chaque manche", + }, + }, + j_vagabond={ + name="Vagabond", + text={ + "Crée une carte de {C:purple}Tarot{}", + "si la main est jouée", + "avec {C:money}#1# ${} ou moins", + }, + }, + j_vampire={ + name="Vampire", + text={ + "Ce Joker octroie Multi. {X:mult,C:white} x#1# {} ", + "pour chaque {C:attention}carte améliorée{} jouée ;", + "supprime {C:attention}l'amélioration de cartes", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_walkie_talkie={ + name="Talkie-walkie", + text={ + "Chaque {C:attention}10{} ou {C:attention}4 joué", + "octroie {C:chips}+#1#{} Jetons et", + "{C:mult}+#2#{} au Multi. lorsqu'il marque des points", + }, + }, + j_wee={ + name="P'tit joker", + text={ + "Ce Joker octroie", + "{C:chips}+#2#{} Jetons lorsque chaque", + "{C:attention}2{} joué marque des points", + "{C:inactive}(Actuellement {C:chips}+#1#{C:inactive} Jetons)", + }, + unlock={ + "Gagnez une partie en {E:1,C:attention}#1#", + "manches ou moins", + }, + }, + j_wily={ + name="Joker habile", + text={ + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "un {C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Joker furieux", + text={ + "Les cartes jouées avec", + "une couleur {C:spades}#2#{} octroient", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points", + }, + }, + j_yorick={ + name="Yorick", + text={ + "{X:mult,C:white}Ce Joker octroie Multi. ", + " x#1# {} toutes les {C:attention}#2#{C:inactive} [#3#]{}", + "cartes défaussées", + "{C:inactive}(Actuellement : Multi. {X:mult,C:white} x#4# {C:inactive})", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Joker blagueur", + text={ + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "un {C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Autocollant noir", + text={ + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}noire{}", + }, + }, + blue_seal={ + name="Sceau bleu", + text={ + "Crée une carte {C:planet}Planète{}", + "pour la dernière {C:attention}main de poker{} jouée", + "de la manche si vous {C:attention}l'avez{} en main", + "{C:inactive}(Selon la place disponible)", + }, + }, + blue_sticker={ + name="Autocollant bleu", + text={ + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}bleue{}", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} Jetons", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} Jetons supplémentaires", + }, + }, + challenge_locked={ + name="(Verrouillé)", + text={ + "Gagnez une partie avec au moins", + "#1# jeux différents pour débloquer le", + "Mode Défi", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Affaibli", + text={ + "Toutes les capacités", + "sont désactivées", + }, + }, + debuffed_playing_card={ + name="Affaibli", + text={ + "N'octroie aucun jeton", + "et toutes les capacités", + "sont désactivées", + }, + }, + deck_locked_discover={ + name="Bloqué", + text={ + "Découvrez au moins", + "{C:attention}#1#{} objets de", + "votre collection", + }, + }, + deck_locked_stake={ + name="Bloqué", + text={ + "Gagnez une partie avec n'importe quel", + "jeu de difficulté", + "{V:1}#1#{} au minimum", + }, + }, + deck_locked_win={ + name="Bloqué", + text={ + "Gagnez une partie avec", + "{C:attention}#1#{}", + "dans n'importe quelle difficulté", + }, + }, + demo_locked={ + name="Bloqué", + text={ + "Non disponible", + "dans cette démo", + }, + }, + demo_shop_locked={ + name="Bloqué", + text={ + "Carte provenant de la collection personnelle de {C:attention}Jimbo", + "personnelle de {C:attention}Jimbo", + "disponible dans la version", + "complète de {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Éternel", + text={ + "Ne peut être vendu", + "ni détruit", + }, + }, + gold_seal={ + name="Sceau d'or", + text={ + "Gagnez {C:money}3 ${} lorsque cette", + "carte est jouée", + "et marque", + }, + }, + gold_sticker={ + name="Autocollant d'or", + text={ + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}d'or{}", + }, + }, + green_sticker={ + name="Autocollant vert", + text={ + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}verte{}", + }, + }, + joker_locked_legendary={ + name="Bloqué", + text={ + "Trouvez ce Joker", + "par la carte {C:spectral}Ame{}", + }, + }, + locked={ + name="Bloqué", + text={ + }, + }, + orange_sticker={ + name="Autocollant orange", + text={ + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}orange{}", + }, + }, + p_arcana_jumbo={ + name="Paquet Jumbo Arcana", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes de{C:tarot} Tarot{} à", + "utiliser immédiatement", + }, + }, + p_arcana_mega={ + name="Paquet Méga-Arcana", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes de{C:tarot} Tarot{} à", + "utiliser immédiatement", + }, + }, + p_arcana_normal={ + name="Paquet Arcana", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes de{C:tarot} Tarot{} à", + "utiliser immédiatement", + }, + }, + p_buffoon_jumbo={ + name="Paquet Jumbo Bouffon", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:joker}Joker{}", + }, + }, + p_buffoon_mega={ + name="Paquet Méga-Bouffon", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:joker}Joker{}", + }, + }, + p_buffoon_normal={ + name="Paquet Bouffon", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:joker}Joker{}", + }, + }, + p_celestial_jumbo={ + name="Paquet Jumbo Céleste", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:planet} Planète{} à", + "utiliser immédiatement", + }, + }, + p_celestial_mega={ + name="Paquet Méga-Céleste", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:planet} Planète{} à", + "utiliser immédiatement", + }, + }, + p_celestial_normal={ + name="Paquet Céleste", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:planet} Planète{} à", + "utiliser immédiatement", + }, + }, + p_spectral_jumbo={ + name="Paquet Jumbo Spectral", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:spectral}Spectrales{} à", + "utiliser immédiatement", + }, + }, + p_spectral_mega={ + name="Paquet Méga-Spectral", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:spectral}Spectrales{} à", + "utiliser immédiatement", + }, + }, + p_spectral_normal={ + name="Paquet Spectral", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes {C:spectral}Spectrales{} à", + "utiliser immédiatement", + }, + }, + p_standard_jumbo={ + name="Paquet Jumbo Standard", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes{C:attention} à jouer{} à", + "ajouter à votre jeu", + }, + }, + p_standard_mega={ + name="Paquet Méga-Standard", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes{C:attention} à jouer{} à", + "ajouter à votre jeu", + }, + }, + p_standard_normal={ + name="Paquet Standard", + text={ + "Choisissez {C:attention}#1#{} parmi", + "{C:attention}#2# cartes{C:attention} à jouer{} à", + "ajouter à votre jeu", + }, + }, + perishable={ + name="Périssable", + text={ + "Effet Affaibli après ", + "{C:attention}#1#{} manches", + "{C:inactive}({C:attention}#2#{C:inactive} restante(s))", + }, + }, + pinned_left={ + name="Épinglé", + text={ + "Ce Joker reste", + "épinglé à la", + "position la plus à gauche", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# de {V:1}#2# ", + }, + }, + purple_seal={ + name="Sceau violet", + text={ + "Crée une carte de {C:tarot}Tarot{}", + "lorsque cette carte est {C:attention}défaussée", + "{C:inactive}(Selon la place disponible)", + }, + }, + purple_sticker={ + name="Autocollant violet", + text={ + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}violette{}", + }, + }, + red_seal={ + name="Sceau rouge", + text={ + "Déclenche à nouveau cette", + "carte {C:attention}1{} fois", + }, + }, + red_sticker={ + name="Autocollant rouge", + text={ + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}rouge{}", + }, + }, + remove_negative={ + name="Négatif", + text={ + "{C:inactive,s:0.9}(Supprime le {C:dark_edition,s:0.9}Negatif{C:inactive,s:0.9} de la copie)", + }, + }, + rental={ + name="Location", + text={ + "Perdez {C:money}#1# ${} à", + "la fin de la manche", + }, + }, + undiscovered_booster={ + name="Non découvert", + text={ + "Ouvrez ce paquet", + "dans une partie sans seed", + "pour connaître son effet", + }, + }, + undiscovered_edition={ + name="Non découvert", + text={ + "Trouvez cette édition", + "dans une partie sans seed pour", + "pour connaître son effet", + }, + }, + undiscovered_joker={ + name="Non découvert", + text={ + "Achetez ou utilisez", + "cette carte dans une partie", + "sans seed pour", + "connaître son effet", + }, + }, + undiscovered_planet={ + name="Non découvert", + text={ + "Achetez ou utilisez", + "cette carte dans une partie", + "sans seed pour", + "connaître son effet", + }, + }, + undiscovered_spectral={ + name="Non découvert", + text={ + "Achetez ou utilisez", + "cette carte dans une partie", + "sans seed pour", + "connaître son effet", + }, + }, + undiscovered_tag={ + name="Non découvert", + text={ + "Utilisez ce badge dans", + "une partie sans seed pour", + "connaître son effet", + }, + }, + undiscovered_tarot={ + name="Non découvert", + text={ + "Achetez ou utilisez", + "cette carte dans une partie", + "sans seed pour", + "connaître son effet", + }, + }, + undiscovered_voucher={ + name="Non découvert", + text={ + "Échangez ce", + "coupon dans une partie", + "sans seed pour", + "connaître son effet", + }, + }, + white_sticker={ + name="Autocollant blanc", + text={ + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise {C:attention}blanche{}", + }, + }, + wip_locked={ + name="Bloqué", + text={ + "Projet", + "en cours", + }, + }, + }, + Planet={ + c_ceres={ + name="Cérès", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_earth={ + name="Terre", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_jupiter={ + name="Jupiter", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_mars={ + name="Mars", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_mercury={ + name="Mercure", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_neptune={ + name="Neptune", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_planet_x={ + name="Planète X", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_pluto={ + name="Pluton", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_saturn={ + name="Saturne", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_uranus={ + name="Uranus", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + c_venus={ + name="Vénus", + text={ + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons", + }, + }, + }, + Spectral={ + c_ankh={ + name="Ankh", + text={ + "Crée une copie d'un", + "{C:attention}Joker{} aléatoire, détruit", + "tous les autres Jokers", + }, + }, + c_aura={ + name="Aura", + text={ + "Ajoute un effet {C:dark_edition}Brillant{}, {C:dark_edition}Holographique{}", + "ou {C:dark_edition}Polychrome{} à", + "{C:attention}1{} carte choisie dans votre main", + }, + }, + c_black_hole={ + name="Trou noir", + text={ + "Augmente chaque", + "{C:legendary,E:1}main de poker", + "d'{C:attention}1{} niveau", + }, + }, + c_cryptid={ + name="Cryptide", + text={ + "Crée {C:attention}#1#{} copies", + "d'{C:attention}une{} carte sélectionnée", + "dans votre main", + }, + }, + c_deja_vu={ + name="Déjà vu", + text={ + "Ajoute un {C:red}Sceau rouge{}", + "à {C:attention}1{} carte sélectionnée", + "dans votre main", + }, + }, + c_ectoplasm={ + name="Ectoplasme", + text={ + "Ajoute {C:dark_edition}Négatif{}", + "à un {C:attention}Joker{} aléatoire,", + "Taille de la main {C:red}-1{}", + }, + }, + c_familiar={ + name="Familier", + text={ + "Détruit {C:attention}1{} carte", + "sélectionnée de votre main,", + "ajoute {C:attention}#1#{} cartes {C:attention}Figure Améliorées{}", + "aléatoires à votre main", + }, + }, + c_grim={ + name="Sinistre", + text={ + "Détruit {C:attention}1{} carte", + "aléatoire de votre main,", + "ajoute {C:attention}#1#{}As améliorés", + "aléatoires à votre main", + }, + }, + c_hex={ + name="Maléfice", + text={ + "Ajoute {C:dark_edition}Polychrome{} à un", + "{C:attention}Joker{} aléatoire, détruisez", + "tous les autres Jokers", + }, + }, + c_immolate={ + name="Immolation", + text={ + "Détruit {C:attention}#1#{} cartes", + "aléatoires en main,", + "gagnez {C:money}#2# $", + }, + }, + c_incantation={ + name="Incantation", + text={ + "Détruit {C:attention}1{} carte", + "aléatoire de votre main, ajoute {C:attention}#1#", + "{C:attention}cartes{} {C:attention}numérotées améliorées", + "aléatoires à votre main", + }, + }, + c_medium={ + name="Médium", + text={ + "Ajoute un {C:purple}Sceau violet{}", + "à {C:attention}1{} carte sélectionnée", + "dans votre main", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Convertit toutes les cartes", + "en main en une unique", + "{C:attention}Valeur{} aléatoire", + "Taille de la main {C:red}-1{}", + }, + }, + c_sigil={ + name="Sceau", + text={ + "Convertit toutes les cartes", + "en main en une unique", + "{C:attention}Couleur{} aléatoire", + }, + }, + c_soul={ + name="L'âme", + text={ + "Crée un", + "Joker {C:legendary,E:1}Légendaire{}", + "{C:inactive}(Selon la place disponible)", + }, + }, + c_talisman={ + name="Talisman", + text={ + "Ajoute un {C:attention}Sceau d'or{}", + "à {C:attention}1{} carte", + "aléatoire de votre main", + }, + }, + c_trance={ + name="Transe", + text={ + "Ajoute un {C:blue}Sceau bleu{}", + "à {C:attention}1{} carte sélectionnée", + "dans votre main", + }, + }, + c_wraith={ + name="Apparition", + text={ + "Crée une carte", + "Joker {C:red}Rare{C:attention}{},", + "fixe l'argent à {C:money}0 $", + }, + }, + }, + Stake={ + stake_black={ + name="Mise noire", + text={ + "Les magasins peuvent posséder des Jokers {C:attention}Éternels{}", + "{C:inactive,s:0.8}(Ne peut pas être vendu ou détruit)", + "{s:0.8}Applique toutes les mises précédentes", + }, + }, + stake_blue={ + name="Mise bleue", + text={ + "{C:red}-1{} défausse", + "{s:0.8}Applique toutes les mises précédentes", + }, + }, + stake_gold={ + name="Mise d'or", + text={ + "Les magasins peuvent posséder des Jokers {C:attention}location{}", + "{C:inactive,s:0.8}(coûte {C:money,s:0.8}3 ${C:inactive,s:0.8} par manche)", + "{s:0.8}S'applique à toutes les mises précédentes", + }, + }, + stake_green={ + name="Mise verte", + text={ + "Le score requis augmente", + "plus rapidement pour chaque {C:attention}mise initiale", + "{s:0.8}Applique toutes les mises précédentes", + }, + }, + stake_orange={ + name="Mise orange", + text={ + "Les magasins peuvent posséder des Jokers {C:attention}périssables{}", + "{C:inactive,s:0.8}(Affaiblis après 5 manches)", + "{s:0.8}S'applique à toutes les mises précédentes", + }, + }, + stake_purple={ + name="Mise violette", + text={ + "Le score requis augmente", + "plus rapidement pour chaque {C:attention}mise initiale", + "{s:0.8}Applique toutes les mises précédentes", + }, + }, + stake_red={ + name="Mise rouge", + text={ + "Une {C:attention}Petite Blinde{} n'octroie pas", + "de récompense en argent", + "{s:0.8}Applique toutes les mises précédentes", + }, + }, + stake_white={ + name="Mise blanche", + text={ + "Difficulté de base", + }, + }, + }, + Tag={ + tag_boss={ + name="Badge de boss", + text={ + "Effectue un renouvellement de la", + "{C:attention}Blinde Boss", + }, + }, + tag_buffoon={ + name="Badge de bouffon", + text={ + "Octroie un", + "{C:attention}Paquet Méga-Bouffon", + }, + }, + tag_charm={ + name="Badge de charme", + text={ + "Octroie un", + "{C:tarot}Paquet Méga-Arcana", + }, + }, + tag_coupon={ + name="Badge de coupon", + text={ + "Les cartes initiales et", + "les Boosters du", + "prochain magasin sont gratuits", + }, + }, + tag_d_six={ + name="Badge D6", + text={ + "Les renouvellements du prochain magasin", + "commencent à {C:money}0 $", + }, + }, + tag_double={ + name="Badge double", + text={ + "Octroie une copie du", + "prochain {C:attention}Badge{} sélectionné", + "{s:0.8}en excluant {s:0.8,C:attention}le badge double", + }, + }, + tag_economy={ + name="Badge économique", + text={ + "Double votre argent", + "{C:inactive}({C:money}#1# ${C:inactive} au maximum)", + }, + }, + tag_ethereal={ + name="Badge éthéré", + text={ + "Octroie un", + "{C:planet}Paquet Spectral", + }, + }, + tag_foil={ + name="Badge brillant", + text={ + "Le prochain Joker en édition de base", + "du magasin sera gratuit et", + "obtiendra le statut {C:dark_edition}Brillant", + }, + }, + tag_garbage={ + name="Badge moisi", + text={ + "Octroie {C:money}#1# ${} par", + "{C:red}défausse{} dans cette partie", + "{C:inactive}(Octroiera {C:money}#2# ${C:inactive})", + }, + }, + tag_handy={ + name="Badge pratique", + text={ + "Octroie {C:money}#1# ${} par", + "{C:blue}main{} jouée dans cette partie", + "{C:inactive}(Octroiera {C:money}#2# ${C:inactive})", + }, + }, + tag_holo={ + name="Badge holographique", + text={ + "Le prochain Joker en édition de base", + "du magasin sera gratuit et", + "obtiendra le statut {C:dark_edition}Holographique", + }, + }, + tag_investment={ + name="Badge d'investissement", + text={ + "Après avoir battu", + "la Blinde Boss,", + "gagnez {C:money}#1# $", + }, + }, + tag_juggle={ + name="Badge de jongleur", + text={ + "{C:attention}+#1#{} à la taille de la main", + "à la prochaine manche", + }, + }, + tag_meteor={ + name="Badge de météore", + text={ + "Octroie un", + "{C:planet}Paquet Méga-Céleste", + }, + }, + tag_negative={ + name="Badge négatif", + text={ + "Le prochain Joker en édition de base", + "du magasin sera gratuit et", + "obtiendra le statut {C:dark_edition}Négatif", + }, + }, + tag_orbital={ + name="Badge orbital", + text={ + "Augmente {C:attention}#1#", + "de {C:attention}#2# niveaux", + }, + }, + tag_polychrome={ + name="Badge polychrome", + text={ + "Le prochain Joker en édition de base", + "du magasin sera gratuit et", + "obtiendra le statut {C:dark_edition}Polychrome", + }, + }, + tag_rare={ + name="Badge rare", + text={ + "Le magasin possède un", + "{C:red}Joker rare gratuit", + }, + }, + tag_skip={ + name="Badge de rapidité", + text={ + "Gagnez {C:money}#1# ${} par blinde", + "passée lors de cette partie", + "{C:inactive}(Peut octroyer {C:money}#2# ${C:inactive})", + }, + }, + tag_standard={ + name="Badge standard", + text={ + "Octroie un", + "{C:attention}Paquet Méga-Standard", + }, + }, + tag_top_up={ + name="Badge d'appoint", + text={ + "Crée jusqu'à {C:attention}#1#", + "Jokers {C:blue}Communs{}", + "{C:inactive}(Selon la place disponible)", + }, + }, + tag_uncommon={ + name="Badge peu commun", + text={ + "Le magasin possède un", + "{C:green}Joker peu commun gratuit", + }, + }, + tag_voucher={ + name="Badge de coupon", + text={ + "Ajoute un {C:voucher}Coupon", + "au prochain magasin", + }, + }, + }, + Tarot={ + c_chariot={ + name="Le Chariot", + text={ + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#", + }, + }, + c_death={ + name="La Mort", + text={ + "Sélectionnez {C:attention}#1#{} cartes,", + "la carte de {C:attention}gauche{}", + "devient la carte de {C:attention}droite{}", + "{C:inactive}(Faites glisser les cartes pour les réorganiser)", + }, + }, + c_devil={ + name="Le Diable", + text={ + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="L'Empereur", + text={ + "Crée jusqu'à {C:attention}#1#", + "cartes de {C:tarot}Tarot{} aléatoires", + "{C:inactive}(Selon la place disponible)", + }, + }, + c_empress={ + name="L'Impératrice", + text={ + "Améliore {C:attention}#1#", + "cartes sélectionnées en", + "{C:attention}#2#", + }, + }, + c_fool={ + name="Le Mat", + text={ + "Crée la dernière", + "carte de {C:tarot}Tarot{} ou {C:planet}Planète{} utilisée", + "pendant cette partie,", + "excepté {s:0.8,C:tarot}Le Mat{s:0.8}", + }, + }, + c_hanged_man={ + name="Le Pendu", + text={ + "Détruit un maximum de", + "{C:attention}#1#{} cartes sélectionnées", + }, + }, + c_heirophant={ + name="Le Pape", + text={ + "Améliore {C:attention}#1#", + "cartes sélectionnées en", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="L'Ermite", + text={ + "Double l'argent", + "{C:inactive}({C:money}#1# ${C:inactive} au maximum)", + }, + }, + c_high_priestess={ + name="La Papesse", + text={ + "Crée jusqu'à {C:attention}#1#", + "cartes {C:planet}Planète{} aléatoires", + "{C:inactive}(Selon la place disponible)", + }, + }, + c_judgement={ + name="Le Jugement", + text={ + "Crée une carte", + "{C:attention}Joker{} aléatoire", + "{C:inactive}(Selon la place disponible)", + }, + }, + c_justice={ + name="La Justice", + text={ + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="L'Amoureux", + text={ + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#", + }, + }, + c_magician={ + name="Le Batleur", + text={ + "Améliore {C:attention}#1#{}", + "cartes sélectionnées en", + "{C:attention}#2#", + }, + }, + c_moon={ + name="La Lune", + text={ + "Convertit jusqu'à", + "{C:attention}#1#{} cartes sélectionnées", + "pour les changer en {V:1}#2#{}", + }, + }, + c_star={ + name="L'Étoile", + text={ + "Convertit jusqu'à", + "{C:attention}#1#{} cartes sélectionnées", + "pour les changer en {V:1}#2#{}", + }, + }, + c_strength={ + name="La Force", + text={ + "Augmente la valeur", + "d'un maximum de {C:attention}#1#{} cartes", + "sélectionnées de {C:attention}1", + }, + }, + c_sun={ + name="Le Soleil", + text={ + "Convertit jusqu'à", + "{C:attention}#1#{} cartes sélectionnées", + "pour les changer en {V:1}#2#{}", + }, + }, + c_temperance={ + name="La Tempérance", + text={ + "Octroie la valeur de vente", + "totale de tous les", + "Jokers actuels {C:inactive}({C:money}#1# ${C:inactive} au maximum)", + "{C:inactive}(Actuellement {C:money}#2# ${C:inactive})", + }, + }, + c_tower={ + name="La Maison Dieu", + text={ + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="La Roue de Fortune", + text={ + "{C:green}#1# chance(s) sur #2#{} d'ajouter une édition", + "{C:dark_edition}Brillantes{}, {C:dark_edition}Holographique{} ou", + "{C:dark_edition}Polychrome{}", + "à un {C:attention}Joker au hasard", + }, + }, + c_world={ + name="Le Monde", + text={ + "Convertit jusqu'à", + "{C:attention}#1#{} cartes sélectionnées", + "pour les changer en {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimatière", + text={ + "{C:dark_edition}+1{} emplacement de Joker", + }, + unlock={ + "Utilisez {C:voucher}À blanc{}", + "{C:attention}#1#{} fois au total", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="À blanc", + text={ + "{C:inactive}Ne fait rien ?", + }, + }, + v_clearance_sale={ + name="Déstockage", + text={ + "Toutes les cartes et tous les paquets du", + "magasin sont vendus avec un rabais de {C:attention}#1# %{}", + }, + }, + v_crystal_ball={ + name="Boule de cristal", + text={ + "{C:attention}+1{} emplacement de consommable", + }, + }, + v_directors_cut={ + name="Director's Cut", + text={ + "Renouveler la Blinde Boss", + "{C:attention}1{} fois par mise initiale,", + "{C:money}#1# ${} par lancer", + }, + }, + v_glow_up={ + name="Bonne mine", + text={ + "Les cartes {C:dark_edition}Brillantes{}, {C:dark_edition}Holographiques{} et", + "{C:dark_edition}Polychromes{}", + "apparaissent {C:attention}#1#x{} plus souvent", + }, + unlock={ + "Vous devez avoir au moins {C:attention}#1#", + "cartes {C:attention}Joker{} en édition", + "{C:dark_edition}Brillantes{}, {C:dark_edition}Holographique{} ou", + "{C:dark_edition}Polychrome{}", + }, + }, + v_grabber={ + name="Grappin", + text={ + "Gagnez de manière permanente", + "{C:blue}+#1#{} main", + "par manche", + }, + }, + v_hieroglyph={ + name="Hiéroglyphe", + text={ + "{C:attention}-#1#{} à la mise initiale,", + "{C:blue}-#1#{} main", + "à chaque manche", + }, + }, + v_hone={ + name="Aiguisage", + text={ + "Les cartes {C:dark_edition}Brillantes{}, {C:dark_edition}Holographiques{} et", + "{C:dark_edition}Polychromes{}", + "apparaissent {C:attention}#1#x{} plus souvent", + }, + }, + v_illusion={ + name="Illusion", + text={ + "Les {C:attention}Cartes à jouer{} du magasin", + "peuvent être {C:enhanced}Améliorées{},", + "{C:dark_edition}Édition{} et/ou {C:dark_edition}Sceau{}", + }, + unlock={ + "Achetez un total de", + "{C:attention}#1#{} cartes à jouer", + "dans le magasin", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Liquidation", + text={ + "Toutes les cartes et tous les paquets du", + "magasin sont vendus avec un rabais de {C:attention}#1# %{}", + }, + unlock={ + "Utilisez au moins", + "{C:attention}#1# cartes {C:voucher}Coupon(s){}", + "en une partie", + }, + }, + v_magic_trick={ + name="Tour de magie", + text={ + "Les {C:attention}Cartes à jouer{} peuvent", + "être achetées", + "dans le {C:attention}magasin", + }, + }, + v_money_tree={ + name="Arbre à monnaie", + text={ + "Augmentez le total", + "d'intérêts gagnés", + "à chaque manche jusqu'à {C:money}#1# ${}", + }, + unlock={ + "Maximisez les intérêts", + "perçus par manche pendant", + "{C:attention}#1#{} manches consécutives", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Tong Nacho", + text={ + "Gagnez de manière permanente", + "{C:blue}+#1#{} main", + "par manche", + }, + unlock={ + "Jouez un total", + "de {C:attention}#1#{} cartes", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Observatoire", + text={ + "Les cartes {C:planet}Planète{} de votre", + "zone {C:attention}Consommable{} octroient", + "{X:red,C:white}x#1#{} au multi. pour", + "leur {C:attention}main de poker spécifique", + }, + unlock={ + "Utilisez un total de {C:attention}#1#", + "cartes {C:planet}Planète{} dans n'importe quel", + "{C:planet}Paquet Céleste", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Globe de présage", + text={ + "Les cartes {C:spectral}Spectrales{} peuvent", + "apparaître dans n'importe quel", + "{C:attention}Paquet Arcana", + }, + unlock={ + "Utilisez un total de {C:attention}#1#", + "cartes de {C:tarot}Tarot{} dans n'importe quel", + "{C:tarot}Paquet Arcana", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Excédent", + text={ + "{C:attention}+1{} emplacement de carte", + "disponible dans le magasin", + }, + }, + v_overstock_plus={ + name="Excédent plus", + text={ + "{C:attention}+1{} emplacement de carte", + "disponible dans le magasin", + }, + unlock={ + "Dépensez un total de", + "{C:money}#1# ${} dans le magasin", + "{C:inactive}(#2# $)", + }, + }, + v_paint_brush={ + name="Pinceau", + text={ + "{C:attention}+#1#{} à la taille de la main", + }, + }, + v_palette={ + name="Palette", + text={ + "{C:attention}+#1#{} à la taille de la main", + }, + unlock={ + "Réduisez la taille de la main", + "jusqu'à {C:attention}#1#{} cartes", + }, + }, + v_petroglyph={ + name="Pétroglyphe", + text={ + "{C:attention}-#1#{} à la mise initiale,", + "{C:red}-#1#{} défausse", + "à chaque manche", + }, + unlock={ + "Atteignez la mise initiale", + "niveau {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Marchand de cartes Planète", + text={ + "Les cartes {C:planet}Planète{} apparaissent", + "{C:attention}#1#X{} plus fréquemment", + "dans le magasin", + }, + }, + v_planet_tycoon={ + name="Magnat des cartes Planète", + text={ + "Les cartes {C:planet}Planète{} apparaissent", + "{C:attention}#1#X{} plus fréquemment", + "dans le magasin", + }, + unlock={ + "Achetez un total de", + "{C:attention}#1# cartes {C:planet}Planète{}", + "dans le magasin", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Recyclomancie", + text={ + "Octroie", + "de manière permanente {C:red}+#1#{} défausse", + "à chaque manche", + }, + unlock={ + "Défaussez un total", + "de {C:attention}#1#{} cartes", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Comme s'il en pleuvait", + text={ + "Les renouvellements coûtent", + "{C:money}#1# ${} moins cher", + }, + unlock={ + "Effectuez un total de", + "{C:attention}#1#{} renouvellements dans le magasin", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Renouvellement en pagaille", + text={ + "Les renouvellements coûtent", + "{C:money}#1# ${} moins cher", + }, + }, + v_retcon={ + name="Retcon", + text={ + "Renouveler la Blinde Boss", + "un nombre {C:attention}illimité{} de fois,", + "{C:money}#1# ${} par relance", + }, + unlock={ + "Découvrez", + "{C:attention}#1#{} Blindes", + }, + }, + v_seed_money={ + name="Capital de départ", + text={ + "Augmentez le total", + "d'intérêts gagnés", + "à chaque manche jusqu'à {C:money}#1# ${}", + }, + }, + v_tarot_merchant={ + name="Marchand de cartes de Tarot", + text={ + "Les cartes de {C:tarot}Tarot{} apparaissent", + "{C:attention}#1#X{} plus fréquemment", + "dans le magasin", + }, + }, + v_tarot_tycoon={ + name="Magnat des cartes de Tarot", + text={ + "Les cartes de {C:tarot}Tarot{} apparaissent", + "{C:attention}#1#X{} plus fréquemment", + "dans le magasin", + }, + unlock={ + "Achetez un total de", + "{C:attention}#1# cartes de {C:tarot}Tarot{}", + "dans le magasin", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Télescope", + text={ + "Les {C:attention}Paquets Célestes{} contiennent", + "toujours la carte {C:planet}Planète{}", + "pour votre", + "{C:attention}main de poker la plus jouée", + }, + }, + v_wasteful={ + name="Gaspillage", + text={ + "Octroie", + "de manière permanente {C:red}+#1#{} défausse", + "à chaque manche", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Gagnez 100 000 000 de Jetons en une seule main", + _1000k="Gagnez 1 000 000 de Jetons en une seule main", + _10k="Gagnez 10 000 Jetons en une seule main", + ante_up="Atteignez la mise initiale 4", + ante_upper="Atteignez la mise initiale 8", + astronomy="Découvrez toutes les cartes Planète", + big_hands="Vous devez avoir 80 cartes ou plus dans votre jeu", + card_discarder="Défaussez au moins 2 500 cartes", + card_player="Jouez au moins 2 500 cartes", + cartomancy="Découvrez toutes les cartes de Tarot", + clairvoyance="Découvrez toutes les cartes Spectrales", + completionist="Découvrez 100 % de votre collection", + completionist_plus="Gagnez avec tous les jeux en difficulté Mise d'or", + completionist_plus_plus="Gagnez un Autocollant d'or sur chaque Joker", + extreme_couponer="Découvrez tous les coupons", + flushed="Jouez une couleur avec 5 cartes Libres", + heads_up="Gagnez une partie", + high_stakes="Gagnez une partie en difficulté Mise d'or au minimum", + legendary="Découvrez un Joker Légendaire", + low_stakes="Gagnez une partie en difficulté Mise rouge au minimum", + mid_stakes="Gagnez une partie en difficulté Mise noire au minimum", + nest_egg="Vous devez accumuler 400 $ ou plus en une seule partie", + retrograde="Faites passer une main de poker au niveau 10", + roi="Achetez 5 coupons avant la mise initiale 4", + royale="Jouez une Quinte flush royale", + rule_bender="Terminez n'importe quelle partie de Défi", + rule_breaker="Terminez toutes les parties de Défi", + shattered="Cassez 2 cartes de verre en une seule main", + speedrunner="Gagnez une partie en 12 manches ou moins", + tiny_hands="Réduisez votre jeu à 20 cartes ou moins", + you_get_what_you_get="Gagnez une partie sans effectuer aucun renouvellement dans le magasin", + }, + achievement_names={ + _100000k="100 000 000", + _1000k="1 000 000", + _10k="10 000", + ante_up="Mise initiale augmentée !", + ante_upper="Mise initiale encore augmentée !", + astronomy="Astronomie", + big_hands="Grandes mains", + card_discarder="Défausseur de cartes", + card_player="Joueur de cartes", + cartomancy="Cartomancie", + clairvoyance="Clairvoyance", + completionist="Jusqu'au-boutiste", + completionist_plus="Jusqu'au-boutiste+", + completionist_plus_plus="Jusqu'au-boutiste++", + extreme_couponer="Chasseur de coupons", + flushed="Coloré", + heads_up="Tête-à-tête", + high_stakes="Mises élevées", + legendary="Légendaire", + low_stakes="Mises faibles", + mid_stakes="Mises moyennes", + nest_egg="Bas de laine", + retrograde="Rétrograde", + roi="Investisseur", + royale="Royal", + rule_bender="Transgresseur", + rule_breaker="Briseur de règles", + shattered="En miettes", + speedrunner="Speedrunner", + tiny_hands="Petites mains", + you_get_what_you_get="À prendre ou à laisser", + }, + blind_states={ + Current="Actuel", + Defeated="Battue", + Select="Sélectionner", + Selected="Sélectionné", + Skipped="Passé", + Upcoming="À venir", + }, + challenge_names={ + c_blast_off_1="Mise à feu", + c_bram_poker_1="Bram Poker", + c_city_1="Ville du quart d'heure", + c_cruelty_1="Cruauté", + c_double_nothing_1="Quitte ou double", + c_five_card_1="Tirage à cinq cartes", + c_fragile_1="Fragile", + c_golden_needle_1="Aiguille d'or", + c_inflation_1="Inflation", + c_jokerless_1="Sans blague", + c_knife_1="Sur le fil du rasoir", + c_luxury_1="Taxe de luxe", + c_mad_world_1="Monde de fous", + c_medusa_1="Méduse", + c_monolith_1="Monolithe", + c_non_perishable_1="Non périssable", + c_omelette_1="L'Omelette", + c_rich_1="Enrichir les riches", + c_typecast_1="Typecasting", + c_xray_1="Vision aux rayons X", + }, + collabs={ + Clubs={ + ["1"]="Défaut", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Défaut", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Défaut", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Défaut", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="FAQ", + b_and_use="ET UTILISER", + b_back="Retour", + b_blinds="Blindes", + b_booster_packs="Boosters", + b_buy="ACHETER", + b_cash_out="Encaisser", + b_challenges="Défis", + b_collection="Collection", + b_collection_cap="COLLECTION", + b_continue="Continuer", + b_copy="Copie", + b_copy_seed="Copier la seed", + b_create_profile="Créer un profil", + b_credits="Crédits", + b_current_profile="Profil actuel", + b_customize_deck="Personnaliser le jeu", + b_deck="Jeu", + b_decks="Jeux", + b_delete_profile="Supprimer un profil", + b_discard="Défausser", + b_editions="Éditions", + b_endless="Mode Infini", + b_enhanced_cards="Cartes améliorées", + b_full_deck="Jeu complet", + b_high_contrast_cards="Cartes à haut contraste", + b_how_to_play="Comment jouer", + b_imagery="Imagerie", + b_jokers="Jokers", + b_load_profile="Charger un profil", + b_main_menu="Menu principal", + b_music="Musique", + b_new_challenge="Commencer un nouveau Défi", + b_new_run="Nouvelle partie", + b_next="Suivant", + b_next_round_1="Manche", + b_next_round_2="Suivante", + b_open="OUVRIR", + b_options="Options", + b_options_cap="OPTIONS", + b_planet_cards="Cartes Planète", + b_play_cap="JOUER", + b_play_hand="Jouer la main", + b_playbalatro="Visiter playbalatro.com", + b_poker_hands="Mains de poker", + b_quit_cap="QUITTER", + b_redeem="ÉCHANGER", + b_reduced_motion="Mouvements réduits", + b_remaining="Restant", + b_reroll_boss="Renouvellement du Boss", + b_reset_profile="Réinitialiser un profil", + b_restrictions="Restrictions", + b_retry="Réessayer", + b_rules="Règles", + b_run_info_1="Partie", + b_run_info_2="Infos", + b_seals="Sceaux", + b_seed="Seed", + b_select="SÉLECTIONNER", + b_sell="VENDRE", + b_set_CRT="CRT", + b_set_CRT_bloom="Flou CRT", + b_set_apply="Appliquer", + b_set_audio="Audio", + b_set_crash_reports="Rapports de plantage", + b_set_game="Jeu", + b_set_game_vol="Volume du jeu", + b_set_gamespeed="Vitesse du jeu", + b_set_graphics="Graphismes", + b_set_master_vol="Volume principal", + b_set_monitor="Écran d'affichage", + b_set_music_vol="Volume de la musique", + b_set_pixel_smoothing="Lissage du Pixel Art", + b_set_play_discard_pos="Position du bouton Jouer/Défausser", + b_set_rumble="Vibrations de la manette", + b_set_screenshake="Tremblement de l'écran", + b_set_shadows="Ombres", + b_set_vibration="Vibrations", + b_set_video="Vidéo", + b_set_windowmode="Mode Fenêtré", + b_settings="Paramètres", + b_skip="Passer", + b_skip_blind="Passer la Blinde", + b_skip_reward="Passer la Récompense", + b_sort_hand="Trier la main", + b_sounds="Sons", + b_spectral_cards="Cartes Spectrales", + b_stake="Mise", + b_start_new_run="Nouvelle partie", + b_stat_consumables="Consommables", + b_stat_jokers="Jokers", + b_stat_planets="Planètes", + b_stat_spectrals="Spectrales", + b_stat_tarots="Tarots", + b_stat_vouchers="Coupons", + b_stats="Statistiques", + b_tags="Badges", + b_tarot_cards="Cartes de Tarot", + b_unlock_all="Tout débloquer", + b_use="UTILISER", + b_vouchers="Coupons", + b_wishlist="Mettre dans la liste de souhaits Steam", + k_aces="As", + k_achievement="Succès", + k_achievements_disabled="Succès désactivés", + k_active="actif", + k_active_ex="Actif !", + k_again_ex="Encore !", + k_all_hands="Toutes les mains", + k_also_applied="A également appliqué", + k_ante="Mise initiale", + k_ante_cap="MISE INITIALE", + k_arcana_pack="Paquet Arcana", + k_balanced="Équilibré", + k_banned_cards="Cartes bannies", + k_banned_tags="Badges bannis", + k_base_cap="BASE", + k_base_cards="Cartes de base", + k_best_hand="Meilleure main", + k_booster="Booster", + k_buffoon_pack="Paquet Bouffon", + k_cap_consumables="CONSOMMABLES", + k_card_stats="Stats des cartes", + k_celestial_pack="Paquet Céleste", + k_challenge_mode="Mode Défi", + k_challenges="Défis", + k_choose="Choisir", + k_collection="Collection", + k_common="Commun", + k_compatible="compatible", + k_copied_ex="Copié !", + k_custom_rules="Règles personnalisées", + k_daily_run="Partie quotidienne", + k_debuffed="Affaibli", + k_deck="Jeu", + k_deck_stake_wins="Victoires de mise de jeu", + k_defeated_by="Battu par", + k_demo_version_ex="Version de démonstration !", + k_disabled_ex="Désactivé !", + k_drank_ex="Belle descente !", + k_duplicated_ex="Dupliqué !", + k_dwarf_planet="Planète naine", + k_eaten_ex="Mangé !", + k_edition="Édition", + k_effective="Efficace", + k_empty_caps="VIDE", + k_enter_name="Saisissez votre nom", + k_enter_seed="Entrer la seed", + k_enter_text="Saisir le texte", + k_eroded_ex="Érodé !", + k_extinct_ex="Détruit !", + k_face_cards="Cartes Figure", + k_game_modifiers="Modificateurs de jeu", + k_gold="Or", + k_high_score_ex="Meilleur score !", + k_hud_discards="Défausses", + k_hud_hands="Mains", + k_incompatible="incompatible", + k_joker="Joker", + k_joker_stickers="Autocollants Joker", + k_jokers_cap="JOKERS", + k_legendary="Légendaire", + k_level_prefix="niv.", + k_level_up_ex="Niveau supérieur !", + k_locked="Bloqué", + k_lower_score="score", + k_lvl="niv.", + k_melted_ex="Fondu !", + k_money="Argent", + k_mult="Multi.", + k_no_other_jokers="Pas d'autres Jokers !", + k_no_reward="Pas de récompense", + k_no_room_ex="Pas de place !", + k_no_space_ex="Pas de place !", + k_none="Aucun", + k_nope_ex="Non !", + k_not_allowed_ex="Non autorisé !", + k_not_discovered="Non découvert", + k_numbered_cards="Cartes numérotées", + k_or="ou", + k_other="Autre", + k_page="Page", + k_planet="Planète", + k_planet_q="Planète ?", + k_playing_as="Joue en tant que", + k_plus_joker="+1 Joker", + k_plus_planet="+1 Planète", + k_plus_spectral="+1 Spectral", + k_plus_stone="+1 Pierres", + k_plus_tarot="+1 Tarot", + k_poker_hand="main de poker", + k_profile="Profil", + k_progress="Progression", + k_rank="Valeur", + k_rare="Rare", + k_redeemed_ex="Échangé !", + k_reroll="Changer", + k_reset="Réinitialiser", + k_reward="Récompense", + k_round="Manche", + k_safe_ex="Sûr !", + k_saved_ex="Sauvegardé !", + k_seed="La seed", + k_seeded_run="Partie avec seed", + k_skipped_cap="PASSÉ", + k_spectral="Spectral", + k_spectral_pack="Paquet Spectral", + k_stake="Mise", + k_stake_level="Niveau de mise", + k_standard_pack="Paquet Standard", + k_suit="Couleur", + k_swapped_ex="Échangé !", + k_tarot="Tarot", + k_trophies_disabled="Trophées désactivés", + k_trophy="Trophée", + k_uncommon="Peu commun", + k_undisovered="Non découvert", + k_unknown="?????", + k_unlocked_ex="Débloqué !", + k_upgrade_ex="Amélioré !", + k_val_up="Valeur supérieure !", + k_view="Afficher", + k_voucher="Coupon", + k_vouchers_cap="COUPONS", + k_wins="Victoires", + k_x_base="X la base", + ml_bloom_opt={ + "Désactivé", + "Activé", + }, + ml_buy_and_use_target={ + "ACHETER", + "ET UTILISER", + }, + ml_buy_target={ + "ACHETER", + }, + ml_card_stats={ + "Carte", + "Stats", + }, + ml_controller_required={ + "Une manette de jeu est requise pour jouer. ", + "Veuillez connecter une manette pour continuer.", + }, + ml_crash_report_info={ + "Les rapports de plantage seront envoyés aux développeurs", + "afin de limiter les problèmes à l'avenir.", + "Aucune information personnelle ou d'identification ne sera envoyée.", + }, + ml_demo_thanks_message={ + "Pensez à ajouter Balatro", + "à votre liste de souhaits sur Steam et à vous inscrire", + "à la newsletter sur playbalatro.com", + }, + ml_disabled_seed={ + "Tous les déblocages et les", + "découvertes désactivés", + }, + ml_edition_seal_enhancement_explanation={ + "Les cartes à jouer peuvent toutes recevoir une", + "Amélioration, une Édition et un Sceau", + }, + ml_eternal={ + "Eternel", + "Ne peut être vendu", + "ni détruit", + }, + ml_gold_seal_desc={ + "Le sceau d'or", + "retourne en main", + "s'il est joué", + }, + ml_offline_message={ + "Cet appareil est déconnecté.", + "La sauvegarde actuelle est peut-être obsolète.", + }, + ml_open_target={ + "OUVRIR", + }, + ml_paste_seed={ + "Coller", + "La seed", + }, + ml_play_discard_pos_opt={ + "Défausser/Jouer", + "Jouer/Défausser", + }, + ml_redeem_target={ + "ÉCHANGER", + }, + ml_sell_target={ + "VENDRE", + }, + ml_shadow_opt={ + "Activées", + "Désactivées", + }, + ml_smoothing_opt={ + "Désactivé", + "Activé", + }, + ml_unlock_all_explanation={ + "ATTENTION ! Si vous débloquez la collection complète,", + "tous les succès seront désactivés sur ce profil !", + }, + ml_unlock_all_trophies={ + "ATTENTION ! Si vous débloquez la collection complète,", + "désactivera les trophées sur ce profil !", + }, + ml_vsync_opt={ + "Synchro V. Activée", + "Synchro V. Désact.", + }, + ml_windowmode_opt={ + "Fenêtré", + "Plein écran", + "Sans bordures", + }, + ph_1_level="+1 Niveau", + ph_4_7_of_clubs="quatre 7 de trèfles", + ph_alert_debuff_confirm="Appuyez à nouveau sur « Jouer » pour confirmer", + ph_all_poker_hand="Toutes les mains de poker", + ph_blind_reward="Récompense : ", + ph_blind_score_at_least="Faire un score d'au moins", + ph_boss_disabled="Bosse désactivé !", + ph_choose_blind_1="Choisissez votre", + ph_choose_blind_2="prochaine Blinde", + ph_click_confirm="Appuyez à nouveau pour confirmer", + ph_deck_preview_effective="Total effectif grâce aux Jokers, aux Blindes et aux améliorations de cartes", + ph_deck_preview_stones="Pierres", + ph_defeat_the_boss="Battez la Blinde Boss", + ph_defeat_this_blind_1="Battez cette Blinde", + ph_defeat_this_blind_2="pour la découvrir", + ph_demo_thanks_1="Merci d'avoir joué à la", + ph_demo_thanks_2="DÉMO DE BALATRO", + ph_display_stickers="Afficher les autocollants des mises pendant la partie", + ph_game_over="PARTIE TERMINÉE", + ph_improve_run="Améliorez votre partie !", + ph_most_played="(main la plus jouée)", + ph_mr_bones="Sauvé par M. Bones", + ph_no_boss_active="aucun boss actif", + ph_no_vouchers="Pas de coupons utilisés pendant cette partie", + ph_score_at_least="Faire un score d'au moins", + ph_score_cards_discarded="Cartes défaussées", + ph_score_cards_played="Cartes jouées", + ph_score_cards_purchased="Cartes achetées", + ph_score_furthest_ante="Mise initiale", + ph_score_furthest_round="Manche", + ph_score_hand="Meilleure main", + ph_score_new_collection="Nouvelles découvertes", + ph_score_poker_hand="Main la plus jouée", + ph_score_times_rerolled="Nombre de renouvellements ", + ph_select_challenge="Sélectionnez un défi", + ph_sneak_peek="Coup d'œil furtif", + ph_stat_consumable="Nombre de fois où cette carte a été utilisée", + ph_stat_joker="Nombre total de manches effectuées avec cette carte", + ph_stat_voucher="Nombre de fois où ce coupon a été utilisé", + ph_unscored_hand="La main ne marquera pas de points", + ph_up_ante_1="Augmente la mise initiale", + ph_up_ante_2="Augmente toutes les Blindes", + ph_up_ante_3="Actualise les Blindes", + ph_vouchers_redeemed="Bons utilisés pendant cette partie", + ph_you_win="VOUS AVEZ GAGNÉ !", + ph_you_win_demo="VOUS AVEZ TERMINÉ LA DÉMO !", + }, + high_scores={ + boss_streak="Le plus de Boss d'affilée", + collection="Collection", + current_streak="", + furthest_ante="Plus grosse mise initiale", + furthest_round="Plus haute manche", + hand="Meilleure main", + most_money="Plus d'argent possédé", + poker_hand="Main la plus jouée", + win_streak="Meilleure série de victoires", + }, + labels={ + blue_seal="Sceau bleu", + common="Commun", + eternal="Éternel", + foil="Brillante", + gold_seal="Sceau d'or", + holographic="Holographique", + legendary="Légendaire", + locked="Bloqué", + negative="Négatif", + perishable="Périssable", + pinned_left="Épinglé", + planet="Planète", + pluto_planet="Planète naine", + polychrome="Polychrome", + purple_seal="Sceau violet", + rare="Rare", + red_seal="Sceau rouge", + rental="Location", + tarot="Tarot", + uncommon="Peu commun", + voucher="Coupon", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 cartes de même valeur", + }, + Flush={ + "5 cartes de même couleur", + }, + ["Flush Five"]={ + "5 cartes de même valeur et de même couleur", + }, + ["Flush House"]={ + "Un brelan et une paire", + "avec des cartes de même couleur", + }, + ["Four of a Kind"]={ + "4 cartes de même valeur. Elles peuvent", + "être jouées avec une autre carte non marquée", + }, + ["Full House"]={ + "Un brelan et une paire", + }, + ["High Card"]={ + "Si la main jouée n'est pas l'une des mains ci-dessus,", + "seule la carte à la valeur la plus élevée est prise en compte", + }, + Pair={ + "2 cartes de même valeur. Elles peuvent", + "être jouées avec trois autres cartes non marquées", + }, + ["Royal Flush"]={ + "5 cartes à la suite {valeurs consécutives} avec", + "partageant la même couleur", + }, + Straight={ + "5 cartes dont les valeurs se suivent", + }, + ["Straight Flush"]={ + "5 cartes à la suite {valeurs consécutives} avec", + "partageant la même couleur", + }, + ["Three of a Kind"]={ + "3 cartes de même valeur. Elles peuvent", + "être jouées avec deux autres cartes non marquées", + }, + ["Two Pair"]={ + "2 paires de cartes de valeurs différentes. Elles peuvent", + "être jouées avec une autre carte non marquée", + }, + }, + poker_hands={ + ["Five of a Kind"]="Cinq cartes identiques", + Flush="Couleur", + ["Flush Five"]="Flush Five", + ["Flush House"]="Flush House", + ["Four of a Kind"]="Carré", + ["Full House"]="Main pleine", + ["High Card"]="Carte Haute", + Pair="Paire", + ["Royal Flush"]="Quinte flush royale", + Straight="Suite", + ["Straight Flush"]="Quinte flush", + ["Three of a Kind"]="Brelan", + ["Two Pair"]="Double paire", + }, + quips={ + dq_1={ + "Aïe ! J'espère que vous", + "avez caché quelques cartes", + "dans votre manche pour", + "relever ce dernier défi !", + }, + lq_1={ + "On ferait peut-être", + "mieux de jouer à", + "la pêche...", + }, + lq_10={ + "Quel flop !", + }, + lq_2={ + "On se couche", + "comme des dégonflés !", + }, + lq_3={ + "Il va falloir", + "reprendre nos esprits", + "avant de reprendre la main !", + }, + lq_4={ + "Vous savez ce qu'on dit,", + "à la fin, c'est toujours", + "le casino qui gagne !", + }, + lq_5={ + "Eh bien, je crois que", + "le vrai Joker,", + "c'est vous !", + }, + lq_6={ + "Oh non, vous bluffiez", + "aussi ?", + }, + lq_7={ + "On n'a pas l'air", + "fins !", + }, + lq_8={ + "Si j'avais des mains,", + "je me serais couvert", + "les yeux !", + }, + lq_9={ + "Je suis un bouffon,", + "au sens propre, et vous,", + "quelle est votre excuse ?", + }, + wq_1={ + "Vous êtes un As !", + }, + wq_2={ + "Vous avez bien géré", + "la situation !", + }, + wq_3={ + "Vous ne bluffiez pas,", + "apparemment !", + }, + wq_4={ + "Dommage que tous ces", + "jetons soient", + "virtuels...", + }, + wq_5={ + "Mes enseignements ont", + "porté leurs fruits !", + }, + wq_6={ + "Vous avez pris", + "de judicieuses décisions !", + }, + wq_7={ + "Heureusement", + "que je n'ai pas misé", + "contre vous !", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="As", + Jack="Valet", + King="Roi", + Queen="Dame", + }, + suits_plural={ + Clubs="Trèfles", + Diamonds="Carreaux", + Hearts="Cœurs", + Spades="Piques", + }, + suits_singular={ + Clubs="Trèfle", + Diamonds="Carreau", + Hearts="Cœur", + Spades="Pique", + }, + tutorial={ + bb_1={ + "La {C:attention}Grosse Blinde", + "vous rapportera de l'argent.", + }, + bb_2={ + "Mais vous pouvez choisir de {C:attention}la passer", + "pour obtenir un {C:attention}Badge{} ! Chaque", + "{C:attention}Badge{} possède un effet unique.", + }, + bb_3={ + "Néanmoins, vous devez garder un œil", + "sur la {C:attention}Blinde Boss{}. Elle", + "a une capacité dont il", + "vous faudra tenir compte.", + }, + bb_4={ + "Si vous la battez, la", + "{C:attention}Mise initiale{} augmente et toutes les", + "{C:attention}Blindes{} deviennent plus difficiles.", + }, + bb_5={ + "Battez la {C:attention}Mise initiale{} #1# pour gagner.", + "Choisissez votre voie !", + }, + fh_1={ + "Vous gagnez des Jetons en", + "jouant des {C:attention}mains de Poker", + }, + fh_2={ + "Chaque {C:attention}main de Poker{} rapporte un", + "montant de base de {C:blue}Jetons", + "multiplié par le {C:red}Multi.", + }, + fh_3={ + "Regardez vos {C:attention}mains de Poker", + "dans la zone {C:attention}Infos sur la partie{},", + "ainsi que d'autres informations", + "sur votre partie en cours.", + }, + fh_4={ + "Les cartes vous rapportent", + "également des {C:blue}Jetons{},", + "passez votre souris dessus pour savoir combien !", + }, + fh_4_touch={ + "Les cartes vous rapportent", + "également des {C:blue}Jetons{},", + "appuyez et maintenez pour savoir combien !", + }, + fh_5={ + "À présent, choisissez jusqu'à", + "{C:attention}5{} cartes à jouer", + "et appuyez sur {C:blue}Jouer la main.", + }, + fh_5_touch={ + "À présent, touchez jusqu'à", + "{C:attention}5{} cartes à jouer", + "et appuyez sur {C:blue}Jouer la main", + }, + fh_6={ + "Vous pouvez également {C:red}Défausser{} jusqu'à", + "{C:attention}5{} cartes sélectionnées", + "pour essayer de créer des", + "mains encore plus fortes. Essayez !", + }, + fh_7={ + "Attention ! Vous ne disposez que d'un", + "nombre limité de {C:blue}Mains", + "et de {C:red}Défausses{} par manche.", + }, + fh_8={ + "Gagnez {C:attention}300 Jetons{} avant", + "de manquer de {C:blue}Mains", + "pour remporter cette manche.", + "Bonne chance !", + }, + s_1={ + "Beau travail ! Maintenant", + "que vous {E:1}nagez{} dans l'{C:money}or{},", + "vous pouvez acheter de nouvelles", + "cartes dans le {C:attention}Magasin", + }, + s_10={ + "Les {C:attention}Coupons{} sont réapprovisionnés", + "lorsque vous battez la", + "{C:attention}Blinde Boss{}.", + }, + s_11={ + "Pensez à regarder les deux", + "{C:booster}Boosters{} dans", + "chaque magasin. Ils", + "renferment de belles surprises !", + }, + s_12={ + "Passons maintenant à", + "la {C:attention}manche suivante{}.", + }, + s_2={ + "Essayez d'acheter cette", + "jolie carte de diable", + }, + s_2_touch={ + "Essayez d'acheter cette", + "jolie carte de Diable !", + "Faites-la glisser du magasin", + "jusqu'à la zone {C:attention}ACHETER{}", + }, + s_3={ + "C'est l'un des {C:attention}#1#", + "{C:attention}Jokers{} que vous pouvez ajouter à", + "votre partie. Chaque {C:attention}Joker", + "a un effet différent.", + }, + s_4={ + "Celui-ci ajoute un {C:red}Multi. +4{} à", + "chaque main que vous jouez !", + }, + s_5={ + "Soyez sélectif, car vous ne pourrez", + "transporter que {C:attention}5 cartes Joker{}", + "à la fois.", + }, + s_6={ + "À présent, achetez cette autre", + "carte dans le {C:attention}Magasin.", + }, + s_7={ + "Cette carte de {C:tarot}Tarot{} est un", + "{C:attention}Consommable{}. Celle-là", + "améliore vos cartes", + "à jouer ! Gardez-la précieusement.", + }, + s_8={ + "Vous pouvez transporter jusqu'à", + "{C:attention}2 cartes Consommable{}", + "à la fois", + }, + s_9={ + "Si vous économisez assez,", + "vous pouvez acheter un {C:attention}Coupon{}.", + "Les {C:attention}Coupons{} améliorent", + "votre partie de manière passive !", + }, + sb_1={ + "Bien le bonjour ! Je m'appelle", + "{C:attention}Jimbo{}, et je suis là pour vous", + "apprendre à jouer !", + }, + sb_2={ + "L'objectif est de gagner des", + "{C:blue}Jetons{} pour vaincre", + "la {C:attention}Blinde ennemie", + }, + sb_3={ + "Ceci est une {C:blue}Petite Blinde{},", + "qui ne requerra qu'un score de", + "{C:attention}300 Jetons{} pour la battre.", + }, + sb_4={ + "Sélectionnez la {C:blue}Petite Blinde", + "pour commencer la manche !", + }, + sh_1={ + "Quand vous obtiendrez d'autres cartes,", + "pensez à les réorganiser.", + "Les{C:attention} Jokers{} se déclenchent", + "de gauche à droite.", + }, + sh_2={ + "Ah, et n'oubliez pas", + "d'{C:attention}UTILISER{} vos consommables !", + }, + sh_3={ + "Sélectionnez jusqu'à {C:attention}2{} cartes", + "dans votre main et appuyez sur", + "{C:attention}UTILISER{} sur la carte {C:tarot}Tarot{}", + "pour les améliorer !", + }, + sh_3_touch={ + "Sélectionnez jusqu'à {C:attention}2{} cartes", + "dans votre main et faites glisser", + "la carte de {C:tarot}Tarot{} jusqu'à la zone {C:attention}UTILISER{}", + "pour les améliorer !", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Mains", + a_handsize="+#1# Taille de la main", + a_handsize_minus="Taille de la main -#1#", + a_mult="+#1# Multi", + a_mult_minus="Multi. -#1#", + a_remaining="#1# Restant", + a_sold_tally="#1#/#2# Vendu", + a_xmult="Multi. x#1#", + a_xmult_minus="-Multi. x#1#", + ante_x_voucher="MISE INITIALE #1# COUPON", + challenges_completed="#1#/#2# Défis terminés", + completed="#1#/#2# complétés", + deck_preview_wheel_plural="Les nombres peuvent être inférieurs en raison des cartes #1# tirées faces cachées", + deck_preview_wheel_singular="Les nombres peuvent être inférieurs en raison de la carte #1# tirée face cachée", + interest="#1# d'intérêt tous les #2# $ (#3# max.)", + loyalty_active="Actif !", + loyalty_inactive="#1# restant", + ml_foil_desc={ + "Brillante", + "+#1# Chips", + }, + ml_holo_desc={ + "Holographique", + "+#1# Multi.", + }, + ml_negative_consumable_desc={ + "Négatif", + "+#1# emplacement de consommable", + }, + ml_negative_desc={ + "Négatif", + "+#1# Emplacement Joker", + }, + ml_polychrome_desc={ + "Polychrome", + "Multi. x#1#", + }, + remaining_discard_money="Défausses restantes (#1# $ chacune)", + remaining_hand_money="Mains restantes (#1# $ chacune)", + unlocked="#1#/#2# débloqués", + }, + v_text={ + ch_c_all_eternal={ + "Tous les Jokers du magasin sont {C:eternal}Éternels{}", + }, + ch_c_chips_dollar_cap={ + "Les {C:blue}Jetons{} ne peuvent pas dépasser le montant actuel de {C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Défi du jour !", + }, + ch_c_debuff_played_cards={ + "Toutes les cartes {C:attention}jouées{} deviennent {C:attention}Affaiblies{} après avoir marqué des points", + }, + ch_c_discard_cost={ + "Chaque défausse coûte {C:money}#1# ${}", + }, + ch_c_flipped_cards={ + "{C:green}1 carte sur #1#{} est tirée face cachée", + }, + ch_c_inflation={ + "Augmente de manière permanente les prix de {C:money}1 ${} à chaque achat", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Vous pouvez tenir {C:red}-1{} cartes en main par tranche de {C:money}#1# ${} en votre possession", + }, + ch_c_no_extra_hand_money={ + "Les {C:blue}Mains{} supplémentaires ne rapportent plus d'argent", + }, + ch_c_no_interest={ + "Vous ne percevez pas d'{C:attention}intérêts{} à la fin de la manche", + }, + ch_c_no_reward={ + "Toutes les {C:attention}Blindes{} ne donnent pas d'argent en récompense", + }, + ch_c_no_reward_specific={ + "Les {C:attention}#1#Blindes{} ne donnent pas d'argent en récompense", + }, + ch_c_no_shop_jokers={ + "Les Jokers n'apparaissent plus dans le {C:attention}magasin", + }, + ch_c_none={ + "{C:inactive}Aucun", + }, + ch_c_set_eternal_ante={ + "Lorsque le boss de la mise initiale {C:attention}#1#{} est vaincu, tous les Jokers deviennent {C:attention}éternels", + }, + ch_c_set_joker_slots_ante={ + "Lorsque le boss de la mise initiale {C:attention}#1#{} est vaincu, les emplacements Joker passent à {C:attention}0", + }, + ch_c_set_seed={ + "1 tentative avec la seed défini : {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} Emplacements Consommable", + }, + ch_m_discards={ + "{C:red}#1#{} défausses par manche", + }, + ch_m_dollars={ + "Commencez avec {C:money}#1# $", + }, + ch_m_hand_size={ + "Taille de la main : {C:attention}#1#{}", + }, + ch_m_hands={ + "{C:blue}#1#{} mains par manche", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} emplacements Joker", + }, + ch_m_none={ + "{C:inactive}Aucun", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/id.lua b/src/localization/id.lua new file mode 100644 index 0000000..3f814ca --- /dev/null +++ b/src/localization/id.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Abandoned Deck", + text={ + "Mulai giliran dengan", + "tidak ada {C:attention}Kartu Wajah", + "di deck Anda", + }, + }, + b_anaglyph={ + name="Anaglyph Deck", + text={ + "Setelah mengalahkan setiap", + "{C:attention}Boss Blind{}, memperoleh sebuah", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Black Deck", + text={ + "{C:attention}+#1#{} slot Joker", + "", + "{C:blue}-#2#{} hand", + "setiap babak", + }, + }, + b_blue={ + name="Blue Deck", + text={ + "{C:blue}+#1#{} hand", + "setiap babak", + }, + }, + b_challenge={ + name="Challenge Deck", + text={ + "", + }, + }, + b_checkered={ + name="Checkered Deck", + text={ + "Mulai giliran dengan", + "{C:attention}26{C:spades} Sekop{} dan", + "{C:attention}26{C:hearts} Hati{} di deck", + }, + }, + b_erratic={ + name="Erratic Deck", + text={ + "Semua {C:attention}Peringkat{} dan", + "{C:attention}Rupa{} di deck", + "diacak", + }, + }, + b_ghost={ + name="Ghost Deck", + text={ + "Kartu {C:spectral}Spectral{} bisa juga", + "muncul di toko,", + "mulai dengan kartu {C:spectral,T:c_hex}Hex{}", + }, + }, + b_green={ + name="Green Deck", + text={ + "Di akhir setiap Babak:", + "{C:money}$#1#{s:0.85} per sisa {C:blue}Hand", + "{C:money}$#2#{s:0.85} per sisa {C:red}Discard", + "Tidak mendapat {C:attention}Keuntungan", + }, + }, + b_magic={ + name="Magic Deck", + text={ + "Mulai giliran dengan", + "{C:tarot,T:v_crystal_ball}#1#{} voucher", + "dan {C:attention}2{} salinan", + "dari {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Nebula Deck", + text={ + "Mulai giliran dengan", + "{C:planet,T:v_telescope}#1#{} voucher", + "", + "{C:red}#2#{} slot habis pakai", + }, + }, + b_painted={ + name="Painted Deck", + text={ + "{C:attention}+#1#{} ukuran hand", + "{C:red}#2#{} slot Joker", + }, + }, + b_plasma={ + name="Plasma Deck", + text={ + "Saldo {C:blue}Chip{} dan", + "{C:red}Mult{} saat menghitung", + "skor untuk hand yang dimainkan", + "{C:red}X#1#{} ukuran Blind base", + }, + }, + b_red={ + name="Red Deck", + text={ + "{C:red}+#1#{} discard", + "setiap babak", + }, + }, + b_yellow={ + name="Yellow Deck", + text={ + "Mulai dengan", + "ekstra {C:money}$#1#", + }, + }, + b_zodiac={ + name="Zodiac Deck", + text={ + "Mulai giliran dengan", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "dan {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="The Arm", + text={ + "Turunkan level", + "poker hand yang dimainkan", + }, + }, + bl_big={ + name="Big Blind", + text={ + }, + }, + bl_club={ + name="The Club", + text={ + "Semua kartu Keriting", + "di-debuff", + }, + }, + bl_eye={ + name="The Eye", + text={ + "Tidak ada jenis", + "repeat hand pada babak ini", + }, + }, + bl_final_acorn={ + name="Amber Acorn", + text={ + "Balik dan kocok", + "semua kartu Joker", + }, + }, + bl_final_bell={ + name="Cerulean Bell", + text={ + "Memaksakan 1 kartu pada", + "kartu yang selalu dipilih", + }, + }, + bl_final_heart={ + name="Crimson Heart", + text={ + "Sebuah Joker secara acak", + "dinonaktifkan setiap hand", + }, + }, + bl_final_leaf={ + name="Verdant Leaf", + text={ + "Semua kartu di-debuff", + "hingga 1 Joker dijual", + }, + }, + bl_final_vessel={ + name="Violet Vessel", + text={ + "Blind sangat besar", + }, + }, + bl_fish={ + name="The Fish", + text={ + "Kartu yang ditarik menghadap ke bawah", + "setelah setiap hand dimainkan", + }, + }, + bl_flint={ + name="The Flint", + text={ + "Base Chip dan", + "Mult dibagi dua", + }, + }, + bl_goad={ + name="The Goad", + text={ + "Semua kartu Sekop", + "di-debuff", + }, + }, + bl_head={ + name="The Head", + text={ + "Semua kartu Hati", + "di-debuff", + }, + }, + bl_hook={ + name="The Hook", + text={ + "Membuang 2 kartu secara", + "acak per hand yang dimainkan", + }, + }, + bl_house={ + name="The House", + text={ + "Hand pertama adalah", + "ditarik menghadap ke bawah", + }, + }, + bl_manacle={ + name="The Manacle", + text={ + "-1 Ukuran Hand", + }, + }, + bl_mark={ + name="The Mark", + text={ + "Semua kartu wajah", + "ditarik menghadap ke bawah", + }, + }, + bl_mouth={ + name="The Mouth", + text={ + "Mainkan 1 jenis hand", + "saja pada babak ini", + }, + }, + bl_needle={ + name="The Needle", + text={ + "Mainkan 1 hand saja", + }, + }, + bl_ox={ + name="The Ox", + text={ + "Memainkan sebuah #1#", + "membuat uang hingga $0", + }, + }, + bl_pillar={ + name="The Pillar", + text={ + "Kartu yang dimainkan sebelumnya", + "sebelum Ante ini di-debuff", + }, + }, + bl_plant={ + name="The Plant", + text={ + "Semua kartu wajah", + "di-debuff", + }, + }, + bl_psychic={ + name="The Psychic", + text={ + "Harus memainkan 5 kartu", + }, + }, + bl_serpent={ + name="The Serpent", + text={ + "Setelah Bermain atau Membuang,", + "harus menarik 3 kartu", + }, + }, + bl_small={ + name="Small Blind", + text={ + }, + }, + bl_tooth={ + name="The Tooth", + text={ + "Kehilangan $1 per", + "kartu yang dimainkan", + }, + }, + bl_wall={ + name="The Wall", + text={ + "Blind ekstra besar", + }, + }, + bl_water={ + name="The Water", + text={ + "Mulai dengan", + "0 discard", + }, + }, + bl_wheel={ + name="The Wheel", + text={ + " dalam 7 kartu menarik", + "ditarik menghadap ke bawah", + }, + }, + bl_window={ + name="The Window", + text={ + "Semua kartu Hati", + "di-debuff", + }, + }, + }, + Edition={ + e_base={ + name="Base", + text={ + "Tanpa efek tambahan", + }, + }, + e_foil={ + name="Foil", + text={ + "{C:chips}+#1#{} chip", + }, + }, + e_holo={ + name="Holographic", + text={ + "{C:mult}+#1#{} Mult", + }, + }, + e_negative={ + name="Negatif", + text={ + "{C:dark_edition}+#1#{} slot Joker", + }, + }, + e_negative_consumable={ + name="Negatif", + text={ + "{C:dark_edition}+#1#{} slot habis pakai", + }, + }, + e_polychrome={ + name="Polychrome", + text={ + "{X:mult,C:white} X#1# {} Mult", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Bonus Card", + text={ + }, + }, + m_glass={ + name="Glass Card", + text={ + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2# dalam #3#{} peluang untuk", + "menghancurkan kartu", + }, + }, + m_gold={ + name="Gold Card", + text={ + "{C:money}$#1#{} jika ini", + "ini ada di hand", + "di akhir babak", + }, + }, + m_lucky={ + name="Lucky Card", + text={ + "{C:green}#1# dalam #3#{} peluang", + "untuk {C:mult}+#2#{} Mult", + "{C:green}#1# dalam #5#{} peluang", + "untuk memenangi {C:money}$#4#", + }, + }, + m_mult={ + name="Mult Card", + text={ + "{C:mult}+#1#{} Mult", + }, + }, + m_steel={ + name="Steel Card", + text={ + "{X:mult,C:white} X#1# {} Mult", + "sedangkan kartu ini", + "tetap di hand", + }, + }, + m_stone={ + name="Stone Card", + text={ + "{C:chips}+#1#{} Chip", + "tanpa peringkat atau rupa", + }, + }, + m_wild={ + name="Wild Card", + text={ + "Bisa dipakai", + "sebagai rupa apa pun", + }, + }, + }, + Joker={ + j_8_ball={ + name="8 Ball", + text={ + "{C:green}#1# di #2#{} peluang untuk setiap", + "8 {C:attention}yang dimainkan{} untuk membuat kartu", + "{C:tarot}Tarot{} saat menang", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + j_abstract={ + name="Abstract Joker", + text={ + "{C:mult}+#1#{} Mult untuk", + "setiap kartu {C:attention}Joker{}", + "{C:inactive}(Saat ini {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_acrobat={ + name="Acrobat", + text={ + "{X:red,C:white} X#1# {} Mult di {C:attention}final", + "{C:attention}hand{} dari babak", + }, + unlock={ + "Mainkan {C:attention,E:1}#1#{} hand", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Ancient Joker", + text={ + "Setiap kartu yang dimainkan dengan", + "{V:1}#2#{} rupa memberikan", + "{X:mult,C:white} X#1# {} Mult saat menang,", + "{s:0.8}rupa berubah di akhir babak", + }, + }, + j_arrowhead={ + name="Arrowhead", + text={ + "Kartu yang dimainkan dengan", + "rupa {C:spades}Sekop{} memberikan", + "{C:chips}+#1#{} Chip saat menang", + }, + unlock={ + "Miliki setidaknya {E:1,C:attention}#1#", + "kartu dengan {E:1,C:attention}#2#", + "rupa di deck Anda", + }, + }, + j_astronomer={ + name="Astronomer", + text={ + "Semua kartu {C:planet}Planet{} dan", + "{C:planet}Celestial Packs{} dalam", + "toko itu {C:attention}gratis", + }, + unlock={ + "Temukan setiap", + "kartu{E:1,C:planet}Planet{}", + }, + }, + j_banner={ + name="Banner", + text={ + "{C:chips}+#1#{} Chip untuk", + "setiap sisa", + "{C:attention}discard", + }, + }, + j_baron={ + name="Baron", + text={ + "Setiap {C:attention}King{}", + "yang ada di hand", + "memberi {X:mult,C:white} X#1# {} Mult", + }, + }, + j_baseball={ + name="Baseball Card", + text={ + "Setiap {C:green}Uncommon{} Joker", + "memberikan {X:mult,C:white} X#1# {} Mult", + }, + }, + j_blackboard={ + name="Blackboard", + text={ + "{X:red,C:white} X#1# {} Mult jika semua", + "kartu yang ada di hand", + "adalah {C:spades}#2#{} atau {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Bloodstone", + text={ + "{C:mult}+#1# dalam #2#{} peluang untuk", + "kartu yang dimainkan dengan", + "rupa {C:hearts}Hati{} memberikan", + "{X:mult,C:white} X#3# {} Mult saat menang,", + }, + unlock={ + "Miliki setidaknya {E:1,C:attention}#1#", + "kartu dengan {E:1,C:attention}#2#", + "rupa di deck Anda", + }, + }, + j_blue_joker={ + name="Blue Joker", + text={ + "{C:chips}+#1#{} Chip untuk setiap", + "kartu yang tersisa di {C:attention}deck", + "{C:inactive}(Saat ini {C:chips}+#2#{C:inactive} Chip)", + }, + }, + j_blueprint={ + name="Blueprint", + text={ + "Salin kemampuan dari", + "{C:attention}Joker{} ke sebelah kanan", + }, + unlock={ + "Menangi giliran", + }, + }, + j_bootstraps={ + name="Bootstraps", + text={ + "{C:mult}+#1#{} Mult untuk setiap", + "{C:money}$#2#{} yang kamu miliki", + "{C:inactive}(Saat ini {C:mult}+#3#{C:inactive} Mult)", + }, + unlock={ + "Miliki setidaknya {E:1,C:attention}#1#", + "Joker{C:dark_edition}Polychrome{}", + }, + }, + j_brainstorm={ + name="Brainstorm", + text={ + "Menyalin kemampuan", + "dari {C:attention}Joker paling kiri", + }, + unlock={ + "Buang sebuah", + "{E:1,C:attention}Royal Flush", + }, + }, + j_bull={ + name="Bull", + text={ + "{C:chips}+#1#{} Chip untuk", + "setiap {C:money}$1{} yang dimiliki", + "{C:inactive}(Saat ini {C:chips}+#2#{C:inactive} Chip)", + }, + }, + j_burglar={ + name="Burglar", + text={ + "Ketika {C:attention}Blind{} dipilih,", + "memperoleh {C:blue}+#1#{} Hand dan", + "{C:attention}kehilangan semua discard", + }, + }, + j_burnt={ + name="Burnt Joker", + text={ + "Upgrade level dari", + "poker hand pertama {C:attention}yang dibuang", + "setiap babak", + }, + unlock={ + "Jual hingga total", + "dari {E:1,C:attention}#1#{} kartu", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Business Card", + text={ + "Face {C:attention}card{} yang dimainkan memiliki", + "sebuah {C:green}#1# dalam #2#{} peluang untuk", + "memberikan {C:money}$2{} saat menang", + }, + }, + j_caino={ + name="Canio", + text={ + "Joker ini mendapatkan {X:mult,C:white} X#1# {} Mult", + "jika {C:attention}face{} card", + "dihancurkan", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Campfire", + text={ + "Joker ini memperoleh {X:mult,C:white}X#1#{} Mult", + "untuk setiap kartu {C:attention}yang dijual{}, mengatur ulang", + "ketika {C:attention}Boss Blind{} dikalahkan", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_card_sharp={ + name="Card Sharp", + text={ + "{X:mult,C:white} X#1# {} Mult jika", + "{C:attention}poker hand{} yang telah", + "dimainkan pada babak ini", + }, + }, + j_cartomancer={ + name="Cartomancer", + text={ + "Memunculkan sebuah kartu {C:tarot}Tarot{}", + "ketika {C:attention}Blind{} dipilih", + "{C:inactive}(Harus memiliki tempat)", + }, + unlock={ + "Temukan setiap", + "kartu {E:1,C:tarot}Tarot{}", + }, + }, + j_castle={ + name="Castle", + text={ + "Joker ini memperoleh {C:chips}+#1#{} Chip", + "setiap kartu {V:1}#2#{} yang dibuang,", + "rupa berubah setiap babak", + "{C:inactive}(Saat ini {C:chips}+#3#{C:inactive} Chip)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2# dalam #3#{} peluang kartu", + "ini dihancurkan", + "di akhir babak", + }, + }, + j_ceremonial={ + name="Ceremonial Dagger", + text={ + "Ketika {C:attention}Blind{} dipilih,", + "menghancurkan Joker ke sebelah kanan", + "dan secara permanen {C:attention}menggandakan", + "nilai jualnya ke Mult {C:red}ini", + "{C:inactive}(Saat ini {C:mult}+#1#{C:inactive} Mult)", + }, + }, + j_certificate={ + name="Certificate", + text={ + "Saat babak dimulai,", + "tambahkan sebuah {C:attention}acak memainkan", + "{C:attention}kartu{} dengan acak", + "{C:attention}seal{} ke hand Anda", + }, + unlock={ + "Have a Gold", + "memainkan kartu dengan", + "sebuah {C:attention,E:1}Gold Seal", + }, + }, + j_chaos={ + name="Chaos the Clown", + text={ + "{C:attention}#1#{} Reroll {C:green}gratis", + "per toko", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Nonaktifkan efek dari", + "setiap {C:attention}Boss Blind", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Clever Joker", + text={ + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_cloud_9={ + name="Cloud 9", + text={ + "Dapatkan {C:money}$#1#{} untuk setiap", + "{C:attention}9{} di deck {C:attention}lengkap Anda", + "di akhir babak", + "{C:inactive}(Saat ini {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="Constellation", + text={ + "Joker ini mendapatkan", + "{X:mult,C:white} X#1# {} Mult setiap kali", + "kartu {C:planet}Planet{} digunakan", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_crafty={ + name="Crafty Joker", + text={ + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_crazy={ + name="Crazy Joker", + text={ + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_credit_card={ + name="Credit Card", + text={ + "Tingkatkan ke", + "{C:red}-$#1#{} berutang", + }, + }, + j_delayed_grat={ + name="Delayed Gratification", + text={ + "Dapatkan {C:money}$#1#{} per {C:attention}discard{} jika", + "tidak ada discard yang dipakai", + "pada akhir babak", + }, + }, + j_devious={ + name="Devious Joker", + text={ + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_diet_cola={ + name="Diet Cola", + text={ + "Jual kartu ini untuk", + "membuat sebuah", + "{C:attention}#1# gratis", + }, + }, + j_dna={ + name="DNA", + text={ + "Jika {C:attention}hand pertama{} dari babak", + "hanya memiliki {C:attention}1{} kartu, tambahkan", + "salinan permanen ke deck", + "dan ambil ke {C:attention}hand", + }, + }, + j_drivers_license={ + name="Driver's License", + text={ + "{X:mult,C:white} X#1# {} Mult jika Anda", + "memiliki setidaknya {C:attention}16", + "kartu enhanced", + "{C:inactive}(Saat ini {C:attention}#2#{C:inactive})", + }, + unlock={ + "Tingkatkan {E:1,C:attention}#1#{} kartu", + "di deck Anda", + }, + }, + j_droll={ + name="Droll Joker", + text={ + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_drunkard={ + name="Drunkard", + text={ + "{C:red}+#1#{} discard", + "tiap babak", + }, + }, + j_duo={ + name="The Idol", + text={ + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + unlock={ + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Dusk", + text={ + "Picu lagi semua kartu", + "kartu di {C:attention}final", + "{C:attention}hand{} dari babak", + }, + }, + j_egg={ + name="Egg", + text={ + "Memperoleh {C:money}$#1#{} dari", + "{C:attention}nilai jual{} di", + "akhir babak", + }, + }, + j_erosion={ + name="Erosion", + text={ + "{C:red}+#1#{} Mult untuk setiap", + "kartu di bawah {C:attention}#3#{}", + "di deck lengkap Anda", + "{C:inactive}(Saat ini {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_even_steven={ + name="Even Steven", + text={ + "Kartu yang dimainkan dengan", + "peringkat {C:attention}genap{} memberikan", + "{C:mult}+#1#{} Mult saat menang", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Faceless Joker", + text={ + "Dapatkan {C:money}$#1#{} jika {C:attention}#2#{} atau", + "lebih banyak {C:attention}kartu wajah{}", + "yang dibuang", + "pada saat bersamaan", + }, + }, + j_family={ + name="The Family", + text={ + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + unlock={ + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "Setiap {C:attention}As{} yang dimainkan,", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{}, atau {C:attention}8{} memberikan", + "{C:mult}+#1#{} Mult saat menang", + }, + }, + j_flash={ + name="Flash Card", + text={ + "Joker ini mendapatkan {C:mult}+#1#{} Mult", + "tiap {C:attention}reroll{} di toko ", + "{C:inactive}(Saat ini {C:mult}+#2#{C:inactive} Mult)", + }, + }, + j_flower_pot={ + name="Flower Pot", + text={ + "{X:mult,C:white} X#1# {} Mult jika poker", + "hand berisi", + "{C:diamonds}Diamond{} card, {C:clubs}Club{} card,", + "{C:hearts}Heart{} card, dan {C:spades}Spade{} card", + }, + unlock={ + "Reach Ante", + "level {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Fortune Teller", + text={ + "{C:red}+#1#{} Mult per", + "kartu {C:purple}Tarot{} dipakai", + "{C:inactive}(Saat ini {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Four Fingers", + text={ + "Semua {C:attention}Flush{} dan", + "{C:attention}Straight{} bisa", + "dilakukan dengan {C:attention}4{} kartu", + }, + }, + j_gift={ + name="Gift Card", + text={ + "Menambah {C:money}$#1#{} dari {C:attention}nilai jual", + "ke setiap kartu {C:attention}Joker{} dan", + "{C:attention}Habis Pakai{} di", + "akhir babak", + }, + }, + j_glass={ + name="Glass Joker", + text={ + "Joker ini mendapatkan {X:mult,C:white} X#1# {} Mult", + "untuk setiap {C:attention}Glass Card", + "yang dihancurkan", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Miliki setidaknya {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} di", + "deck Anda", + }, + }, + j_gluttenous_joker={ + name="Gluttonous Joker", + text={ + "Kartu yang dimainkan dengan", + "{C:clubs}#2#{} rupa memberikan", + "{C:mult}+#1#{} Mult saat menang", + }, + }, + j_golden={ + name="Golden Joker", + text={ + "Dapatkan {C:money}$#1#{} di", + "akhir babak", + }, + }, + j_greedy_joker={ + name="Greedy Joker", + text={ + "Kartu yang dimainkan dengan", + "{C:diamonds}#2#{} rupa memberikan", + "{C:mult}+#1#{} Mult saat menang", + }, + }, + j_green_joker={ + name="Green Joker", + text={ + "{C:mult}+#1#{} Mult per hand yang dimainkan", + "{C:mult}-#2#{} Mult per discard", + "{C:inactive}(Saat ini {C:mult}+#3#{C:inactive} Mult)", + }, + }, + j_gros_michel={ + name="Gros Michel", + text={ + "{C:mult}+#1#{} Mult", + "{C:green}#2# dalam #3#{} peluang kartu", + "ini dihancurkan", + "di akhir babak", + }, + }, + j_hack={ + name="Impostor", + text={ + "Picu lagi", + "setiap dimainkan", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{}, atau {C:attention}5{}", + }, + }, + j_half={ + name="Half Joker", + text={ + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "{C:attention}#2#{} atau kartu lebih sedikit", + }, + }, + j_hallucination={ + name="Hallucination", + text={ + "{C:green}#1# dalam #2#{} peluang untuk membuat", + "sebuah kartu {C:tarot}Tarot{} ketika", + "{C:attention}Booster Pack{} dibuka", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + j_hanging_chad={ + name="Hanging Chad", + text={ + "Picu lagi {C:attention}kartu pertama{} yang dimainkan", + "yang digunakan dalam memenangkan", + "{C:attention}#1#{} kali tambahan", + }, + unlock={ + "Kalahkan satu Boss Blind", + "dengan sebuah {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Hiker", + text={ + "Setiap {C:attention}card{} yang dimainkan", + "secara permanen memperoleh", + "{C:chips}+#1#{} Chip saat menang", + }, + }, + j_hit_the_road={ + name="Hit the Road", + text={ + "Joker ini mendapatkan {X:mult,C:white} X#1# {} Mult", + "untuk setiap {C:attention}Jack{}", + "yang dibuang di babak ini", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Buang {E:1,C:attention}5", + "{E:1,C:attention}Jack{} pada", + "saat bersamaan", + }, + }, + j_hologram={ + name="Hologram", + text={ + "Joker ini mendapatkan {X:mult,C:white} X#1# {} Mult", + "setiap kali {C:attention}kartu yang dimainkan{}", + "ditambahkan ke deck kamu", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_ice_cream={ + name="Ice Cream", + text={ + "{C:chips}+#1#{} Chip", + "{C:chips}-#2#{} Chip untuk", + "setiap hand yang dimainkan", + }, + }, + j_idol={ + name="The Idol", + text={ + "Setiap {C:attention}#2# yang dimainkan", + "dari {V:1}#3#{} memberikan", + "{X:mult,C:white} X#1# {} Mult saat menang", + "{s:0.8}Kartu berubah setiap babak", + }, + unlock={ + "Dalam satu hand,", + "mendapat setidaknya", + "{E:1,C:attention}#1#{} chip", + }, + }, + j_invisible={ + name="Invisible Joker", + text={ + "Setelah {C:attention}#1#{} babak,", + "jual kartu ini untuk", + "{C:attention}Duplicate{} Joker secara acak", + "{C:inactive}(Currently {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Menangi giliran tanpa", + "pernah memiliki lebih", + "dari {E:1,C:attention}4 Joker{}", + }, + }, + j_joker={ + name="Joker", + text={ + "{C:red,s:1.1}+#1#{} Mult", + }, + }, + j_jolly={ + name="Jolly Joker", + text={ + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_juggler={ + name="Juggler", + text={ + "{C:attention}+#1#{} ukuran hand", + }, + }, + j_loyalty_card={ + name="Loyalty Card", + text={ + "{X:red,C:white} X#1# {} Mult setiap", + "{C:attention}#2#{} hand yang dimainkan", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Jual kartu ini untuk", + "menonaktifkan", + "{C:attention}Boss Blind{} saat ini", + }, + }, + j_lucky_cat={ + name="Lucky Card", + text={ + "Joker ini mendapatkan {X:mult,C:white} X#1# {} Mult", + "setiap kali {C:attention}Lucky{} card", + "{C:green}sukses{} terpicu", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_lusty_joker={ + name="Lusty Joker", + text={ + "Kartu yang dimainkan dengan", + "{C:hearts}#2#{} rupa memberikan", + "{C:mult}+#1#{} Mult saat menang", + }, + }, + j_mad={ + name="Mad Joker", + text={ + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_madness={ + name="Madness", + text={ + "Jika {C:attention}Small Blind{} atau {C:attention}Big Blind{}", + "dipilih, akan didapat {X:mult,C:white} X#1# {} Mult", + "dan {C:attention}menghancurkan{} Joker acak", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_mail={ + name="Mail-In Rebate", + text={ + "Dapatkan {C:money}$#1#{} untuk setiap", + "{C:attention}#2#{} yang dibuang, peringkat", + "berubah setiap babak", + }, + }, + j_marble={ + name="Marble Joker", + text={ + "Menambah satu kartu {C:attention}Stone{}", + "ke deck saat", + "{C:attention}Blind{} dipilih", + }, + }, + j_matador={ + name="Matador", + text={ + "Dapatkan {C:money}$#1#{} jika memainkan", + "hand memicu", + "kemampuan {C:attention}Boss Blind{}", + }, + unlock={ + "Kalahkan satu Boss Blind", + "dalam {E:1,C:attention}1 hand{} tanpa", + "memakai discard apa pun", + }, + }, + j_merry_andy={ + name="Merry Andy", + text={ + "{C:red}+#1#{} membuang", + "setiap babak,", + "{C:red}#2#{} ukuran hand", + }, + unlock={ + "Menangi giliran dalam {E:1,C:attention}#1#", + "atau lebih sedikit babak", + }, + }, + j_midas_mask={ + name="Midas Mask", + text={ + "Semua kartu {C:attention}wajah{} yang dimainkan", + "menjadi {C:attention}kartu{} Gold", + "jika mendapatkan skor", + }, + }, + j_mime={ + name="Mime", + text={ + "Picu lagi semua", + "kartu yang {C:attention}disimpan dalam", + "kemampuan {C:attention}hand{}", + }, + }, + j_misprint={ + name="Misprint", + text={ + "", + }, + }, + j_mr_bones={ + name="Mr. Bones", + text={ + "Prevents Death", + "jika chip yang didapat", + "paling sedikit {C:attention}25%", + "dari chip yang diperlukan", + "{S:1.1,C:red,E:2}penghancuran diri{}", + }, + unlock={ + "Kalah {C:attention,E:1}#1#{} giliran", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Mystic Summit", + text={ + "{C:mult}+#1#{} Mult ketika", + "{C:attention}#2#{} discard", + "sisa", + }, + }, + j_obelisk={ + name="Obelisk", + text={ + "Joker ini memperoleh {X:mult,C:white} X#1# {} Mult", + "per hand yang {C:attention}berturut-turut{} dimainkan", + "tanpa memainkan", + "{C:attention}poker hand", + "{C:inactive}yang paling sering dimainkan (Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_odd_todd={ + name="Odd Todd", + text={ + "Kartu yang dimainkan dengan", + "peringkat {C:attention}ganjil{} memberikan", + "{C:chips}+#1#{} Chip saat menang", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Onyx Agate", + text={ + "Kartu yang dimainkan dengan", + "rupa {C:clubs}Club{} memberikan", + "{C:mult}+#1#{} Mult saat menang", + }, + unlock={ + "Miliki setidaknya {E:1,C:attention}#1#", + "kartu dengan {E:1,C:attention}#2#", + "rupa di deck Anda", + }, + }, + j_oops={ + name="Oops! All 6s", + text={ + "Menggandakan semua {C:attention}yang terdaftar", + "{C:green,E:1,S:1.1}probabilitas", + "{C:inactive}(mis.: {C:green}1 in 3{C:inactive} -> {C:green}2 in 3{C:inactive})", + }, + unlock={ + "Dalam satu hand,", + "mendapat setidaknya", + "{E:1,C:attention}#1#{} chip", + }, + }, + j_order={ + name="The Order", + text={ + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + unlock={ + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Pareidolia", + text={ + "Semua kartu", + "dianggap", + "{C:attention}Kartu{} Wajah", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Memunculkan sebuah salinan {C:dark_edition}Negatif{} dari", + "{C:attention}1{} kartu {C:attention}habis pakai{} secara acak", + "yang Anda miliki", + "di akhir dari {C:attention}toko", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Photograph", + text={ + "Face card {C:attention}pertama", + "yang dimainkan memberi {X:mult,C:white} X#1# {} Mult", + "saat menang", + }, + }, + j_popcorn={ + name="Popcorn", + text={ + "{C:mult}+#1#{} Mult", + "{C:mult}-#2#{} Mult setiap", + "babak yang dimainkan", + }, + }, + j_raised_fist={ + name="Raised Fist", + text={ + "Menambahkan {C:attention}dua kali{} peringkat", + "dari {C:attention}kartu{} dengan peringkat terendah", + "yang ada di hand untuk Mult", + }, + }, + j_ramen={ + name="Ramen", + text={ + "{X:mult,C:white} X#1# {} Mult,", + "kehilangan {X:mult,C:white} X#2# {} Mult", + "setiap {C:attention}kartu{} yang dibuang", + }, + }, + j_red_card={ + name="Red Card", + text={ + "Joker ini mendapatkan", + "{C:red}+#1#{} Mult jika ada", + "{C:attention}Booster Pack{} yang dilewati", + "{C:inactive}(Saat ini {C:red}+#2#{C:inactive} Mult)", + }, + }, + j_reserved_parking={ + name="Reserved Parking", + text={ + "Setiap {C:attention}kartu{} wajah", + "yang ada di hand memiliki", + "sebuah peluang {C:green}#2# dalam #3#{}", + "memberi {C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="Ride the Bus", + text={ + "Joker ini memperoleh {C:mult}+#1#{} Mult", + "per {C:attention}hand{} yang dimainkan", + "berturut-turut tanpa", + "mencetak skor {C:attention}face{} card", + "{C:inactive}(Saat ini {C:mult}+#2#{C:inactive} Mult)", + }, + }, + j_riff_raff={ + name="Riff-raff", + text={ + "Ketika {C:attention}Blind{} dipilih,", + "memunculkan {C:attention}#1# {C:blue}Common{C:attention} Joker", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + j_ring_master={ + name="Ring Master", + text={ + "kartu {C:attention}Joker{}, {C:tarot}Tarot{}, {C:planet}Planet{}", + "dan {C:spectral}Spectral{} dapat", + "muncul berkali-kali", + }, + unlock={ + "Reach Ante", + "level {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Rocket", + text={ + "Perolehan {C:money}$#1#{} di akhir babak", + "Payout meningkat sebesar {C:money}$#2#{}", + "jika {C:attention}Boss Blind{} dikalahkan", + }, + }, + j_rough_gem={ + name="Rough Gem", + text={ + "Kartu yang dimainkan dengan", + "rupa {C:diamonds}Wajik{} mendapatkan", + "{C:money}$#1#{} saat menang", + }, + unlock={ + "Miliki setidaknya {E:1,C:attention}#1#", + "kartu dengan {E:1,C:attention}#2#", + "rupa di deck Anda", + }, + }, + j_runner={ + name="Runner", + text={ + "Memperoleh {C:chips}+#2#{} Chip", + "jika hand yang dimainkan", + "berisi sebuah {C:attention}Straight{}", + "{C:inactive}(Saat ini {C:chips}+#1#{C:inactive} Chip)", + }, + }, + j_satellite={ + name="Satellite", + text={ + "Dapatkan {C:money}$#1#{} di akhir", + "babak per {C:planet}Planet unik", + "kartu yang dipakai pada giliran ini", + "{C:inactive}(Saat ini {C:money}$#2#{C:inactive})", + }, + unlock={ + "Miliki {E:1,C:money}$#1#", + "atau lebih", + }, + }, + j_scary_face={ + name="Scary Face", + text={ + "Face {C:attention}card{} yang dimainkan", + "memberikan {C:chips}+#1#{} Chip", + "saat menang", + }, + }, + j_scholar={ + name="Scholar", + text={ + "Setiap {C:attention}As{} yang dimainkan", + "memberi {C:chips}+#2#{} Chip", + "and {C:mult}+#1#{} Mult", + "saat menang", + }, + }, + j_seance={ + name="Séance", + text={ + "Jika {C:attention}poker hand{} adalah sebuah", + "{C:attention}#1#{}, memunculkan sebuah", + "kartu {C:spectral}Spectral{} secara acak", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + j_seeing_double={ + name="Seeing Double", + text={ + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan memiliki sebuah kemenangan", + "kartu{C:clubs}Keriting{} dan kartu", + "yang menang dari rupa {C:attention}lainnya", + }, + unlock={ + "Mainkan sebuah hand", + "yang memiliki", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Seltzer", + text={ + "Memicu lagi semua", + "kartu yang dimainkan untuk", + "hand {C:attention}#1#{} berikutnya", + }, + }, + j_shoot_the_moon={ + name="Shoot the Moon", + text={ + "Setiap {C:attention}Queen{}", + "yang ada di hand", + "memberikan {C:mult}+#1#{} Mult", + }, + unlock={ + "Mainkan setiap {E:1,C:attention}Hati", + "di deck Anda dalam", + "satu babak", + }, + }, + j_shortcut={ + name="Shortcut", + text={ + "Memungkinkan {C:attention}Straight{} agar", + "dibuat dengan selisih {C:attention}1 peringkat", + "{C:inactive}(misalnya: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Sixth Sense", + text={ + "Jika {C:attention}hand pertama{} dari babak ini adalah", + "sebuah {C:attention}6{}, menghancurkannya dan", + "memunculkan sebuah kartu {C:spectral}Spectral{}", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + j_sly={ + name="Sly Joker", + text={ + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_smeared={ + name="Smeared Joker", + text={ + "{C:hearts}Hati{} dan {C:diamonds}Wajik", + "dianggap sebagai rupa yang sama,", + "{C:spades}Sekop{} dan {C:clubs}Keriting", + "dianggap sebagai rupa yang sama", + }, + unlock={ + "Miliki setidaknya {C:attention}#1#", + "{E:1,C:attention}#2#{} di", + "ke deck Anda di", + }, + }, + j_smiley={ + name="Smiley Face", + text={ + "Kartu {C:attention}wajah{} yang dimainkan", + "memberi {C:mult}+#1#{} Mult", + "saat menang", + }, + }, + j_sock_and_buskin={ + name="Sock and Buskin", + text={ + "Picu lagi semua", + "face {C:attention}card{} yang dimainkan", + }, + unlock={ + "Mainkan total", + "{C:attention,E:1}#1#{} kartu wajah", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Space Joker", + text={ + "{C:green}#1# dalam #2#{} peluang untuk", + "upgrade level dari", + "{C:attention}poker hand{} yang dimainkan", + }, + }, + j_splash={ + name="Splash", + text={ + "Setiap {C:attention}kartu yang dimainkan", + "dihitung dalam kemenangan", + }, + }, + j_square={ + name="Square Joker", + text={ + "Joker ini mendapatkan {C:chips}+#2#{} Chip", + "jika hand yang dimainkan memiliki", + "tepat {C:attention}4{} kartu", + "{C:inactive}(Saat ini {C:chips}#1#{C:inactive} Chip)", + }, + }, + j_steel_joker={ + name="Steel Joker", + text={ + "Memberikan {X:mult,C:white} X#1# {} Mult", + "untuk setiap {C:attention}Steel Card", + "di {C:attention}deck lengkap kamu", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_stencil={ + name="Joker Stencil", + text={ + "{X:red,C:white} X1 {} Mult untuk setiap", + "slot {C:attention}Joker{} yang kosong", + "{s:0.8}termasuk Joker Stencil", + "{C:inactive}(Saat ini {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Stone Joker", + text={ + "Memberikan {C:chips}+#1#{} Chip untuk", + "setiap {C:attention}Stone Card", + "di {C:attention}deck lengkap kamu", + "{C:inactive}(Saat ini {C:chips}+#2#{C:inactive} Chip)", + }, + }, + j_stuntman={ + name="Stuntman", + text={ + "{C:chips}+#1#{} Chip,", + "{C:attention}-#2#{} ukuran hand", + }, + unlock={ + "Dalam satu hand,", + "dapatkan setidaknya", + "{E:1,C:attention}#1#{} chip", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Menambahkan berapa kali", + "{C:attention}poker hand{} telah", + "memainkan giliran ini ke Mult", + }, + }, + j_superposition={ + name="Superposition", + text={ + "Memunculkan sebuah kartu {C:tarot}Tarot{} jika", + "poker hand berisi sebuah", + "{C:attention}As{} dan sebuah {C:attention}Straight{}", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + j_swashbuckler={ + name="Swashbuckler", + text={ + "Menambah nilai jual", + "semua", + "{C:attention}Joker{} lain yang dimiliki ke Mult", + "{C:inactive}(Saat ini {C:mult}+#1#{C:inactive} Mult)", + }, + unlock={ + "Jual hingga total", + "Kartu {C:attention,E:1}#1#{} Joker", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Throwback", + text={ + "{X:mult,C:white} X#1# {} Mult untuk setiap", + "{C:attention}Blind{} yang dilewati pada giliran ini", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + unlock={ + "Lanjutkan giliran yang tersimpan", + "dari menu utama", + }, + }, + j_ticket={ + name="Golden Ticket", + text={ + "Kartu {C:attention}Gold{} yang dimainkan", + "mendapatkan {C:money}$#1#{} saat menang", + }, + unlock={ + "Ketika 5 kartu hand", + "yang hanya memiliki", + "kartu {C:attention,E:1}Gold{}", + }, + }, + j_to_the_moon={ + name="To the Moon", + text={ + "Dapatkan ekstra {C:money}$#1#{} dari", + "{C:attention}keuntungan{} untuk setiap {C:money}$5{} yang Anda", + "miliki di akhir babak", + }, + }, + j_todo_list={ + name="To Do List", + text={ + "Dapatkan {C:money}$#1#{} jika {C:attention}poker hand{}", + "merupakan {C:attention}#2#{},", + "poker hand berubah", + "di akhir babak", + }, + }, + j_trading={ + name="Trading Card", + text={ + "Jika {C:attention}discard pertama{} dari babak", + "hanya memiliki {C:attention}1{} kartu, hancurkanlah", + "dan dapatkan {C:money}$#1#", + }, + }, + j_tribe={ + name="The Tribe", + text={ + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + unlock={ + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "{C:attention}King{} dan", + "{C:attention}Queen{} yang dimainkan memberi", + "{X:mult,C:white} X#1# {} Mult saat menang,", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="The Trio", + text={ + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + unlock={ + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Troubadour", + text={ + "{C:attention}+#1#{} ukuran hand,", + "{C:blue}-#2#{} hand setiap babak", + }, + unlock={ + "Menangi {C:attention,E:1}#1#{} babak", + "berturut-turut dengan memainkan", + "1 hand saja", + }, + }, + j_trousers={ + name="Spare Trousers", + text={ + "Joker ini mendapatkan {C:mult}+#1#{} Mult", + "jika hand yang dimainkan berisi", + "satu {C:attention}#2#", + "{C:inactive}(Saat ini {C:red}+#3#{C:inactive} Mult)", + }, + }, + j_turtle_bean={ + name="Turtle Bean", + text={ + "{C:attention}+#1#{} ukuran hand,", + "berkurang sebanyak", + "{C:red}#2#{} setiap babak", + }, + }, + j_vagabond={ + name="Vagabond", + text={ + "Buat sebuah kartu {C:purple}Tarot{}", + "jika hand dimainkan", + "dengan {C:money}$#1#{} atau kurang", + }, + }, + j_vampire={ + name="Vampire", + text={ + "Joker ini mendapatkan {X:mult,C:white} X#1# {} Mult", + "tiap mencetak skor {C:attention}Peningkatan kartu{} yang dimainkan,", + "membuang {C:attention}Enhancement", + "{C:inactive}kartu (Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_walkie_talkie={ + name="Walkie Talkie", + text={ + "Setiap {C:attention}10{} atau {C:attention}4 yang dimainkan", + "memberi {C:chips}+#1#{} Chip dan", + "{C:mult}+#2#{} Mult saat menang", + }, + }, + j_wee={ + name="Wee Joker", + text={ + "Joker ini memperoleh", + "{C:chips}+#2#{} Chip ketika setiap", + "{C:attention}2{} yang dimainkan menang", + "{C:inactive}(Saat ini {C:chips}+#1#{C:inactive} Chip)", + }, + unlock={ + "Menangi giliran dalam {E:1,C:attention}#1#", + "atau lebih sedikit babak", + }, + }, + j_wily={ + name="Wily Joker", + text={ + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Wrathful Joker", + text={ + "Kartu yang dimainkan dengan", + "{C:spades}#2#{} rupa memberikan", + "{C:mult}+#1#{} Mult saat menang", + }, + }, + j_yorick={ + name="Yorick", + text={ + "Joker ini mendapatkan", + "{X:mult,C:white} X#1# {} Mult setiap {C:attention}#2#{C:inactive} [#3#]{}", + "kartu dibuang", + "{C:inactive}(Saat ini {X:mult,C:white} X#4# {C:inactive} Mult)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Zany Joker", + text={ + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Black Sticker", + text={ + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Black", + "{C:attention}Stake{}", + }, + }, + blue_seal={ + name="Blue Seal", + text={ + "Membuat kartu {C:planet}Planet{}", + "untuk {C:attention}poker hand{}", + "terakhir yang dimainkan pada babak tersebut jika {C:attention}ada{} di hand", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + blue_sticker={ + name="Blue Sticker", + text={ + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Blue", + "{C:attention}Stake{}", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} chip", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} chip ekstra", + }, + }, + challenge_locked={ + name="Dikunci", + text={ + "Menangi giliran dengan setidaknya", + "#1# deck lain untuk membuka", + "Mode tantangan", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Di-debuff", + text={ + "Semua kemampuan", + "dinonaktifkan", + }, + }, + debuffed_playing_card={ + name="Di-debuff", + text={ + "Tidak mendapat chip", + "dan semua kemampuan", + "dinonaktifkan", + }, + }, + deck_locked_discover={ + name="Dikunci", + text={ + "Temukan setidaknya", + "{C:attention}#1#{} item dari", + "koleksi Anda", + }, + }, + deck_locked_stake={ + name="Dikunci", + text={ + "Menangi giliran dengan", + "deck apa pun setidaknya pada", + "kesulitan {V:1}#1#{}", + }, + }, + deck_locked_win={ + name="Dikunci", + text={ + "Menangi giliran dengan", + "{C:attention}#1#{}", + "pada kesulitan apa pun", + }, + }, + demo_locked={ + name="Dikunci", + text={ + "Tidak tersedia", + "dalam demo ini", + }, + }, + demo_shop_locked={ + name="Dikunci", + text={ + "Kartu dari {C:attention}koleksi", + "pribadi Jimbo,", + "tersedia di versi", + "lengkapnya {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Eternal", + text={ + "Tidak bisa dijual", + "atau dihancurkan", + }, + }, + gold_seal={ + name="Gold Seal", + text={ + "Dapatkan {C:money}$3{} saat kartu", + "ini dimainkan", + "dan menang", + }, + }, + gold_sticker={ + name="Gold Sticker", + text={ + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Gold", + "{C:attention}Stake{}", + }, + }, + green_sticker={ + name="Green Sticker", + text={ + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Green", + "{C:attention}Stake{}", + }, + }, + joker_locked_legendary={ + name="Dikunci", + text={ + "Temukan Joker ini", + "dari kartu {C:spectral}Soul{}", + }, + }, + locked={ + name="Dikunci", + text={ + }, + }, + orange_sticker={ + name="Orange Sticker", + text={ + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Orange", + "{C:attention}Stake{}", + }, + }, + p_arcana_jumbo={ + name="Jumbo Arcana Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:tarot} kartu{} Tarot untuk", + "segera dipakai", + }, + }, + p_arcana_mega={ + name="Mega Arcana Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:tarot} kartu{} Tarot untuk", + "segera dipakai", + }, + }, + p_arcana_normal={ + name="Arcana Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:tarot} kartu{} Tarot untuk", + "segera dipakai", + }, + }, + p_buffoon_jumbo={ + name="Jumbo Buffoon Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:joker} kartu{} Joker", + }, + }, + p_buffoon_mega={ + name="Mega Buffoon Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:joker} kartu{} Joker", + }, + }, + p_buffoon_normal={ + name="Buffoon Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:joker} kartu{} Joker", + }, + }, + p_celestial_jumbo={ + name="Jumbo Celestial Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:planet} kartu{} Planet untuk", + "segera dipakai", + }, + }, + p_celestial_mega={ + name="Mega Celestial Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:planet} kartu{} Planet untuk", + "segera dipakai", + }, + }, + p_celestial_normal={ + name="Celestial Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:planet} kartu{} Planet untuk", + "segera dipakai", + }, + }, + p_spectral_jumbo={ + name="Jumbo Spectral Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:spectral} kartu{} Spectral untuk", + "segera dipakai", + }, + }, + p_spectral_mega={ + name="Mega Spectral Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:spectral} kartu{} Spectral untuk", + "segera dipakai", + }, + }, + p_spectral_normal={ + name="Spectral Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:spectral} kartu{} Spectral untuk", + "segera dipakai", + }, + }, + p_standard_jumbo={ + name="Jumbo Standard Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:attention} kartu{} Permainan untuk", + "ditambahkan ke deck Anda", + }, + }, + p_standard_mega={ + name="Mega Standard Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:attention} kartu{} Permainan untuk", + "ditambahkan ke deck Anda", + }, + }, + p_standard_normal={ + name="Standard Pack", + text={ + "Pilih sampai {C:attention}#1#{} dari", + "{C:attention}#2#{C:attention} kartu{} Permainan untuk", + "ditambahkan ke deck Anda", + }, + }, + perishable={ + name="Perishable", + text={ + "Di-debuff setelah", + "{C:attention}#1#{} babak", + "{C:inactive}({C:attention}#2#{C:inactive} tersisa)", + }, + }, + pinned_left={ + name="Disematkan", + text={ + "Joker ini tetap", + "disematkan ke", + "posisi paling kiri", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# dari {V:1}#2# ", + }, + }, + purple_seal={ + name="Purple Seal", + text={ + "Membuat sebuah kartu {C:tarot}Tarot{}", + "ketika {C:attention}dibuang", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + purple_sticker={ + name="Purple Sticker", + text={ + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Purple", + "{C:attention}Stake{}", + }, + }, + red_seal={ + name="Red Seal", + text={ + "Picu lagi kartu", + "ini {C:attention}1{} kali", + }, + }, + red_sticker={ + name="Red Sticker", + text={ + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Red", + "{C:attention}Stake{}", + }, + }, + remove_negative={ + name="Negatif", + text={ + "{C:inactive,s:0.9}(Hapus {C:dark_edition,s:0.9}Negatif{C:inactive,s:0.9} dari salinan)", + }, + }, + rental={ + name="Rental", + text={ + "Kehilangan {C:money}$#1#{} pada", + "akhir babak", + }, + }, + undiscovered_booster={ + name="Belum Ditemukan", + text={ + "Buka paket ini", + "saat giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya", + }, + }, + undiscovered_edition={ + name="Belum Ditemukan", + text={ + "Temukan edisi ini", + "saat giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya", + }, + }, + undiscovered_joker={ + name="Belum Ditemukan", + text={ + "Beli atau pakai", + "kartu ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya", + }, + }, + undiscovered_planet={ + name="Belum Ditemukan", + text={ + "Beli atau pakai", + "kartu ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya", + }, + }, + undiscovered_spectral={ + name="Belum Ditemukan", + text={ + "Beli atau pakai", + "kartu ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya", + }, + }, + undiscovered_tag={ + name="Belum Ditemukan", + text={ + "Pakai tag ini saat", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya", + }, + }, + undiscovered_tarot={ + name="Belum Ditemukan", + text={ + "Beli atau pakai", + "kartu ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya", + }, + }, + undiscovered_voucher={ + name="Belum Ditemukan", + text={ + "Tukarkan voucher", + "ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya", + }, + }, + white_sticker={ + name="White Sticker", + text={ + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}White", + "{C:attention}Stake{}", + }, + }, + wip_locked={ + name="Dikunci", + text={ + "Pekerjaan sedang", + "berlangsung", + }, + }, + }, + Planet={ + c_ceres={ + name="Ceres", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_earth={ + name="Earth", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_jupiter={ + name="Jupiter", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_mars={ + name="Mars", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_mercury={ + name="Mercury", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_neptune={ + name="Neptune", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_planet_x={ + name="Planet X", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_pluto={ + name="Pluto", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_saturn={ + name="Saturn", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_uranus={ + name="Uranus", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + c_venus={ + name="Venus", + text={ + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip", + }, + }, + }, + Spectral={ + c_ankh={ + name="Ankh", + text={ + "Buat sebuah salinan", + "acak {C:attention}Joker{}, hancurkan", + "seluruh Joker lainnya", + }, + }, + c_aura={ + name="Aura", + text={ + "Tambahkan efek {C:dark_edition}Foil{}, {C:dark_edition}Holographic{},", + "atau {C:dark_edition}Polychrome{} ke", + "{C:attention}1{} kartu pilihan di hand", + }, + }, + c_black_hole={ + name="Black Hole", + text={ + "Upgrade setiap", + "{C:legendary,E:1}poker hand", + "sebanyak {C:attention}1{} level", + }, + }, + c_cryptid={ + name="Cryptid", + text={ + "Buat {C:attention}#1#{} salinan", + "{C:attention}1{} kartu pilihan", + "di hand Anda", + }, + }, + c_deja_vu={ + name="Deja Vu", + text={ + "Tambahkan sebuah {C:red}Red Seal{}", + "hingga {C:attention}1{} kartu", + "kartu di hand Anda", + }, + }, + c_ectoplasm={ + name="Ectoplasm", + text={ + "Menambah {C:dark_edition}Negatif{} ke", + "{C:attention}Joker secara acak,", + "{C:red}-1{} ukuran hand", + }, + }, + c_familiar={ + name="Familiar", + text={ + "Hancurkan {C:attention}1{} kartu", + "kartu di hand Anda, menambah", + "{C:attention}#1#{} secara acak {C:attention}Enhanced face", + "{C:attention}kartu{} ke hand Anda", + }, + }, + c_grim={ + name="Grim", + text={ + "Hancurkan {C:attention}1{} kartu", + "kartu di hand Anda,", + "menambah {C:attention}#1#{} secara acak {C:attention}As", + "{C:attention}As{} ke hand Anda", + }, + }, + c_hex={ + name="Hex", + text={ + "Tambahkan {C:dark_edition}Polychrome{} ke sebuah", + "acak {C:attention}Joker{}, hancurkan", + "seluruh Joker lainnya", + }, + }, + c_immolate={ + name="Immolate", + text={ + "Menghancurkan {C:attention}#1#{} kartu", + "kartu di hand,", + "dapatkan {C:money}$#2#", + }, + }, + c_incantation={ + name="Incantation", + text={ + "Hancurkan {C:attention}1{} kartu", + "kartu di hand Anda, menambah {C:attention}#1#", + "secara acak {C:attention}kartu bernomor", + "{C:attention}bernomor{} ke hand Anda", + }, + }, + c_medium={ + name="Medium", + text={ + "Tambahkan sebuah {C:purple}Purple Seal{}", + "ke {C:attention}1{} kartu", + "kartu di hand Anda", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Mengubah semua kartu", + "di hand menjadi sebuah", + "peringkat {C:attention}secara acak", + "{C:red}-1{} ukuran hand", + }, + }, + c_sigil={ + name="Sigil", + text={ + "Mengubah semua kartu", + "di hand menjadi sebuah", + "rupa {C:attention}secara acak", + }, + }, + c_soul={ + name="The Soul", + text={ + "Membuat sebuah", + "{C:legendary,E:1}Legendary{} Joker", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + c_talisman={ + name="Talisman", + text={ + "Tambahkan sebuah {C:attention}Gold Seal{}", + "ke {C:attention}1{} kartu", + "kartu di hand Anda", + }, + }, + c_trance={ + name="Trance", + text={ + "Tambahkan sebuah {C:blue}Blue Seal{}", + "ke {C:attention}1{} kartu", + "kartu di hand Anda", + }, + }, + c_wraith={ + name="Wraith", + text={ + "Memunculkan secara acak", + "{C:red}Rare{C:attention} Joker{},", + "membuat uang hingga {C:money}$0", + }, + }, + }, + Stake={ + stake_black={ + name="Black Stake", + text={ + "Toko dapat memiliki {C:attention}Eternal{} Joker", + "{C:inactive,s:0.8}{Tidak bisa dijual atau dihancurkan}", + "{s:0.8}Memakai semua Stake sebelumnya", + }, + }, + stake_blue={ + name="Blue Stake", + text={ + "{C:red}-1{} Discard", + "{s:0.8}Memakai semua Stake sebelumnya", + }, + }, + stake_gold={ + name="Gold Stake", + text={ + "Shop bisa memiliki {C:attention}Rental{} Joker", + "{C:inactive,s:0.8}(Berbiaya {C:money,s:0.8}$3{C:inactive,s:0.8} per babak)", + "{s:0.8}Berlaku untuk semua Stake sebelumnya", + }, + }, + stake_green={ + name="Green Stake", + text={ + "Memerlukan skala menang", + "yang lebih cepat untuk setiap {C:attention}Ante", + "{s:0.8}Memakai semua Stake sebelumnya", + }, + }, + stake_orange={ + name="Orange Stake", + text={ + "Shop bisa memiliki {C:attention}Perishable{} Joker", + "{C:inactive,s:0.8}(Terkena debuff setelah 5 Babak)", + "{s:0.8}Berlaku untuk semua Stake sebelumnya", + }, + }, + stake_purple={ + name="Purple Stake", + text={ + "Memerlukan skala menang", + "yang lebih cepat untuk setiap {C:attention}Ante", + "{s:0.8}Memakai semua Stake sebelumnya", + }, + }, + stake_red={ + name="Red Stake", + text={ + "{C:attention}Small Blind{} memberikan", + "tanpa hadiah uang", + "{s:0.8}Memakai semua Stake sebelumnya", + }, + }, + stake_white={ + name="White Stake", + text={ + "Kesulitan Dasar", + }, + }, + }, + Tag={ + tag_boss={ + name="Boss Tag", + text={ + "Reroll", + "{C:attention}Boss Blind", + }, + }, + tag_buffoon={ + name="Buffoon Tag", + text={ + "Memberikan gratis", + "{C:attention}Buffoon Pack", + }, + }, + tag_charm={ + name="Charm Tag", + text={ + "Memberikan gratis", + "{C:tarot}Mega Arcana Pack", + }, + }, + tag_coupon={ + name="Coupon Tag", + text={ + "Kartu perdana dan", + "paket booster di toko", + "toko itu gratis", + }, + }, + tag_d_six={ + name="D6 Tag", + text={ + "Reroll di babak berikutnya", + "mulai dari {C:money}$0", + }, + }, + tag_double={ + name="Double Tag", + text={ + "Memberikan sebuah salinan", + "{C:attention}Tag{} pilihan berikutnya", + "{s:0.8}tidak termasuk {s:0.8,C:attention}Double Tag", + }, + }, + tag_economy={ + name="Economy Tag", + text={ + "Menggandakan uang Anda", + "{C:inactive}(Maks {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="Ethereal Tag", + text={ + "Memberikan gratis", + "{C:planet}Spectral Pack", + }, + }, + tag_foil={ + name="Foil Tag", + text={ + "Joker", + "shop edisi dasar selanjutnya gratis dan", + "menjadi {C:dark_edition}Foil", + }, + }, + tag_garbage={ + name="Garbage Tag", + text={ + "Memberikan {C:money}$#1#{} per discard", + "{C:red}yang tidak dipakai{} pada giliran ini", + "{C:inactive}(Akan memberi {C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="Handy Tag", + text={ + "Memberikan {C:money}$#1#{} per hand", + "{C:blue}yang dimainkan{} pada giliran ini", + "{C:inactive}(Akan memberi {C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="Holographic Tag", + text={ + "Joker", + "shop edisi dasar selanjutnya gratis dan", + "menjadi {C:dark_edition}Holographic", + }, + }, + tag_investment={ + name="Investment Tag", + text={ + "Setelah mengalahkan", + "si Boss Blind,", + "dapatkan {C:money}$#1#", + }, + }, + tag_juggle={ + name="Juggle Tag", + text={ + "{C:attention}+#1#{} ukuran hand", + "babak berikutnya", + }, + }, + tag_meteor={ + name="Meteor Tag", + text={ + "Memberikan gratis", + "{C:planet}Mega Celestial Pack", + }, + }, + tag_negative={ + name="Tag Negatif", + text={ + "Joker", + "shop edisi dasar selanjutnya gratis dan", + "menjadi {C:dark_edition}Negatif", + }, + }, + tag_orbital={ + name="Orbital Tag", + text={ + "Upgrade {C:attention}#1#", + "sebanyak {C:attention}#2# level", + }, + }, + tag_polychrome={ + name="Polychrome Tag", + text={ + "Joker", + "shop edisi dasar selanjutnya gratis dan", + "menjadi {C:dark_edition}Polychrome", + }, + }, + tag_rare={ + name="Rare Tag", + text={ + "Shop memiliki", + "{C:red}Rare Joker gratis", + }, + }, + tag_skip={ + name="Speed Tag", + text={ + "Memberikan {C:money}$#1#{} per", + "Blind yang dilewati pada giliran ini", + "{C:inactive}(Akan memberi {C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="Standard Tag", + text={ + "Memberikan gratis", + "{C:attention}Mega Standard Pack", + }, + }, + tag_top_up={ + name="Top-up Tag", + text={ + "Memunculkan hingga {C:attention}#1#", + "{C:blue}Common{} Joker", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + tag_uncommon={ + name="Uncommon Tag", + text={ + "Shop memiliki", + "{C:green}Uncommon Joker gratis", + }, + }, + tag_voucher={ + name="Voucher Tag", + text={ + "Menambah satu {C:voucher}Voucher", + "ke babak berikutnya", + }, + }, + }, + Tarot={ + c_chariot={ + name="The Chariot", + text={ + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#", + }, + }, + c_death={ + name="Death", + text={ + "Pilih {C:attention}#1#{} kartu,", + "mengubah kartu {C:attention}kiri{}", + "menjadi kartu {C:attention}kanan{}", + "{C:inactive}(Seret untuk mengatur kembali)", + }, + }, + c_devil={ + name="The Devil", + text={ + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="The Emperor", + text={ + "Memunculkan hingga {C:attention}#1#", + "kartu {C:tarot}Tarot{} secara acak", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + c_empress={ + name="The Empress", + text={ + "Meningkatkan {C:attention}#1#", + "kartu pilihan hingga", + "{C:attention}#2#s", + }, + }, + c_fool={ + name="The Fool", + text={ + "Memunculkan", + "kartu {C:tarot}Tarot{} atau {C:planet} Planet{}", + "dipakai pada giliran ini", + "{s:0.8,C:tarot}The Fool{s:0.8} tidak termasuk", + }, + }, + c_hanged_man={ + name="The Hanged Man", + text={ + "Menghancurkan hingga", + "{C:attention}#1#{} kartu pilihan", + }, + }, + c_heirophant={ + name="The Hierophant", + text={ + "Meningkatkan {C:attention}#1#", + "kartu pilihan hingga", + "{C:attention}#2#s", + }, + }, + c_hermit={ + name="The Hermit", + text={ + "Menggandakan uang", + "{C:inactive}(Maks {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="The High Priestess", + text={ + "Memunculkan hingga {C:attention}#1#", + "kartu {C:planet}Planet{} secara acak", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + c_judgement={ + name="Judgement", + text={ + "Memunculkan secara acak", + "kartu {C:attention}Joker{}", + "{C:inactive}(Harus memiliki tempat)", + }, + }, + c_justice={ + name="Justice", + text={ + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="The Lovers", + text={ + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#", + }, + }, + c_magician={ + name="The Magician", + text={ + "Meningkatkan {C:attention}#1#{}", + "kartu pilihan hingga", + "{C:attention}#2#", + }, + }, + c_moon={ + name="The Moon", + text={ + "Mengubah hingga", + "{C:attention}#1#{} kartu pilihan", + "menjadi {V:1}#2#{}", + }, + }, + c_star={ + name="The Star", + text={ + "Mengubah hingga", + "{C:attention}#1#{} kartu pilihan", + "menjadi {V:1}#2#{}", + }, + }, + c_strength={ + name="Strength", + text={ + "Menaikkan peringkat", + "hingga {C:attention}#1#{} kartu", + "pilihan sebanyak {C:attention}1", + }, + }, + c_sun={ + name="The Sun", + text={ + "Mengubah hingga", + "{C:attention}#1#{} kartu pilihan", + "menjadi {V:1}#2#{}", + }, + }, + c_temperance={ + name="Temperance", + text={ + "Memberikan total nilai", + "jual semua", + "Joker saat ini {C:inactive}(Maks {C:money}$#1#{C:inactive})", + "{C:inactive}(Saat ini {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="The Tower", + text={ + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="The Wheel of Fortune", + text={ + "{C:green}#1# dalam #2#{} peluang untuk menambah", + "edisi {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan", + "{C:dark_edition}Polychrome{}", + "menghancurkan sebuah {C:attention}Joker secara acak", + }, + }, + c_world={ + name="The World", + text={ + "Mengubah hingga", + "{C:attention}#1#{} kartu pilihan", + "menjadi {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimatter", + text={ + "{C:dark_edition}+1{} Joker Slot", + }, + unlock={ + "Tukarkan {C:voucher}Blank{}", + "total {C:attention}#1#{} kali", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="Blank", + text={ + "{C:inactive}Tidak apa-apa?", + }, + }, + v_clearance_sale={ + name="Clearance Sale", + text={ + "Semua kartu dan paket di", + "toko itu diskon {C:attention}#1#%{}", + }, + }, + v_crystal_ball={ + name="Crystal Ball", + text={ + "{C:attention}+1{} slot habis pakai", + }, + }, + v_directors_cut={ + name="Director's Cut", + text={ + "Reroll Boss Blind", + "{C:attention}1{} kali per Ante,", + "{C:money}$#1#{} per roll", + }, + }, + v_glow_up={ + name="Glow Up", + text={ + "Kartu {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan", + "{C:dark_edition}Polychrome{}", + "muncul {C:attention}#1#X{} lebih sering", + }, + unlock={ + "Miliki setidaknya {C:attention}#1#", + "kartu{C:attention}Joker{} dengan", + "edisi {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan", + "{C:dark_edition}Polychrome{}", + }, + }, + v_grabber={ + name="Grabber", + text={ + "Secara permanen", + "memperoleh {C:blue}+#1#{} hand", + "per babak", + }, + }, + v_hieroglyph={ + name="Hieroglyph", + text={ + "{C:attention}-#1#{} Ante,", + "{C:blue}-#1#{} hand", + "setiap babak", + }, + }, + v_hone={ + name="Hone", + text={ + "Kartu {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan", + "{C:dark_edition}Polychrome{}", + "muncul {C:attention}#1#X{} lebih sering", + }, + }, + v_illusion={ + name="Illusion", + text={ + "{C:attention}Kartu permainan{} di toko", + "mungkin memiliki sebuah {C:enhanced}Enhancement{},", + "{C:dark_edition}Edition{}, dan/atau sebuah {C:attention}Seal{}", + }, + unlock={ + "Beli total", + "{C:attention}#1#{} kartu permainan", + "dari toko", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Liquidation", + text={ + "Semua kartu dan paket di", + "toko itu diskon {C:attention}#1#%{}", + }, + unlock={ + "Tukarkan setidaknya", + "kartu {C:attention}#1#{C:voucher} Voucher{}", + "dalam satu giliran", + }, + }, + v_magic_trick={ + name="Magic Trick", + text={ + "{C:attention}Kartu permainan{} bisa", + "dibeli", + "dari {C:attention}toko", + }, + }, + v_money_tree={ + name="Money Tree", + text={ + "Naikkan batas", + "bunga yang diperoleh di", + "setiap babak menjadi {C:money}$#1#{}", + }, + unlock={ + "Maksimalkan keuntungan", + "pendapatan per babak selama", + "{C:attention}#1#{} babak berturut-turut", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Nacho Tong", + text={ + "Secara permanen", + "memperoleh {C:blue}+#1#{} hand", + "per babak", + }, + unlock={ + "Mainkan total", + "dari {C:attention}#1#{} kartu", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Observatory", + text={ + "kartu {C:planet}Planet{} di", + "area{C:attention}habis pakai{} Anda memberikan", + "{X:red,C:white} X#1# {} Mult untuk", + "{C:attention}poker hand tertentu", + }, + unlock={ + "Pakai total {C:attention}#1#", + "kartu {C:planet}Planet{} dari", + "{C:planet}Celestial Pack apa pun", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Omen Globe", + text={ + "Kartu {C:spectral}Spectral{} bisa juga", + "muncul dalam", + "{C:attention}Arcana Pack apa pun", + }, + unlock={ + "Pakai total {C:attention}#1#", + "kartu {C:tarot}Tarot{} dari", + "{C:tarot}Arcana Pack apa pun", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Overstock", + text={ + "{C:attention}+1{} slot kartu", + "tersedia di toko", + }, + }, + v_overstock_plus={ + name="Overstock Plus", + text={ + "{C:attention}+1{} slot kartu", + "tersedia di toko", + }, + unlock={ + "Belanjakan total", + "{C:money}$#1#{} di toko", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="Paint Brush", + text={ + "{C:attention}+#1#{} ukuran hand", + }, + }, + v_palette={ + name="Palette", + text={ + "{C:attention}+#1#{} ukuran hand", + }, + unlock={ + "Kurangi ukuran hand", + "hingga {C:attention}#1#{} kartu", + }, + }, + v_petroglyph={ + name="Petroglyph", + text={ + "{C:attention}-#1#{} Ante,", + "{C:red}-#1#{} discard", + "setiap babak", + }, + unlock={ + "Reach Ante", + "level {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Planet Merchant", + text={ + "Kartu {C:planet}Planet{} muncul", + "{C:attention}#1#X{} lebih sering", + "di toko", + }, + }, + v_planet_tycoon={ + name="Planet Tycoon", + text={ + "Kartu {C:planet}Planet{} muncul", + "{C:attention}#1#X{} lebih sering", + "di toko", + }, + unlock={ + "Beli total", + "kartu{C:attention}#1#{C:planet} Planet{}", + "dari toko", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Recyclomancy", + text={ + "Secara permanen", + "mendapatkan {C:red}+#1#{} discard", + "setiap babak", + }, + unlock={ + "Buang total", + "dari {C:attention}#1#{} kartu", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Reroll Glut", + text={ + "Biaya reroll", + "kurang dari {C:money}$#1#{}", + }, + unlock={ + "Reroll toko", + "total {C:attention}#1#{} kali", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Reroll Surplus", + text={ + "Biaya reroll", + "kurang dari {C:money}$#1#{}", + }, + }, + v_retcon={ + name="Retcon", + text={ + "Reroll Boss Blind", + "{C:attention}tanpa batas{} waktu,", + "{C:money}$#1#{} per roll", + }, + unlock={ + "Discover", + "{C:attention}#1#{} Blind", + }, + }, + v_seed_money={ + name="Seed Money", + text={ + "Naikkan batas", + "bunga yang diperoleh di", + "setiap babak menjadi {C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="Tarot Merchant", + text={ + "Kartu {C:tarot}Tarot{} muncul", + "{C:attention}#1#X{} lebih sering", + "di toko", + }, + }, + v_tarot_tycoon={ + name="Tarot Tycoon", + text={ + "Kartu {C:tarot}Tarot{} muncul", + "{C:attention}#1#X{} lebih sering", + "di toko", + }, + unlock={ + "Beli total", + "kartu {C:attention}#1#{C:tarot} Tarot{}", + "dari toko", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Telescope", + text={ + "{C:attention}Celestial Pack{} selalu", + "berisi kartu {C:planet}Planet{}", + "untuk", + "poker hand {C:attention}yang paling banyak dimainkan", + }, + }, + v_wasteful={ + name="Wasteful", + text={ + "Secara permanen", + "mendapatkan {C:red}+#1#{} discard", + "setiap babak", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Menangi 100.000.000 Chip dengan sekali hand", + _1000k="Menangi 1.000.000 Chip dengan sekali hand", + _10k="Menangi 10.000 Chip dengan sekali hand", + ante_up="Raih Ante 4", + ante_upper="Raih Ante 8", + astronomy="Temukan setiap kartu Planet", + big_hands="Miliki 80 kartu atau lebih di deck Anda", + card_discarder="Buang setidaknya 2500 Kartu", + card_player="Memainkan setidaknya 2500 Kartu", + cartomancy="Temukan setiap kartu Tarot", + clairvoyance="Temukan setiap kartu Spectral", + completionist="Temukan 100% dari koleksi Anda", + completionist_plus="Menangi dengan setiap deck di kesulitan Gold Stake", + completionist_plus_plus="Dapatkan Stiker Gold di setiap Joker", + extreme_couponer="Temukan setiap Voucer", + flushed="Mainkan Flush dengan 5 Wild Card", + heads_up="Menangi Giliran", + high_stakes="Menangi giliran setidaknya kesulitan Gold Stake", + legendary="Temukan Legendary Joker", + low_stakes="Menangi giliran setidaknya kesulitan Red Stake", + mid_stakes="Menangi giliran setidaknya kesulitan Black Stake", + nest_egg="Miliki $400 atau lebih selama sekali giliran", + retrograde="Dapatkan poker hand apa pun hingga level 10", + roi="Beli 5 Voucer dengan Ante 4", + royale="Mainkan Royal Flush", + rule_bender="Selesaikan giliran tantangan apa pun", + rule_breaker="Selesaikan setiap giliran tantangan", + shattered="Pecahkan 2 Glass Card dengan sekali hand", + speedrunner="Menangi giliran dalam 12 babak atau kurang", + tiny_hands="Kurangi deck Anda hingga 20 kartu atau kurang", + you_get_what_you_get="Menangi giliran tanpa reroll toko", + }, + achievement_names={ + _100000k="100.000K", + _1000k="1.000K", + _10k="10K", + ante_up="Ante Naik!", + ante_upper="Ante Naik Lagi!", + astronomy="Astronomi", + big_hands="Hand Besar", + card_discarder="Pembuang Kartu", + card_player="Pemain Kartu", + cartomancy="Ramalan Kartu", + clairvoyance="Kewaskitaan", + completionist="Completionist", + completionist_plus="Completionist+", + completionist_plus_plus="Completionist++", + extreme_couponer="Pemilik Kupon Ekstrem", + flushed="Flush", + heads_up="Duel", + high_stakes="Taruhan Besar", + legendary="Legendaris", + low_stakes="Taruhan Kecil", + mid_stakes="Taruhan Sedang", + nest_egg="Nest Egg", + retrograde="Retrograde", + roi="ROI", + royale="Royale", + rule_bender="Rule Bender", + rule_breaker="Rule Breaker", + shattered="Shattered", + speedrunner="Speedrunner", + tiny_hands="Hand Kecil", + you_get_what_you_get="Anda Mendapat Apa yang Didapat", + }, + blind_states={ + Current="Saat ini", + Defeated="Dikalahkan", + Select="Pilih", + Selected="Pilihan", + Skipped="Dilewati", + Upcoming="Mendatang", + }, + challenge_names={ + c_blast_off_1="Meluncur", + c_bram_poker_1="Bram Poker", + c_city_1="Kota 15 Menit", + c_cruelty_1="Kekejaman", + c_double_nothing_1="Dobel atau Tidak", + c_five_card_1="Tarik Lima Kartu", + c_fragile_1="Rapuh", + c_golden_needle_1="Jarum Emas", + c_inflation_1="Inflasi", + c_jokerless_1="Tanpa Joker", + c_knife_1="Di Mata Pisau", + c_luxury_1="Pajak Barang Mewah", + c_mad_world_1="Dunia Gila", + c_medusa_1="Medusa", + c_monolith_1="Monolit", + c_non_perishable_1="Tidak Mudah Rusak", + c_omelette_1="Dadar", + c_rich_1="Kaya makin Kaya", + c_typecast_1="Typecast", + c_xray_1="Penglihatan sinar-X", + }, + collabs={ + Clubs={ + ["1"]="Bawaan", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Bawaan", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Bawaan", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Bawaan", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="Pertanyaan Umum", + b_and_use="& PAKAI", + b_back="Kembali", + b_blinds="Blind", + b_booster_packs="Booster Pack", + b_buy="BELI", + b_cash_out="Ambil Taruhan", + b_challenges="Tantangan", + b_collection="Koleksi", + b_collection_cap="KOLEKSI", + b_continue="Lanjutkan", + b_copy="Salin", + b_copy_seed="Salin Unggul", + b_create_profile="Buat Profil", + b_credits="Kredit", + b_current_profile="Profil Saat Ini", + b_customize_deck="Sesuaikan deck", + b_deck="Deck", + b_decks="Decks", + b_delete_profile="Hapus Profil", + b_discard="Buang", + b_editions="Edisi", + b_endless="Mode Tanpa Henti", + b_enhanced_cards="Kartu Enhanced", + b_full_deck="Deck Lengkap", + b_high_contrast_cards="Kartu High Contrast", + b_how_to_play="Cara bermain", + b_imagery="Citra", + b_jokers="Joker", + b_load_profile="Muat Profil", + b_main_menu="Menu Utama", + b_music="Musik", + b_new_challenge="Mulai Tantangan Baru", + b_new_run="Giliran Baru", + b_next="Berikutnya", + b_next_round_1="Berikutnya", + b_next_round_2="Babak", + b_open="BUKA", + b_options="Opsi", + b_options_cap="OPSI", + b_planet_cards="Kartu Planet", + b_play_cap="MAINKAN", + b_play_hand="Mainkan Hand", + b_playbalatro="Kunjungi playbalatro.com", + b_poker_hands="Poker Hand", + b_quit_cap="KELUAR", + b_redeem="TUKAR", + b_reduced_motion="Mengurangi Gerakan", + b_remaining="Sisa", + b_reroll_boss="Reroll Boss", + b_reset_profile="Reset Profil", + b_restrictions="Larangan", + b_retry="Coba lagi", + b_rules="Aturan", + b_run_info_1="Giliran", + b_run_info_2="Info", + b_seals="Seal", + b_seed="Unggul", + b_select="PILIH", + b_sell="JUAL", + b_set_CRT="CRT", + b_set_CRT_bloom="CRT Bloom", + b_set_apply="Terapkan", + b_set_audio="Audio", + b_set_crash_reports="Laporan Crash", + b_set_game="Game", + b_set_game_vol="Volume Game", + b_set_gamespeed="Kecepatan Game", + b_set_graphics="Grafik", + b_set_master_vol="Volume Utama", + b_set_monitor="Monitor Tampilan", + b_set_music_vol="Volume Musik", + b_set_pixel_smoothing="Penghalusan Seni Piksel", + b_set_play_discard_pos="Putar/Buang Posisi Tombol", + b_set_rumble="Controller Rumble", + b_set_screenshake="Goyangan layar", + b_set_shadows="Bayangan", + b_set_vibration="Getar", + b_set_video="Video", + b_set_windowmode="Mode Jendela", + b_settings="Pengaturan", + b_skip="Lewati", + b_skip_blind="Lewati Blind", + b_skip_reward="Lewati Hadiah", + b_sort_hand="Sortir Hand", + b_sounds="Suara", + b_spectral_cards="Kartu Spectral", + b_stake="Stake", + b_start_new_run="Giliran Baru", + b_stat_consumables="Habis Pakai", + b_stat_jokers="Joker", + b_stat_planets="Planet", + b_stat_spectrals="Spectral", + b_stat_tarots="Tarot", + b_stat_vouchers="Voucher", + b_stats="Stat", + b_tags="Tag", + b_tarot_cards="Kartu Tarot", + b_unlock_all="Buka Semua", + b_use="PAKAI", + b_vouchers="Voucher", + b_wishlist="Wishlist di Steam", + k_aces="As", + k_achievement="Prestasi", + k_achievements_disabled="Prestasi Dinonaktifkan", + k_active="aktif", + k_active_ex="Aktif!", + k_again_ex="Lagi!", + k_all_hands="Semua Hand", + k_also_applied="Juga berlaku", + k_ante="Ante", + k_ante_cap="ANTE", + k_arcana_pack="Arcana Pack", + k_balanced="Seimbang", + k_banned_cards="Kartu Terlarang", + k_banned_tags="Tag Terlarang", + k_base_cap="BASE", + k_base_cards="Base Card", + k_best_hand="Best Hand", + k_booster="Booster", + k_buffoon_pack="Buffoon Pack", + k_cap_consumables="HABIS PAKAI", + k_card_stats="Stat Kartu", + k_celestial_pack="Celestial Pack", + k_challenge_mode="Mode Tantangan", + k_challenges="Tantangan", + k_choose="Memilih", + k_collection="Koleksi", + k_common="Common", + k_compatible="kompatibel", + k_copied_ex="Disalin!", + k_custom_rules="Aturan Kustom", + k_daily_run="Giliran Harian", + k_debuffed="Di-debuff", + k_deck="Deck", + k_deck_stake_wins="Taruhan Deck Menang", + k_defeated_by="Dikalahkan Oleh", + k_demo_version_ex="Versi Demo!", + k_disabled_ex="Dinonaktifkan!", + k_drank_ex="Mabuk!", + k_duplicated_ex="Diduplikasi!", + k_dwarf_planet="Dwarf Planet", + k_eaten_ex="Dimakan!", + k_edition="Edisi", + k_effective="Efektif", + k_empty_caps="KOSONG", + k_enter_name="Masukkan Nama", + k_enter_seed="Masukkan Unggulan", + k_enter_text="Masukkan Teks", + k_eroded_ex="Terkikis!", + k_extinct_ex="Punah!", + k_face_cards="Kartu Wajah", + k_game_modifiers="Pengubah Game", + k_gold="Gold", + k_high_score_ex="Menang Besar!", + k_hud_discards="Discard", + k_hud_hands="Hand", + k_incompatible="tidak kompatibel", + k_joker="Joker", + k_joker_stickers="Stiker Joker", + k_jokers_cap="JOKER", + k_legendary="Legendary", + k_level_prefix="lvl.", + k_level_up_ex="Level Naik!", + k_locked="Dikunci", + k_lower_score="menang", + k_lvl="lvl.", + k_melted_ex="Meleleh!", + k_money="Uang", + k_mult="Mult", + k_no_other_jokers="Tak boleh Joker lagi!", + k_no_reward="Tidak ada Hadiah", + k_no_room_ex="Tak Ada Tempat!", + k_no_space_ex="Tak Ada Ruang!", + k_none="Tidak Ada", + k_nope_ex="Tidak!", + k_not_allowed_ex="Tidak Diperbolehkan!", + k_not_discovered="Belum Ditemukan", + k_numbered_cards="Kartu Bernomor", + k_or="atau", + k_other="Lainnya", + k_page="Halaman", + k_planet="Planet", + k_planet_q="Planet?", + k_playing_as="Bermain sebagai", + k_plus_joker="+1 Joker", + k_plus_planet="+1 Planet", + k_plus_spectral="+1 Spectral", + k_plus_stone="+1 Stone", + k_plus_tarot="+1 Tarot", + k_poker_hand="poker hand", + k_profile="Profil", + k_progress="Progres", + k_rank="Peringkat", + k_rare="Rare", + k_redeemed_ex="Ditukarkan!", + k_reroll="Reroll", + k_reset="Reset", + k_reward="Hadiah", + k_round="Babak", + k_safe_ex="Aman!", + k_saved_ex="Disimpan!", + k_seed="Unggul", + k_seeded_run="Giliran yang Diunggulkan", + k_skipped_cap="DILEWATI", + k_spectral="Spectral", + k_spectral_pack="Spectral Pack", + k_stake="Stake", + k_stake_level="Level Stake", + k_standard_pack="Standard Pack", + k_suit="Rupa", + k_swapped_ex="Ditukar!", + k_tarot="Tarot", + k_trophies_disabled="Trofi Dinonaktifkan", + k_trophy="Trofi", + k_uncommon="Uncommon", + k_undisovered="Belum Ditemukan", + k_unknown="?????", + k_unlocked_ex="Terbuka!", + k_upgrade_ex="Upgrade!", + k_val_up="Nilai Naik!", + k_view="Tampilan", + k_voucher="Voucher", + k_vouchers_cap="VOUCHER", + k_wins="Menang", + k_x_base="X Base", + ml_bloom_opt={ + "Mati", + "Nyala", + }, + ml_buy_and_use_target={ + "BELI", + "& PAKAI", + }, + ml_buy_target={ + "BELI", + }, + ml_card_stats={ + "Kartu", + "Stat", + }, + ml_controller_required={ + "Pengontrol permainan diperlukan untuk bermain.", + "Silakan sambungkan pengontrol untuk melanjutkan.", + }, + ml_crash_report_info={ + "Laporan crash akan dikirim ke pengembang", + "agar kelak mengurangi masalah. Tidak ada", + "identifikasi atau info pribadi yang akan dikirim.", + }, + ml_demo_thanks_message={ + "Harap pertimbangkan wishlist", + "Balatro di Steam dan mendaftar agar", + "menerima buletin di playbalatro.com", + }, + ml_disabled_seed={ + "Semua Terbuka dan", + "Penemuan dinonaktifkan", + }, + ml_edition_seal_enhancement_explanation={ + "Mungkin setiap kartu yang dimainkan punya satu", + "Enhancement, Edisi, dan Seal", + }, + ml_eternal={ + "Eternal", + "Tidak bisa dijual", + "atau dihancurkan", + }, + ml_gold_seal_desc={ + "Gold Seal", + "kembali ke hand", + "saat dimainkan", + }, + ml_offline_message={ + "Perangkat ini offline.", + "Penyimpanan saat ini mungkin bukan versi terbaru.", + }, + ml_open_target={ + "BUKA", + }, + ml_paste_seed={ + "Tempel", + "Unggul", + }, + ml_play_discard_pos_opt={ + "Buang/Putar", + "Putar/Buang", + }, + ml_redeem_target={ + "TUKAR", + }, + ml_sell_target={ + "JUAL", + }, + ml_shadow_opt={ + "Nyala", + "Mati", + }, + ml_smoothing_opt={ + "Mati", + "Nyala", + }, + ml_unlock_all_explanation={ + "PERINGATAN! Membuka Koleksi lengkap", + "akan menonaktifkan prestasi untuk profil ini!", + }, + ml_unlock_all_trophies={ + "PERINGATAN! Membuka Koleksi lengkap", + "akan menonaktifkan trofi untuk profil ini!", + }, + ml_vsync_opt={ + "VSync Nyala", + "VSync Mati", + }, + ml_windowmode_opt={ + "Berjendela", + "Layar Penuh", + "Tanpa Batas", + }, + ph_1_level="+1 Tingkat", + ph_4_7_of_clubs="empat 7 dari Keriting", + ph_alert_debuff_confirm="Tekan 'Mainkan' lagi untuk mengonfirmasi", + ph_all_poker_hand="Semua Poker Hand", + ph_blind_reward="Hadiah: ", + ph_blind_score_at_least="Menang Setidaknya", + ph_boss_disabled="Boss Dinonaktifkan!", + ph_choose_blind_1="Pilih Blind", + ph_choose_blind_2="Anda berikutnya", + ph_click_confirm="Tekan lagi untuk mengonfirmasi", + ph_deck_preview_effective="Total efektif karena Joker, Blind, dan peningkatan kartu", + ph_deck_preview_stones="Stone", + ph_defeat_the_boss="Kalahkan Boss Blind", + ph_defeat_this_blind_1="Kalahkan blind ini", + ph_defeat_this_blind_2="untuk menemukannya", + ph_demo_thanks_1="Terima kasih sudah memutar", + ph_demo_thanks_2="DEMO BALATRO", + ph_display_stickers="Menampilkan Stiker Taruhan selama Giliran", + ph_game_over="GAME OVER", + ph_improve_run="Perbaiki giliran Anda!", + ph_most_played="(poker hand yang paling banyak dimainkan)", + ph_mr_bones="Diselamatkan oleh Mr. Bones", + ph_no_boss_active="tak ada bos aktif", + ph_no_vouchers="Tidak ada voucher yang ditukarkan pada giliran ini", + ph_score_at_least="Menang Setidaknya", + ph_score_cards_discarded="Kartu yang Dibuang", + ph_score_cards_played="Kartu yang Dimainkan", + ph_score_cards_purchased="Kartu yang Dibeli", + ph_score_furthest_ante="Ante", + ph_score_furthest_round="Babak", + ph_score_hand="Hand Terbaik", + ph_score_new_collection="Penemuan Baru", + ph_score_poker_hand="Hand yang Paling Sering Dimainkan", + ph_score_times_rerolled="Reroll Waktu", + ph_select_challenge="Pilih Tantangan", + ph_sneak_peek="Intip Sekilas", + ph_stat_consumable="Berapa kali kartu ini telah dipakai", + ph_stat_joker="Total babak yang diselesaikan dengan kartu ini", + ph_stat_voucher="Berapa kali Voucher ini telah ditukarkan", + ph_unscored_hand="Hand tidak akan menang", + ph_up_ante_1="Naikkan Ante", + ph_up_ante_2="Naikkan semua Blind", + ph_up_ante_3="Refresh Blind", + ph_vouchers_redeemed="Voucher yang ditukarkan pada giliran ini", + ph_you_win="ANDA MENANG!", + ph_you_win_demo="ANDA MENANG DEMO!", + }, + high_scores={ + boss_streak="Most Bosses dalam sebuah Row", + collection="Koleksi", + current_streak="", + furthest_ante="Highest Ante", + furthest_round="Highest Round", + hand="Best Hand", + most_money="Most Money", + poker_hand="Most Played Hand", + win_streak="Best Win Streak", + }, + labels={ + blue_seal="Blue Seal", + common="Common", + eternal="Eternal", + foil="Foil", + gold_seal="Gold Seal", + holographic="Holographic", + legendary="Legendary", + locked="Dikunci", + negative="Negatif", + perishable="Perishable", + pinned_left="Disematkan", + planet="Planet", + pluto_planet="Dwarf Planet", + polychrome="Polychrome", + purple_seal="Purple Seal", + rare="Rare", + red_seal="Red Seal", + rental="Rental", + tarot="Tarot", + uncommon="Uncommon", + voucher="Voucher", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 kartu dengan peringkat yang sama", + }, + Flush={ + "5 kartu yang memiliki rupa yang sama", + }, + ["Flush Five"]={ + "5 kartu dengan peringkat dan rupa yang sama", + }, + ["Flush House"]={ + "Sebuah Three of a Kind dan sebuah Pair dengan", + "semua kartu memiliki rupa yang sama", + }, + ["Four of a Kind"]={ + "4 kartu dengan peringkat yang sama. Keempatnya mungkin", + "dimainkan dengan 1 kartu tanpa kemenangan lainnya", + }, + ["Full House"]={ + "Sebuah Three of a Kind dan sebuah Pair dengan", + }, + ["High Card"]={ + "Jika hand yang dimainkan bukan salah satu hand", + "yang di atas, hanya kartu berperingkat tertinggi yang menang", + }, + Pair={ + "2 kartu yang memiliki peringkat yang sama. Keduanya mungkin", + "dimainkan dengan hingga 3 kartu tanpa kemenangan lainnya", + }, + ["Royal Flush"]={ + "5 kartu berturut-turut {peringkat berurutan} dengan", + "semua kartu memiliki rupa yang sama", + }, + Straight={ + "5 kartu berturut-turut {peringkat berurutan}", + }, + ["Straight Flush"]={ + "5 kartu berturut-turut {peringkat berurutan} dengan", + "semua kartu memiliki rupa yang sama", + }, + ["Three of a Kind"]={ + "3 kartu dengan peringkat yang sama. Ketiganya mungkin", + "dimainkan dengan 2 kartu tanpa kemenangan lainnya", + }, + ["Two Pair"]={ + "2 pasang kartu dengan peringkat berbeda, mungkin", + "dimainkan dengan 1 kartu tanpa kemenangan lainnya", + }, + }, + poker_hands={ + ["Five of a Kind"]="Five of a Kind", + Flush="Flush", + ["Flush Five"]="Flush Five", + ["Flush House"]="Flush House", + ["Four of a Kind"]="Four of a Kind", + ["Full House"]="Full House", + ["High Card"]="High Card", + Pair="Pair", + ["Royal Flush"]="Royal Flush", + Straight="Straight", + ["Straight Flush"]="Straight Flush", + ["Three of a Kind"]="Three of a Kind", + ["Two Pair"]="Two Pair", + }, + quips={ + dq_1={ + "Astaga! Kuharap kau", + "punya trik-trik", + "rahasia untuk", + "tantangan final ini!", + }, + lq_1={ + "Mungkin Go Fish", + "itu menambah", + "kecepatan kita...", + }, + lq_10={ + "Gagal total!", + }, + lq_2={ + "Kita dilipat seperti", + "jas murahan!", + }, + lq_3={ + "Saatnya kita", + "menghindar", + "dan mencoba lagi!", + }, + lq_4={ + "Engkau tahu apa", + "kata mereka,", + "house selalu menang!", + }, + lq_5={ + "Sepertinya kita", + "tahu siapa", + "sebenarnya Joker itu!", + }, + lq_6={ + "Oh tidak, Anda", + "juga menggertak?", + }, + lq_7={ + "Sepertinya kita", + "menjadi lawakan!", + }, + lq_8={ + "Andai aku punya tangan,", + "aku pasti akan", + "menutup mataku!", + }, + lq_9={ + "Aku memang", + "bodoh, apa", + "alasanmu?", + }, + wq_1={ + "Anda berhasil!", + }, + wq_2={ + "Anda menghadapinya", + "dengan cukup baik!", + }, + wq_3={ + "Sepertinya Anda", + "tidak menggertak!", + }, + wq_4={ + "Sayangnya semua", + "chip ini", + "virtual...", + }, + wq_5={ + "Sepertinya aku telah", + "mengajarimu dengan baik!", + }, + wq_6={ + "Anda membuat", + "permainan duel!", + }, + wq_7={ + "Untungnya", + "aku tak bertaruh", + "melawanmu!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="As", + Jack="Jack", + King="King", + Queen="Queen", + }, + suits_plural={ + Clubs="Keriting", + Diamonds="Wajik", + Hearts="Hati", + Spades="Sekop", + }, + suits_singular={ + Clubs="Keriting", + Diamonds="Wajik", + Hearts="Hati", + Spades="Sekop", + }, + tutorial={ + bb_1={ + "Memilih {C:attention}Big Blind", + "akan mendapat sejumlah uang tunai", + }, + bb_2={ + "Atau memilih untuk {C:attention}melewatinya", + "agar mendapat sebuah {C:attention}Tag{}! Setiap", + "{C:attention}Tag{} memiliki efek unik", + }, + bb_3={ + "Namun perhatikan", + "si {C:attention}Boss Blind{}. Ia", + "punya kemampuan yang akan", + "diperlukan untuk membuat rencana.", + }, + bb_4={ + "Jika Anda mengalahkannya,", + "{C:attention}Ante{} naik dan semua", + "{C:attention}Blind{} menjadi lebih sulit", + }, + bb_5={ + "Kalahkan {C:attention}Ante{} #1# agar menang.", + "Sekarang pilih jalur Anda!", + }, + fh_1={ + "Anda mendapat chip dengan", + "memainkan {C:attention}Poker hand", + }, + fh_2={ + "Setiap {C:attention}Poker hand{} mendapatkan", + "sejumlah dasar {C:blue}Chip", + "diperbanyak oleh sejumlah {C:red}Mult", + }, + fh_3={ + "Lihat {C:attention}Poker hand Anda", + "di area {C:attention}Info Giliran{},", + "bersama dengan info lainnya", + "tentang giliran Anda saat ini", + }, + fh_4={ + "Beberapa kartu juga memberi Anda", + "sejumlah {C:blue}Chip{},", + "arahkan kursor ke atas untuk melihatnya!", + }, + fh_4_touch={ + "Beberapa kartu juga memberi Anda", + "sejumlah {C:blue}Chip{},", + "tekan dan tahan untuk melihatnya!", + }, + fh_5={ + "Sekarang pilih hingga", + "{C:attention}5{} kartu untuk dimainkan", + "dan tekan {C:blue}'Mainkan Hand'", + }, + fh_5_touch={ + "Sekarang tekan hingga", + "{C:attention}5{} kartu untuk dimainkan", + "dan tekan {C:blue}'Mainkan Hand'", + }, + fh_6={ + "Anda juga dapat {C:red}'Membuang'{} hingga", + "{C:attention}5{} kartu pilihan", + "untuk mencoba dan memperkuat", + "hand lagi. Cobalah!", + }, + fh_7={ + "Awas! Anda cuma punya", + "sejumlah terbatas {C:blue}Hand", + "dan {C:red}Discard{} per babak", + }, + fh_8={ + "Dapatkan {C:attention}300 Chip{} sebelum", + "Anda kehabisan {C:blue}Hand", + "untuk memenangi babak ini.", + "Semoga berhasil!", + }, + s_1={ + "Bagus sekali! Sekarang", + "Anda {E:1}melimpah{} dengan {C:money}Uang Tunai{},", + "Anda bisa membeli beberapa kartu", + "baru dari {C:attention}Toko", + }, + s_10={ + "Stok {C:attention}Voucher{} diisi kembali", + "setelah Anda mengalahkan", + "{C:attention}Boss Blind{}.", + }, + s_11={ + "Dan periksalah", + "{C:booster}Booster Packs{} di", + "setiap toko. Paketnya", + "penuh pernak-pernik!", + }, + s_12={ + "Marilah kita maju ke", + "{C:attention}babak berikutnya{}.", + }, + s_2={ + "Cobalah membeli", + "Iblis ganteng ini", + }, + s_2_touch={ + "Cobalah membeli", + "Iblis ganteng ini!", + "Geser dari toko", + "ke area {C:attention}'BELI'{}", + }, + s_3={ + "Ini merupakan salah satu {C:attention}#1#", + "{C:attention}Joker{} yang bisa ditambahkan ke", + "giliran Anda. Setiap {C:attention}Joker", + "membuat sesuatu yang berbeda", + }, + s_4={ + "Yang satu ini menambahkan {C:red}+4 Mult{} ke", + "setiap hand yang Anda mainkan!", + }, + s_5={ + "Jadilah pemilih, Anda cuma dapat", + "membawa {C:attention}5 kartu{} Joker", + "pada saat bersamaan", + }, + s_6={ + "Sekarang belilah kartu", + "lainnya dari {C:attention}Toko", + }, + s_7={ + "Kartu {C:tarot}Tarot{} ini merupakan suatu", + "{C:attention}habis pakai{}. Yang satu ini akan", + "meningkatkan permainan kartu", + "Anda! Pertahankanlah.", + }, + s_8={ + "Sekarang pilihlah hingga", + "{C:attention}2 kartu{} habis pakai", + "pada suatu saat", + }, + s_9={ + "Jika Anda cukup banyak menyimpan,", + "Anda bisa membeli sebuah {C:attention}Voucher{}.", + "{C:attention}Voucher{} secara pasif", + "meng-upgrade giliran Anda!", + }, + sb_1={ + "Halo! Namaku", + "{C:attention}Jimbo{}, aku siap membantu", + "Anda mempelajari cara bermain!", + }, + sb_2={ + "Tujuan Anda adalah mendapatkan", + "{C:blue}Chip{} untuk mengalahkan", + "musuh {C:attention}Blind", + }, + sb_3={ + "Di sini ada sebuah {C:blue}Small Blind{},", + "Anda hanya perlu mendapat", + "{C:attention}300 Chip{} untuk mengalahkannya.", + }, + sb_4={ + "Pilih {C:blue}Small Blind", + "untuk memulai babak!", + }, + sh_1={ + "Saat Anda mendapatkan lebih banyak kartu,", + "jangan lupa kalau Anda bisa mengaturnya kembali.", + "{C:attention}Joker{} memicu secara", + "berurutan dari kiri ke kanan", + }, + sh_2={ + "Dan memastikan bahwa Anda", + "{C:attention}MEMAKAI{} habis pakai Anda!", + }, + sh_3={ + "Pilih hingga {C:attention}2{} kartu", + "di hand Anda dan tekan", + "{C:attention}'GUNAKAN'{} di kartu {C:tarot}Tarot{}", + "untuk meningkatkannya!", + }, + sh_3_touch={ + "Pilih hingga {C:attention}2{} kartu", + "di hand Anda dan geser", + "kartu Tarot {C:tarot}{} ke area {C:attention}'GUNAKAN'{}", + "untuk meningkatkannya!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Hand", + a_handsize="+#1# ukuran hand", + a_handsize_minus="-#1# Ukuran Hand", + a_mult="+#1# Mult", + a_mult_minus="-#1# Mult", + a_remaining="Tersisa #1#", + a_sold_tally="Terjual #1#/#2#", + a_xmult=" X#1# Mult", + a_xmult_minus="-X#1# Mult", + ante_x_voucher="VOUCHER #1# ANTE", + challenges_completed="Tantangan #1#/#2# Selesai", + completed="#1#/#2# Lengkap", + deck_preview_wheel_plural="Jumlahnya mungkin lebih rendah karena #1# kartu yang ditarik menghadap ke bawah", + deck_preview_wheel_singular="Jumlahnya mungkin lebih rendah karena #1# kartu yang ditarik menghadap ke bawah", + interest="#1# keuntungan setiap $#2# (#3# maks)", + loyalty_active="Aktif!", + loyalty_inactive="tersisa #1#", + ml_foil_desc={ + "Foil", + "+#1# Chip", + }, + ml_holo_desc={ + "Holographic", + "+#1# Mult", + }, + ml_negative_consumable_desc={ + "Negatif", + "+#1# Slot habis pakai", + }, + ml_negative_desc={ + "Negatif", + "+#1# slot Joker", + }, + ml_polychrome_desc={ + "Polychrome", + " X#1# Mult", + }, + remaining_discard_money="Sisa Discard (masing-masing #1#$)", + remaining_hand_money="Sisa Hands (masing-masing #1#$)", + unlocked="#1#/#2# Terbuka", + }, + v_text={ + ch_c_all_eternal={ + "Semua Joker toko adalah {C:eternal}Eternal{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}Chip{} tidak dapat melebihi {C:money}$ saat ini", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Tantangan Harian!", + }, + ch_c_debuff_played_cards={ + "Semua kartu yang {C:attention}Dimainkan{} terkena {C:attention}debuff{} setelah menang", + }, + ch_c_discard_cost={ + "Buang setiap harga {C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "{C:green}1 di #1#{} kartu ditarik menghadap ke bawah", + }, + ch_c_inflation={ + "Naikkan harga secara permanen sebesar {C:money}$1{} di setiap pembelian", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Pegang {C:red}-1{} kartu di hand untuk setiap {C:money}$#1#{} yang Anda miliki", + }, + ch_c_no_extra_hand_money={ + "Ekstra {C:blue}Hand{} tidak lagi mendapat uang", + }, + ch_c_no_interest={ + "Tidak mendapat {C:attention}Keuntungan{} di akhir babak", + }, + ch_c_no_reward={ + "Semua {C:attention}Blind{} tidak memberikan hadiah uang", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# Blind{} tidak memberikan hadiah uang", + }, + ch_c_no_shop_jokers={ + "Joker tidak lagi muncul di {C:attention}toko", + }, + ch_c_none={ + "{C:inactive}Tidak ada", + }, + ch_c_set_eternal_ante={ + "Saat ante {C:attention}#1#{} bos dikalahkan, semua Joker menjadi {C:attention}eternal", + }, + ch_c_set_joker_slots_ante={ + "Saat ante {C:attention}#1#{} bos dikalahkan, setel slot Joker menjadi {C:attention}0", + }, + ch_c_set_seed={ + "1 upaya dengan set Seed: {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} Slot Habis Pakai", + }, + ch_m_discards={ + "{C:red}#1#{} discard per babak", + }, + ch_m_dollars={ + "Mulai dengan {C:money}$#1#", + }, + ch_m_hand_size={ + "{C:attention}#1#{} ukuran hand", + }, + ch_m_hands={ + "{C:blue}#1#{} hand per babak", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} Joker Slot", + }, + ch_m_none={ + "{C:inactive}Tidak ada", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/it.lua b/src/localization/it.lua new file mode 100644 index 0000000..5ccd766 --- /dev/null +++ b/src/localization/it.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Mazzo abbandonato", + text={ + "Inizia la sessione", + "senza {C:attention}figure", + "nel tuo mazzo", + }, + }, + b_anaglyph={ + name="Mazzo anaglifo", + text={ + "Dopo aver sconfitto ogni", + "{C:attention}buio boss{}, guadagni 1", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Mazzo nero", + text={ + "{C:attention}+#1#{} slot Jolly", + "", + "{C:blue}-#2#{} mani", + "in ogni round", + }, + }, + b_blue={ + name="Mazzo blu", + text={ + "{C:blue}+#1#{} mano", + "in ogni round", + }, + }, + b_challenge={ + name="Mazzo sfida", + text={ + "", + }, + }, + b_checkered={ + name="Mazzo a quadretti", + text={ + "Inizia la sessione con", + "{C:attention}26{C:spades} Picche{} e", + "{C:attention}26{C:hearts} Cuori{} nel mazzo", + }, + }, + b_erratic={ + name="Mazzo irregolare", + text={ + "Tutti i {C:attention}valori{} e", + "{C:attention}semi{} nel mazzo", + "sono casuali", + }, + }, + b_ghost={ + name="Mazzo fantasma", + text={ + "Le carte {C:spectral}Spettrali{} possono", + "apparire nel negozio,", + "inizi con una carta {C:spectral,T:c_hex}Maledizione{}", + }, + }, + b_green={ + name="Mazzo verde", + text={ + "Alla fine di ogni round:", + "{C:money}$#1#{s:0.85} per ogni {C:blue}mano{} rimasta", + "{C:money}$#2#{s:0.85} per ogni {C:red}scarto{} rimasto", + "Non guadagni {C:attention}interessi", + }, + }, + b_magic={ + name="Mazzo magico", + text={ + "Inizia la sessione con il", + "Buono {C:tarot,T:v_crystal_ball}#1#{}", + "e {C:attention}2{} copie", + "di {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Mazzo nebulosa", + text={ + "Inizia la sessione con il", + "Buono {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} slot consumabili", + }, + }, + b_painted={ + name="Mazzo dipinto", + text={ + "{C:attention}+#1#{} carte della mano", + "{C:red}#2#{} slot Jolly", + }, + }, + b_plasma={ + name="Mazzo plasma", + text={ + "Bilancia {C:blue}fiche{} e", + "{C:red}Molt{} durante il calcolo", + "dei punti della mano giocata", + "{C:red}X#1#{} importo buio base", + }, + }, + b_red={ + name="Mazzo rosso", + text={ + "{C:red}+#1#{} scarto", + "in ogni round", + }, + }, + b_yellow={ + name="Mazzo giallo", + text={ + "Inizi con", + "{C:money}$#1# in più", + }, + }, + b_zodiac={ + name="Mazzo zodiacale", + text={ + "Inizia la sessione con", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "e {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="Il braccio", + text={ + "Riduce il livello della", + "mano di poker giocata", + }, + }, + bl_big={ + name="Grande buio", + text={ + }, + }, + bl_club={ + name="Il fiore", + text={ + "Tutte le carte di Fiori", + "sono penalizzate", + }, + }, + bl_eye={ + name="L'occhio", + text={ + "Niente tipi di mani", + "ripetuti in questo round", + }, + }, + bl_final_acorn={ + name="Ghianda d'ambra", + text={ + "Gira e mischia", + "tutti i Jolly", + }, + }, + bl_final_bell={ + name="Campana cerulea", + text={ + "Ti costringe a selezionare", + "sempre una 1 carta", + }, + }, + bl_final_heart={ + name="Cuore cremisi", + text={ + "Disattiva un Jolly", + "casuale in ogni mano", + }, + }, + bl_final_leaf={ + name="Foglia verde", + text={ + "Le carte sono penalizzate", + "finché non vendi 1 Jolly", + }, + }, + bl_final_vessel={ + name="Contenitore violetto", + text={ + "Buio molto grande", + }, + }, + bl_fish={ + name="Il pesce", + text={ + "Carte pescate a faccia in giù", + "dopo ogni mano giocata", + }, + }, + bl_flint={ + name="La selce", + text={ + "Fiche e Molt di base", + "sono dimezzati", + }, + }, + bl_goad={ + name="Il pungolo", + text={ + "Tutte le carte di Picche", + "sono penalizzate", + }, + }, + bl_head={ + name="La testa", + text={ + "Tutte le carte di Cuori", + "sono penalizzate", + }, + }, + bl_hook={ + name="L'uncino", + text={ + "Scarta 2 carte", + "casuali per mano giocata", + }, + }, + bl_house={ + name="La casa", + text={ + "La prima mano viene", + "pescata a faccia in giù", + }, + }, + bl_manacle={ + name="La manetta", + text={ + "-1 carta della mano", + }, + }, + bl_mark={ + name="Il marchio", + text={ + "Tutte le figure vengono", + "pescate a faccia in giù", + }, + }, + bl_mouth={ + name="La bocca", + text={ + "Giochi solo 1 tipo di", + "mano in questo round", + }, + }, + bl_needle={ + name="L'ago", + text={ + "Giochi solo 1 mano", + }, + }, + bl_ox={ + name="Il bue", + text={ + "Giocare 1 #1#", + "porta i soldi a $0", + }, + }, + bl_pillar={ + name="Il pilastro", + text={ + "Le carte giocate precedentemente", + "in questo ante sono penalizzate", + }, + }, + bl_plant={ + name="La pianta", + text={ + "Tutte le figure", + "sono penalizzate", + }, + }, + bl_psychic={ + name="Il medium", + text={ + "Devi giocare 5 carte", + }, + }, + bl_serpent={ + name="Il serpente", + text={ + "Dopo Gioca o Scarta,", + "peschi sempre 3 carte", + }, + }, + bl_small={ + name="Piccolo buio", + text={ + }, + }, + bl_tooth={ + name="Il dente", + text={ + "Perdi $1 per", + "carta giocata", + }, + }, + bl_wall={ + name="Il muro", + text={ + "Buio super grande", + }, + }, + bl_water={ + name="L'acqua", + text={ + "Inizi con", + "0 scarti", + }, + }, + bl_wheel={ + name="La ruota", + text={ + " su 7 carte vengono", + "pescate a faccia in giù", + }, + }, + bl_window={ + name="La finestra", + text={ + "Tutte le carte di Quadri", + "sono penalizzate", + }, + }, + }, + Edition={ + e_base={ + name="Base", + text={ + "Nessun effetto extra", + }, + }, + e_foil={ + name="Foil", + text={ + "{C:chips}+#1#{} fiche", + }, + }, + e_holo={ + name="Olografica", + text={ + "{C:mult}+#1#{} Molt", + }, + }, + e_negative={ + name="Negativa", + text={ + "{C:dark_edition}+#1#{} slot Jolly", + }, + }, + e_negative_consumable={ + name="Negativa", + text={ + "{C:dark_edition}+#1#{} slot consumabili", + }, + }, + e_polychrome={ + name="Policroma", + text={ + "{X:mult,C:white} X#1# {} Molt", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Carta bonus", + text={ + }, + }, + m_glass={ + name="Carta di vetro", + text={ + "{X:mult,C:white} X#1# {} Molt", + "{C:green}#2# probabilità su #3#{} di", + "distruggere la carta", + }, + }, + m_gold={ + name="Carta dorata", + text={ + "{C:money}$#1#{} se hai", + "in mano questa carta", + "alla fine del round", + }, + }, + m_lucky={ + name="Carta fortunata", + text={ + "{C:green}#1# probabilità su #3#{}", + "di {C:mult}+#2#{} Molt", + "{C:green}#1# probabilità su #5#{}", + "di vincere {C:money}$#4#", + }, + }, + m_mult={ + name="Carta Molt", + text={ + "{C:mult}+#1#{} Molt", + }, + }, + m_steel={ + name="Carta d'acciaio", + text={ + "{X:mult,C:white} X#1# {} Molt", + "mentre questa carta", + "rimane in mano", + }, + }, + m_stone={ + name="Carta di pietra", + text={ + "{C:chips}+#1#{} fiche", + "nessun valore o seme", + }, + }, + m_wild={ + name="Carta multiuso", + text={ + "Può essere usata", + "al posto di ogni seme", + }, + }, + }, + Joker={ + j_8_ball={ + name="Palla 8", + text={ + "{C:green}#1# probabilità su #2#{} per ogni", + "{C:attention}8{} giocato di creare un", + "{C:tarot}Tarocco{} quando assegna punti", + "{C:inactive}(Serve spazio)", + }, + }, + j_abstract={ + name="Jolly astratto", + text={ + "{C:mult}+#1#{} Molt per", + "ogni {C:attention}Jolly{}", + "{C:inactive}(Attualmente {C:red}+#2#{C:inactive} Molt)", + }, + }, + j_acrobat={ + name="Acrobata", + text={ + "{X:red,C:white} X#1# {} Molt nella {C:attention}mano", + "{C:attention}finale{} del round", + }, + unlock={ + "Gioca {C:attention,E:1}#1#{} mani", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Jolly antico", + text={ + "Ogni carta giocata con", + "seme {V:1}#2#{} dà", + "{X:mult,C:white} X#1# {} Molt quando assegna punti,", + "{s:0.8}il seme cambia alla fine del round", + }, + }, + j_arrowhead={ + name="Punta di freccia", + text={ + "Le carte giocate con", + "seme {C:spades}Picche{} danno", + "{C:chips}+#1#{} fiche quando assegna punti", + }, + unlock={ + "Devi avere almeno {E:1,C:attention}#1#", + "carte di {E:1,C:attention}#2#", + "nel tuo mazzo", + }, + }, + j_astronomer={ + name="Astronomo", + text={ + "Tutte le carte {C:planet}Pianeta{} e", + "{C:planet}buste celestiali{} nel", + "Negozio sono {C:attention}gratis", + }, + unlock={ + "Scopri ogni", + "carta {E:1,C:planet}Pianeta{}", + }, + }, + j_banner={ + name="Stendardo", + text={ + "{C:chips}+#1#{} fiche", + "per ogni", + "{C:attention}scarto{} rimasto", + }, + }, + j_baron={ + name="Barone", + text={ + "Ogni {C:attention}Re{}", + "tenuto in mano", + "dà {X:mult,C:white} X#1# {} Molt", + }, + }, + j_baseball={ + name="Carta da baseball", + text={ + "I Jolly {C:green}non comuni{}", + "danno {X:mult,C:white} X#1# {} Molt ciascuno", + }, + }, + j_blackboard={ + name="Lavagna", + text={ + "{X:red,C:white} X#1# {} Molt se tutte", + "carte tenute in mano", + "sono di {C:spades}#2#{} o {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Diaspro sanguigno", + text={ + "{C:green}#1# probabilità su #2#{} che", + "le carte giocate con", + "seme {C:hearts}Cuori{} diano", + "{X:mult,C:white} X#3# {} Molt quando assegna punti,", + }, + unlock={ + "Devi avere almeno {E:1,C:attention}#1#", + "carte di {E:1,C:attention}#2#", + "nel tuo mazzo", + }, + }, + j_blue_joker={ + name="Jolly blu", + text={ + "{C:chips}+#1#{} fiche per ogni", + "carta rimasta nel {C:attention}mazzo", + "{C:inactive}(Attualmente {C:chips}+#2#{C:inactive} fiche)", + }, + }, + j_blueprint={ + name="Cianografia", + text={ + "Copia le abilità", + "del {C:attention}Jolly{} a destra", + }, + unlock={ + "Vinci una sessione", + }, + }, + j_bootstraps={ + name="Scarpe ai piedi", + text={ + "{C:mult}+#1#{} Molt per ogni", + "{C:money}$#2#{} che possiedi", + "{C:inactive}(Attualmente {C:mult}+#3#{C:inactive} Molt)", + }, + unlock={ + "Devi avere almeno {E:1,C:attention}#1#", + "Jolly {C:dark_edition}policromi{}", + }, + }, + j_brainstorm={ + name="Raccolta di idee", + text={ + "Copia l'abilità", + "del {C:attention}Jolly{} più a sinistra", + }, + unlock={ + "Scarta una", + "{E:1,C:attention}Scala reale massima", + }, + }, + j_bull={ + name="Toro", + text={ + "{C:chips}+#1#{} fiche per", + "ogni {C:money}$1{} che possiedi", + "{C:inactive}(Attualmente {C:chips}+#2#{C:inactive} fiche)", + }, + }, + j_burglar={ + name="Ladro", + text={ + "Quando selezioni un {C:attention}buio{},", + "guadagni {C:blue}+#1#{} mani e", + "{C:attention}perdi tutti gli scarti", + }, + }, + j_burnt={ + name="Jolly bruciato", + text={ + "Migliora il livello della prima", + "mano di poker {C:attention}scartata", + "in ogni round", + }, + unlock={ + "Vendi un totale", + "di {E:1,C:attention}#1#{} carte", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Biglietto da visita", + text={ + "Le {C:attention}figure{} giocate hanno", + "{C:green}#1# probabilità su #2#{} di", + "dare {C:money}$2{} quando assegnano punti", + }, + }, + j_caino={ + name="Canio", + text={ + "Questo Jolly guadagna {X:mult,C:white} X#1# {} Molt", + "ogni volta che una {C:attention}figura{}", + "viene distrutta", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Falò", + text={ + "Questo Jolly guadagna {X:mult,C:white}X#1#{} Molt", + "per ogni carta {C:attention}venduta{}, si ripristina", + "quando sconfiggi il {C:attention}buio boss{}", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + }, + j_card_sharp={ + name="Baro", + text={ + "{X:mult,C:white} X#1# {} Molt se la {C:attention}mano", + "{C:attention}di poker{} è già stata", + "giocata in questo round", + }, + }, + j_cartomancer={ + name="Cartomante", + text={ + "Crea un {C:tarot}Tarocco{}", + "quando selezioni un {C:attention}buio{}", + "{C:inactive}(Serve spazio)", + }, + unlock={ + "Scopri ogni", + "{E:1,C:tarot}Tarocco{}", + }, + }, + j_castle={ + name="Castello", + text={ + "Questo Jolly guadagna {C:chips}+#1#{} fiche", + "per ogni {V:1}#2#{} che scarti,", + "il seme è diverso in ogni round", + "{C:inactive}(Attualmente {C:chips}+#3#{C:inactive} fiche)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "{X:mult,C:white} X#1# {} Molt", + "{C:green}#2# probabilità su #3#{} che", + "questa carta venga distrutta", + "alla fine del round", + }, + }, + j_ceremonial={ + name="Pugnale cerimoniale", + text={ + "Quando selezioni un {C:attention}buio{},", + "distruggi il Jolly a destra", + "e aggiungi permanentemente il {C:attention}doppio", + "del suo valore di vendita a {C:red}Molt", + "{C:inactive}(Attualmente {C:mult}+#1#{C:inactive} Molt)", + }, + }, + j_certificate={ + name="Certificato", + text={ + "All'inizio del round,", + "aggiungi una {C:attention}carta", + "{C:attention}giocata{} casuale con un", + "{C:attention}Sigillo{} casuale alla tua mano", + }, + unlock={ + "Devi avere una carta", + "da gioco dorata con", + "un {C:attention,E:1}Sigillo d'oro", + }, + }, + j_chaos={ + name="Caos il clown", + text={ + "{C:attention}#1#{} {C:green}cambio{} gratis", + "per negozio", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Disattiva l'effetto di", + "ogni {C:attention}buio boss", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Jolly intelligente", + text={ + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_cloud_9={ + name="Nove nuvoloso", + text={ + "Guadagni {C:money}$#1#{} per ogni", + "{C:attention}9{} nel tuo {C:attention}mazzo completo", + "alla fine del round", + "{C:inactive}(Attualmente {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="Costellazione", + text={ + "Questo Jolly ottiene", + "{X:mult,C:white} X#1# {} Molt ogni volta che", + "viene giocata una carta {C:planet}Pianeta{}", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + }, + j_crafty={ + name="Jolly furbo", + text={ + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_crazy={ + name="Jolly folle", + text={ + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_credit_card={ + name="Carta di credito", + text={ + "Il debito", + "arriva a {C:red}-$#1#{}", + }, + }, + j_delayed_grat={ + name="Gratificazione ritardata", + text={ + "Guadagni {C:money}$#1#{} per {C:attention}scarto{} se", + "non ne usi nessuno", + "entro la fine del round", + }, + }, + j_devious={ + name="Jolly infido", + text={ + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_diet_cola={ + name="Senza zuccheri", + text={ + "Vendi questa carta per", + "creare 1", + "{C:attention}#1#{} gratis", + }, + }, + j_dna={ + name="DNA", + text={ + "Se la {C:attention}prima mano{} del round", + "ha solo {C:attention}1{} carta, aggiungine una", + "copia permanente al mazzo", + "e pescala in {C:attention}mano", + }, + }, + j_drivers_license={ + name="Patente di guida", + text={ + "{X:mult,C:white} X#1# {} Molt se", + "hai almeno {C:attention}16", + "carte potenziate", + "{C:inactive}(Attualmente {C:attention}#2#{C:inactive})", + }, + unlock={ + "Potenzia {E:1,C:attention}#1#{} carte", + "nel tuo mazzo", + }, + }, + j_droll={ + name="Jolly divertente", + text={ + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_drunkard={ + name="Beone", + text={ + "{C:red}+#1#{} scarto", + "in ogni round", + }, + }, + j_duo={ + name="Il duo", + text={ + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + unlock={ + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Crepuscolo", + text={ + "Riattiva tutte le carte", + "giocate nella {C:attention}mano", + "{C:attention}finale{} del round", + }, + }, + j_egg={ + name="Uovo", + text={ + "Guadagna {C:money}$#1#{} come", + "{C:attention}valore di vendita{} alla", + "fine del round", + }, + }, + j_erosion={ + name="Erosione", + text={ + "{C:red}+#1#{} Molt per ogni", + "carta sotto {C:attention}#3#{}", + "nel tuo mazzo completo", + "{C:inactive}(Attualmente {C:red}+#2#{C:inactive} Molt)", + }, + }, + j_even_steven={ + name="Numeri pari", + text={ + "Le carte giocate con", + "valore {C:attention}pari{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Jolly senza volto", + text={ + "Guadagni {C:money}$#1#{} se {C:attention}#2#{} o", + "più {C:attention}figure{}", + "sono scartate", + "allo stesso tempo", + }, + }, + j_family={ + name="La famiglia", + text={ + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + unlock={ + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "Ogni {C:attention}Asso{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} o {C:attention}8{} giocato dà", + "{C:mult}+#1#{} Molt quando assegna punti", + }, + }, + j_flash={ + name="Carta alfabeto", + text={ + "Questo Jolly ottiene {C:mult}+#1#{} Molt", + "per ogni {C:attention}cambio{} del negozio", + "{C:inactive}(Attualmente {C:mult}+#2#{C:inactive} Molt)", + }, + }, + j_flower_pot={ + name="Vaso di fiori", + text={ + "{X:mult,C:white} X#1# {} Molt se la mano", + "di poker include una carta", + "{C:diamonds}di Quadri{}, {C:clubs}di Fiori{},", + "{C:hearts}di Cuori{} e {C:spades}di Picche{}", + }, + unlock={ + "Raggiungi il liv.", + "ante {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Chiromante", + text={ + "{C:red}+#1#{} Molt per", + "{C:purple}Tarocco{} usato", + "{C:inactive}(Attualmente {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Quattro dita", + text={ + "Puoi fare {C:attention}Colori{} e", + "{C:attention}Scale{} anche", + "con {C:attention}4{} carte", + }, + }, + j_gift={ + name="Carta regalo", + text={ + "Aggiungi {C:money}$#1#{} di {C:attention}valore di vendita", + "a ogni {C:attention}Jolly{} e", + "carta {C:attention}consumabile{} alla", + "fine del round", + }, + }, + j_glass={ + name="Jolly di vetro", + text={ + "Questo Jolly ottiene {X:mult,C:white} X#1# {} Molt", + "per ogni {C:attention}carta di vetro", + "distrutta", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + unlock={ + "Devi avere almeno {E:1,C:attention}#1#", + "{E:1,C:attention}#2#{} nel", + "tuo mazzo", + }, + }, + j_gluttenous_joker={ + name="Jolly vorace", + text={ + "Le carte giocate con", + "seme {C:clubs}#2#{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti", + }, + }, + j_golden={ + name="Jolly dorato", + text={ + "Guadagni {C:money}$#1#{} a", + "fine del round", + }, + }, + j_greedy_joker={ + name="Jolly avido", + text={ + "Le carte giocate con", + "seme {C:diamonds}#2#{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti", + }, + }, + j_green_joker={ + name="Jolly verde", + text={ + "{C:mult}+#1#{} Molt per mano giocata", + "{C:mult}-#2#{} Molt per scarto", + "{C:inactive}(Attualmente {C:mult}+#3#{C:inactive} Molt)", + }, + }, + j_gros_michel={ + name="Gros Michel", + text={ + "{C:mult}+#1#{} Molt", + "{C:green}#2# probabilità su #3#{} che", + "questa carta venga distrutta", + "alla fine del round", + }, + }, + j_hack={ + name="Impostore", + text={ + "Riattiva", + "tutti i", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} o {C:attention}5{} giocati", + }, + }, + j_half={ + name="Mezzo Jolly", + text={ + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "{C:attention}#2#{} o meno carte", + }, + }, + j_hallucination={ + name="Allucinazione", + text={ + "{C:green}#1# probabilità su #2#{} di creare", + "un {C:tarot}Tarocco{} quando apri una", + "{C:attention}busta di espansione{} qualsiasi", + "{C:inactive}(Serve spazio)", + }, + }, + j_hanging_chad={ + name="Scheda non valida", + text={ + "Riattiva la {C:attention}prima{} carta", + "giocata per ottenere punti", + "{C:attention}#1#{} volte in più", + }, + unlock={ + "Batti un buio boss", + "con 1 {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Escursionista", + text={ + "Ogni {C:attention}carta{} giocata", + "guadagna permanentemente", + "{C:chips}+#1#{} fiche quando assegna punti", + }, + }, + j_hit_the_road={ + name="In viaggio", + text={ + "Questo Jolly ottiene {X:mult,C:white} X#1# {} Molt", + "per ogni {C:attention}Fante{}", + "scartato in questo round", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + unlock={ + "Scarta {E:1,C:attention}5", + "{E:1,C:attention}Fanti{} allo", + "stesso tempo", + }, + }, + j_hologram={ + name="Ologramma", + text={ + "Questo Jolly ottiene {X:mult,C:white} X#1# {} Molt", + "ogni volta che una {C:attention}carta da gioco{}", + "viene aggiunta al tuo mazzo", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + }, + j_ice_cream={ + name="Gelato", + text={ + "{C:chips}+#1#{} fiche", + "{C:chips}-#2#{} fiche per", + "ogni mano giocata", + }, + }, + j_idol={ + name="L'idolo", + text={ + "Ogni {C:attention}#2#", + "di {V:1}#3#{} che giochi dà", + "{X:mult,C:white} X#1# {} Molt quando assegna punti", + "{s:0.8}La carta è diversa in ogni round", + }, + unlock={ + "In una mano,", + "guadagna almeno", + "{E:1,C:attention}#1#{} fiche", + }, + }, + j_invisible={ + name="Jolly invisibile", + text={ + "Dopo {C:attention}#1#{} round,", + "vendi questa carta per", + "{C:attention}duplicare{} un Jolly casuale", + "{C:inactive}(Attualmente {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Vinci una sessione", + "senza avere più", + "di {E:1,C:attention}4 Jolly{}", + }, + }, + j_joker={ + name="Jolly", + text={ + "{C:red,s:1.1}+#1#{} Molt", + }, + }, + j_jolly={ + name="Jolly allegro", + text={ + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_juggler={ + name="Giocoliere", + text={ + "{C:attention}+#1#{} carte della mano", + }, + }, + j_loyalty_card={ + name="Carta fedeltà", + text={ + "{X:red,C:white} X#1# {} Molt per ogni", + "{C:attention}#2#{} mani giocate", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Vendi questa carta per", + "disattivare l'attuale", + "{C:attention}buio boss{}", + }, + }, + j_lucky_cat={ + name="Gatto della fortuna", + text={ + "Questo Jolly ottiene {X:mult,C:white} X#1# {} Molt", + "ogni volta che una carta {C:attention}fortunata{}", + "si attiva {C:green}con successo{}", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + }, + j_lusty_joker={ + name="Jolly lussurioso", + text={ + "Le carte giocate con", + "seme {C:hearts}#2#{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti", + }, + }, + j_mad={ + name="Jolly furioso", + text={ + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_madness={ + name="Follia", + text={ + "Quando selezioni un {C:attention}piccolo buio{} o un {C:attention}grande buio{}", + ", ottieni {X:mult,C:white} X#1# {} Molt", + "e {C:attention}distruggi{} un Jolly casuale", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + }, + j_mail={ + name="Offerta per posta", + text={ + "Guadagni {C:money}$#1#{} per ogni", + "{C:attention}#2#{} che scarti, il valore", + "è diverso in ogni round", + }, + }, + j_marble={ + name="Jolly di marmo", + text={ + "Aggiunge una carta di {C:attention}pietra{}", + "al mazzo quando", + "selezioni un {C:attention}buio{}", + }, + }, + j_matador={ + name="Torero", + text={ + "Guadagni {C:money}$#1#{} se la mano", + "giocata attiva", + "l'abilità del {C:attention}buio boss{}.", + }, + unlock={ + "Sconfiggi un buio boss", + "in {E:1,C:attention}1 mano{} senza", + "scartare carte", + }, + }, + j_merry_andy={ + name="Risparmio di scarti", + text={ + "{C:red}+#1#{} scarti", + "in ogni round,", + "{C:red}#2#{} carte della mano", + }, + unlock={ + "Vinci una sessione in {E:1,C:attention}#1#", + "o meno round", + }, + }, + j_midas_mask={ + name="Maschera di Mida", + text={ + "Tutte le {C:attention}figure{} giocate", + "diventano carte {C:attention}dorate{}", + "quando assegnano punti", + }, + }, + j_mime={ + name="Mimo", + text={ + "Riattiva tutte", + "le abilità delle carte", + "{C:attention}tenute in mano{}", + }, + }, + j_misprint={ + name="Errore di stampa", + text={ + "", + }, + }, + j_mr_bones={ + name="Signor Scheletro", + text={ + "Previene la morte", + "se le fiche vinte", + "sono almeno il {C:attention}25%", + "delle fiche richieste", + "{S:1.1,C:red,E:2}si autodistrugge{}", + }, + unlock={ + "Perdi {C:attention,E:1}#1#{} sessioni", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Cima mistica", + text={ + "{C:mult}+#1#{} Molt", + "con {C:attention}#2#{} scarti", + "rimasti", + }, + }, + j_obelisk={ + name="Obelisco", + text={ + "Questo Jolly ottiene {X:mult,C:white} X#1# {} Molt", + "per ogni mano {C:attention}consecutiva{} giocata", + "senza giocare la tua", + "{C:attention}mano di poker più giocata", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + }, + j_odd_todd={ + name="Numeri dispari", + text={ + "Le carte giocate con", + "valore {C:attention}dispari{} danno", + "{C:chips}+#1#{} fiche quando assegnano punti", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Agata onice", + text={ + "Le carte giocate con", + "seme {C:clubs}Fiori{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti", + }, + unlock={ + "Devi avere almeno {E:1,C:attention}#1#", + "carte di {E:1,C:attention}#2#", + "nel tuo mazzo", + }, + }, + j_oops={ + name="Ops! Tutti 6", + text={ + "Raddoppia tutte le {C:attention}probabilità", + "{C:green,E:1,S:1.1}elencate", + "{C:inactive}(es.: {C:green}1 su 3{C:inactive} -> {C:green}2 su 3{C:inactive})", + }, + unlock={ + "In una mano,", + "guadagna almeno", + "{E:1,C:attention}#1#{} fiche", + }, + }, + j_order={ + name="L'ordine", + text={ + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + unlock={ + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Pareidolia", + text={ + "Tutte le carte", + "sono considerate", + "{C:attention}figure{}", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Crea una copia {C:dark_edition}negativa{} di", + "{C:attention}1{} carta {C:attention}consumabile{}", + "casuale in tuo possesso", + "alla fine del {C:attention}negozio", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Fotografia", + text={ + "La prima {C:attention}figura", + "giocata dà {X:mult,C:white} X#1# {} Molt", + "quando assegna punti", + }, + }, + j_popcorn={ + name="Popcorn", + text={ + "{C:mult}+#1#{} Molt", + "{C:mult}-#2#{} Molt per ogni", + "round giocato", + }, + }, + j_raised_fist={ + name="Pugno alzato", + text={ + "Aggiunge il {C:attention}doppio{} del", + "valore della carta {C:attention}più bassa{}", + "in mano al Molt", + }, + }, + j_ramen={ + name="Ramen", + text={ + "{X:mult,C:white} X#1# {} Molt,", + "perde {X:mult,C:white} X#2# {} Molt", + "per ogni {C:attention}carta{} scartata", + }, + }, + j_red_card={ + name="Carta rossa", + text={ + "Questo Jolly ottiene", + "{C:red}+#1#{} Molt quando", + "salti una {C:attention}busta di espansione{}", + "{C:inactive}(Attualmente {C:red}+#2#{C:inactive} Molt)", + }, + }, + j_reserved_parking={ + name="Parcheggio riservato", + text={ + "Ogni {C:attention}figura{}", + "tenuta in mano ha", + "{C:green}#2# probabilità su #3#{}", + "di dare {C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="Giro sull'autobus", + text={ + "Questo Jolly ottiene {C:mult}+#1#{} Molt", + "per ogni mano {C:attention}consecutiva{}", + "giocata senza", + "una {C:attention}figura{} da punti", + "{C:inactive}(Attualmente {C:mult}+#2#{C:inactive} Molt)", + }, + }, + j_riff_raff={ + name="Marmaglia", + text={ + "Quando selezioni un {C:attention}buio{},", + "crea {C:attention}#1# Jolly {C:blue}comuni", + "{C:inactive}(Serve spazio)", + }, + }, + j_ring_master={ + name="Direttore di circo", + text={ + "{C:attention}Jolly{}, {C:tarot}Tarocchi{}, carte {C:planet}Pianeta{}", + "e {C:spectral}Spettrali{} possono", + "apparire più volte", + }, + unlock={ + "Raggiungi il liv.", + "ante {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Razzo", + text={ + "Guadagni {C:money}$#1#{} alla fine del round", + "I pagamenti aumentano di {C:money}$#2#{}", + "quando viene sconfitto il {C:attention}buio boss{}", + }, + }, + j_rough_gem={ + name="Pietra grezza", + text={ + "Le carte giocate con", + "seme {C:diamonds}Quadri{} guadagnano", + "{C:money}$#1#{} quando assegnano punti", + }, + unlock={ + "Devi avere almeno {E:1,C:attention}#1#", + "carte di {E:1,C:attention}#2#", + "nel tuo mazzo", + }, + }, + j_runner={ + name="Corridore", + text={ + "Guadagna {C:chips}+#2#{} fiche", + "se la mano giocata", + "include una {C:attention}Scala{}", + "{C:inactive}(Attualmente {C:chips}+#1#{C:inactive} fiche)", + }, + }, + j_satellite={ + name="Satellite", + text={ + "Guadagni {C:money}$#1#{} alla fine del", + "round per ogni carta {C:planet}Pianeta{} unica", + "usata in questa sessione", + "{C:inactive}(Attualmente {C:money}$#2#{C:inactive})", + }, + unlock={ + "Devi avere {E:1,C:money}$#1#", + "o più", + }, + }, + j_scary_face={ + name="Volto pauroso", + text={ + "Le {C:attention}figure{} giocate", + "danno {C:chips}+#1#{} fiche", + "quando assegnano punti", + }, + }, + j_scholar={ + name="Studioso", + text={ + "Gli {C:attention}Assi{} giocati", + "danno {C:chips}+#2#{} fiche", + "e {C:mult}+#1#{} Molt", + "quando assegnano punti", + }, + }, + j_seance={ + name="Seduta spiritica", + text={ + "Se una {C:attention}mano di poker{} è 1", + "{C:attention}#1#{}, crea una", + "carta {C:spectral}Spettrale{} casuale", + "{C:inactive}(Serve spazio)", + }, + }, + j_seeing_double={ + name="Visione doppia", + text={ + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata ha una carta di", + "{C:clubs}Picche{} da punti e una carta", + "di qualsiasi altro {C:attention}seme{} da punti", + }, + unlock={ + "Gioca una mano", + "che include", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Seltz", + text={ + "Riattiva tutte", + "le carte giocate", + "per le prossime {C:attention}#1#{} mani", + }, + }, + j_shoot_the_moon={ + name="Cappotto", + text={ + "Ogni {C:attention}Regina{}", + "in mano", + "dà {C:mult}+#1#{} Molt", + }, + unlock={ + "Gioca ogni {E:1,C:attention}Cuore", + "nel tuo mazzo in", + "un singolo round", + }, + }, + j_shortcut={ + name="Scorciatoia", + text={ + "Consente di fare {C:attention}Scale{} anche", + "con salti di {C:attention}1 valore", + "{C:inactive}(ad es.: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Sesto senso", + text={ + "Se la {C:attention}prima mano{} del round è", + "un singolo {C:attention}6{}, distruggilo e", + "crea una carta {C:spectral}Spettrale{}", + "{C:inactive}(Serve spazio)", + }, + }, + j_sly={ + name="Jolly subdolo", + text={ + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_smeared={ + name="Jolly sbavato", + text={ + "{C:hearts}Cuori{} e {C:diamonds}Quadri", + "contano come lo stesso seme,", + "{C:spades}Picche{} e {C:clubs}Fiori", + "contano come lo stesso seme", + }, + unlock={ + "Devi avere almeno {C:attention}#1#", + "{E:1,C:attention}#2#{} nel", + "tuo mazzo", + }, + }, + j_smiley={ + name="Volto sorridente", + text={ + "Le {C:attention}figure{} giocate", + "danno {C:mult}+#1#{} Molt", + "quando assegnano punti", + }, + }, + j_sock_and_buskin={ + name="Maschere tragicomiche", + text={ + "Riattiva tutte", + "le {C:attention}figure{} giocate", + }, + unlock={ + "Gioca un totale di", + "{C:attention,E:1}#1#{} figure", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Jolly spaziale", + text={ + "{C:green}#1# probabilità su #2#{} di", + "migliorare il livello della", + "{C:attention}mano di poker{} giocata", + }, + }, + j_splash={ + name="Schizzo", + text={ + "Ogni {C:attention}carta giocata", + "assegna punti", + }, + }, + j_square={ + name="Jolly squadrato", + text={ + "Questo Jolly ottiene {C:chips}+#2#{} fiche", + "se la mano giocata", + "ha esattamente {C:attention}4{} carte", + "{C:inactive}(Attualmente {C:chips}#1#{C:inactive} fiche)", + }, + }, + j_steel_joker={ + name="Jolly d'acciaio", + text={ + "Dà {X:mult,C:white} X#1# {} Molt", + "per ogni {C:attention}carta d'acciaio", + "nel tuo {C:attention}mazzo completo", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + }, + j_stencil={ + name="Forma di Jolly", + text={ + "{X:red,C:white} X1 {} Molt per ogni", + "slot {C:attention}Jolly{} vuoto", + "{s:0.8}Forma di Jolly inclusa", + "{C:inactive}(Attualmente {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Jolly di pietra", + text={ + "Dà {C:chips}+#1#{} fiche per", + "ogni {C:attention}carta di pietra", + "nel tuo {C:attention}mazzo completo", + "{C:inactive}(Attualmente {C:chips}+#2#{C:inactive} fiche)", + }, + }, + j_stuntman={ + name="Stuntman", + text={ + "{C:chips}+#1#{} fiche,", + "{C:attention}-#2#{} carte della mano", + }, + unlock={ + "In una mano,", + "guadagna almeno", + "{E:1,C:attention}#1#{} fiche", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Aggiunge il numero di volte che", + "è stata giocata una {C:attention}mano di poker{}", + "in questa sessione al Molt", + }, + }, + j_superposition={ + name="Sovrapposizione", + text={ + "Crea un {C:tarot}Tarocco{} se", + "la mano di poker include un", + "{C:attention}Asso{} e una {C:attention}Scala{}", + "{C:inactive}(Serve spazio)", + }, + }, + j_swashbuckler={ + name="Moschettiere", + text={ + "Aggiunge il valore di", + "vendita di tutti gli altri", + "{C:attention}Jolly{} posseduti al Molt", + "{C:inactive}(Attualmente {C:mult}+#1#{C:inactive} Molt)", + }, + unlock={ + "Vendi un totale di", + "{C:attention,E:1}#1#{} Jolly", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Tuffo nel passato", + text={ + "{X:mult,C:white} X#1# {} Molt per ogni", + "{C:attention}buio{} saltato in questa sessione", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + unlock={ + "Continua una sessione salvata", + "dal menu principale", + }, + }, + j_ticket={ + name="Biglietto dorato", + text={ + "Le carte {C:attention}dorate{} giocate", + "guadagnano {C:money}$#1#{} quando assegnano punti", + }, + unlock={ + "Gioca una mano da 5 carte", + "che include solo", + "carte {C:attention,E:1}dorate{}", + }, + }, + j_to_the_moon={ + name="Crescita notevole", + text={ + "Guadagni {C:money}$#1#{} in più di", + "{C:attention}interessi{} per ogni {C:money}$5{} che", + "hai alla fine del round", + }, + }, + j_todo_list={ + name="Lista del da farsi", + text={ + "Guadagni {C:money}$#1#{} se la {C:attention}mano di poker{}", + "è una {C:attention}#2#{},", + "la mano di poker cambia", + "alla fine del round", + }, + }, + j_trading={ + name="Carta collezionabile", + text={ + "Se il {C:attention}primo scarto{} del round", + "ha solo {C:attention}1{} carta, distruggila", + "e guadagna {C:money}$#1#", + }, + }, + j_tribe={ + name="La tribù", + text={ + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + unlock={ + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "Ogni {C:attention}Re{} e", + "{C:attention}Regina{} che giochi dà", + "{X:mult,C:white} X#1# {} Molt quando assegna punti,", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="Il trio", + text={ + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + unlock={ + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Trovatore", + text={ + "{C:attention}+#1#{} carte della mano,", + "{C:blue}-#2#{} mani in ogni round", + }, + unlock={ + "Vinci {C:attention,E:1}#1#{} round", + "consecutivi giocando", + "solo 1 mano", + }, + }, + j_trousers={ + name="Ricambio", + text={ + "Questo Jolly ottiene {C:mult}+#1#{} Molt", + "se la mano giocata include", + "una carta {C:attention}#2#", + "{C:inactive}(Attualmente {C:red}+#3#{C:inactive} Molt)", + }, + }, + j_turtle_bean={ + name="Fagiolo nero", + text={ + "{C:attention}+#1#{} carte della mano,", + "si riducono di", + "{C:red}#2#{} in ogni round", + }, + }, + j_vagabond={ + name="Vagabondo", + text={ + "Crea un {C:purple}Tarocco{}", + "se giochi la mano", + "con {C:money}$#1#{} o meno", + }, + }, + j_vampire={ + name="Vampiro", + text={ + "Questo Jolly ottiene {X:mult,C:white} X#1# {} Molt", + "per ogni {C:attention}carta potenziata{} da punti giocata", + "e rimuove il {C:attention}potenziamento", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)", + }, + }, + j_walkie_talkie={ + name="Walkie-talkie", + text={ + "Ogni {C:attention}10{} o {C:attention}4{} giocati", + "danno {C:chips}+#1#{} fiche e", + "{C:mult}+#2#{} Molt quando assegnano punti", + }, + }, + j_wee={ + name="Jolly piccolo", + text={ + "Questo Jolly guadagna", + "{C:chips}+#2#{} fiche quando ogni", + "{C:attention}2{} giocato assegna punti", + "{C:inactive}(Attualmente {C:chips}+#1#{C:inactive} fiche)", + }, + unlock={ + "Vinci una sessione in {E:1,C:attention}#1#", + "o meno round", + }, + }, + j_wily={ + name="Jolly astuto", + text={ + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Jolly iroso", + text={ + "Le carte giocate con", + "seme {C:spades}#2#{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti", + }, + }, + j_yorick={ + name="Yorick", + text={ + "Questo Jolly ottiene", + "{X:mult,C:white} X#1# {} Molt per ogni carta {C:attention}#2#{C:inactive} [#3#]{}", + "scartata", + "{C:inactive}(Attualmente {X:mult,C:white} X#4# {C:inactive} Molt)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Jolly buffo", + text={ + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Adesivo nero", + text={ + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata nera{}", + }, + }, + blue_seal={ + name="Sigillo blu", + text={ + "Crea la carta {C:planet}Pianeta{}", + "per l'ultima {C:attention}mano di poker{} giocata", + "nel round se {C:attention}tenuta{} in mano", + "{C:inactive}(Serve spazio)", + }, + }, + blue_sticker={ + name="Adesivo blu", + text={ + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata blu{}", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} fiche", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} fiche in più", + }, + }, + challenge_locked={ + name="Bloccato", + text={ + "Vinci una sessione con almeno", + "#1# mazzi diversi per sbloccare", + "Modalità sfida", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Penalizzata", + text={ + "Tutte le abilità", + "sono disattivate", + }, + }, + debuffed_playing_card={ + name="Penalizzata", + text={ + "Non assegna fiche", + "e tutte le abilità", + "sono disattivate", + }, + }, + deck_locked_discover={ + name="Bloccato", + text={ + "Scopri almeno", + "{C:attention}#1#{} oggetti della", + "tua collezione", + }, + }, + deck_locked_stake={ + name="Bloccato", + text={ + "Vinci una sessione con", + "qualsiasi mazzo almeno", + "in difficoltà {V:1}#1#{}", + }, + }, + deck_locked_win={ + name="Bloccato", + text={ + "Vinci una sessione con", + "{C:attention}#1#{}", + "in qualsiasi difficoltà", + }, + }, + demo_locked={ + name="Bloccato", + text={ + "Non disponibile", + "in questa demo", + }, + }, + demo_shop_locked={ + name="Bloccata", + text={ + "Carta della collezione", + "personale di {C:attention}Jimbo{},", + "disponibile nella versione", + "completa di {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Eterna", + text={ + "Invendibile", + "o indistruttibile", + }, + }, + gold_seal={ + name="Sigillo d'oro", + text={ + "Guadagni {C:money}$3{} quando questa", + "carta è giocata", + "e assegna punti", + }, + }, + gold_sticker={ + name="Adesivo dorato", + text={ + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata dorata{}", + }, + }, + green_sticker={ + name="Adesivo verde", + text={ + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata rossa{}", + }, + }, + joker_locked_legendary={ + name="Bloccato", + text={ + "Trova questo Jolly", + "con la carta {C:spectral}Anima{}", + }, + }, + locked={ + name="Bloccata", + text={ + }, + }, + orange_sticker={ + name="Adesivo arancione", + text={ + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata arancione{}", + }, + }, + p_arcana_jumbo={ + name="Busta arcana jumbo", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:tarot} Tarocchi{} da", + "usare immediatamente", + }, + }, + p_arcana_mega={ + name="Busta arcana mega", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:tarot} Tarocchi{} da", + "usare immediatamente", + }, + }, + p_arcana_normal={ + name="Busta arcana", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:tarot} Tarocchi{} da", + "usare immediatamente", + }, + }, + p_buffoon_jumbo={ + name="Busta buffone jumbo", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:joker} Jolly{}", + }, + }, + p_buffoon_mega={ + name="Busta buffone mega", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:joker} Jolly{}", + }, + }, + p_buffoon_normal={ + name="Busta buffone", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:joker} Jolly{}", + }, + }, + p_celestial_jumbo={ + name="Busta celestiale jumbo", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:planet}Pianeta{} da", + "usare immediatamente", + }, + }, + p_celestial_mega={ + name="Busta celestiale mega", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:planet}Pianeta{} da", + "usare immediatamente", + }, + }, + p_celestial_normal={ + name="Busta celestiale", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:planet}Pianeta{} da", + "usare immediatamente", + }, + }, + p_spectral_jumbo={ + name="Busta spettrale jumbo", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:spectral}Spettrali{} da", + "usare immediatamente", + }, + }, + p_spectral_mega={ + name="Busta spettrale mega", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:spectral}Spettrali{} da", + "usare immediatamente", + }, + }, + p_spectral_normal={ + name="Busta spettrale", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:spectral}Spettrali{} da", + "usare immediatamente", + }, + }, + p_standard_jumbo={ + name="Busta standard jumbo", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte da {C:attention}gioco{} da", + "aggiungere al tuo mazzo", + }, + }, + p_standard_mega={ + name="Busta standard mega", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte da {C:attention}gioco{} da", + "aggiungere al tuo mazzo", + }, + }, + p_standard_normal={ + name="Busta standard", + text={ + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte da {C:attention}gioco{} da", + "aggiungere al tuo mazzo", + }, + }, + perishable={ + name="Deperibile", + text={ + "Carta penalizzata dopo", + "{C:attention}#1#{} round", + "{C:inactive}({C:attention}#2#{C:inactive} rimanenti)", + }, + }, + pinned_left={ + name="Fissato", + text={ + "Questo Jolly", + "è fissato nella", + "posizione più a sinistra", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# di {V:1}#2# ", + }, + }, + purple_seal={ + name="Sigillo viola", + text={ + "Crea un {C:tarot}Tarocco{}", + "quando è {C:attention}scartata", + "{C:inactive}(Serve spazio)", + }, + }, + purple_sticker={ + name="Adesivo viola", + text={ + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata viola{}", + }, + }, + red_seal={ + name="Sigillo rosso", + text={ + "Riattiva questa", + "carta {C:attention}1{} volta", + }, + }, + red_sticker={ + name="Adesivo rosso", + text={ + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata rossa{}", + }, + }, + remove_negative={ + name="Negativo", + text={ + "{C:inactive,s:0.9}(Rimuove {C:dark_edition,s:0.9}Negativo{C:inactive,s:0.9} dalla copia)", + }, + }, + rental={ + name="A noleggio", + text={ + "Perdi {C:money}$#1#{} alla", + "fine del round", + }, + }, + undiscovered_booster={ + name="Non scoperta", + text={ + "Apri questa busta in una", + "sessione con seed casuale", + "per scoprire cosa fa", + }, + }, + undiscovered_edition={ + name="Non scoperta", + text={ + "Trova questa edizione in una", + "sessione con seed casuale", + "per scoprire cosa fa", + }, + }, + undiscovered_joker={ + name="Non scoperto", + text={ + "Compra o usa", + "questa carta in una", + "sessione con seed casuale", + "per scoprire cosa fa", + }, + }, + undiscovered_planet={ + name="Non scoperto", + text={ + "Compra o usa", + "questa carta in una", + "sessione con seed casuale", + "per scoprire cosa fa", + }, + }, + undiscovered_spectral={ + name="Non scoperto", + text={ + "Compra o usa", + "questa carta in una", + "sessione con seed casuale", + "per scoprire cosa fa", + }, + }, + undiscovered_tag={ + name="Non scoperto", + text={ + "Usa questo patto in una", + "sessione con seed casuale", + "per scoprire cosa fa", + }, + }, + undiscovered_tarot={ + name="Non scoperto", + text={ + "Compra o usa", + "questa carta in una", + "sessione con seed casuale", + "per scoprire cosa fa", + }, + }, + undiscovered_voucher={ + name="Non scoperto", + text={ + "Riscatta questo", + "buono in una", + "sessione con seed casuale", + "per scoprire cosa fa", + }, + }, + white_sticker={ + name="Adesivo bianco", + text={ + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata bianca{}", + }, + }, + wip_locked={ + name="Bloccato", + text={ + "Sviluppo", + "in corso", + }, + }, + }, + Planet={ + c_ceres={ + name="Cerere", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_earth={ + name="Terra", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_jupiter={ + name="Giove", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_mars={ + name="Marte", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_mercury={ + name="Mercurio", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_neptune={ + name="Nettuno", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_planet_x={ + name="Pianeta X", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_pluto={ + name="Plutone", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_saturn={ + name="Saturno", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_uranus={ + name="Urano", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + c_venus={ + name="Venere", + text={ + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche", + }, + }, + }, + Spectral={ + c_ankh={ + name="Ankh", + text={ + "Crea una copia di un", + "{C:attention}Jolly{} casuale, distruggi", + "tutti gli altri Jolly", + }, + }, + c_aura={ + name="Aura", + text={ + "Applica un effetto {C:dark_edition}foil{},", + "{C:dark_edition}olografico{} o {C:dark_edition}policromo{} a", + "{C:attention}1{} carta selezionata in mano", + }, + }, + c_black_hole={ + name="Buco nero", + text={ + "Migliora ogni", + "{C:legendary,E:1}mano di poker", + "di {C:attention}1{} livello", + }, + }, + c_cryptid={ + name="Criptide", + text={ + "Crea {C:attention}#1#{} copie di", + "{C:attention}1{} carta selezionata", + "nella tua mano", + }, + }, + c_deja_vu={ + name="Déjà vu", + text={ + "Aggiungi un {C:red}Sigillo rosso{}", + "a {C:attention}1{} carta", + "selezionata nella tua mano", + }, + }, + c_ectoplasm={ + name="Ectoplasma", + text={ + "Applica {C:dark_edition}negativo{} a", + "un {C:attention}Jolly casuale", + "{C:red}-1{} carta della mano", + }, + }, + c_familiar={ + name="Famiglio", + text={ + "Distruggi {C:attention}1{} carta", + "casuale nella tua mano, aggiungi", + "{C:attention}#1# figure potenziate{}", + "casuali alla tua mano", + }, + }, + c_grim={ + name="Tenebre", + text={ + "Distruggi {C:attention}1{} carta", + "casuale nella tua mano,", + "aggiungi {C:attention}#1# Assi potenziati{}", + "casuali alla tua mano", + }, + }, + c_hex={ + name="Maledizione", + text={ + "Aggiungi {C:dark_edition}policromo{} a un", + "{C:attention}Jolly{} casuale, distruggi", + "tutti gli altri Jolly", + }, + }, + c_immolate={ + name="Immolazione", + text={ + "Distrugge {C:attention}#1#{} carte", + "casuali in mano,", + "guadagni {C:money}$#2#", + }, + }, + c_incantation={ + name="Incantesimo", + text={ + "Distruggi {C:attention}1{} carta", + "casuale nella tua mano, aggiungi {C:attention}#1#", + "{C:attention}carte numerate potenziate", + "casuali alla tua mano", + }, + }, + c_medium={ + name="Medium", + text={ + "Aggiungi un {C:purple}Sigillo viola{}", + "a {C:attention}1{} carta", + "selezionata nella tua mano", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Converte tutte le carte", + "in mano in un singolo", + "{C:attention}valore casuale", + "{C:red}-1{} carta della mano", + }, + }, + c_sigil={ + name="Sigillo", + text={ + "Converte tutte le carte", + "in mano in un singolo", + "{C:attention}seme casuale", + }, + }, + c_soul={ + name="Anima", + text={ + "Crea un", + "Jolly {C:legendary,E:1}leggendario{}", + "{C:inactive}(Serve spazio)", + }, + }, + c_talisman={ + name="Talismano", + text={ + "Applica un {C:attention}Sigillo d'oro{}", + "a {C:attention}1{} carta", + "selezionata nella tua mano", + }, + }, + c_trance={ + name="Trance", + text={ + "Aggiungi un {C:blue}Sigillo blu{}", + "a {C:attention}1{} carta", + "selezionata nella tua mano", + }, + }, + c_wraith={ + name="Fantasma", + text={ + "Crea un", + "{C:attention}Jolly {C:red}raro{} casuale,", + "porta i soldi a {C:money}$0", + }, + }, + }, + Stake={ + stake_black={ + name="Puntata nera", + text={ + "Il negozio può avere Jolly {C:attention}eterni{}", + "{C:inactive,s:0.8}{Invendibili o indistruttibili}", + "{s:0.8}Applica tutte le puntate precedenti", + }, + }, + stake_blue={ + name="Puntata blu", + text={ + "{C:red}-1{} scarto", + "{s:0.8}Applica tutte le puntate precedenti", + }, + }, + stake_gold={ + name="Puntata dorata", + text={ + "Il negozio può avere dei Jolly {C:attention}a noleggio{}", + "{C:inactive,s:0.8}(Costano {C:money,s:0.8}$3{C:inactive,s:0.8} per round)", + "{s:0.8}Si applica a tutte le puntate precedenti", + }, + }, + stake_green={ + name="Puntata verde", + text={ + "Maggior incremento dei punti", + "richiesti per ciascun {C:attention}ante", + "{s:0.8}Applica tutte le puntate precedenti", + }, + }, + stake_orange={ + name="Puntata arancione", + text={ + "Il negozio può avere dei Jolly {C:attention}deperibili{}", + "{C:inactive,s:0.8}(Penalizzati dopo 5 round)", + "{s:0.8}Si applica a tutte le puntate precedenti", + }, + }, + stake_purple={ + name="Puntata viola", + text={ + "Maggior incremento dei punti", + "richiesti per ciascun {C:attention}ante", + "{s:0.8}Applica tutte le puntate precedenti", + }, + }, + stake_red={ + name="Puntata rossa", + text={ + "Il {C:attention}piccolo buio{} non dà", + "soldi come ricompensa", + "{s:0.8}Applica tutte le puntate precedenti", + }, + }, + stake_white={ + name="Puntata bianca", + text={ + "Difficoltà base", + }, + }, + }, + Tag={ + tag_boss={ + name="Patto boss", + text={ + "Cambia il", + "{C:attention}buio boss", + }, + }, + tag_buffoon={ + name="Patto buffone", + text={ + "Dà gratuitamente una", + "{C:attention}busta buffone", + }, + }, + tag_charm={ + name="Patto magico", + text={ + "Dà gratuitamente una", + "{C:tarot}busta arcana mega", + }, + }, + tag_coupon={ + name="Patto coupon", + text={ + "Le carte e buste di", + "espansione iniziali nel prossimo", + "negozio sono gratis", + }, + }, + tag_d_six={ + name="Patto fortunato", + text={ + "Il prezzo iniziale dei cambi", + "nel prossimo negozio è {C:money}$0", + }, + }, + tag_double={ + name="Patto doppio", + text={ + "Assegna una copia del", + "prossimo {C:attention}patto{} scelto", + "{s:0.8}Escluso il {s:0.8,C:attention}patto doppio", + }, + }, + tag_economy={ + name="Patto economia", + text={ + "Raddoppia i tuoi soldi", + "{C:inactive}(Massimo {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="Patto etereo", + text={ + "Dà gratuitamente una", + "{C:planet}busta spettrale", + }, + }, + tag_foil={ + name="Patto foil", + text={ + "Il prossimo Jolly del negozio", + "dell'edizione base è gratuito e", + "diventa {C:dark_edition}foil", + }, + }, + tag_garbage={ + name="Patto spazzatura", + text={ + "Dà {C:money}$#1#{} per", + "{C:red}scarto{} non usato in questa sessione", + "{C:inactive}(Darà {C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="/descriptions/Tag/tag_d_six/text/_array_2", + text={ + "Dà {C:money}$#1#{} per", + "{C:blue}mano{} giocata in questa sessione", + "{C:inactive}(Darà {C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="Patto olografico", + text={ + "Il prossimo Jolly del negozio", + "dell'edizione base è gratuito e", + "diventa {C:dark_edition}olografico", + }, + }, + tag_investment={ + name="Patto investimento", + text={ + "Dopo aver sconfitto", + "il buio boss,", + "guadagni {C:money}$#1#", + }, + }, + tag_juggle={ + name="Patto giocoliere", + text={ + "{C:attention}+#1#{} carte della mano", + "nel prossimo round", + }, + }, + tag_meteor={ + name="Patto meteora", + text={ + "Dà gratuitamente una", + "{C:planet}busta celestiale mega", + }, + }, + tag_negative={ + name="Patto negativo", + text={ + "Il prossimo Jolly del negozio", + "dell'edizione base è gratuito e", + "diventa {C:dark_edition}negativo", + }, + }, + tag_orbital={ + name="Patto orbitale", + text={ + "Migliora {C:attention}#1#", + "di {C:attention}#2# livelli", + }, + }, + tag_polychrome={ + name="Patto policromo", + text={ + "Il prossimo Jolly del negozio", + "dell'edizione base è gratuito e", + "diventa {C:dark_edition}policromo", + }, + }, + tag_rare={ + name="Patto raro", + text={ + "Il negozio ha un", + "{C:red}Jolly raro", + }, + }, + tag_skip={ + name="Patto veloce", + text={ + "Dà {C:money}$#1#{} per ogni buio", + "saltato in questa sessione", + "{C:inactive}(Assegnerà {C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="Patto standard", + text={ + "Dà gratuitamente una", + "{C:attention}busta standard mega", + }, + }, + tag_top_up={ + name="Patto ricarica", + text={ + "Crea fino a {C:attention}#1#", + "Jolly {C:blue}comuni{}", + "{C:inactive}(Serve spazio)", + }, + }, + tag_uncommon={ + name="Patto non comune", + text={ + "Il negozio ha un", + "{C:green}Jolly non comune", + }, + }, + tag_voucher={ + name="Patto Buoni", + text={ + "Aggiunge un {C:voucher}Buono", + "al prossimo negozio", + }, + }, + }, + Tarot={ + c_chariot={ + name="Il carro", + text={ + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#", + }, + }, + c_death={ + name="La morte", + text={ + "Seleziona {C:attention}#1#{} carte,", + "converti la carta a {C:attention}sinistra{}", + "nella carta a {C:attention}destra{}", + "{C:inactive}(Trascina per riordinare)", + }, + }, + c_devil={ + name="Il diavolo", + text={ + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="L'imperatore", + text={ + "Crea fino a {C:attention}#1#", + "{C:tarot}Tarocchi{} casuali", + "{C:inactive}(Serve spazio)", + }, + }, + c_empress={ + name="L'imperatrice", + text={ + "Potenzia {C:attention}#1#", + "carte selezionate a", + "{C:attention}#2#", + }, + }, + c_fool={ + name="Il matto", + text={ + "Crea l'ultima", + "carta {C:planet}Pianeta{} o {C:tarot}Tarocco{}", + "che hai usato in questa sessione", + "Escluso {s:0.8,C:tarot}Il matto{s:0.8}", + }, + }, + c_hanged_man={ + name="L'appeso", + text={ + "Distrugge fino a", + "{C:attention}#1#{} carte selezionate", + }, + }, + c_heirophant={ + name="Il papa", + text={ + "Potenzia {C:attention}#1#", + "carte selezionate a", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="L'eremita", + text={ + "Raddoppia i soldi", + "{C:inactive}(Massimo {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="La papessa", + text={ + "Crea fino a {C:attention}#1#", + "carte {C:planet}Pianeta{} casuali", + "{C:inactive}(Serve spazio)", + }, + }, + c_judgement={ + name="Il giudizio", + text={ + "Crea un", + "{C:attention}Jolly{} casuale", + "{C:inactive}(Serve spazio)", + }, + }, + c_justice={ + name="La giustizia", + text={ + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="Gli amanti", + text={ + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#", + }, + }, + c_magician={ + name="Il bagatto", + text={ + "Potenzia {C:attention}#1#{}", + "carte selezionate a", + "{C:attention}#2#", + }, + }, + c_moon={ + name="La luna", + text={ + "Converte fino a", + "{C:attention}#1#{} carte selezionate", + "in {V:1}#2#{}", + }, + }, + c_star={ + name="La stella", + text={ + "Converte fino a", + "{C:attention}#1#{} carte selezionate", + "in {V:1}#2#{}", + }, + }, + c_strength={ + name="La forza", + text={ + "Aumenta il valore di", + "un massimo di {C:attention}#1#{} carte", + "selezionate di {C:attention}1", + }, + }, + c_sun={ + name="Il sole", + text={ + "Converte fino a", + "{C:attention}#1#{} carte selezionate", + "in {V:1}#2#{}", + }, + }, + c_temperance={ + name="La temperanza", + text={ + "Assegna il valore di vendita", + "totale di tutti i Jolly", + "attuali {C:inactive}(Massimo {C:money}$#1#{C:inactive})", + "{C:inactive}(Attualmente {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="La torre", + text={ + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="La ruota della fortuna", + text={ + "{C:green}#1# probabilità su #2#{} di applicare", + "un'edizione {C:dark_edition}foil{}, {C:dark_edition}olografica{} o", + "{C:dark_edition}policroma{}", + "a un {C:attention}Jolly{} casuale", + }, + }, + c_world={ + name="Il mondo", + text={ + "Converte fino a", + "{C:attention}#1#{} carte selezionate", + "in {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimateria", + text={ + "{C:dark_edition}+1{} slot Jolly", + }, + unlock={ + "Riscatta {C:voucher}Vuoto{}", + "{C:attention}#1#{} volte in totale", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="Vuoto", + text={ + "{C:inactive}Non fa nulla?", + }, + }, + v_clearance_sale={ + name="Svendita", + text={ + "Tutte le carte e le buste nel", + "negozio sono scontate del {C:attention}#1#%{}", + }, + }, + v_crystal_ball={ + name="Sfera di cristallo", + text={ + "{C:attention}+1{} slot consumabili", + }, + }, + v_directors_cut={ + name="Versione del regista", + text={ + "Puoi cambiare il buio boss", + "{C:attention}1{} volta per ante,", + "{C:money}$#1#{} per cambio", + }, + }, + v_glow_up={ + name="Perfezionamento", + text={ + "Le carte {C:dark_edition}foil{}, {C:dark_edition}olografiche{} e", + "{C:dark_edition}policrome{} appaiono", + "{C:attention}#1#X{} più spesso", + }, + unlock={ + "Devi avere almeno {C:attention}#1#", + "{C:attention}Jolly{} di", + "edizione {C:dark_edition}foil{}, {C:dark_edition}olografica{} o", + "{C:dark_edition}policroma{}", + }, + }, + v_grabber={ + name="Manesco", + text={ + "Guadagni", + "permanentemente {C:blue}+#1#{} mano", + "per round", + }, + }, + v_hieroglyph={ + name="Geroglifico", + text={ + "{C:attention}-#1#{} ante,", + "{C:blue}-#1#{} mano", + "in ogni round", + }, + }, + v_hone={ + name="Affinatura", + text={ + "Le carte {C:dark_edition}foil{}, {C:dark_edition}olografiche{} e", + "{C:dark_edition}policrome{} appaiono", + "{C:attention}#1#X{} più spesso", + }, + }, + v_illusion={ + name="Illusione", + text={ + "Le {C:attention}carte da gioco{} nel negozio", + "possono avere un {C:enhanced}potenziamento{},", + "un'{C:dark_edition}edizione{} e/o un {C:attention}Sigillo{}", + }, + unlock={ + "Compra un totale di", + "{C:attention}#1#{} carte da gioco", + "dal negozio", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Liquidazione", + text={ + "Tutte le carte e le buste nel", + "negozio sono scontate del {C:attention}#1#%{}", + }, + unlock={ + "Riscatta almeno", + "{C:attention}#1#{C:voucher} Buoni{}", + "in una sessione", + }, + }, + v_magic_trick={ + name="Trucco di magia", + text={ + "Le {C:attention}carte da gioco{} possono", + "essere acquistate", + "dal {C:attention}negozio", + }, + }, + v_money_tree={ + name="Albero di soldi", + text={ + "Aumenta il limite sugli", + "interessi guadagnati in", + "ogni round a {C:money}$#1#{}", + }, + unlock={ + "Massimizzi gli interessi", + "guadagnati per round per", + "{C:attention}#1#{} round consecutivi", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Mano sui nachos", + text={ + "Guadagni", + "permanentemente {C:blue}+#1#{} mano", + "per round", + }, + unlock={ + "Gioca un totale", + "di {C:attention}#1#{} carte", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Osservatorio", + text={ + "Le carte {C:planet}Pianeta{} nella tua", + "area dei {C:attention}consumabili{} danno", + "{X:red,C:white} X#1# {} Molt per la loro", + "specifica {C:attention}mano di poker", + }, + unlock={ + "Usa un totale di {C:attention}#1#", + "carte {C:planet}Pianeta{} di qualsiasi", + "{C:planet}busta celestiale", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Sfera presagente", + text={ + "Le carte {C:spectral}Spettrali{} possono", + "apparire in qualsiasi", + "{C:attention}busta arcana", + }, + unlock={ + "Usa un totale di {C:attention}#1#", + "{C:tarot}Tarocchi{} di qualsiasi", + "{C:tarot}busta arcana", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Più merce", + text={ + "{C:attention}+1{} slot carte", + "disponibile nel negozio", + }, + }, + v_overstock_plus={ + name="Troppa merce", + text={ + "{C:attention}+1{} slot carte", + "disponibile nel negozio", + }, + unlock={ + "Spendi un totale di", + "{C:money}$#1#{} al negozio", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="Pennello", + text={ + "{C:attention}+#1#{} carte della mano", + }, + }, + v_palette={ + name="Tavolozza", + text={ + "{C:attention}+#1#{} carte della mano", + }, + unlock={ + "Riduci le carte della mano", + "a {C:attention}#1#{} carte", + }, + }, + v_petroglyph={ + name="Petroglifo", + text={ + "{C:attention}-#1#{} ante,", + "{C:red}-#1#{} scarto", + "in ogni round", + }, + unlock={ + "Raggiungi il liv.", + "ante {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Mercante di Pianeti", + text={ + "Le carte {C:planet}Pianeta{} appaiono", + "{C:attention}#1#X{} più frequentemente", + "nel negozio", + }, + }, + v_planet_tycoon={ + name="Magnate di Pianeti", + text={ + "Le carte {C:planet}Pianeta{} appaiono", + "{C:attention}#1#X{} più frequentemente", + "nel negozio", + }, + unlock={ + "Compra un totale di", + "{C:attention}#1#{} carte {C:planet}Pianeta{}", + "dal negozio", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Reciclomanzia", + text={ + "Guadagna", + "permanentemente {C:red}+#1#{} scarto", + "in ogni round", + }, + unlock={ + "Scarta un totale", + "di {C:attention}#1#{} carte", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Eccesso di cambi", + text={ + "I cambi costano", + "{C:money}$#1#{} in meno", + }, + unlock={ + "Cambia il negozio", + "un totale di {C:attention}#1#{} volte", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Cambi in surplus", + text={ + "I cambi costano", + "{C:money}$#1#{} in meno", + }, + }, + v_retcon={ + name="Retcon", + text={ + "Puoi cambiare il buio boss", + "un {C:attention}numero illimitato{} di volte,", + "{C:money}$#1#{} per cambio", + }, + unlock={ + "Scopri", + "{C:attention}#1#{} bui", + }, + }, + v_seed_money={ + name="Seme del successo", + text={ + "Aumenta il limite sugli", + "interessi guadagnati in", + "ogni round a {C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="Mercante di Tarocchi", + text={ + "I {C:tarot}Tarocchi{} appaiono", + "{C:attention}#1#X{} più frequentemente", + "nel negozio", + }, + }, + v_tarot_tycoon={ + name="Magnate di Tarocchi", + text={ + "I {C:tarot}Tarocchi{} appaiono", + "{C:attention}#1#X{} più frequentemente", + "nel negozio", + }, + unlock={ + "Compra un totale di", + "{C:attention}#1#{C:tarot} Tarocchi{}", + "dal negozio", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Telescopio", + text={ + "Le {C:attention}buste celestiali{} hanno", + "sempre la carta {C:planet}Pianeta{}", + "relativa alla tua", + "{C:attention}mano di poker{} più giocata", + }, + }, + v_wasteful={ + name="Spreco", + text={ + "Guadagna", + "permanentemente {C:red}+#1#{} scarto", + "in ogni round", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Ottieni 100.000.000 fiche in una singola mano", + _1000k="Ottieni 1.000.000 fiche in una singola mano", + _10k="Ottieni 10.000 fiche in una singola mano", + ante_up="Raggiungi l'ante 4", + ante_upper="Raggiungi l'ante 8", + astronomy="Scopri ogni carta Pianeta", + big_hands="Tieni almeno 80 carte nel tuo mazzo", + card_discarder="Scarta almeno 2.500 carte", + card_player="Gioca almeno 2.500 carte", + cartomancy="Scopri ogni Tarocco", + clairvoyance="Scopri ogni carta Spettrale", + completionist="Scopri il 100% della tua collezione", + completionist_plus="Vinci con ogni mazzo in difficoltà Puntata dorata", + completionist_plus_plus="Guadagna un Adesivo dorato su ogni Jolly", + extreme_couponer="Scopri ogni Buono", + flushed="Gioca un Colore con 5 carte multiuso", + heads_up="Vinci una sessione", + high_stakes="Vinci una sessione almeno in difficoltà Puntata dorata", + legendary="Scopri un Jolly leggendario", + low_stakes="Vinci una sessione almeno in difficoltà Puntata rossa", + mid_stakes="Vinci una sessione almeno in difficoltà Puntata nera", + nest_egg="Accumula almeno $400 durante una singola sessione", + retrograde="Porta una mano di poker qualsiasi al livello 10", + roi="Compra 5 Buoni prima dell'ante 4", + royale="Gioca una Scala reale massima", + rule_bender="Completa una sessione sfida qualsiasi", + rule_breaker="Completa ogni sessione sfida", + shattered="Rompi 2 carte di vetro in una singola mano", + speedrunner="Vinci una sessione in massimo 12 round", + tiny_hands="Riduci il tuo mazzo a massimo 20 carte", + you_get_what_you_get="Vinci una sessione senza cambiare il negozio", + }, + achievement_names={ + _100000k="Cento milioni", + _1000k="Un milione", + _10k="Diecimila", + ante_up="Aumento di ante!", + ante_upper="Grande aumento di ante!", + astronomy="Astronomia", + big_hands="Mani grandi", + card_discarder="Tanti scarti", + card_player="Tante giocate", + cartomancy="Cartomanzia", + clairvoyance="Chiaroveggenza", + completionist="Perfezionista", + completionist_plus="Perfezionista+", + completionist_plus_plus="Perfezionista++", + extreme_couponer="Fan dei coupon", + flushed="Colore multiuso", + heads_up="Testa a testa", + high_stakes="Puntata alta", + legendary="Leggendario", + low_stakes="Puntata bassa", + mid_stakes="Puntata media", + nest_egg="Gruzzolo", + retrograde="Retrocessione", + roi="ROI", + royale="Reale", + rule_bender="Regole aggirate", + rule_breaker="Regole infrante", + shattered="A pezzi", + speedrunner="Velocista", + tiny_hands="Mani piccole", + you_get_what_you_get="Accetta ciò che hai", + }, + blind_states={ + Current="Attuale", + Defeated="Sconfitto", + Select="Seleziona", + Selected="Selezionato", + Skipped="Saltato", + Upcoming="Imminente", + }, + challenge_names={ + c_blast_off_1="Lancio", + c_bram_poker_1="Bram Poker", + c_city_1="Città di 15 minuti", + c_cruelty_1="Crudeltà", + c_double_nothing_1="Lascia o raddoppia", + c_five_card_1="Poker tradizionale", + c_fragile_1="Fragile", + c_golden_needle_1="Ago dorato", + c_inflation_1="Inflazione", + c_jokerless_1="Senza Jolly", + c_knife_1="Sul filo del rasoio", + c_luxury_1="Tassa sul lusso", + c_mad_world_1="Mondo folle", + c_medusa_1="Medusa", + c_monolith_1="Monolite", + c_non_perishable_1="Non deperibile", + c_omelette_1="La frittata", + c_rich_1="Ricchi sempre più ricchi", + c_typecast_1="Caratterista", + c_xray_1="Visione a raggi X", + }, + collabs={ + Clubs={ + ["1"]="Predefinito", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Predefinito", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Predefinito", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Predefinito", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="FAQ", + b_and_use="E USA", + b_back="Indietro", + b_blinds="Bui", + b_booster_packs="Buste di espansione", + b_buy="COMPRA", + b_cash_out="Incassa", + b_challenges="Sfide", + b_collection="Collezione", + b_collection_cap="COLLEZIONE", + b_continue="Continua", + b_copy="Copia", + b_copy_seed="Copia seed", + b_create_profile="Crea profilo", + b_credits="Riconoscimenti", + b_current_profile="Profilo attuale", + b_customize_deck="Personalizzare il mazzo", + b_deck="Mazzo", + b_decks="Mazzi", + b_delete_profile="Elimina profilo", + b_discard="Scarta", + b_editions="Edizioni", + b_endless="Modalità infinita", + b_enhanced_cards="Carte potenziate", + b_full_deck="Mazzo pieno", + b_high_contrast_cards="Carta ad alto contrasto", + b_how_to_play="Come si gioca", + b_imagery="Immagini", + b_jokers="Jolly", + b_load_profile="Carica profilo", + b_main_menu="Menu principale", + b_music="Musica", + b_new_challenge="Inizia nuova sfida", + b_new_run="Nuova sessione", + b_next="Prossimo", + b_next_round_1="Prossimo", + b_next_round_2="Round", + b_open="APRI", + b_options="Opzioni", + b_options_cap="OPZIONI", + b_planet_cards="Carte Pianeta", + b_play_cap="GIOCA", + b_play_hand="Gioca mano", + b_playbalatro="Visita playbalatro.com", + b_poker_hands="Mani di poker", + b_quit_cap="ESCI", + b_redeem="RISCATTA", + b_reduced_motion="Movimenti ridotti", + b_remaining="Rimanenti", + b_reroll_boss="Cambia boss", + b_reset_profile="Ripristina profilo", + b_restrictions="Limitazioni", + b_retry="Riprova", + b_rules="Regole", + b_run_info_1="Sessione", + b_run_info_2="Dati", + b_seals="Sigilli", + b_seed="Seed", + b_select="SELEZIONA", + b_sell="VENDI", + b_set_CRT="Effetto CRT", + b_set_CRT_bloom="Effetto CRT luminoso", + b_set_apply="Applica", + b_set_audio="Audio", + b_set_crash_reports="Segnalazioni arresti anomali", + b_set_game="Gioco", + b_set_game_vol="Volume gioco", + b_set_gamespeed="Velocità di gioco", + b_set_graphics="Grafica", + b_set_master_vol="Volume principale", + b_set_monitor="Monitor di visualizzazione", + b_set_music_vol="Volume musica", + b_set_pixel_smoothing="Lisciamento pixel art", + b_set_play_discard_pos="Posizione pulsanti Gioca/Scarta", + b_set_rumble="Vibrazione controller", + b_set_screenshake="Vibrazione schermo", + b_set_shadows="Ombre", + b_set_vibration="Vibrazione", + b_set_video="Video", + b_set_windowmode="Modalità finestra", + b_settings="Impostazioni", + b_skip="Salta", + b_skip_blind="Salta buio", + b_skip_reward="Salta ricompensa", + b_sort_hand="Ordina mano", + b_sounds="Suoni", + b_spectral_cards="Carte Spettrali", + b_stake="Puntata", + b_start_new_run="Nuova sessione", + b_stat_consumables="Consumabili", + b_stat_jokers="Jolly", + b_stat_planets="Pianeti", + b_stat_spectrals="Spettrali", + b_stat_tarots="Tarocchi", + b_stat_vouchers="Buoni", + b_stats="Statistiche", + b_tags="Patti", + b_tarot_cards="Tarocchi", + b_unlock_all="Sblocca tutto", + b_use="USA", + b_vouchers="Buoni", + b_wishlist="Aggiungilo alla lista dei desideri su Steam", + k_aces="Assi", + k_achievement="Obiettivo", + k_achievements_disabled="Obiettivi disattivati", + k_active="attivo", + k_active_ex="Attivazione!", + k_again_ex="Di nuovo!", + k_all_hands="Tutte le mani", + k_also_applied="Si applica anche", + k_ante="Ante", + k_ante_cap="ANTE", + k_arcana_pack="Busta arcana", + k_balanced="Bilanciato", + k_banned_cards="Carte proibite", + k_banned_tags="Patti proibiti", + k_base_cap="BASE", + k_base_cards="Carte base", + k_best_hand="Mano migliore", + k_booster="Espansione", + k_buffoon_pack="Busta buffone", + k_cap_consumables="CONSUMABILI", + k_card_stats="Statistiche carte", + k_celestial_pack="Busta celestiale", + k_challenge_mode="Modalità sfida", + k_challenges="Sfide", + k_choose="Scegli", + k_collection="Collezione", + k_common="Comune", + k_compatible="compatibile", + k_copied_ex="Copia!", + k_custom_rules="Regole personalizzate", + k_daily_run="Sessione giornaliera", + k_debuffed="Penalizzato", + k_deck="Mazzo", + k_deck_stake_wins="Vittorie puntata mazzo", + k_defeated_by="Sconfitto da", + k_demo_version_ex="Versione demo!", + k_disabled_ex="Disattivato!", + k_drank_ex="Bevuta!", + k_duplicated_ex="Duplicazione!", + k_dwarf_planet="Pianeta nano", + k_eaten_ex="Consumazione!", + k_edition="Edizione", + k_effective="Efficace", + k_empty_caps="VUOTO", + k_enter_name="Inserisci nome", + k_enter_seed="Inserisci seed", + k_enter_text="Inserisci testo", + k_eroded_ex="Erosione!", + k_extinct_ex="Disattivazione!", + k_face_cards="Figure", + k_game_modifiers="Modificatori gioco", + k_gold="Dorata", + k_high_score_ex="Miglior punteggio!", + k_hud_discards="Scarti", + k_hud_hands="Mani", + k_incompatible="incompatibile", + k_joker="Jolly", + k_joker_stickers="Adesivi Jolly", + k_jokers_cap="JOLLY", + k_legendary="Leggendario", + k_level_prefix="liv.", + k_level_up_ex="Aumento di livello!", + k_locked="Bloccato", + k_lower_score="punti", + k_lvl="liv.", + k_melted_ex="Scioglimento!", + k_money="Soldi", + k_mult="Molt", + k_no_other_jokers="Nessun altro Jolly!", + k_no_reward="Nessuna ricompensa", + k_no_room_ex="Niente spazio!", + k_no_space_ex="Niente spazio!", + k_none="Nessuno", + k_nope_ex="No!", + k_not_allowed_ex="Non concessa!", + k_not_discovered="Non scoperto", + k_numbered_cards="Carte numerate", + k_or="o", + k_other="Altro", + k_page="Pagina", + k_planet="Pianeta", + k_planet_q="Pianeta?", + k_playing_as="Nome giocatore:", + k_plus_joker="+1 Jolly", + k_plus_planet="+1 Pianeta", + k_plus_spectral="+1 Spettrale", + k_plus_stone="+1 Pietre", + k_plus_tarot="+1 Tarocco", + k_poker_hand="mano di poker", + k_profile="Profilo", + k_progress="Progressi", + k_rank="Valore", + k_rare="Raro", + k_redeemed_ex="Riscatto!", + k_reroll="Cambio", + k_reset="Ripristino", + k_reward="Ricompensa", + k_round="Round", + k_safe_ex="Al sicuro!", + k_saved_ex="Salvataggio!", + k_seed="Seed", + k_seeded_run="Sessione con seed scelto", + k_skipped_cap="SALTATO", + k_spectral="Spettrale", + k_spectral_pack="Busta spettrale", + k_stake="Puntata", + k_stake_level="Livello puntata", + k_standard_pack="Busta standard", + k_suit="Seme", + k_swapped_ex="Scambio!", + k_tarot="Tarocco", + k_trophies_disabled="Trofei disattivati", + k_trophy="Trofeo", + k_uncommon="Non comune", + k_undisovered="Sconosciuto", + k_unknown="?????", + k_unlocked_ex="Sbloccato!", + k_upgrade_ex="Miglioramento!", + k_val_up="Aumento di valore!", + k_view="Vedi", + k_voucher="Buono", + k_vouchers_cap="BUONI", + k_wins="Vittorie", + k_x_base="X base", + ml_bloom_opt={ + "No", + "Sì", + }, + ml_buy_and_use_target={ + "COMPRA", + "E USA", + }, + ml_buy_target={ + "COMPRA", + }, + ml_card_stats={ + "Carta", + "Statistiche", + }, + ml_controller_required={ + "Per poter giocare è necessario un controller.", + "Collega un controller per continuare.", + }, + ml_crash_report_info={ + "Le segnalazioni degli arresti anomali verranno inviate allo sviluppatore", + "per ridurre i problemi in futuro. Non verranno inviate", + "informazioni identificanti o personali.", + }, + ml_demo_thanks_message={ + "Valuta l'opzione di aggiungere Balatro", + "alla tua lista dei desideri su Steam e di iscriverti", + "alla newsletter su playbalatro.com", + }, + ml_disabled_seed={ + "Sblocchi e", + "scoperte disattivati", + }, + ml_edition_seal_enhancement_explanation={ + "Ogni carta da gioco può avere", + "un potenziamento, un'edizione e un Sigillo", + }, + ml_eternal={ + "Eterna", + "Invendibile", + "o indistruttibile", + }, + ml_gold_seal_desc={ + "Sigillo d'oro", + "torna in mano", + "quando è giocato", + }, + ml_offline_message={ + "Questo dispositivo è offline.", + "Il salvataggio attuale potrebbe essere obsoleto.", + }, + ml_open_target={ + "APRI", + }, + ml_paste_seed={ + "Incolla", + "Seed", + }, + ml_play_discard_pos_opt={ + "Scarta/Gioca", + "Gioca/Scarta", + }, + ml_redeem_target={ + "RISCATTA", + }, + ml_sell_target={ + "VENDI", + }, + ml_shadow_opt={ + "Sì", + "No", + }, + ml_smoothing_opt={ + "No", + "Sì", + }, + ml_unlock_all_explanation={ + "ATTENZIONE! Sbloccare la collezione completa", + "disattiverà gli obiettivi per questo profilo!", + }, + ml_unlock_all_trophies={ + "ATTENZIONE! Sbloccare la collezione completa", + "disattiverà i trofei per questo profilo!", + }, + ml_vsync_opt={ + "V-Sync sì", + "V-Sync no", + }, + ml_windowmode_opt={ + "Finestra", + "Schermo intero", + "Senza bordi", + }, + ph_1_level="+1 livello", + ph_4_7_of_clubs="quattro 7 di Fiori", + ph_alert_debuff_confirm="Premi Gioca di nuovo per confermare", + ph_all_poker_hand="Tutte le mani di poker", + ph_blind_reward="Ricompensa: ", + ph_blind_score_at_least="Ottieni almeno", + ph_boss_disabled="Boss disattivato!", + ph_choose_blind_1="Scegli il tuo", + ph_choose_blind_2="prossimo buio", + ph_click_confirm="Premi di nuovo per confermare", + ph_deck_preview_effective="Totale effettivo grazie a Jolly, bui e potenziamenti delle carte", + ph_deck_preview_stones="Pietre", + ph_defeat_the_boss="Sconfiggi il buio boss", + ph_defeat_this_blind_1="Sconfiggi questo buio", + ph_defeat_this_blind_2="per scoprirlo", + ph_demo_thanks_1="Grazie aver giocato alla", + ph_demo_thanks_2="DEMO DI BALATRO", + ph_display_stickers="Visualizzazione degli adesivi della puntata durante la sessione", + ph_game_over="GAME OVER", + ph_improve_run="Migliora la tua sessione!", + ph_most_played="(mano più giocata)", + ph_mr_bones="Salvataggio del Signor Scheletro", + ph_no_boss_active="nessun boss attivo", + ph_no_vouchers="Nessun buono riscattato in questa sessione", + ph_score_at_least="Ottieni almeno", + ph_score_cards_discarded="Carte scartate", + ph_score_cards_played="Carte giocate", + ph_score_cards_purchased="Carte acquistate", + ph_score_furthest_ante="Ante", + ph_score_furthest_round="Round", + ph_score_hand="Mano migliore", + ph_score_new_collection="Nuove scoperte", + ph_score_poker_hand="Mano più giocata", + ph_score_times_rerolled="Numero di cambi", + ph_select_challenge="Seleziona una sfida", + ph_sneak_peek="Anteprima", + ph_stat_consumable="Numero di volte che questa carta è stata usata", + ph_stat_joker="Round completati totali con questa carta", + ph_stat_voucher="Numero di volte che questo buono è stato riscattato", + ph_unscored_hand="La mano non segnerà punti", + ph_up_ante_1="Aumenta l'ante", + ph_up_ante_2="Incrementa tutti i bui", + ph_up_ante_3="Aggiorna bui", + ph_vouchers_redeemed="Buoni riscattati in questa sessione", + ph_you_win="VITTORIA!", + ph_you_win_demo="VITTORIA NELLA DEMO!", + }, + high_scores={ + boss_streak="Record di boss di fila", + collection="Collezione", + current_streak="", + furthest_ante="Ante più alto", + furthest_round="Round più alto", + hand="Mano migliore", + most_money="Record di soldi", + poker_hand="Mano più giocata", + win_streak="Serie di vittorie migliore", + }, + labels={ + blue_seal="Sigillo blu", + common="Comune", + eternal="Eterna", + foil="Foil", + gold_seal="Sigillo d'oro", + holographic="Olografica", + legendary="Leggendario", + locked="Bloccato", + negative="Negativa", + perishable="Deperibile", + pinned_left="Fissato", + planet="Pianeta", + pluto_planet="Pianeta nano", + polychrome="Policroma", + purple_seal="Sigillo viola", + rare="Raro", + red_seal="Sigillo rosso", + rental="A noleggio", + tarot="Tarocco", + uncommon="Non comune", + voucher="Buono", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 carte dello stesso valore", + }, + Flush={ + "5 carte dello stesso seme", + }, + ["Flush Five"]={ + "5 carte dello stesso valore e seme", + }, + ["Flush House"]={ + "Un Tris e una Coppia", + "con carte dello stesso seme", + }, + ["Four of a Kind"]={ + "4 carte dello stesso valore. Giocabili", + "con 1 carta che non dà punti", + }, + ["Full House"]={ + "Un Tris e una Coppia", + }, + ["High Card"]={ + "Se la mano giocata non è nessuna delle mani qui sopra,", + "solo la carta dal valore più alto assegna punti", + }, + Pair={ + "2 carte dello stesso valore. Giocabili", + "con un massimo di 3 carte che non danno punti", + }, + ["Royal Flush"]={ + "5 carte in sequenza {valori consecutivi}", + "che hanno lo stesso seme", + }, + Straight={ + "5 carte in sequenza {valori consecutivi}", + }, + ["Straight Flush"]={ + "5 carte in sequenza {valori consecutivi}", + "che hanno lo stesso seme", + }, + ["Three of a Kind"]={ + "3 carte dello stesso valore. Giocabili", + "con un massimo di 2 carte che non danno punti", + }, + ["Two Pair"]={ + "2 coppie di carte con valori diversi,", + "giocabili con 1 carta che non dà punti", + }, + }, + poker_hands={ + ["Five of a Kind"]="Pokerissimo", + Flush="Colore", + ["Flush Five"]="Colore perfetto", + ["Flush House"]="Full colore", + ["Four of a Kind"]="Poker", + ["Full House"]="Full", + ["High Card"]="Carta più alta", + Pair="Coppia", + ["Royal Flush"]="Scala reale massima", + Straight="Scala", + ["Straight Flush"]="Scala reale", + ["Three of a Kind"]="Tris", + ["Two Pair"]="Doppia coppia", + }, + quips={ + dq_1={ + "Accidenti! Spero", + "che tu abbia qualche", + "asso nella manica per", + "questa sfida finale!", + }, + lq_1={ + "Forse è meglio", + "se giochiamo a", + "rubamazzetto...", + }, + lq_10={ + "Che fiasco!", + }, + lq_2={ + "Non abbiamo", + "lasciato il segno!", + }, + lq_3={ + "È il momento di", + "rinunciare al piatto", + "e riprovare!", + }, + lq_4={ + "Sai come", + "si dice: il banco", + "vince sempre!", + }, + lq_5={ + "Abbiamo scoperto", + "chi è il vero", + "prodigio del poker!", + }, + lq_6={ + "Oh no,", + "stavi bluffando?", + }, + lq_7={ + "Siamo rimasti", + "a mani vuote!", + }, + lq_8={ + "Se avessi le mani,", + "avrei coperto", + "i miei occhi!", + }, + lq_9={ + "Io sono solo", + "un buffone, tu", + "che scusa hai?", + }, + wq_1={ + "Sei un asso!", + }, + wq_2={ + "Te la sei cavata", + "piuttosto bene!", + }, + wq_3={ + "Pare che il tuo", + "non fosse un bluff!", + }, + wq_4={ + "Peccato che queste", + "fiche sono tutte", + "virtuali...", + }, + wq_5={ + "Sembra che ti", + "ho insegnato bene!", + }, + wq_6={ + "Sei abile", + "nel testa a testa!", + }, + wq_7={ + "Menomale che", + "non ho scommesso", + "contro di te!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="Asso", + Jack="Fante", + King="Re", + Queen="Regina", + }, + suits_plural={ + Clubs="Fiori", + Diamonds="Quadri", + Hearts="Cuori", + Spades="Picche", + }, + suits_singular={ + Clubs="Fiore", + Diamonds="Quadro", + Hearts="Cuore", + Spades="Picca", + }, + tutorial={ + bb_1={ + "Se selezioni il {C:attention}grande buio", + "guadagnerai dei soldi", + }, + bb_2={ + "Oppure scegli di {C:attention}saltarlo", + "per ricevere un {C:attention}patto{}!", + "Ogni {C:attention}patto{} ha un effetto unico", + }, + bb_3={ + "Ma tieni d'occhio", + "il {C:attention}buio boss{}.", + "Ha un'abilità che dovrai", + "tenere in considerazione.", + }, + bb_4={ + "Se lo batti,", + "l'{C:attention}ante{} aumenta e tutti i", + "{C:attention}bui{} diventano più difficili", + }, + bb_5={ + "Batti l'{C:attention}ante{} #1# per vincere.", + "Ora scegli la tua strada!", + }, + fh_1={ + "Guadagni fiche", + "giocando {C:attention}mani di poker", + }, + fh_2={ + "Con ogni {C:attention}mano di poker{} guadagni", + "una quantità base di {C:blue}fiche", + "moltiplicata per un certo {C:red}Molt", + }, + fh_3={ + "Trovi le tue {C:attention}mani di poker", + "nell'area {C:attention}Dati sessione{},", + "insieme ad altri dati", + "sulla sessione attuale", + }, + fh_4={ + "Anche con le carte", + "guadagni {C:blue}fiche{},", + "passaci sopra il cursore!", + }, + fh_4_touch={ + "Anche con le carte", + "guadagni {C:blue}fiche{},", + "tieni premuto per vedere!", + }, + fh_5={ + "Ora seleziona fino a", + "{C:attention}5{} carte da giocare", + "e premi {C:blue}'Gioca mano'", + }, + fh_5_touch={ + "Ora tocca fino a", + "{C:attention}5{} carte da giocare", + "e premi {C:blue}Gioca mano", + }, + fh_6={ + "Puoi anche {C:red}'scartare'{} fino", + "a {C:attention}5{} carte selezionate", + "per provare a creare", + "mani più forti. Provaci!", + }, + fh_7={ + "Attenzione! Hai a disposizione", + "un numero limitato di {C:blue}mani", + "e {C:red}scarti{} per round", + }, + fh_8={ + "Guadagna {C:attention}300 fiche{} prima", + "di rimanere senza {C:blue}mani", + "per vincere il round.", + "Buona fortuna!", + }, + s_1={ + "Ottimo lavoro! Ora che", + "hai le {E:1}mani{} piene di {C:money}soldi{},", + "puoi comprare delle nuove", + "carte dal {C:attention}negozio", + }, + s_10={ + "I {C:attention}Buoni{} vengono riassortiti", + "dopo che sconfiggi il", + "{C:attention}buio boss{}.", + }, + s_11={ + "E dai un'occhiata a entrambe", + "le {C:booster}buste di espansione{} in", + "ciascun negozio. Sono", + "piene di carte utili!", + }, + s_12={ + "Passiamo", + "al {C:attention}prossimo round{}.", + }, + s_2={ + "Compra questo", + "bel diavoletto", + }, + s_2_touch={ + "Compra questo ", + "bel diavoletto!", + "Trascinalo dal negozio", + "nell'area {C:attention}ACQUISTA{}", + }, + s_3={ + "Questo è uno dei {C:attention}#1#", + "{C:attention}Jolly{} che puoi aggiungere", + "alla tua sessione. Ogni {C:attention}Jolly", + "fa qualcosa di diverso", + }, + s_4={ + "Questo aggiunge {C:red}+4 Molt{} a", + "ogni mano che giochi!", + }, + s_5={ + "Scegli bene, puoi avere", + "solo {C:attention}5 Jolly{} con te", + "alla volta", + }, + s_6={ + "Ora compra l'altra", + "carta dal {C:attention}negozio", + }, + s_7={ + "Questo {C:tarot}Tarocco{} è una", + "{C:attention}carta consumabile{}.", + "Potenzierà le tue", + "carte! Non perderlo.", + }, + s_8={ + "Puoi avere fino a", + "{C:attention}2 carte consumabili{}", + "con te alla volta", + }, + s_9={ + "Se risparmi abbastanza,", + "puoi comprare un {C:attention}Buono{}.", + "I {C:attention}Buoni{} migliorano", + "passivamente la sessione!", + }, + sb_1={ + "Ehilà! Mi chiamo", + "{C:attention}Jimbo{}, sono qui per", + "insegnarti come si gioca!", + }, + sb_2={ + "L'obiettivo è guadagnare", + "{C:blue}fiche{} per battere", + "il {C:attention}buio{} nemico", + }, + sb_3={ + "Questo è un {C:blue}piccolo buio{},", + "devi ottenere solo", + "{C:attention}300 fiche{} per batterlo.", + }, + sb_4={ + "Seleziona il {C:blue}piccolo buio", + "per iniziare il round!", + }, + sh_1={ + "Quando ottieni più carte,", + "ricorda che puoi riordinarle.", + "I {C:attention}Jolly{} si attivano", + "da sinistra a destra", + }, + sh_2={ + "E assicurati di", + "{C:attention}USARE{} i consumabili!", + }, + sh_3={ + "Seleziona fino a {C:attention}2{} carte", + "nella tua mano e premi", + "{C:attention}'USA'{} sul {C:tarot}Tarocco{}", + "per potenziarle!", + }, + sh_3_touch={ + "Seleziona fino a {C:attention}2{} carte", + "nella tua mano e trascina", + "la carta {C:tarot}Tarocco{} nell'area {C:attention}USA{}", + "per potenziarle!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Mani", + a_handsize="+#1# carta della mano", + a_handsize_minus="-#1# di carte della mano", + a_mult="+#1# Molt", + a_mult_minus="-#1# Molt", + a_remaining="#1# rimanenti", + a_sold_tally="#1#/#2# vendute", + a_xmult=" X#1# Molt", + a_xmult_minus="-X#1# Molt", + ante_x_voucher="BUONO ANTE #1#", + challenges_completed="#1#/#2# sfide completate", + completed="Completato: #1#/#2#", + deck_preview_wheel_plural="I numeri potrebbero essere inferiori a causa di #1# carte pescate a faccia in giù", + deck_preview_wheel_singular="I numeri potrebbero essere inferiori a causa di #1# carta pescata a faccia in giù", + interest="$#1# di interessi per ogni $#2# (massimo $#3#)", + loyalty_active="Attivazione!", + loyalty_inactive="#1# rimanenti", + ml_foil_desc={ + "Foil", + "+#1# Chips", + }, + ml_holo_desc={ + "Olografica", + "+#1# Molt", + }, + ml_negative_consumable_desc={ + "Negativa", + "+#1# slot consumabili", + }, + ml_negative_desc={ + "Negativa", + "+#1# slot Jolly", + }, + ml_polychrome_desc={ + "Policroma", + " X#1# Molt", + }, + remaining_discard_money="Scarti rimasti ($#1# ciascuno)", + remaining_hand_money="Mani rimaste ($#1# ciascuna)", + unlocked="Sbloccato: #1#/#2#", + }, + v_text={ + ch_c_all_eternal={ + "Tutti i Jolly del negozio sono {C:eternal}eterni{}", + }, + ch_c_chips_dollar_cap={ + "Le {C:blue}fiche{} non possono superare i {C:money}${} attuali", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Sfida giornaliera!", + }, + ch_c_debuff_played_cards={ + "Tutte le carte {C:attention}giocate{} vengono {C:attention}penalizzate{} dopo aver assegnato punti", + }, + ch_c_discard_cost={ + "Gli scarti costano {C:money}$#1#{} ciascuno", + }, + ch_c_flipped_cards={ + "{C:green}1 carta su #1#{} viene pescata a faccia in giù", + }, + ch_c_inflation={ + "Incrementa permanentemente i prezzi di {C:money}$1{} per ogni acquisto", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Tieni {C:red}-1{} carta in mano per ogni {C:money}$#1#{} che hai", + }, + ch_c_no_extra_hand_money={ + "Le {C:blue}mani{} in più non fanno guadagnare soldi", + }, + ch_c_no_interest={ + "Non guadagni {C:attention}interessi{} alla fine del round", + }, + ch_c_no_reward={ + "Tutti i {C:attention}bui{} non danno soldi come ricompensa", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# bui{} non danno soldi come ricompensa", + }, + ch_c_no_shop_jokers={ + "I Jolly non appaiono più nel {C:attention}negozio", + }, + ch_c_none={ + "{C:inactive}Nessuno", + }, + ch_c_set_eternal_ante={ + "Quando il boss dell'ante {C:attention}#1#{} viene sconfitto, tutti i Jolly diventano {C:attention}eterni", + }, + ch_c_set_joker_slots_ante={ + "Quando il boss dell'ante {C:attention}#1#{} viene sconfitto, gli slot Jolly vengono portati a {C:attention}0", + }, + ch_c_set_seed={ + "1 tentativo con seed impostato: {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} slot consumabili", + }, + ch_m_discards={ + "{C:red}#1#{} scarti per round", + }, + ch_m_dollars={ + "Inizi con {C:money}$#1#", + }, + ch_m_hand_size={ + "{C:attention}#1#{} carte della mano", + }, + ch_m_hands={ + "{C:blue}#1#{} mani per round", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} slot Jolly", + }, + ch_m_none={ + "{C:inactive}Nessuno", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/ja.lua b/src/localization/ja.lua new file mode 100644 index 0000000..046ff93 --- /dev/null +++ b/src/localization/ja.lua @@ -0,0 +1,4321 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="アバンダンドデッキ", + text={ + "デッキに", + "{C:attention}フェイスカード{} がない状態で", + "ランをスタートする", + }, + }, + b_anaglyph={ + name="アナグリフデッキ", + text={ + "{C:attention}ボスブラインド{} を倒すたびに", + "{C:attention,T:tag_double}#1#{} を", + "得る", + }, + }, + b_black={ + name="ブラックデッキ", + text={ + "すべてのラウンドで", + "", + "ジョーカースロット {C:attention}+#1#{}", + "ハンド {C:blue}-#2#{}", + }, + }, + b_blue={ + name="ブルーデッキ", + text={ + "すべてのラウンドで", + "ハンド {C:blue}+#1#{}", + }, + }, + b_challenge={ + name="チャレンジデッキ", + text={ + "", + }, + }, + b_checkered={ + name="チェッカードデッキ", + text={ + "デッキに {C:attention}26{} 枚の {C:spades}スペード{} と", + "{C:attention}26{} 枚の {C:hearts}ハート{} がある状態で", + "ランをスタートする", + }, + }, + b_erratic={ + name="エラティックデッキ", + text={ + "デッキのすべての ", + "{C:attention}ランク{} と {C:attention}スーツ{} が", + "ランダムになる", + }, + }, + b_ghost={ + name="ゴーストデッキ", + text={ + "{C:spectral}スペクトル{} カードが", + "ショップに出現し", + "{C:spectral,T:c_hex}ヘックス{} カードで始まる", + }, + }, + b_green={ + name="グリーンデッキ", + text={ + "各ラウンドの終了時に", + "{s:0.85}残りの {C:blue}ハンド{} ごとに {C:money}$#1#{}", + "{s:0.85}残りの {C:red}ディスカード{} ごとに {C:money}$#1#{}", + "{C:attention}利息{} は得ない", + }, + }, + b_magic={ + name="マジックデッキ", + text={ + "{C:tarot,T:v_crystal_ball}#1#{} のバウチャーと", + "{C:tarot,T:c_fool}#2#{} の", + "{C:attention}2{} つのコピーで", + "ランをスタートする", + }, + }, + b_nebula={ + name="ネビュラデッキ", + text={ + "{C:planet,T:v_telescope}#1#{} のバウチャーと", + "消耗スロットで", + "", + "ランをスタートする", + }, + }, + b_painted={ + name="ペインテッドデッキ", + text={ + "ハンドサイズ {C:attention}+#1#{}", + "ジョーカースロット {C:red}#2#{}", + }, + }, + b_plasma={ + name="プラズマデッキ", + text={ + "プレイされたハンドのスコアを", + "計算する時に", + "{C:blue}チップ{} と {C:red}倍率{} のバランスをとる", + "ブラインドの基本サイズ {C:red}X#1#{}", + }, + }, + b_red={ + name="レッドデッキ", + text={ + "すべてのラウンドで", + "ディスカード {C:red}+#1#{}", + }, + }, + b_yellow={ + name="イエローデッキ", + text={ + "{C:money}$#1#{} を追加して", + "スタートする", + }, + }, + b_zodiac={ + name="ゾディアックデッキ", + text={ + "{C:tarot,T:v_tarot_merchant}#1#{}、", + "{C:planet,T:v_planet_merchant}#2#{}、", + "{C:attention,T:v_overstock_norm}#3#{}で", + "ランをスタートする", + }, + }, + }, + Blind={ + bl_arm={ + name="腕", + text={ + "プレイされたポーカーハンドの", + "レベルを下げる", + }, + }, + bl_big={ + name="ビッグブラインド", + text={ + }, + }, + bl_club={ + name="クラブ", + text={ + "すべてのクラブカードに", + "デバフがかかる", + }, + }, + bl_eye={ + name="目", + text={ + "このラウンドでは", + "ハンドタイプをリピートできない", + }, + }, + bl_final_acorn={ + name="琥珀色のドングリ", + text={ + "すべてのジョーカーカードを", + "裏返してシャッフルする", + }, + }, + bl_final_bell={ + name="セルリアンベル", + text={ + "常に1枚のカードが", + "強制的に選択される", + }, + }, + bl_final_heart={ + name="クリムゾンハート", + text={ + "すべてのハンドで", + "1枚のランダムなジョーカーが無効にされる", + }, + }, + bl_final_leaf={ + name="青々とした葉", + text={ + "1枚のジョーカーが売られるまで", + "すべてのカードにデバフがかかる", + }, + }, + bl_final_vessel={ + name="バイオレットベッセル", + text={ + "ベリーラージブラインド", + }, + }, + bl_fish={ + name="魚", + text={ + "各ハンドをプレイ後に", + "カードが裏向きでドローされる", + }, + }, + bl_flint={ + name="フリント", + text={ + "ベースチップと倍率が", + "半分になる", + }, + }, + bl_goad={ + name="ゴアド", + text={ + "すべてのスペードカードに", + "デバフがかかる", + }, + }, + bl_head={ + name="頭", + text={ + "すべてのハートカードに", + "デバフがかかる", + }, + }, + bl_hook={ + name="フック", + text={ + "ハンドがプレイされるたびに", + "ランダムなカードを2枚捨てる", + }, + }, + bl_house={ + name="家", + text={ + "最初のハンドは", + "裏向きでドローされる", + }, + }, + bl_manacle={ + name="手枷", + text={ + "ハンドサイズ -1", + }, + }, + bl_mark={ + name="マーク", + text={ + "すべてのフェイスカードが", + "裏向きでドローされる", + }, + }, + bl_mouth={ + name="口", + text={ + "このラウンドでは", + "1タイプのハンドだけをプレイする", + }, + }, + bl_needle={ + name="ニードル", + text={ + "1ハンドだけをプレイする", + }, + }, + bl_ox={ + name="雄牛", + text={ + "#1# をプレイすると", + "資金が$0になる", + }, + }, + bl_pillar={ + name="柱", + text={ + "このアンティの前にプレイされたカードに", + "デバフがかかる", + }, + }, + bl_plant={ + name="プラント", + text={ + "すべてのフェイスカードに", + "デバフがかかる", + }, + }, + bl_psychic={ + name="サイキック", + text={ + "5枚のカードをプレイしなければならない", + }, + }, + bl_serpent={ + name="サーペント", + text={ + "プレイまたはディスカードの後", + "カードを3枚ドローする", + }, + }, + bl_small={ + name="スモールブラインド", + text={ + }, + }, + bl_tooth={ + name="歯", + text={ + "カードがプレイされるたびに", + "$1失う", + }, + }, + bl_wall={ + name="壁", + text={ + "エクストララージブラインド", + }, + }, + bl_water={ + name="水", + text={ + "0ディスカードで", + "スタートする", + }, + }, + bl_wheel={ + name="ホイール", + text={ + " 7枚のカードが", + "裏向きでドローされる", + }, + }, + bl_window={ + name="窓", + text={ + "すべてのダイヤカードに", + "デバフがかかる", + }, + }, + }, + Edition={ + e_base={ + name="ベース", + text={ + "追加効果なし", + }, + }, + e_foil={ + name="フォイル", + text={ + "チップ {C:chips}+#1#{}", + }, + }, + e_holo={ + name="ホログラム", + text={ + "倍率 {C:mult}+#1#{}", + }, + }, + e_negative={ + name="ネガティブ", + text={ + "ジョーカースロット {C:dark_edition}+#1#{}", + }, + }, + e_negative_consumable={ + name="ネガティブ", + text={ + "消耗スロット {C:dark_edition}+#1#{}", + }, + }, + e_polychrome={ + name="ポリクローム", + text={ + "倍率 {X:mult,C:white}X#1#{}", + }, + }, + }, + Enhanced={ + m_bonus={ + name="ボーナスカード", + text={ + }, + }, + m_glass={ + name="グラスカード", + text={ + "{C:green}#3#分の#2#{} の確率で", + "カードを破壊する", + "倍率 {X:mult,C:white} X#1#{}", + }, + }, + m_gold={ + name="ゴールドカード", + text={ + "ラウンド終了時に", + "このカードが手札にある場合", + "{C:money}$#1#{}", + }, + }, + m_lucky={ + name="ラッキーカード", + text={ + "{C:green}#3#分の#1#{} の確率で", + "倍率 {C:mult}+#2#{}", + "{C:green}#5#分の#1#{} の確率で", + "{C:money}$#4#{} 得る", + }, + }, + m_mult={ + name="倍率カード", + text={ + "倍率 {C:mult}+#1#{}", + }, + }, + m_steel={ + name="スチールカード", + text={ + "このカードが", + "手札にある間", + "倍率 {X:mult,C:white} X#1# {}", + }, + }, + m_stone={ + name="ストーンカード", + text={ + "チップ {C:chips}+#1#{}", + "ランクおよびスーツはない", + }, + }, + m_wild={ + name="ワイルドカード", + text={ + "どのスーツとしても", + "使用できる", + }, + }, + }, + Joker={ + j_8_ball={ + name="8ボール", + text={ + "{C:attention}8{}がスコアされた時", + "{C:green}#2#{} 分の #1#{} の確率で", + "{C:tarot}タロット{}カードを作る", + "{C:inactive}(空きが必要)", + }, + }, + j_abstract={ + name="アブストラクトジョーカー", + text={ + "{C:attention}ジョーカー{} カード1枚につき", + "倍率 {C:mult}+#1#{}", + "{C:inactive}(現在 倍率 {C:red}+#2#{C:inactive})", + }, + }, + j_acrobat={ + name="アクロバット", + text={ + "ラウンドの {C:attention}最終ハンド{} の", + "倍率 {X:red,C:white}X#1#{}", + }, + unlock={ + "{C:attention,E:1}#1#{} のハンドをプレイする", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="エンシェントジョーカー", + text={ + "スコアされた時", + "{V:1}#2#{} スーツでプレイされたカードごとに", + "倍率 {X:mult,C:white}X#1#{}", + "{s:0.8} スーツはラウンド終了時に変わる", + }, + }, + j_arrowhead={ + name="アローヘッド", + text={ + "プレイされた {C:spades}スペード{} スーツのカードが", + "スコアされた時", + "チップ {C:chips}+#1#{}", + }, + unlock={ + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} スーツを持つ", + }, + }, + j_astronomer={ + name="天文学者", + text={ + "ショップの {C:planet}惑星{} カードと", + "{C:planet}天体パック{} ", + "がすべて {C:attention}無料{} になる", + }, + unlock={ + "すべての {E:1,C:planet}惑星{} カードを", + "発見する", + }, + }, + j_banner={ + name="バナー", + text={ + "残りの {C:attention}ディスカード{}", + "1枚につき", + "チップ {C:chips}+#1#{}", + }, + }, + j_baron={ + name="バロン", + text={ + "手札にある {C:attention}キング{} 1枚につき", + "倍率 {X:mult,C:white}X#1#{} を", + "与える", + }, + }, + j_baseball={ + name="ベースボールカード", + text={ + "それぞれの {C:green}アンコモン{} ジョーカーが", + "倍率 {X:mult,C:white}X#1#{} を与える", + }, + }, + j_blackboard={ + name="黒板", + text={ + "手札にあるすべてのカードが", + "{C:spades}#2#{} または {C:clubs}#3#{} の場合", + "倍率 {X:red,C:white}X#1#{}", + }, + }, + j_bloodstone={ + name="ブラッドストーン", + text={ + "{C:green}#2#分の#1#{} の確率で", + "{C:hearts}ハート{} スーツのカードがスコアされると", + "倍率 {C:mult}+#1#{} を与える", + "倍率 {X:mult,C:white}X#3#{}", + }, + unlock={ + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} スーツを持つ", + }, + }, + j_blue_joker={ + name="ブルージョーカー", + text={ + "{C:attention}デッキ{} の残りのカード1枚につき", + "チップ {C:chips}+#1#{}", + "{C:inactive}(現在 チップ {C:chips}+#2#{C:inactive})", + }, + }, + j_blueprint={ + name="ブループリント", + text={ + "右の {C:attention}ジョーカー{} の能力を", + "コピーする", + }, + unlock={ + "ランに勝利する", + }, + }, + j_bootstraps={ + name="ブートストラップ", + text={ + "自分が持っている", + "{C:money}$#2#{}につき、倍率{C:mult}+#1#{}", + "{C:inactive}(現在 倍率{C:mult}+#3#{C:inactive})", + }, + unlock={ + "{E:1,C:attention}#1#{} 枚以上の", + "{C:dark_edition}ポリクローム{} ジョーカーを持つ", + }, + }, + j_brainstorm={ + name="ブレインストーム", + text={ + "一番左の {C:attention}ジョーカー{} の", + "能力をコピーする", + }, + unlock={ + "{E:1,C:attention}ロイヤルフラッシュ{} を", + "ディスカードする", + }, + }, + j_bull={ + name="ブル", + text={ + "自分が持っている", + "{C:money}$1{}につき、チップ {C:chips}+#1#{}", + "{C:inactive}(現在 チップ{C:chips}+#2#{C:inactive})", + }, + }, + j_burglar={ + name="強盗", + text={ + "{C:attention}ブラインド{} が選択された時", + "ハンドを {C:blue}+#1#{} 得て", + "{C:attention}すべてのディスカードを失う", + }, + }, + j_burnt={ + name="バーントジョーカー", + text={ + "各ラウンドで", + "最初に{C:attention}ディスカード{} されたポーカーハンドの", + "レベルをアップグレードする", + }, + unlock={ + "合計 {E:1,C:attention}#1#{} 枚の", + "カードを売る", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="ビジネスカード", + text={ + "プレイされた {C:attention}フェイス{} カードがスコアされた時", + "{C:green}#2#分の#1#{} の確率で", + "{C:money}$2{} を与える", + }, + }, + j_caino={ + name="カイーノ", + text={ + "{C:attention}フェイス{}カードが", + "破壊されるたびに、", + "倍率{X:mult,C:white}X#1#{}", + "{C:inactive}(現在 倍率{X:mult,C:white}X#2#{C:inactive})", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="キャンプファイヤー", + text={ + "このジョーカーは、カードが1枚 {C:attention}売れる{} たびに", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:attention}ボスブラインド{} を倒すとリセットされる", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})", + }, + }, + j_card_sharp={ + name="カードシャープ", + text={ + "プレイした {C:attention}ポーカーハンド{} が", + "すでにこのラウンドでプレイされていた場合", + "倍率 {X:mult,C:white}X#1#{}", + }, + }, + j_cartomancer={ + name="カード占い", + text={ + "{C:attention}ブラインド{} が選択された時", + "{C:tarot}タロット{} カードを1枚作る", + "{C:inactive}(空きが必要)", + }, + unlock={ + "すべての{E:1,C:tarot}タロット{} カードを", + "発見する", + }, + }, + j_castle={ + name="キャッスル", + text={ + "このジョーカーは、 {V:1}#2#{} のカードがディスカードされるたびに", + "チップ {C:chips}+#1#{} を得る", + "スーツはラウンドごとに変わる", + "{C:inactive}(現在 チップ {C:chips}+#3#{C:inactive})", + }, + }, + j_cavendish={ + name="カベンディッシュ", + text={ + "倍率 {X:mult,C:white}X#1#{}", + "このカードはラウンド終了時に", + "{C:green}#3#分の#2#{} の確率で", + "破壊される", + }, + }, + j_ceremonial={ + name="儀式の短剣", + text={ + "{C:attention}ブラインド{} が選択された時", + "右のジョーカーを破壊し", + "永久的にそのセルバリューの2倍の値を", + "この {C:red}倍率{} に加える", + "{C:inactive}(現在 倍率 {C:mult}+#1#{C:inactive})", + }, + }, + j_certificate={ + name="証明書", + text={ + "ラウンド開始時に", + "ランダムな {C:attention}シール{} のついた", + "ランダムな{C:attention}トランプカード{} を", + "1枚手札に加える", + }, + unlock={ + "{C:attention,E:1}ゴールドシール{} の", + "ゴールドトランプを持つ", + " ", + }, + }, + j_chaos={ + name="カオス・ザ・クラウン", + text={ + "ショップに行くたびに", + "{C:attention}#1#{} 回無料で {C:green}リロール{} できる", + }, + }, + j_chicot={ + name="チコット", + text={ + "すべての {C:attention}ボスブラインド{} の", + "効果を無効にする", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="クレバージョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}", + }, + }, + j_cloud_9={ + name="クラウド9", + text={ + "ラウンド終了時に", + "{C:attention}フルデッキ{} にある{C:attention} 9{} 1枚につき", + "{C:money}$#1#{} を得る", + "{C:inactive}(現在{C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="星座", + text={ + "{C:planet}惑星{}カードが", + "使用されるたびに、", + "倍率{X:mult,C:white}X#1#{}", + "{C:inactive}(現在 倍率{X:mult,C:white}X#2#{C:inactive})", + }, + }, + j_crafty={ + name="クラフティジョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}", + }, + }, + j_crazy={ + name="クレイジージョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}", + }, + }, + j_credit_card={ + name="クレジットカード", + text={ + "負債額が", + "{C:red}-$#1#{} まで増える", + }, + }, + j_delayed_grat={ + name="遅れた満足感", + text={ + "ラウンド終了までに", + "ディスカードが使われなかった場合", + "{C:attention}ディスカード{} ごとに {C:money}$#1#{} を得る", + }, + }, + j_devious={ + name="ディヴィアスジョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}", + }, + }, + j_diet_cola={ + name="ダイエットコーラ", + text={ + "このカードを売ると", + "無料の {C:attention}#1#{} を", + "作る", + }, + }, + j_dna={ + name="DNA", + text={ + "ラウンドの {C:attention}ファーストハンド{} のカードが", + "{C:attention}1{} 枚しかない場合", + "永久的なコピーを1枚デッキに加えて", + "ドローしてから {C:attention}手札{} に加える", + }, + }, + j_drivers_license={ + name="運転免許証", + text={ + "強化されたカードが", + "{C:attention}16{} 枚以上ある場合", + "倍率 {X:mult,C:white}X#1#{}", + "{C:inactive}(現在 {C:attention}#2#{C:inactive})", + }, + unlock={ + "デッキ内の {E:1,C:attention}#1#{} 枚のカードを", + "強化する", + }, + }, + j_droll={ + name="ドロールジョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}", + }, + }, + j_drunkard={ + name="大酒飲み", + text={ + "毎ラウンドで", + "ディスカード {C:red}+#1#{}", + }, + }, + j_duo={ + name="デュオ", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}", + }, + unlock={ + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + "カードを売る", + }, + }, + j_dusk={ + name="ダスク", + text={ + "ラウンドの {C:attention}最終ハンド{} で", + "すべてのプレイしたカードを", + "再発動する", + }, + }, + j_egg={ + name="エッグ", + text={ + "ラウンド終了時に", + "{C:attention}セルバリュー{} を", + "{C:money}$#1#{} を得る", + }, + }, + j_erosion={ + name="イロージョン", + text={ + "フルデッキの {C:attention}#3#{} 枚を下回る", + "カード1枚につき", + "倍率 {C:red}+#1#{}", + "{C:inactive}(現在 倍率 {C:red}+#2#{C:inactive})", + }, + }, + j_even_steven={ + name="イーブンスティーブン", + text={ + "プレイされた {C:attention}偶数{} ランクの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}", + "{C:inactive}(10、8、6、4、2)", + }, + }, + j_faceless={ + name="フェイスレスジョーカー", + text={ + "{C:attention}#2#{} 枚以上の", + "{C:attention}フェイスカード{} が", + "同時にディスカードされた場合", + "{C:money}$#1#{} を得る", + }, + }, + j_family={ + name="ファミリー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}", + }, + unlock={ + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + " ", + }, + }, + j_fibonacci={ + name="フィボナッチ", + text={ + "{C:attention}エース{}、 {C:attention}2{}、 {C:attention}3{}、 {C:attention}5{}、 {C:attention}8{} の", + "いずれかがプレイされ、スコアされると", + "倍率 {C:mult}+#1#{}", + }, + }, + j_flash={ + name="フラッシュカード", + text={ + "ショップで{C:attention}リロール{}", + "するたびに、倍率{C:mult}+#1#{}", + "{C:inactive}(現在 倍率{C:mult}+#2#{C:inactive})", + }, + }, + j_flower_pot={ + name="フラワーポット", + text={ + "ポーカーハンドに", + "{C:diamonds}ダイヤ{}、{C:clubs}クラブ{}、", + "{C:hearts}ハート{}、{C:spades}スペード{}を", + "含む場合、倍率 {X:mult,C:white}X#1#{}", + }, + unlock={ + "アンティのレベルが", + "{E:1,C:attention}#1#{} に到達する", + }, + }, + j_fortune_teller={ + name="占い師", + text={ + "使用された {C:purple}タロット{} カード1枚につき", + "倍率 {C:red}+#1#{}", + "{C:inactive}(現在 {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="フォーフィンガー", + text={ + "すべての {C:attention}フラッシュ{} と", + "{C:attention}ストレート{} を", + "{C:attention}4{} 枚のカードで作ることができる", + }, + }, + j_gift={ + name="ギフトカード", + text={ + "ラウンド終了時に", + "すべての {C:attention}ジョーカー{} と {C:attention}消耗{} カードの", + "{C:attention}セルバリュー{} に", + "{C:money}$#1#{} を加える", + }, + }, + j_glass={ + name="グラスジョーカー", + text={ + "{C:attention}グラスカード", + "が破壊されるたびに", + "倍率 {X:mult,C:white}X#1#{}", + "{C:inactive}(現在 倍率{X:mult,C:white}X#2#{C:inactive})", + }, + unlock={ + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} を持つ", + }, + }, + j_gluttenous_joker={ + name="グラトナスジョーカー", + text={ + "プレイされた {C:clubs}#2#{} スーツの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}", + }, + }, + j_golden={ + name="ゴールデンジョーカー", + text={ + "ラウンド終了時に", + "{C:money}$#1#{} を得る", + }, + }, + j_greedy_joker={ + name="グリーディージョーカー", + text={ + "プレイされた {C:diamonds}#2#{} スーツの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}", + }, + }, + j_green_joker={ + name="グリーンジョーカー", + text={ + "プレイされたハンドごとに倍率 {C:mult}+#1#{}", + "ディスカードするごとに倍率 {C:mult}-#2#{}", + "{C:inactive}(現在 倍率 {C:mult}+#3#{C:inactive})", + }, + }, + j_gros_michel={ + name="グロスミッチェル", + text={ + "倍率 {C:mult}+#1#{}", + "このカードはラウンド終了時に", + "{C:green}#3#分の#2#{} の確率で", + "破壊される", + }, + }, + j_hack={ + name="詐欺師", + text={ + "{C:attention}2{}、 {C:attention}3{}、 {C:attention}4{}、 {C:attention}5{} のカードが", + "プレイされるごとに", + "再発動する", + }, + }, + j_half={ + name="ハーフジョーカー", + text={ + "プレイしたハンドの枚数が{C:attention}#2#{} ", + "以下なら", + "倍率 {C:red}+#1#{}", + }, + }, + j_hallucination={ + name="ハルシネーション", + text={ + "{C:attention}ブースターパック{} を開封するたびに", + "{C:green}#2# 分の #1#{} の確率で", + "{C:tarot}タロット{} カードを作る", + "{C:inactive}(空きが必要)", + }, + }, + j_hanging_chad={ + name="ハンギングチャド", + text={ + "プレイしたカードで、", + "{C:attention}最初に{}スコアされたものを", + "{C:attention}#1#{}回追加で再発動する", + }, + unlock={ + "{E:1,C:attention}#1#{} で", + "ボスブラインドを倒す", + }, + }, + j_hiker={ + name="ハイカー", + text={ + "プレイされた {C:attention}カード{} が", + "スコアされた時、永久的に", + "チップ {C:chips}+#1#{} を与える", + }, + }, + j_hit_the_road={ + name="ヒット・ザ・ロード", + text={ + "このラウンドで{C:attention}ジャック{}が", + "ディスカードされるたびに", + "倍率 {X:mult,C:white}X#1#{}", + "{C:inactive}(現在 倍率{X:mult,C:white}X#2#{C:inactive})", + }, + unlock={ + "同時に", + "{E:1,C:attention}ジャック{} を", + "{E:1,C:attention}5{} 枚ディスカードする", + }, + }, + j_hologram={ + name="ホログラム", + text={ + "{C:attention}カード{}がデッキに", + "追加されるたびに、", + "倍率 {X:mult,C:white}X#1#{}を得る", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})", + }, + }, + j_ice_cream={ + name="アイスクリーム", + text={ + "チップ {C:chips}+#1#{}", + "手札がプレイされるたびに", + "チップ {C:chips}-#2#{}", + }, + }, + j_idol={ + name="アイドル", + text={ + "プレイされた{V:1}#3#{} の{C:attention}#2#{} が", + "スコアされるごとに", + "倍率 {X:mult,C:white}X#1#{}", + "{s:0.8}カードはラウンドごとに変わる", + }, + unlock={ + "1つのハンドで", + "チップを {E:1,C:attention}#1#{} 以上獲得する", + " ", + }, + }, + j_invisible={ + name="インビジブルジョーカー", + text={ + "{C:attention}#1#{} ラウンド後", + "このカードを売ると", + "ランダムなジョーカーを {C:attention}複製{} する", + "{C:inactive}(現在 {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "{E:1,C:attention}ジョーカーを4枚{} よりも", + "多く持たずにランに勝利する", + " ", + }, + }, + j_joker={ + name="ジョーカー", + text={ + "倍率 {C:red,s:1.1}+#1#{}", + }, + }, + j_jolly={ + name="ジョリージョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}", + }, + }, + j_juggler={ + name="ジャグラー", + text={ + "ハンドサイズ {C:attention}+#1#{}", + }, + }, + j_loyalty_card={ + name="ロイヤルティカード", + text={ + "{C:attention}#2#{} ハンドがプレイされるたびに", + "倍率 {X:red,C:white}X#1#{}", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="ルチャドール", + text={ + "このカードを売ると", + "現在の {C:attention}ボスブラインド{} を", + "無効にする", + }, + }, + j_lucky_cat={ + name="ラッキーキャット", + text={ + "{C:attention}ラッキーカード{}が", + "発動に{C:green}成功{}するたびに、", + "倍率{X:mult,C:white}X#1#{}", + "{C:inactive}(現在 倍率{X:mult,C:white}X#2#{C:inactive})", + }, + }, + j_lusty_joker={ + name="ラスティジョーカー", + text={ + "プレイされた {C:hearts}#2#{} スーツの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}", + }, + }, + j_mad={ + name="マッドジョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}", + }, + }, + j_madness={ + name="マッドネス", + text={ + "{C:attention}スモールブラインド{}または{C:attention}ビッグブラインド{}", + "が選択された時、倍率 {X:mult,C:white}X#1#{}を得て、", + "ランダムなジョーカー1枚を{C:attention}破壊{}する", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})", + }, + }, + j_mail={ + name="メールによる払い戻し", + text={ + "{C:attention}#2#{} がディスカードされるたびに", + "{C:money}$#1#{} を得る", + "ランクはラウンドごとに変わる", + }, + }, + j_marble={ + name="マーブルジョーカー", + text={ + "{C:attention}ブラインド{} が選択された時", + "デッキに", + "{C:attention}ストーン{} カードを1枚加える", + }, + }, + j_matador={ + name="マタドール", + text={ + "プレイしたハンドが", + "{C:attention}ボスブラインド{} の能力を発動した場合", + "{C:money}$#1#{} を得る", + }, + unlock={ + "ディスカードを使わずに", + "{E:1,C:attention}1ハンド{} で", + "ボスブラインドを倒す", + }, + }, + j_merry_andy={ + name="メリーアンディ", + text={ + "毎ラウンドで", + "ディスカード {C:red}+#1#{}", + "ハンドサイズ{C:red}#2#{}", + }, + unlock={ + "{E:1,C:attention}#1# ラウンド以内に", + "ランに勝利する", + }, + }, + j_midas_mask={ + name="ミダスマスク", + text={ + "プレイした全ての{C:attention}フェイス{}カードが、", + "スコアされた時に", + "{C:attention}ゴールド{}カードになる", + }, + }, + j_mime={ + name="マイム", + text={ + "{C:attention}手札にある{}", + "すべてのカードの能力を", + "再発動させる", + }, + }, + j_misprint={ + name="ミスプリント", + text={ + "", + }, + }, + j_mr_bones={ + name="ミスターボーンズ", + text={ + "スコアされたチップが", + "必要なチップの", + "{C:attention}25%{} 以上だった場合", + "死を防ぎ", + "{S:1.1,C:red,E:2}自らを破壊する{}", + }, + unlock={ + "{C:attention,E:1}#1#{} ランで負ける", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="ミスティックサミット", + text={ + "{C:attention}#2#{} ディスカード", + "が残っていない時", + "倍率 {C:mult}+#1#{}", + }, + }, + j_obelisk={ + name="オベリスク", + text={ + "最も多くプレイした", + "{C:attention}ポーカーハンド{}以外を{C:attention}連続{}で", + "プレイするたびに", + "倍率{X:mult,C:white}X#1#", + "{C:inactive}(現在 倍率{X:mult,C:white}X#2#{C:inactive})", + }, + }, + j_odd_todd={ + name="オッドトッド", + text={ + "プレイされた {C:attention}奇数{} ランクの", + "カードがスコアされた時", + "チップ {C:chips}+#1#{}", + "{C:inactive}(A、9、7、5、3)", + }, + }, + j_onyx_agate={ + name="オニキスアゲート", + text={ + "プレイされた {C:clubs}クラブ{} スーツのカードが", + "スコアされた時", + "倍率 {C:mult}+#1#{} ", + }, + unlock={ + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} スーツを持つ", + }, + }, + j_oops={ + name="すべてが6!", + text={ + "すべての {C:green,E:1,S:1.1}確率{} を", + "2倍にする", + "{C:inactive}(例:{C:green}3分の1{C:inactive} → {C:green}3分の2{C:inactive})", + }, + unlock={ + "1つのハンドで", + "チップを {E:1,C:attention}#1#{} 以上獲得する", + " ", + }, + }, + j_order={ + name="オーダー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}", + }, + unlock={ + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + " ", + }, + }, + j_pareidolia={ + name="パレイドリア", + text={ + "すべてのカードが", + "{C:attention}フェイス{} カードと", + "みなされる", + }, + }, + j_perkeo={ + name="ペルケオ", + text={ + "{C:attention}ショップ{} 終了時に所持している", + "ランダムな {C:tarot}消耗{} カード{C:attention}1{} 枚を", + "{C:dark_edition}ネガティブ{} にした", + "コピーを作る", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="フォトグラフ", + text={ + "最初にプレイされた{C:attention}フェイス{} カードが", + "スコアされた時", + "倍率 {X:mult,C:white}X#1#{}", + }, + }, + j_popcorn={ + name="ポップコーン", + text={ + "倍率 {C:mult}+#1#{}", + "プレイされたラウンドごとに", + "倍率 {C:mult}-#2#{}", + }, + }, + j_raised_fist={ + name="レイズドフィスト", + text={ + "手札にある{C:attention}最も低い{}", + "ランクのカードの{C:attention}2倍{}を", + "倍率に加算する。", + }, + }, + j_ramen={ + name="ラーメン", + text={ + "倍率 {X:mult,C:white}X#1#{}", + "ディスカードされた {C:attention}カード{} 1枚につき", + "倍率 {X:mult,C:white}X#2#{} を失う", + }, + }, + j_red_card={ + name="レッドカード", + text={ + "{C:attention}ブースターパック{}が", + "スキップされた時、", + "倍率{C:red}+#1#{}", + "{C:inactive}(現在 倍率{C:red}+#2#{C:inactive})", + }, + }, + j_reserved_parking={ + name="リザーブドパーキング", + text={ + "手札にある", + "{C:attention}フェイス{} カード1枚につき", + "{C:green}#3#分の#2#{} の確率で", + "{C:money}$#1#{}を与える", + }, + }, + j_ride_the_bus={ + name="ライド・ザ・バス", + text={ + "スコアされる{C:attention}フェイス{}カードが", + "ないハンドを{C:attention}連続{}で", + "プレイするたびに、", + "倍率{C:mult}+#1#{}", + "{C:inactive}(現在 倍率{C:mult}+#2#{C:inactive})", + }, + }, + j_riff_raff={ + name="リフ・ラフ", + text={ + "{C:attention}ブラインド{} が選択された時", + "{C:attention}#1#{} {C:blue}コモン{} {C:attention}ジョーカー{} を作る", + "{C:inactive}(空きが必要)", + }, + }, + j_ring_master={ + name="リングマスター", + text={ + "{C:attention}ジョーカー{} 、{C:tarot}タロット{} 、{C:planet}惑星{} 、", + "{C:spectral}スペクトル{} カードが", + "複数回出現する", + }, + unlock={ + "アンティのレベルが", + "{E:1,C:attention}#1#{} に到達する", + }, + }, + j_rocket={ + name="ロケット", + text={ + "ラウンド終了時に{C:money}$#1#{}を得る", + "{C:attention}ボスブラインド{}を倒すと、", + "{C:money}$#2#{}増加する", + }, + }, + j_rough_gem={ + name="ラフジェム", + text={ + "{C:diamonds}ダイヤ{} スーツでプレイされた", + "カードがスコアされた時", + "{C:money}$#1#{}", + }, + unlock={ + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} スーツを持つ", + }, + }, + j_runner={ + name="ランナー", + text={ + "プレイしたハンドに", + "{C:attention}ストレート{} が含まれる場合", + "チップ {C:chips}+#2#{}", + "{C:inactive}(現在 {C:chips}+#1#{C:inactive} チップ)", + }, + }, + j_satellite={ + name="サテライト", + text={ + "ラウンド終了時に", + "このランで使われた {C:planet}惑星{} カード1種類ごとに", + "{C:money}$#1#{} を得る", + "{C:inactive}(現在 {C:money}$#2#{C:inactive})", + }, + unlock={ + "{E:1,C:money}$#1# 以上持つ", + " ", + }, + }, + j_scary_face={ + name="スケアリーフェイス", + text={ + "プレイされた {C:attention}フェイス{} カードが", + "スコアされた時", + "チップを {C:chips}+#1#{} 与える", + }, + }, + j_scholar={ + name="学者", + text={ + "プレイされた {C:attention}エース{} がスコアされた時", + "チップ {C:chips}+#2#{} と", + "倍率 {C:mult}+#1#{} を", + "与える", + }, + }, + j_seance={ + name="降霊術", + text={ + "{C:attention}ポーカーハンド{} が {C:attention}#1#{} だった場合", + "ランダムな {C:spectral}スペクトル{} カードを", + "1枚作る", + "{C:inactive} 空きが必要)", + }, + }, + j_seeing_double={ + name="シーイングダブル", + text={ + "プレイしたハンドに", + "{C:clubs}クラブ{} のスコアリングカード1枚と", + "その他の{C:attention}スーツ{} の", + "スコアリングカード1枚があると倍率 {X:mult,C:white} X#1#{} ", + }, + unlock={ + "{E:1,C:attention}#1#{} を含む", + "ハンドをプレイする", + " ", + }, + }, + j_selzer={ + name="セルツァー", + text={ + "次の {C:attention}#1#{} ハンドに", + "プレイされたすべてのカードを", + "再発動する", + }, + }, + j_shoot_the_moon={ + name="シュート・ザ・ムーン", + text={ + "手札にある {C:attention}クイーン{}", + "1枚につき", + "倍率 {C:mult}+#1#{}", + }, + unlock={ + "1ラウンドでデッキ内の", + "すべての {E:1,C:attention}ハート{} を", + "プレイする", + }, + }, + j_shortcut={ + name="ショートカット", + text={ + "{C:attention}1ランク{}の差があっても", + "{C:attention}ストレート{}を作ることができる", + "{C:inactive}(例:{C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="シックスセンス", + text={ + "ラウンドの {C:attention}ファーストハンド{} で", + "{C:attention}6{} のカード1枚を使用した時", + "それを破壊し、{C:spectral}スペクトル{} カードを1枚作る", + "{C:inactive}(空きが必要)", + }, + }, + j_sly={ + name="スライジョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}", + }, + }, + j_smeared={ + name="スメアードジョーカー", + text={ + "{C:hearts}ハート{} と {C:diamonds}ダイヤ{} が", + "同じスーツとみなされ", + "{C:spades}スペード{} と{C:clubs}クラブ{} が", + "同じスーツとみなさる", + }, + unlock={ + "デッキに", + "{C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} を持つ", + }, + }, + j_smiley={ + name="スマイリーフェイス", + text={ + "スコアされた時", + "プレイされた {C:attention}フェイス{} カードが", + "倍率 {C:mult}+#1#{} を与える", + }, + }, + j_sock_and_buskin={ + name="ソックスとバスキン", + text={ + "すべてのプレイされた{C:attention}フェイス{} カードが", + "再発動する", + }, + unlock={ + "合計 {C:attention,E:1}#1#{} 枚の", + "フェイスカードをプレイする", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="スペースジョーカー", + text={ + "{C:green}#2#分の#1#{} の確率で", + "プレイした {C:attention}ポーカーハンド{} の", + "レベルがアップグレードする", + }, + }, + j_splash={ + name="スプラッシュ", + text={ + "すべての {C:attention}プレイされたカード{} が", + "スコアにカウントされる", + }, + }, + j_square={ + name="スクエアジョーカー", + text={ + "プレイしたハンドが", + "ちょうど{C:attention}4{}枚の場合、", + "チップ {C:chips}+#2#{}を得る", + "{C:inactive}(現在 チップ{C:chips}#1#{C:inactive})", + }, + }, + j_steel_joker={ + name="スチールジョーカー", + text={ + "{C:attention}フルデッキ{}の", + "{C:attention}スチールカード1枚につき、", + "倍率 {X:mult,C:white}X#1#", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})", + }, + }, + j_stencil={ + name="ジョーカーステンシル", + text={ + "{C:attention}ジョーカー{} の空きスロット1つにつき", + "倍率 {X:red,C:white}X1{}", + "{s:0.8}ジョーカーステンシルを含む", + "{C:inactive}(現在{X:red,C:white}X#1#{C:inactive} )", + }, + }, + j_stone={ + name="ストーンジョーカー", + text={ + "{C:attention}フルデッキ{} の", + "{C:attention}ストーンカード", + "1枚につきチップ {C:chips}+#1#", + "{C:inactive}(現在 チップ {C:chips}+#2#{C:inactive})", + }, + }, + j_stuntman={ + name="スタントマン", + text={ + "チップ {C:chips}+#1#{}", + "ハンドサイズ {C:attention}-#2#{}", + }, + unlock={ + "1つのハンドで", + "チップを {E:1,C:attention}#1#{} 以上", + "獲得する ", + }, + }, + j_supernova={ + name="超新星", + text={ + "このランでプレイした", + "{C:attention}ポーカーハンド{}の回数を", + "倍率に加算する", + }, + }, + j_superposition={ + name="スーパーポジション", + text={ + "ポーカーハンドに", + "{C:attention}エース{} と {C:attention}ストレート{} を含む場合", + "{C:tarot}タロット{} カードを1枚作る", + "{C:inactive}(空きが必要)", + }, + }, + j_swashbuckler={ + name="スワッシュバックラー", + text={ + "他のすべての", + "ジョーカーの{C:attention}セルバリュー{}を", + "倍率に加算する", + "{C:inactive}(現在 倍率{C:mult}+#1#{C:inactive})", + }, + unlock={ + "合計 {C:attention,E:1}#1#{} 枚の", + "ジョーカーカードを売る", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="スローバック", + text={ + "このランで {C:attention}ブラインド{} をスキップするごとに", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})", + }, + unlock={ + "メインメニューから", + "保存したランを続ける", + }, + }, + j_ticket={ + name="ゴールデンチケット", + text={ + "プレイされた {C:attention}ゴールドカード{} がスコアされた時", + "{C:money}$#1#{} を得る", + }, + unlock={ + "{C:attention,E:1}ゴールド{} カード", + "だけを含む", + "5のカードのハンドをプレイする", + }, + }, + j_to_the_moon={ + name="トゥ・ザ・ムーン", + text={ + "ラウンド終了時の", + "所持金 {C:money}$5{} ごとに", + "追加の {C:attention}利息{} を{C:money}$#1#{} 得る", + }, + }, + j_todo_list={ + name="ToDoリスト", + text={ + "{C:attention}ポーカーハンド{}が{C:attention}#2#{}である場合に", + "{C:money}$#1#{}を得る。", + "ポーカーハンドはラウンド", + "終了時に変化する", + }, + }, + j_trading={ + name="トレーディングカード", + text={ + "ラウンドの {C:attention}最初のディスカード{} が", + "{C:attention}1{} 枚だった場合", + "それを破壊して {C:money}$#1#{} を得る", + }, + }, + j_tribe={ + name="トライブ", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}", + }, + unlock={ + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + " ", + }, + }, + j_triboulet={ + name="トリブレ", + text={ + "プレイされた {C:attention}キング{} と {C:attention}クイーン{} が", + "それぞれスコアされた時", + "倍率 {X:mult,C:white}X#1#{}", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="トリオ", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}", + }, + unlock={ + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + " ", + }, + }, + j_troubadour={ + name="トルバドゥール", + text={ + "ハンドサイズ {C:attention}+#1#{}、", + "毎ラウンドのハンド{C:blue}-#2#{}", + }, + unlock={ + "1ハンドだけで", + "連続 {C:attention,E:1}#1#{} ラウンド", + "勝利する", + }, + }, + j_trousers={ + name="スペアトラウザー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{}を含む場合", + "倍率 {C:mult}+#1#", + "{C:inactive}(現在 倍率{C:red}+#3#{C:inactive})", + }, + }, + j_turtle_bean={ + name="タートルビーン", + text={ + "ハンドサイズ {C:attention}+#1#{}", + "ラウンドごとに", + "{C:red}#2#{} 枚ずつ減らす", + }, + }, + j_vagabond={ + name="バガボンド", + text={ + "{C:money}$#1#{} 以下の", + "ハンドがプレイされた場合", + "{C:purple}タロット{} カードを作る", + }, + }, + j_vampire={ + name="ヴァンパイア", + text={ + "スコアされた{C:attention}強化カード{}が", + "プレイされるたびに倍率 {X:mult,C:white}X#1#{}を得るが、", + "カードの{C:attention}強化{}を解除する", + "{C:inactive}(現在 倍率{X:mult,C:white}X#2#{C:inactive})", + }, + }, + j_walkie_talkie={ + name="ウォーキートーキー", + text={ + "スコアされた時", + "プレイされた {C:attention}10{} または {C:attention}4{} ごとに", + "チップ {C:chips}+#1#{} を与え、倍率 {C:mult}+#2#{}", + }, + }, + j_wee={ + name="ウィージョーカー", + text={ + "このジョーカーは", + "プレイした {C:attention}2{} のカードがスコアされるごとに", + "チップを{C:chips}+#2#{} 得る", + "{C:inactive}(現在{C:chips}+#1#{C:inactive} チップ)", + }, + unlock={ + "{E:1,C:attention}#1# ラウンド以内に", + "ランに勝利する", + }, + }, + j_wily={ + name="ウィリージョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}", + }, + }, + j_wrathful_joker={ + name="ラスフルジョーカー", + text={ + "プレイされた {C:spades}#2#{} スーツの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}", + }, + }, + j_yorick={ + name="ヨリック", + text={ + "カードが{C:attention}#2#{C:inactive}[#3#]{}枚", + "ディスカードされるたびに、", + "倍率{X:mult,C:white}X#1#{}", + "{C:inactive}(現在 倍率{X:mult,C:white}X#4#{C:inactive})", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="ザニージョーカー", + text={ + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}", + }, + }, + }, + Other={ + black_sticker={ + name="ブラックステッカー", + text={ + "{C:attention}ブラックステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した", + }, + }, + blue_seal={ + name="ブルーシール", + text={ + "ハンドにこのシールが{C:attention}ある{}場合、", + "ラウンドの最後にプレイした{C:attention}ポーカーハンド{}", + "の{C:planet}惑星{}カードを作る", + "{C:inactive}(空きが必要)", + }, + }, + blue_sticker={ + name="ブルーステッカー", + text={ + "{C:attention}ブルーステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した", + }, + }, + card_chips={ + text={ + "チップ {C:chips}+#1#{}", + }, + }, + card_extra_chips={ + text={ + "追加チップ {C:chips}+#1#{}", + }, + }, + challenge_locked={ + name="ロック中", + text={ + "チャレンジモードをアンロックするには", + "#1#種類以上の異なるデッキで", + "ランに勝利する", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="デバフ状態", + text={ + "すべての能力は", + "無効です", + }, + }, + debuffed_playing_card={ + name="デバフ状態", + text={ + "チップはスコアされず", + "すべての能力は", + "無効です", + }, + }, + deck_locked_discover={ + name="ロック中", + text={ + "自分のコレクションから", + "{C:attention}#1#{} 以上のアイテムを", + "発見する", + }, + }, + deck_locked_stake={ + name="ロック中", + text={ + "いずれかのデッキで", + "{V:1}#1#{} 以上の難易度で", + "ランに勝利する", + }, + }, + deck_locked_win={ + name="ロック中", + text={ + "いずれかの難易度で", + "{C:attention}#1#{} で", + "ランに勝利する", + }, + }, + demo_locked={ + name="ロック中", + text={ + "この体験版では", + "利用できません", + }, + }, + demo_shop_locked={ + name="ロック中", + text={ + "{C:attention}Jimbo{} のパーソナルコレクションの", + "カードは", + "{E:1,C:red}Balatro{} の製品版で", + "利用できます", + }, + }, + eternal={ + name="エターナル", + text={ + "売ることも", + "壊すこともできない", + }, + }, + gold_seal={ + name="ゴールドシール", + text={ + "このカードがプレイされた時", + "{C:money}$3{} を得て", + "スコアする", + }, + }, + gold_sticker={ + name="ゴールドステッカー", + text={ + "{C:attention}ゴールドステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した", + }, + }, + green_sticker={ + name="グリーンステッカー", + text={ + "{C:attention}グリーンステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した", + }, + }, + joker_locked_legendary={ + name="ロック中", + text={ + "{C:spectral}ソウル{} カードから", + "このジョーカーを見つける", + }, + }, + locked={ + name="ロック中", + text={ + }, + }, + orange_sticker={ + name="オレンジステッカー", + text={ + "{C:attention}オレンジステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した", + }, + }, + p_arcana_jumbo={ + name="ジャンボアルカナパック", + text={ + "{C:attention}#2#{} 枚までの {C:tarot}タロット{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_arcana_mega={ + name="メガアルカナパック", + text={ + "{C:attention}#2#{} 枚までの {C:tarot}タロット{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_arcana_normal={ + name="アルカナパック", + text={ + "{C:attention}#2#{} 枚までの {C:tarot}タロット{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_buffoon_jumbo={ + name="ジャンボ道化師パック", + text={ + "{C:attention}#2#{} 枚までの {C:joker}ジョーカー{} カードから", + "{C:attention}#1#{} 枚を選ぶ", + }, + }, + p_buffoon_mega={ + name="メガ道化師パック", + text={ + "{C:attention}#2#{} 枚までの {C:joker}ジョーカー{} カードから", + "{C:attention}#1#{} 枚を選ぶ", + }, + }, + p_buffoon_normal={ + name="道化師パック", + text={ + "{C:attention}#2#{} 枚までの {C:joker}ジョーカー{} カードから", + "{C:attention}#1#{} 枚を選ぶ", + }, + }, + p_celestial_jumbo={ + name="ジャンボ天体パック", + text={ + "{C:attention}#2#{} 枚までの {C:planet}惑星{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_celestial_mega={ + name="メガ天体パック", + text={ + "{C:attention}#2#{} 枚までの {C:planet}惑星{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_celestial_normal={ + name="天体パック", + text={ + "{C:attention}#2#{} 枚までの {C:planet}惑星{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_spectral_jumbo={ + name="ジャンボスペクトルパック", + text={ + "{C:attention}#2#{} 枚までの {C:spectral}スペクトル{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_spectral_mega={ + name="メガスペクトルパック", + text={ + "{C:attention}#2#{} 枚までの {C:spectral}スペクトル{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_spectral_normal={ + name="スペクトルパック", + text={ + "{C:attention}#2#{} 枚までの {C:spectral}スペクトル{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する", + }, + }, + p_standard_jumbo={ + name="ジャンボスタンダードパック", + text={ + "{C:attention}#2#{} 枚までの {C:attention}トランプ{} から", + "{C:attention}#1#{} 枚を選んで", + "デッキに加える", + }, + }, + p_standard_mega={ + name="メガスタンダードパック", + text={ + "{C:attention}#2#{} 枚までの {C:attention}トランプ{} から", + "{C:attention}#1#{} 枚を選んで", + "デッキに加える", + }, + }, + p_standard_normal={ + name="スタンダードパック", + text={ + "{C:attention}#2#{} 枚までの {C:attention}トランプ{} から", + "{C:attention}#1#{} 枚を選んで", + "デッキに加える", + }, + }, + perishable={ + name="摩耗", + text={ + "{C:attention}#1#{}ラウンド後に", + "デバフ状態になる", + "{C:inactive}(残り{C:attention}#2#{C:inactive})", + }, + }, + pinned_left={ + name="ピン留め", + text={ + "このジョーカーは", + "一番左のポジションに", + "固定される", + }, + }, + playing_card={ + text={ + " {V:1}#2# の {C:light_black}#1#{} ", + }, + }, + purple_seal={ + name="パープルシール", + text={ + "{C:attention}ディスカード{} された時", + "{C:tarot}タロット{} カードを作る", + "{C:inactive}(空きが必要)", + }, + }, + purple_sticker={ + name="パープルステッカー", + text={ + "{C:attention}パープルステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した", + }, + }, + red_seal={ + name="レッドシール", + text={ + "このカードを {C:attention}1{} 回", + "再発動する", + }, + }, + red_sticker={ + name="レッドステッカー", + text={ + "{C:attention}レッドステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した", + }, + }, + remove_negative={ + name="ネガティブ", + text={ + "{C:inactive,s:0.9}(解除 {C:dark_edition,s:0.9}ネガティブ{C:inactive,s:0.9} コピーから)", + }, + }, + rental={ + name="レンタル", + text={ + "ラウンド終了時に", + "{C:money}$#1#{} を失う", + }, + }, + undiscovered_booster={ + name="未発見", + text={ + "シードされていないランで", + "このパックを開封すると", + "効果を知ることができる", + }, + }, + undiscovered_edition={ + name="未発見", + text={ + "シードされていないランで", + "このエディションを見つけると", + "効果を知ることができる", + }, + }, + undiscovered_joker={ + name="未発見", + text={ + "このカードを購入するか", + "シードされていないランで使用すると", + "効果を知ることができる", + " ", + }, + }, + undiscovered_planet={ + name="未発見", + text={ + "このカードを購入するか", + "シードされていないランで使用すると", + "効果を知ることができる", + " ", + }, + }, + undiscovered_spectral={ + name="未発見", + text={ + "このカードを購入するか", + "シードされていないランで使用すると", + "効果を知ることができる", + " ", + }, + }, + undiscovered_tag={ + name="未発見", + text={ + "シードされていないランで", + "このタグを使用すると", + "効果を知ることができる", + }, + }, + undiscovered_tarot={ + name="未発見", + text={ + "このカードを購入するか", + "シードされていないランで使用すると", + "効果を知ることができる", + " ", + }, + }, + undiscovered_voucher={ + name="未発見", + text={ + "このバウチャーを", + "シードされていないランで", + "引き換えると", + "効果を知ることができる", + }, + }, + white_sticker={ + name="ホワイトステッカー", + text={ + "{C:attention}ホワイトステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した", + }, + }, + wip_locked={ + name="ロック中", + text={ + "現在", + "開発中です", + }, + }, + }, + Planet={ + c_ceres={ + name="セレス", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_earth={ + name="地球", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_eris={ + name="エリス", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#{}", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_jupiter={ + name="木星", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_mars={ + name="火星", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_mercury={ + name="水星", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_neptune={ + name="海王星", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_planet_x={ + name="プラネットX", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_pluto={ + name="冥王星", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_saturn={ + name="土星", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_uranus={ + name="天王星", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + c_venus={ + name="金星", + text={ + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}", + }, + }, + }, + Spectral={ + c_ankh={ + name="アンク", + text={ + "ランダムな {C:attention}ジョーカー{} の", + "コピーを作る", + "他のすべてのジョーカーを破壊する", + }, + }, + c_aura={ + name="オーラ", + text={ + "手札 にある選択したカード{C:attention}1{} 枚に", + "{C:dark_edition}フォイル{}、{C:dark_edition}ホログラム{}、{C:dark_edition}ポリクローム{} の", + "いずれかの効果を加える", + }, + }, + c_black_hole={ + name="ブラックホール", + text={ + "すべての {C:legendary,E:1}ポーカーハンド{} を", + "{C:attention}1{} レベル", + "アップグレードする", + }, + }, + c_cryptid={ + name="クリプティッド", + text={ + "手札から選んだ", + "カード {C:attention}1{} 枚の", + "コピーを {C:attention}#1#{} 枚作る", + }, + }, + c_deja_vu={ + name="デジャヴ", + text={ + "手札から選んだ", + "カード {C:attention}1{} 枚に", + "{C:red}レッドシール{} を加える", + }, + }, + c_ectoplasm={ + name="エクトプラズム", + text={ + "ランダムな {C:attention}ジョーカー{} に", + "{C:dark_edition}ネガティブ{} を加える", + "ハンドサイズ {C:red}-1{}", + }, + }, + c_familiar={ + name="ファミリア", + text={ + "ランダムな手札を {C:attention}1{} 枚", + "破壊して", + "ランダムな {C:attention}強化されたフェイスカード{} を{C:attention}#1#{} 枚", + "手札に加える", + }, + }, + c_grim={ + name="グリム", + text={ + "ランダムな手札を {C:attention}1{} 枚", + "破壊して", + "ランダムな {C:attention}強化されたエース{} を{C:attention}#1#{} 枚", + "手札に加える", + }, + }, + c_hex={ + name="ヘックス", + text={ + "ランダムな {C:attention}ジョーカー{} に", + "{C:dark_edition}ポリクローム{} を加える", + "他のすべてのジョーカーを破壊する", + }, + }, + c_immolate={ + name="生贄", + text={ + "ランダムな手札を {C:attention}#1#{} 枚", + "破壊して", + "{C:money}$#2#{} 得る", + }, + }, + c_incantation={ + name="呪文", + text={ + "ランダムな手札を {C:attention}1{} 枚", + "破壊して", + "ランダムな {C:attention}強化されたナンバーカード{} を{C:attention}#1#{} 枚", + "手札に加える", + }, + }, + c_medium={ + name="ミディアム", + text={ + "手札から選んだ", + "カード {C:attention}1{} 枚に", + "{C:purple}パープルシール{} を加える", + }, + }, + c_ouija={ + name="ウイジャ", + text={ + "手札のすべてのカードを", + "ランダムな1つの {C:attention}ランク{} に", + "変換する", + "ハンドサイズ {C:red}-1{}", + }, + }, + c_sigil={ + name="紋章", + text={ + "手札のすべてのカードを", + "ランダムな1つの {C:attention}スーツ{} に", + "変換する", + }, + }, + c_soul={ + name="魂", + text={ + "{C:legendary,E:1}レジェンド{} ジョーカーを", + "作る", + "{C:inactive}(空きが必要)", + }, + }, + c_talisman={ + name="タリスマン", + text={ + "手札から選んだ", + "カード {C:attention}1{} 枚に", + "{C:attention}ゴールドシール{} を加える", + }, + }, + c_trance={ + name="トランス", + text={ + "手札から選んだ", + "カード {C:attention}1{} 枚に", + "{C:blue}ブルーシール{} を加える", + }, + }, + c_wraith={ + name="レイス", + text={ + "ランダムな {C:red}レア{C:attention}ジョーカー{} を", + "作り", + "資金を {C:money}$0{} にする", + }, + }, + }, + Stake={ + stake_black={ + name="ブラックステーク", + text={ + "ショップに {C:attention}エターナル{} ジョーカーが出現可", + "{C:inactive,s:0.8}{売却や破壊はできない}", + "{s:0.8}以前のすべてのステークに適用", + }, + }, + stake_blue={ + name="ブルーステーク", + text={ + "ディスカード {C:red}-1{}", + "{s:0.8}以前のすべてのステークに適用", + }, + }, + stake_gold={ + name="ゴールドステーク", + text={ + "ショップに{C:attention}レンタル{}ジョーカーが出現する", + "{C:inactive,s:0.8}(ラウンドごとに{C:money,s:0.8}$3{C:inactive,s:0.8}消費)", + "{s:0.8}以前のすべてのステークに適用", + }, + }, + stake_green={ + name="グリーンステーク", + text={ + "各 {C:attention}アンティ{} に必要な", + "スコアスケールが速くなる", + "{s:0.8}以前のすべてのステークに適用", + }, + }, + stake_orange={ + name="オレンジステーク", + text={ + "ショップに{C:attention}摩耗{}ジョーカーが出現する", + "{C:inactive,s:0.8}(5ラウンド後にデバフ状態になる)", + "{s:0.8}以前のすべてのステークに適用", + }, + }, + stake_purple={ + name="パープルステーク", + text={ + "各 {C:attention}アンティ{} に必要な", + "スコアスケールが速くなる", + "{s:0.8}以前のすべてのステークに適用", + }, + }, + stake_red={ + name="レッドステーク", + text={ + "{C:attention}スモールブラインド{} が", + "報奨金を与えない", + "{s:0.8}以前のすべてのステークに適用", + }, + }, + stake_white={ + name="ホワイトステーク", + text={ + "ベース難易度", + }, + }, + }, + Tag={ + tag_boss={ + name="ボスタグ", + text={ + "{C:attention}ボスブラインド{} を", + "リロールする", + }, + }, + tag_buffoon={ + name="道化師タグ", + text={ + "無料の", + "{C:attention}道化師パック{} を与える", + }, + }, + tag_charm={ + name="チャームタグ", + text={ + "無料の", + "{C:tarot}メガアルカナパック{} を与える", + }, + }, + tag_coupon={ + name="クーポンタグ", + text={ + "次のショップで", + "イニシャルカードとブースターパックが", + "無料になる", + }, + }, + tag_d_six={ + name="D6タグ", + text={ + "次のショップのリロールが", + "{C:money}$0{} からスタートする", + }, + }, + tag_double={ + name="ダブルタグ", + text={ + "次に選択した {C:attention}タグ{} の", + "コピーを与える", + "{s:0.8}ただし {s:0.8,C:attention}ダブルタグ{s:0.8} は除く", + }, + }, + tag_economy={ + name="エコノミータグ", + text={ + "資金を2倍にする", + "{C:inactive}(最高 {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="エーテルタグ", + text={ + "無料の {C:planet}スペクトルパック{} を", + "与える", + }, + }, + tag_foil={ + name="フォイルタグ", + text={ + "次のベースショップジョーカーが", + "無料になり、以下の", + "エディションになる:{C:dark_edition}フォイル", + }, + }, + tag_garbage={ + name="ガーベジタグ", + text={ + "このランで使わなかった{C:red}ディスカード{} につき", + "{C:money}$#1#{} を与える", + "{C:inactive}(最高{C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="ハンディタグ", + text={ + "このランでプレイした{C:blue}ハンド{} ごとに", + "{C:money}$#1#{} を与える", + "{C:inactive}(最高{C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="ホログラムタグ", + text={ + "次のベースショップジョーカーが", + "無料になり、以下の", + "エディションになる:{C:dark_edition}ホログラム", + }, + }, + tag_investment={ + name="投資タグ", + text={ + "ボスブラインドを倒すと", + "{C:money}$#1#{} 得る", + " ", + }, + }, + tag_juggle={ + name="ジャグルタグ", + text={ + "次のラウンドで", + "ハンドサイズ{C:attention}+#1#{}", + }, + }, + tag_meteor={ + name="メテオタグ", + text={ + "無料の", + "{C:planet}メガ天体パック{} を与える", + }, + }, + tag_negative={ + name="ネガティブタグ", + text={ + "次のベースショップジョーカーが", + "無料になり、以下の", + "エディションになる:{C:dark_edition}ネガティブ", + }, + }, + tag_orbital={ + name="オービタルタグ", + text={ + "{C:attention}#1#{} を", + "{C:attention}#2# レベル{} アップグレードする", + }, + }, + tag_polychrome={ + name="ポリクロームタグ", + text={ + "次のベースショップジョーカーが", + "無料になり、以下の", + "エディションになる:{C:dark_edition}ポリクローム", + }, + }, + tag_rare={ + name="レアタグ", + text={ + "ショップに出現:無料の", + "{C:red}レアジョーカー", + }, + }, + tag_skip={ + name="スピードタグ", + text={ + "このランでスキップされた", + "ブラインドごとに {C:money}$#1#{} 与える", + "{C:inactive}(最高 {C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="スタンダードタグ", + text={ + "無料の", + "{C:attention}メガスタンダードパック{} を与える", + }, + }, + tag_top_up={ + name="トップアップタグ", + text={ + "{C:blue}コモン{} ジョーカーを", + "最大{C:attention}#1#{} まで作る", + "{C:inactive}(空きが必要)", + }, + }, + tag_uncommon={ + name="アンコモンタグ", + text={ + "ショップに出現:無料の", + "{C:green}アンコモンジョーカー", + }, + }, + tag_voucher={ + name="バウチャータグ", + text={ + "次のショップに", + "{C:voucher}バウチャー{} を1つ加える", + }, + }, + }, + Tarot={ + c_chariot={ + name="戦車", + text={ + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する", + }, + }, + c_death={ + name="死神", + text={ + "{C:attention}#1#{} 枚のカードを選択し", + "{C:attention}左{} のカードを", + "{C:attention}右{} のカードに変換する", + "{C:inactive}(ドラッグして並べ替え)", + }, + }, + c_devil={ + name="悪魔", + text={ + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する", + }, + }, + c_emperor={ + name="皇帝", + text={ + "ランダムな {C:tarot}タロット{} カードを", + "最大 {C:attention}#1#{} 枚まで作る", + "{C:inactive}(空きが必要)", + }, + }, + c_empress={ + name="女帝", + text={ + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する", + }, + }, + c_fool={ + name="愚者", + text={ + "このランで使用された", + "最後の {C:tarot}タロット{} または {C:planet}惑星{} カードを", + "作る", + "ただし {s:0.8,C:tarot}愚者{s:0.8} は除く", + }, + }, + c_hanged_man={ + name="吊された男", + text={ + "{C:attention}#1#{} 枚までの", + "選択されたカードを破壊する", + }, + }, + c_heirophant={ + name="教皇", + text={ + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する", + }, + }, + c_hermit={ + name="隠者", + text={ + "資金を2倍にする", + "{C:inactive}(最高 {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="女教皇", + text={ + "ランダムな {C:planet}惑星{} カードを", + "最大 {C:attention}#1#{} 枚まで作る", + "{C:inactive}(空きが必要)", + }, + }, + c_judgement={ + name="審判", + text={ + "ランダムな {C:attention}ジョーカー{} カードを", + "作る", + "{C:inactive}(空きが必要)", + }, + }, + c_justice={ + name="正義", + text={ + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する", + }, + }, + c_lovers={ + name="恋人", + text={ + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する", + }, + }, + c_magician={ + name="魔術師", + text={ + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する", + }, + }, + c_moon={ + name="月", + text={ + "{C:attention}#1#{} 枚までの", + "選択されたカードを", + "{V:1}#2#{} に変換する", + }, + }, + c_star={ + name="星", + text={ + "{C:attention}#1#{} 枚までの", + "選択されたカードを", + "{V:1}#2#{} に変換する", + }, + }, + c_strength={ + name="強さ", + text={ + "最大 {C:attention}#1#{} 枚の", + "選択されたカードを", + "{C:attention}1{} つ大きい数字にする", + }, + }, + c_sun={ + name="太陽", + text={ + "{C:attention}#1#{} 枚までの", + "選択されたカードを", + "{V:1}#2#{} に変換する", + }, + }, + c_temperance={ + name="節制", + text={ + "現在のすべてのジョーカーの", + "セルバリューの合計を与える", + "{C:inactive}(最高 {C:money}$#1#{C:inactive})", + "{C:inactive}(現在 {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="塔", + text={ + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する", + }, + }, + c_wheel_of_fortune={ + name="運命の輪", + text={ + "{C:green}#2#分の#1#{} の確率で", + "ランダムな {C:attention}ジョーカー{} に", + "{C:dark_edition}フォイル{}、 {C:dark_edition}ホログラム{}", + "{C:dark_edition}ポリクローム{} エディションのいずれかを加える", + }, + }, + c_world={ + name="世界", + text={ + "{C:attention}#1#{} 枚までの", + "選択されたカードを", + "{V:1}#2#{} に変換する", + }, + }, + }, + Voucher={ + v_antimatter={ + name="反物質", + text={ + "ジョーカースロット {C:dark_edition}+1{}", + }, + unlock={ + "{C:voucher}ブランク{} を", + "合計 {C:attention}#1#{} 回引き換える", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="ブランク", + text={ + "{C:inactive}何もしない?", + }, + }, + v_clearance_sale={ + name="クリアランスセール", + text={ + "すべてのカードとパックが", + "ショップで {C:attention}#1#%{} オフ", + }, + }, + v_crystal_ball={ + name="水晶玉", + text={ + "消耗スロット {C:attention}+1{}", + }, + }, + v_directors_cut={ + name="ディレクターズカット", + text={ + "ボスブラインドをアンティごとに", + "{C:attention}1{} 回リロールする", + "1ロールあたり {C:money}$#1#{}", + }, + }, + v_glow_up={ + name="グローアップ", + text={ + "{C:dark_edition}フォイル{}、{C:dark_edition}ホログラム{}", + "{C:dark_edition}ポリクローム{} カードの", + "出現確率 {C:attention}#1#X{}", + }, + unlock={ + "{C:dark_edition}フォイル{}、 {C:dark_edition}ホログラム{}", + "{C:dark_edition}ポリクローム{} エディションの", + "いずれかの {C:attention}ジョーカー{} カードを", + "{C:attention}#1#{} 枚以上持つ", + }, + }, + v_grabber={ + name="グラバー", + text={ + "ラウンドごとに", + "永久的に", + "ハンド {C:blue}+#1#{} を得る", + }, + }, + v_hieroglyph={ + name="ヒエログリフ", + text={ + "アンティ {C:attention}-#1#{}、", + "毎ラウンドの", + "ハンド{C:blue}-#1#{}", + }, + }, + v_hone={ + name="ホーン", + text={ + "{C:dark_edition}フォイル{}、{C:dark_edition}ホログラム{}", + "{C:dark_edition}ポリクローム{} カードの", + "出現確率 {C:attention}#1#X{}", + }, + }, + v_illusion={ + name="イリュージョン", + text={ + "ショップの {C:attention}トランプ{} が", + "{C:enhanced}強化{} 、 {C:dark_edition}エディション{}、および/または{C:attention}シール{}の", + "いずれかになる可能性がある", + }, + unlock={ + "ショップで", + "合計 {C:attention}#1#{} 枚のトランプを", + "購入する", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="清算", + text={ + "すべてのカードとパックが", + "ショップで {C:attention}#1#%{} オフ", + }, + unlock={ + "1回のランで", + "{C:attention}#1#{} 枚の {C:voucher}バウチャー{} カードを", + "引き換える", + }, + }, + v_magic_trick={ + name="マジックトリック", + text={ + "{C:attention}トランプ{} を", + "{C:attention}ショップ{} で", + "購入できる", + }, + }, + v_money_tree={ + name="マネーツリー", + text={ + "ラウンドごとの", + "利息獲得量の", + "上限を${C:money}#1#{}に増加する", + }, + unlock={ + "{C:attention}#1#{} ラウンド連続で", + "ラウンド利益の利息を", + "最大にする", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="ナチョトング", + text={ + "ラウンドごとに", + "永久的に", + "ハンド {C:blue}+#1#{} を得る", + }, + unlock={ + "合計 {C:attention}#1#{} 枚の", + "カードをプレイする", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="天文台", + text={ + "{C:attention}消耗{} エリアの", + "{C:planet}惑星{} カードが", + "特定のポーカーハンドに", + "倍率 {X:red,C:white}X#1#{} を与える", + }, + unlock={ + "いずれかの{C:planet}天体パック{} から", + "合計 {C:attention}#1#{} 枚の", + "{C:planet}惑星{} カードを使用する", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="オーメングローブ", + text={ + "{C:spectral}スペクトル{} カードが", + "いずれかの {C:attention}アルカナパック{} に", + "含まれている可能性がある", + }, + unlock={ + "いずれかの{C:tarot}アルカナパック{} から", + "合計 {C:attention}#1#{} 枚の", + "{C:tarot}タロット{} カードを使用する", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="オーバーストック", + text={ + "カードスロット {C:attention}+1{} が", + "ショップで購入できる", + }, + }, + v_overstock_plus={ + name="オーバーストックプラス", + text={ + "カードスロット {C:attention}+1{} が", + "ショップで購入できる", + }, + unlock={ + "ショップで", + "合計 {C:money}$#1#{} 使う", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="ペイント ブラシ", + text={ + "ハンドにカードを", + "{C:attention}+#1#{} 枚持てる", + "ハンドサイズ {C:attention}+#1#{}", + }, + }, + v_palette={ + name="パレット", + text={ + "ハンドにカードを", + "{C:attention}+#1#{} 枚持てる", + "ハンドサイズ {C:attention}+#1#{}", + }, + unlock={ + "ハンドサイズを", + "{C:attention}#1#{} 枚まで減らす", + }, + }, + v_petroglyph={ + name="ペトログリフ", + text={ + "アンティ {C:attention}-#1#{}、", + "毎ラウンドの", + "ディスカード {C:red}-#1#{}", + }, + unlock={ + "アンティ {C:attention}-#1#{}", + "{E:1,C:attention}#1#{} に到達する", + }, + }, + v_planet_merchant={ + name="惑星商人", + text={ + "ショップでの", + "{C:planet}惑星{} カードの", + "出現確率 {C:attention}#1#X{}", + }, + }, + v_planet_tycoon={ + name="惑星タイクーン", + text={ + "ショップでの", + "{C:planet}惑星{} カードの", + "出現確率 {C:attention}#1#X{}", + }, + unlock={ + "ショップで", + "{C:attention}#1#{} 枚の {C:planet}惑星{} カードを", + "購入する", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="リサイクロマンシー", + text={ + "ラウンドごとに", + "永久的に", + "ディスカード {C:red}+#1#{}を得る", + }, + unlock={ + "合計 {C:attention}#1#{} 枚の", + "カードをディスカードする", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="リロールグラト", + text={ + "リロールのコストが", + "{C:money}$#1#{} 減少する", + }, + unlock={ + "ショップを", + "合計 {C:attention}#1#{} 回リロールする", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="リロールサープラス", + text={ + "リロールのコストが", + "{C:money}$#1#{} 減少する", + }, + }, + v_retcon={ + name="リトコン", + text={ + "ボスブラインドを", + "回数 {C:attention}無制限{} でリロールする", + "リロール1回につき{C:money}$#1#{}", + }, + unlock={ + "{C:attention}#1#{} のブラインドを", + "発見する", + }, + }, + v_seed_money={ + name="シードマネー", + text={ + "ラウンドごとの", + "利息獲得量の", + "上限を${C:money}#1#{}に増加する", + }, + }, + v_tarot_merchant={ + name="タロット商人", + text={ + "ショップでの", + "{C:tarot}タロット{} カードの", + "出現確率 {C:attention}#1#X{}", + }, + }, + v_tarot_tycoon={ + name="タロットタイクーン", + text={ + "ショップでの", + "{C:tarot}タロット{} カードの", + "出現確率 {C:attention}#1#X{}", + }, + unlock={ + "ショップで", + "合計 {C:attention}#1#{} 枚の {C:tarot}タロット{} カードを", + "購入する", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="望遠鏡", + text={ + "最もプレイされた {C:attention}ポーカーハンド{} の", + "{C:planet}惑星{} カードが", + "{C:attention}天体パック{} に", + "常に含まれる", + }, + }, + v_wasteful={ + name="浪費", + text={ + "ラウンドごとに", + "永久的に", + "ディスカード {C:red}+#1#{}を得る", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="1回のハンドでチップ100,000,000をスコアする", + _1000k="1回のハンドでチップ1,000,000をスコアする", + _10k="1回のハンドでチップ10,000をスコアする", + ante_up="アンティ4に到達する", + ante_upper="アンティ8に到達する", + astronomy="すべての惑星カードを発見する", + big_hands="デッキを80枚以上にする", + card_discarder="2500枚以上のカードをディスカードする", + card_player="2500枚以上のカードをプレイする", + cartomancy="すべてのタロットカードを発見する", + clairvoyance="すべてのスペクトルカードを発見する", + completionist="コレクションを100%にする", + completionist_plus="ゴールドステークの難易度ですべてのデッキで勝利する", + completionist_plus_plus="すべてのジョーカーでゴールドステッカーを獲得する", + extreme_couponer="すべてのバウチャーを発見する", + flushed="ワイルドカード5枚でフラッシュをプレイする", + heads_up="ランに勝利する", + high_stakes="ゴールドステーク以上の難易度でランに勝利する", + legendary="レジェンドジョーカーを発見する", + low_stakes="レッドステーク以上の難易度でランに勝利する", + mid_stakes="ブラックステーク以上の難易度でランに勝利する", + nest_egg="1回のランで$400以上獲得する ", + retrograde="いずれかのポーカーハンドをレベル10にする", + roi="アンティ4でバウチャーを5購入する", + royale="ロイヤルフラッシュをプレイする", + rule_bender="いずれかのチャレンジランを完了する", + rule_breaker="すべてのチャレンジランを完了する", + shattered="1回のハンドで2枚のグラスカードを割る", + speedrunner="12ラウンド以内にランに勝利する", + tiny_hands="デッキを20枚以下にする", + you_get_what_you_get="ショップをリロールせずにランに勝利する", + }, + achievement_names={ + _100000k="100,000K", + _1000k="1,000K", + _10k="10K", + ante_up="アンティアップ!", + ante_upper="アンティアッパー!", + astronomy="天文学", + big_hands="ビッグハンド", + card_discarder="カードディスカーダー", + card_player="カードプレイヤー", + cartomancy="カード占い", + clairvoyance="透視能力", + completionist="完全主義者", + completionist_plus="完全主義者+", + completionist_plus_plus="完全主義者++", + extreme_couponer="エクストリームクーポナー", + flushed="フラッシュ", + heads_up="ヘッドアップ", + high_stakes="ハイステーク", + legendary="レジェンド", + low_stakes="ローステーク", + mid_stakes="ミッドステーク", + nest_egg="ネストエッグ", + retrograde="レトログレード", + roi="ROI", + royale="ロワイヤル", + rule_bender="ルールベンダー", + rule_breaker="ルールブレイカー", + shattered="シャッター", + speedrunner="スピードランナー", + tiny_hands="タイニーハンド", + you_get_what_you_get="得られるものを得よ", + }, + blind_states={ + Current="現在", + Defeated="敗北", + Select="選択", + Selected="選択中", + Skipped="スキップ", + Upcoming="今後", + }, + challenge_names={ + c_blast_off_1="吹き飛ばし", + c_bram_poker_1="ブラムポーカー", + c_city_1="15分都市", + c_cruelty_1="残虐", + c_double_nothing_1="一か八か", + c_five_card_1="ファイブカードドロー", + c_fragile_1="フラジャイル", + c_golden_needle_1="ゴールデンニードル", + c_inflation_1="インフレ", + c_jokerless_1="ジョーカーなし", + c_knife_1="紙一重", + c_luxury_1="ぜいたく税", + c_mad_world_1="狂気の世界", + c_medusa_1="メデューサ", + c_monolith_1="一枚岩", + c_non_perishable_1="保存食", + c_omelette_1="オムレツ", + c_rich_1="大富豪", + c_typecast_1="はまり役", + c_xray_1="透視能力", + }, + collabs={ + Clubs={ + ["1"]="デフォルト", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="デフォルト", + ["2"]="デイヴ・ザ・ダイバー", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="デフォルト", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="デフォルト", + ["2"]="ウィッチャー", + ["3"]="サイバーパンク2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="FAQ", + b_and_use="& 使用", + b_back="戻る", + b_blinds="ブラインド", + b_booster_packs="ブースターパック", + b_buy="購入", + b_cash_out="清算", + b_challenges="チャレンジ", + b_collection="コレクション", + b_collection_cap="コレクション", + b_continue="続ける", + b_copy="コピー", + b_copy_seed="シードをコピー", + b_create_profile="プロフィールを作成", + b_credits="クレジット", + b_current_profile="現在のプロフィール", + b_customize_deck="デッキのカスタマイズ", + b_deck="デッキ", + b_decks="デッキ", + b_delete_profile="プロフィールを削除", + b_discard="ディスカード", + b_editions="エディション", + b_endless="エンドレスモード", + b_enhanced_cards="強化されたカード", + b_full_deck="フルデッキ", + b_high_contrast_cards="ハイコントラストカード", + b_how_to_play="遊び方", + b_imagery="画像", + b_jokers="ジョーカー", + b_load_profile="プロフィールをロード", + b_main_menu="メインメニュー", + b_music="ミュージック", + b_new_challenge="新しいチャレンジをスタート", + b_new_run="新しいラン", + b_next="次", + b_next_round_1="次の", + b_next_round_2="ラウンド", + b_open="開封", + b_options="オプション", + b_options_cap="オプション", + b_planet_cards="惑星カード", + b_play_cap="プレイ", + b_play_hand="ハンドをプレイ", + b_playbalatro="playbalatro.comに移動する", + b_poker_hands="ポーカーハンド", + b_quit_cap="終了", + b_redeem="引き換え", + b_reduced_motion="動作の軽減", + b_remaining="残り", + b_reroll_boss="ボスをリロール", + b_reset_profile="プロフィールをリセット", + b_restrictions="制限事項", + b_retry="再トライ", + b_rules="ルール", + b_run_info_1="ラン", + b_run_info_2="情報", + b_seals="シール", + b_seed="シード", + b_select="選択", + b_sell="売却", + b_set_CRT="CRT", + b_set_CRT_bloom="CRTブルーム", + b_set_apply="適用", + b_set_audio="オーディオ", + b_set_crash_reports="クラッシュレポート", + b_set_game="ゲーム", + b_set_game_vol="ゲーム音量", + b_set_gamespeed="ゲームスピード", + b_set_graphics="グラフィック", + b_set_master_vol="マスター音量", + b_set_monitor="ディスプレイモニター", + b_set_music_vol="ミュージック音量", + b_set_pixel_smoothing="ピクセルアートのスムージング", + b_set_play_discard_pos="プレイ/ディスカード ボタンの位置", + b_set_rumble="コントローラーの振動", + b_set_screenshake="画面の揺れ", + b_set_shadows="影", + b_set_vibration="振動", + b_set_video="画面表示", + b_set_windowmode="ウィンドウモード", + b_settings="設定", + b_skip="スキップ", + b_skip_blind="ブラインドをスキップ", + b_skip_reward="報酬をスキップ", + b_sort_hand="ハンドをソート", + b_sounds="サウンド", + b_spectral_cards="スペクトルカード", + b_stake="ステーク", + b_start_new_run="新しいラン", + b_stat_consumables="消耗", + b_stat_jokers="ジョーカー", + b_stat_planets="惑星", + b_stat_spectrals="スペクトル", + b_stat_tarots="タロット", + b_stat_vouchers="バウチャー", + b_stats="統計", + b_tags="タグ", + b_tarot_cards="タロットカード", + b_unlock_all="すべてをアンロック", + b_use="使用", + b_vouchers="バウチャー", + b_wishlist="Steamのウィッシュリストに登録", + k_aces="エース", + k_achievement="実績", + k_achievements_disabled="実績が無効化", + k_active="アクティブ", + k_active_ex="アクティブ!", + k_again_ex="再び!", + k_all_hands="すべてのハンド", + k_also_applied="適用中", + k_ante="アンティ", + k_ante_cap="アンティ", + k_arcana_pack="アルカナパック", + k_balanced="バランス", + k_banned_cards="使用禁止カード", + k_banned_tags="使用禁止タグ", + k_base_cap="ベース", + k_base_cards="ベースカード", + k_best_hand="ベストハンド", + k_booster="ブースター", + k_buffoon_pack="道化師パック", + k_cap_consumables="消耗", + k_card_stats="カード統計", + k_celestial_pack="天体パック", + k_challenge_mode="チャレンジモード", + k_challenges="チャレンジ", + k_choose="選択", + k_collection="コレクション", + k_common="コモン", + k_compatible="適合", + k_copied_ex="コピー!", + k_custom_rules="カスタムルール", + k_daily_run="デイリーラン", + k_debuffed="デバフ状態", + k_deck="デッキ", + k_deck_stake_wins="デッキステーク勝利数", + k_defeated_by="敗北:", + k_demo_version_ex="体験版!", + k_disabled_ex="無効!", + k_drank_ex="ドランク!", + k_duplicated_ex="重複!", + k_dwarf_planet="小惑星", + k_eaten_ex="食べられた!", + k_edition="エディション", + k_effective="効果", + k_empty_caps="なし", + k_enter_name="名前を入力", + k_enter_seed="シードを入力", + k_enter_text="テキストを入力", + k_eroded_ex="横取りされた!", + k_extinct_ex="消滅!", + k_face_cards="フェイスカード", + k_game_modifiers="ゲーム編集", + k_gold="ゴールド", + k_high_score_ex="ハイスコア!", + k_hud_discards="ディスカード", + k_hud_hands="ハンド", + k_incompatible="不適合", + k_joker="ジョーカー", + k_joker_stickers="ジョーカーステッカー", + k_jokers_cap="ジョーカー", + k_legendary="レジェンド", + k_level_prefix="レベル", + k_level_up_ex="レベルアップ!", + k_locked="ロック中", + k_lower_score="スコア", + k_lvl="レベル", + k_melted_ex="メルト!", + k_money="資金", + k_mult="倍率", + k_no_other_jokers="他のジョーカーなし!", + k_no_reward="報酬なし", + k_no_room_ex="空きなし!", + k_no_space_ex="スペースなし!", + k_none="なし", + k_nope_ex="いいえ!", + k_not_allowed_ex="禁止!", + k_not_discovered="未発見", + k_numbered_cards="ナンバーカード", + k_or="または", + k_other="その他", + k_page="ページ", + k_planet="惑星", + k_planet_q="惑星?", + k_playing_as="プレイヤー", + k_plus_joker="+1 ジョーカー", + k_plus_planet="+1 惑星", + k_plus_spectral="+1 スペクトル", + k_plus_stone="+1 ストーン", + k_plus_tarot="+1 タロット", + k_poker_hand="ポーカーハンド", + k_profile="プロフィール", + k_progress="進行状況", + k_rank="ランク", + k_rare="レア", + k_redeemed_ex="引き換え!", + k_reroll="リロール", + k_reset="リセット", + k_reward="報酬", + k_round="ラウンド", + k_safe_ex="セーフ!", + k_saved_ex="セーブ!", + k_seed="シード", + k_seeded_run="シードされたラン", + k_skipped_cap="スキップ", + k_spectral="スペクトル", + k_spectral_pack="スペクトルパック", + k_stake="ステーク", + k_stake_level="ステークレベル", + k_standard_pack="スタンダードパック", + k_suit="スーツ", + k_swapped_ex="スワップ!", + k_tarot="タロット", + k_trophies_disabled="トロフィーの無効化", + k_trophy="トロフィー", + k_uncommon="アンコモン", + k_undisovered="未発見", + k_unknown="?????", + k_unlocked_ex="アンロック!", + k_upgrade_ex="アップグレード!", + k_val_up="バリューアップ!", + k_view="表示", + k_voucher="バウチャー", + k_vouchers_cap="バウチャー", + k_wins="勝利", + k_x_base="X ベース", + ml_bloom_opt={ + "オフ", + "オン", + }, + ml_buy_and_use_target={ + "購入", + "& 使用", + }, + ml_buy_target={ + "購入", + }, + ml_card_stats={ + "カード", + "統計", + }, + ml_controller_required={ + "プレイするにはゲームコントローラーが必要です。", + "コントローラーを接続してから再開してください。", + }, + ml_crash_report_info={ + "クラッシュレポートは開発者に送信され", + "今後の問題解決に役立てられます", + "識別情報や個人情報は送信されません", + }, + ml_demo_thanks_message={ + "BalatroをSteamのウィッシュリストに登録し", + "playbalatro.comにサインアップして", + "ニュースレターに登録してください", + }, + ml_disabled_seed={ + "すべてのアンロックと", + "発見が無効化", + }, + ml_edition_seal_enhancement_explanation={ + "カードはそれぞれ、強化、エディション、", + "シールを1つずつ持つことができます", + }, + ml_eternal={ + "エターナル", + "売ることも", + "壊すこともできない", + }, + ml_gold_seal_desc={ + "ゴールドシール", + "プレイされた時", + "手札に戻す", + }, + ml_offline_message={ + "このデバイスは現在オフラインです。", + "現在の保存データは古い可能性があります。", + }, + ml_open_target={ + "開封", + }, + ml_paste_seed={ + "貼り付け", + "シード", + }, + ml_play_discard_pos_opt={ + "ディスカード/プレイ", + "プレイ/ディスカード", + }, + ml_redeem_target={ + "引き換え", + }, + ml_sell_target={ + "売却", + }, + ml_shadow_opt={ + "オン", + "オフ", + }, + ml_smoothing_opt={ + "オフ", + "オン", + }, + ml_unlock_all_explanation={ + "警告! コンプリートコレクションをアンロックすると", + "このプロフィールの実績が無効になります!", + }, + ml_unlock_all_trophies={ + "警告! コンプリートコレクションをアンロックすると", + "このプロフィールのトロフィーが無効になります!", + }, + ml_vsync_opt={ + "垂直同期オン", + "垂直同期オフ", + }, + ml_windowmode_opt={ + "ウィンドウ", + "フルスクリーン", + "ボーダーレス", + }, + ph_1_level="+1レベル", + ph_4_7_of_clubs="4x クラブの7", + ph_alert_debuff_confirm="もう一度「プレイ」を押して確認", + ph_all_poker_hand="すべてのポーカーハンド", + ph_blind_reward="報酬: ", + ph_blind_score_at_least="最低スコア", + ph_boss_disabled="ボスは無効!", + ph_choose_blind_1="あなたの次のブラインドを", + ph_choose_blind_2="選択してください", + ph_click_confirm="もう一度押して確認", + ph_deck_preview_effective="ジョーカー、ブラインド、カード強化による実質合計", + ph_deck_preview_stones="ストーン", + ph_defeat_the_boss="ボスブラインドを倒す", + ph_defeat_this_blind_1="それを見つけるために", + ph_defeat_this_blind_2="このブラインドを倒す", + ph_demo_thanks_1="プレイして頂きありがとうございます", + ph_demo_thanks_2="BALATRO 体験版", + ph_display_stickers="ラン中にステークのステッカーを掲示する", + ph_game_over="ゲームオーバー", + ph_improve_run="ランを改善しよう!", + ph_most_played="(最もプレイされたハンド)", + ph_mr_bones="ミスターボーンズで死を回避", + ph_no_boss_active="アクティブなボスなし", + ph_no_vouchers="このランで引き換えられたバウチャーなし", + ph_score_at_least="最低スコア", + ph_score_cards_discarded="ディスカードしたカードの枚数", + ph_score_cards_played="プレイしたカードの枚数", + ph_score_cards_purchased="購入したカードの枚数", + ph_score_furthest_ante="アンティ", + ph_score_furthest_round="ラウンド", + ph_score_hand="ベストハンド", + ph_score_new_collection="新発見", + ph_score_poker_hand="最もプレイされたハンド", + ph_score_times_rerolled="リロールした回数", + ph_select_challenge="チャレンジを選択", + ph_sneak_peek="プレビュー", + ph_stat_consumable="そのカードの使用回数", + ph_stat_joker="そのカードで完了した合計ラウンド数", + ph_stat_voucher="そのバウチャーが引き換えられた回数", + ph_unscored_hand="ハンドがスコアされない", + ph_up_ante_1="アンティを上げる", + ph_up_ante_2="すべてのブラインドをレイズ", + ph_up_ante_3="ブラインドを更新", + ph_vouchers_redeemed="このランで引き換えられたバウチャーの数", + ph_you_win="勝利!", + ph_you_win_demo="体験版に勝利!", + }, + high_scores={ + boss_streak="連続最多ボス", + collection="コレクション", + current_streak="", + furthest_ante="最高アンティ", + furthest_round="最高ラウンド", + hand="ベストハンド", + most_money="最多マネー", + poker_hand="最もプレイされたハンド", + win_streak="連勝記録", + }, + labels={ + blue_seal="ブルーシール", + common="コモン", + eternal="エターナル", + foil="フォイル", + gold_seal="ゴールドシール", + holographic="ホログラム", + legendary="レジェンド", + locked="ロック中", + negative="ネガティブ", + perishable="摩耗", + pinned_left="ピン留め", + planet="惑星", + pluto_planet="小惑星", + polychrome="ポリクローム", + purple_seal="パープルシール", + rare="レア", + red_seal="レッドシール", + rental="レンタル", + tarot="タロット", + uncommon="アンコモン", + voucher="バウチャー", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "同じランクのカード5枚", + }, + Flush={ + "同じスーツのカード5枚", + }, + ["Flush Five"]={ + "同じランクとスーツのカード5枚", + }, + ["Flush House"]={ + "すべてのカードが同じスーツの", + "スリーカードとワンペア", + }, + ["Four of a Kind"]={ + "同じランクのカード4枚", + "スコアされないカードが1枚あってもよい", + }, + ["Full House"]={ + "スリーカードとワンペア", + }, + ["High Card"]={ + "プレイされたハンドが上記のハンドではない場合", + "最もランクの高いカードだけがスコアされる", + }, + Pair={ + "同じランクのカード2枚", + "スコアされないカードが3枚あってもよい", + }, + ["Royal Flush"]={ + "すべてが同じスーツの", + "ランクが連続したカード5枚", + }, + Straight={ + "ランクが連続したカード5枚", + }, + ["Straight Flush"]={ + "すべてが同じスーツの", + "ランクが連続したカード5枚", + }, + ["Three of a Kind"]={ + "同じランクのカード3枚", + "スコアされないカードが2枚あってもよい", + }, + ["Two Pair"]={ + "異なるランクのカード2組", + "スコアされないカードが1枚あってもよい", + }, + }, + poker_hands={ + ["Five of a Kind"]="ファイブカード", + Flush="フラッシュ", + ["Flush Five"]="フラッシュファイブ", + ["Flush House"]="フラッシュハウス", + ["Four of a Kind"]="フォーカード", + ["Full House"]="フルハウス", + ["High Card"]="ハイカード", + Pair="ワンペア", + ["Royal Flush"]="ロイヤルフラッシュ", + Straight="ストレート", + ["Straight Flush"]="ストレートフラッシュ", + ["Three of a Kind"]="スリーカード", + ["Two Pair"]="ツーペア", + }, + quips={ + dq_1={ + "マズイぞ! この", + "ファイナルチャレンジ", + "のために何か対策を", + "打たなければ!", + }, + lq_1={ + "もっと簡単なカードゲームの方が", + "私たちのスピードには", + "合っているのかもしれない…", + }, + lq_10={ + "大失敗だ!", + }, + lq_2={ + "楽な相手だ!", + " ", + }, + lq_3={ + "いったん引いて", + "再挑戦しよう!", + " ", + }, + lq_4={ + "ギャンブルでは", + "そう簡単には", + "勝てないんだ!", + }, + lq_5={ + "どうやら本物の", + "ジョーカーが誰なのか", + "わかったぞ!", + }, + lq_6={ + "おっと、きみも", + "ブラフだったのか?", + }, + lq_7={ + "どうやら冗談は", + "通じないらしい!", + }, + lq_8={ + "もし私に手があったら", + "目を覆うところだったよ!", + " ", + }, + lq_9={ + "私は文字通りの", + "愚か者なんだ", + "そうだろう?", + }, + wq_1={ + "カンペキだ!", + }, + wq_2={ + "うまく対応したね!", + " ", + }, + wq_3={ + "どうやらブラフじゃ", + "なかったようだね!", + }, + wq_4={ + "残念だけど", + "このチップはすべて", + "バーチャルなんだ…", + }, + wq_5={ + "私が教えたことを", + "しっかり覚えているね!", + }, + wq_6={ + "すばらしいプレイが", + "いくつもあったよ!", + }, + wq_7={ + "きみに賭けなくて", + "よかったよ!", + " ", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="エース", + Jack="ジャック", + King="キング", + Queen="クイーン", + }, + suits_plural={ + Clubs="クラブ", + Diamonds="ダイヤ", + Hearts="ハート", + Spades="スペード", + }, + suits_singular={ + Clubs="クラブ", + Diamonds="ダイヤ", + Hearts="ハート", + Spades="スペード", + }, + tutorial={ + bb_1={ + "{C:attention}ビッグブラインド{} を選択すると", + "キャッシュをいくらか獲得できる。", + }, + bb_2={ + "もしくは {C:attention}スキップ{} を選択して", + "{C:attention}タグ{} を取得することもできるんだ!", + "{C:attention}タグ{} はそれぞれ特殊効果を持っている。", + }, + bb_3={ + "しかし {C:attention}ボスブラインド{} には", + "気をつけよう。", + "ボスブラインドの能力に対抗するには", + "戦略が必要になる。", + }, + bb_4={ + "ボスブラインドを倒すと", + "{C:attention}アンティ{} が上がり", + "すべての {C:attention}ブラインド{} が難しくなる。", + }, + bb_5={ + "{C:attention}アンティ{} #1# を破って勝利しよう。", + "さあ 自分の道を選ぼう!", + }, + fh_1={ + "{C:attention}ポーカーハンド{} をプレイして", + "チップを獲得しよう。", + }, + fh_2={ + "それぞれの {C:attention}ポーカーハンド{} は", + "{C:blue}チップ{} の基本値に", + "{C:red}倍率{} をかけた額を獲得する。", + }, + fh_3={ + "{C:attention}ラン情報{} エリアで", + "{C:attention}ポーカーハンド{} を確認しよう。", + "現在のランに関する", + "その他の情報もある。", + }, + fh_4={ + "カードでも {C:blue}チップ{} を", + "獲得することができる。", + "カーソルを合わせて確認しよう!", + }, + fh_4_touch={ + "カードでも {C:blue}チップ{} を", + "獲得することができる。", + "ホールドして確認しよう!", + }, + fh_5={ + "プレイするカードを", + "{C:attention}5{} 枚まで選んで", + "{C:blue}「プレイハンド」{} を押そう。", + }, + fh_5_touch={ + "プレイするカードを", + "{C:attention}5{} 枚までタップして", + "{C:blue}「ハンドをプレイ」を押そう。", + }, + fh_6={ + "選択したカードを{C:attention}5{}枚まで", + "{C:red}「ディスカード」{} することもできる。", + "さらに強いハンドを作れるかもしれない。", + "やってみよう!", + }, + fh_7={ + "ラウンドごとに使用できる {C:blue}ハンド{} と", + "{C:red}ディスカード{} の回数には", + "限りがあるから注意しよう!", + }, + fh_8={ + "{C:blue}ハンド{} がなくなる前に", + "{C:attention}300チップ{} 獲得して", + "このラウンドに勝利しよう。", + "応援しているよ!", + }, + s_1={ + "うまくいったね!さあ 次は", + "{C:money}キャッシュ{} が{E:1}たまった{} から", + "{C:attention}ショップ{} で新しいカードを", + "購入しよう。", + }, + s_10={ + "{C:attention}バウチャー{} は", + "{C:attention}ボスブラインド{} を倒すと", + "再び補充される。", + }, + s_11={ + "各ショップにある {C:booster}ブースターパック{} も", + "チェックしておこう。", + "{C:booster}ブースターパック{} には", + "いろいろなグッズが入っているんだ!", + }, + s_12={ + "準備ができたら", + "{C:attention}次のラウンド{} に進もう。", + }, + s_2={ + "このハンサムな", + "悪魔を買ってみよう。", + }, + s_2_touch={ + "このハンサムな", + "悪魔を買ってみよう!", + "ショップから{C:attention}『購入』{}に", + "ドラッグしよう", + }, + s_3={ + "これはきみのランに加えることができる", + "{C:attention}#1#{} 種類の {C:attention}ジョーカー{} のうちの1つだ。", + "それぞれの {C:attention}ジョーカー{} は", + "異なる効果を持っている。", + }, + s_4={ + "これはきみがプレイするハンドに", + "{C:red}倍率 +4{} を加えるぞ!", + }, + s_5={ + "{C:attention}ジョーカー{} は 同時に {C:attention}5{} 枚しか", + "持つことができないから", + "注意しよう。", + }, + s_6={ + "{C:attention}ショップ{} でもう1枚", + "カードを購入しよう。", + }, + s_7={ + "この {C:tarot}タロット{} カードは", + "{C:attention}消耗{} カードだ。", + "きみのトランプを強化してくれるから", + "持っておこう。", + }, + s_8={ + "{C:attention}消耗{} カードは", + "同時に {C:attention}2{} 枚", + "持つことができる。", + }, + s_9={ + "十分な資金があれば", + "{C:attention}バウチャー{} を買うことができる。", + "{C:attention}バウチャー{} を使用すると", + "ランをアップグレードできるんだ!", + }, + sb_1={ + "やあ! 私は {C:attention}Jimbo{}", + "きみにこのゲームのプレイ方法を", + "説明しよう!", + }, + sb_2={ + "きみの目標は", + "{C:blue}チップ{} を獲得して", + "敵の {C:attention}ブラインド{} を倒すことだ。", + }, + sb_3={ + "これは {C:blue}スモールブラインド{}。", + "{C:attention}300 チップ{} 獲得すれば", + "倒すことができる。", + }, + sb_4={ + "{C:blue}スモールブラインド{} を選択して", + "ラウンドをスタートしよう!", + }, + sh_1={ + "カードが増えた時には", + "それらを並べ替えることができる。", + "{C:attention}ジョーカー{} は左から右の順に", + "発動する。", + }, + sh_2={ + "そして消耗カードは", + "必ず {C:attention}使用{} するんだ!", + }, + sh_3={ + "手札を {C:attention}2{} 枚まで選んだら", + "{C:tarot}タロット{} カードの", + "{C:attention}「使用」{} を押して", + "それらを強化しよう!", + }, + sh_3_touch={ + "手札を{C:attention}2{}枚まで選んだら", + "{C:tarot}タロット{}カードを", + "{C:attention}『使用』{}にドラッグして", + "それらを強化しよう!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# ハンド", + a_handsize="+#1# ハンドサイズ", + a_handsize_minus="ハンドサイズ -#1#", + a_mult="倍率 +#1#", + a_mult_minus="倍率 -#1#", + a_remaining="残り #1#", + a_sold_tally="#1#/#2# 売却済", + a_xmult="倍率 X#1#", + a_xmult_minus="倍率 -X#1#", + ante_x_voucher="アンティ #1# のバウチャー", + challenges_completed="チャレンジ完了 #1#/#2#", + completed="完了#1#/#2#", + deck_preview_wheel_plural="#1# 枚が裏向きでドローされたため、数字が小さくなる可能性があります", + deck_preview_wheel_singular="#1# 枚が裏向きでドローされたため、数字が小さくなる可能性があります", + interest="$#2# につき利息 #1# (最大 #3#)", + loyalty_active="アクティブ!", + loyalty_inactive="残り #1#", + ml_foil_desc={ + "フォイル", + "+#1# チップ", + }, + ml_holo_desc={ + "ホログラム", + "+#1# 倍率", + }, + ml_negative_consumable_desc={ + "ネガティブ", + "+#1# 消耗スロット", + }, + ml_negative_desc={ + "ネガティブ", + "すべてのラウンドで", + }, + ml_polychrome_desc={ + "ポリクローム", + "倍率 X#1#", + }, + remaining_discard_money="残りのディスカード(各$#1# )", + remaining_hand_money="残りのハンド(各$#1# )", + unlocked="アンロック済#1#/#2#", + }, + v_text={ + ch_c_all_eternal={ + "すべてのショップのジョーカーが {C:eternal}エターナル{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}チップ{} が現在の {C:money}${} を超えることはできない", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}デイリーチャレンジ!", + }, + ch_c_debuff_played_cards={ + "{C:attention}プレイした{} すべてのカードに、スコア後{C:attention}デバフ{} がかかる", + }, + ch_c_discard_cost={ + "ディスカードのたびに {C:money}$#1#{} の費用がかかる", + }, + ch_c_flipped_cards={ + "{C:green}#1#枚につき1枚{} は裏向きでドローされる", + }, + ch_c_inflation={ + "永久的に、購入するたびに{C:money}$1{} 値上がりする", + }, + ch_c_minus_hand_size_per_X_dollar={ + "所持金 {C:money}$#1#{} ごとにハンド {C:red}-1{} 枚", + }, + ch_c_no_extra_hand_money={ + "追加の {C:blue}ハンド{} では資金が得られない", + }, + ch_c_no_interest={ + "ラウンド終了時に {C:attention}利息{} を得ない", + }, + ch_c_no_reward={ + "すべての {C:attention}ブラインド{} が報奨金を与えない", + }, + ch_c_no_reward_specific={ + "{C:attention}#1#のブラインド{} が報奨金を与えない", + }, + ch_c_no_shop_jokers={ + "ジョーカーが今後{C:attention}ショップ{} に出現しない", + }, + ch_c_none={ + "{C:inactive}なし", + }, + ch_c_set_eternal_ante={ + "アンティが{C:attention}#1#{} の時にボスを倒すと、すべてのジョーカーが{C:attention}エターナルになる{}", + }, + ch_c_set_joker_slots_ante={ + "アンティが{C:attention}#1#{} の時にボスを倒すと、ジョーカーのスロットが{C:attention}0{} になる", + }, + ch_c_set_seed={ + "シードを設定して1回試行: {C:inactive}{非表示}", + }, + ch_m_consumable_slots={ + "消耗スロット {C:attention}#1#{}", + }, + ch_m_discards={ + "ラウンドごとにディスカード {C:red}#1#{}", + }, + ch_m_dollars={ + "{C:money}$#1#{} でスタート", + }, + ch_m_hand_size={ + "ハンドサイズ{C:attention}#1#{}", + }, + ch_m_hands={ + "ラウンドごとにハンド {C:blue}#1#{}", + }, + ch_m_joker_slots={ + "ジョーカースロット {C:attention}#1#{}", + }, + ch_m_none={ + "{C:inactive}なし", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/ko.lua b/src/localization/ko.lua new file mode 100644 index 0000000..a6ab12d --- /dev/null +++ b/src/localization/ko.lua @@ -0,0 +1,4318 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="버려진 덱", + text={ + "덱에", + "{C:attention}그림 카드{} 없이", + "런을 시작합니다", + }, + }, + b_anaglyph={ + name="입체 사진 덱", + text={ + "각 {C:attention}보스 블라인드{} 를", + "물리친 후,", + "{C:attention,T:tag_double}#1#{}을(를) 획득합니다", + }, + }, + b_black={ + name="블랙 덱", + text={ + "매 라운드", + "", + "{C:attention}+#1#{} 개의 조커 슬롯", + "{C:blue}-#2#{} 핸드", + }, + }, + b_blue={ + name="블루 덱", + text={ + "라운드마다", + "{C:red}+#1#{} 핸드", + }, + }, + b_challenge={ + name="챌린지 덱", + text={ + "", + }, + }, + b_checkered={ + name="체크무늬 덱", + text={ + "덱에 {C:attention}26{} 장의 {C:spades} 스페이드{} 및", + "{C:attention}26{} 장의 {C:hearts} 하트{} 를 갖고", + "런을 시작합니다", + }, + }, + b_erratic={ + name="불규칙한 덱", + text={ + "덱의 모든 {C:attention}랭크{} 및", + "{C:attention}수트{} 가", + "무작위로 지정됩니다", + }, + }, + b_ghost={ + name="고스트 덱", + text={ + "{C:spectral}유령{} 카드가", + "상점에서 나타납니다", + "{C:spectral,T:c_hex}헥스{} 카드로 시작합니다", + }, + }, + b_green={ + name="그린 덱", + text={ + "각 라운드 종료 시:", + "{s:0.85}남은 {C:blue}핸드{} 당 {C:money}$#1#", + "{s:0.85}남은 {C:red}버리기{} 당 {C:money}$#2#", + "{C:attention}이자{} 가 없습니다", + }, + }, + b_magic={ + name="매직 덱", + text={ + "{C:tarot,T:v_crystal_ball}#1#{} 바우처", + "및 {C:tarot,T:c_fool}#2#", + "복사본 {C:attention}2{} 장으로", + "런을 시작합니다", + }, + }, + b_nebula={ + name="네뷸라 덱", + text={ + "{C:planet,T:v_telescope}#1#{} 바우처 및", + "{C:red}#2#{} 개의 소모품 슬롯으로", + "", + "런을 시작합니다", + }, + }, + b_painted={ + name="칠한 덱", + text={ + "{C:attention}+#1#{} 핸드 크기", + "{C:red}#2#{} 조커 슬롯", + }, + }, + b_plasma={ + name="플라스마 덱", + text={ + "플레이한 핸드의", + "점수를 계산할 때 {C:blue}칩{} 과 {C:red}배수{} 의", + "균형을 맞춥니다", + "{C:red}X#1#{} 기본 블라인드 크기", + }, + }, + b_red={ + name="레드 덱", + text={ + "라운드마다", + "{C:red}+#1#{} 버리기", + }, + }, + b_yellow={ + name="옐로우 덱", + text={ + "추가 {C:money}$#1#{} 로", + "시작합니다", + }, + }, + b_zodiac={ + name="황도대 덱", + text={ + "덱에 {C:attention}26{} 장의 {C:spades} 스페이드{} 및", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "및 {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="팔", + text={ + "플레이한 포커 핸드의", + "레벨이 낮아집니다", + }, + }, + bl_big={ + name="빅 블라인드", + text={ + }, + }, + bl_club={ + name="클럽", + text={ + "모든 클럽 카드가", + "디버프됩니다", + }, + }, + bl_eye={ + name="눈", + text={ + "이 라운드에서는", + "핸드 유형의 반복이 불가능합니다", + }, + }, + bl_final_acorn={ + name="호박색 도토리", + text={ + "모든 조커 카드를", + "플립 및 셔플합니다", + }, + }, + bl_final_bell={ + name="하늘색 종", + text={ + "항상 카드 1장이", + "강제 선택됩니다", + }, + }, + bl_final_heart={ + name="진홍색 술잔", + text={ + "라운드마다 무작위로", + "조커 한장이 비활성화됩니다", + }, + }, + bl_final_leaf={ + name="심록색 잎사귀", + text={ + "1장의 조커가 팔릴 때까지", + "모든 카드가 디버프됩니다", + }, + }, + bl_final_vessel={ + name="보라색 술잔", + text={ + "대형 블라인드", + }, + }, + bl_fish={ + name="물고기", + text={ + "각 핸드의 플레이 후", + "카드가 뒤집혀서 뽑힙니다", + }, + }, + bl_flint={ + name="부싯돌", + text={ + "기본 칩과 배수가", + "절반이 됩니다", + }, + }, + bl_goad={ + name="자극", + text={ + "모든 스페이드 카드가", + "디버프됩니다", + }, + }, + bl_head={ + name="머리", + text={ + "모든 하트 카드가", + "디버프됩니다", + }, + }, + bl_hook={ + name="훅", + text={ + "핸드를 플레이할 때마다", + "2장의 무작위 카드를 버립니다", + }, + }, + bl_house={ + name="집", + text={ + "첫 핸드가", + "뒤집혀서 나옵니다", + }, + }, + bl_manacle={ + name="수갑", + text={ + "-1 핸드 크기", + }, + }, + bl_mark={ + name="가면", + text={ + "모든 그림 카드가", + "뒤집혀서 나옵니다", + }, + }, + bl_mouth={ + name="입", + text={ + "이 라운드에서는 오직", + "1개 유형의 핸드로 플레이합니다", + }, + }, + bl_needle={ + name="바늘", + text={ + "오직 한 번의 핸드로 플레이합니다", + }, + }, + bl_ox={ + name="황소", + text={ + "#1# 을(를) 플레이하면", + "돈이 $0가 됩니다", + }, + }, + bl_pillar={ + name="기둥", + text={ + "이전에 이 앤티를 플레이한", + "카드가 디버프됩니다", + }, + }, + bl_plant={ + name="행성", + text={ + "모든 그림 카드가", + "디버프됩니다", + }, + }, + bl_psychic={ + name="심령술사", + text={ + "반드시 카드 5장을 플레이해야 합니다", + }, + }, + bl_serpent={ + name="뱀", + text={ + "플레이 또는 버리기 후,", + "뽑는 카드가 3장으로 고정됩니다", + }, + }, + bl_small={ + name="스몰 블라인드", + text={ + }, + }, + bl_tooth={ + name="이빨", + text={ + "플레이한 카드당", + "$1를 잃습니다", + }, + }, + bl_wall={ + name="벽", + text={ + "특대형 블라인드", + }, + }, + bl_water={ + name="물", + text={ + "0번의 버리기로", + "시작합니다", + }, + }, + bl_wheel={ + name="바퀴", + text={ + " / 7 의 확률로 카드가", + "뒤집혀서 나옵니다", + }, + }, + bl_window={ + name="창문", + text={ + "모든 다이아몬드 카드가", + "디버프됩니다", + }, + }, + }, + Edition={ + e_base={ + name="기본", + text={ + "추가 효과 없음", + }, + }, + e_foil={ + name="포일", + text={ + "{C:chips}+#1#{} 개의 칩", + }, + }, + e_holo={ + name="홀로그래픽", + text={ + "{C:mult}+#1#{} 배수", + }, + }, + e_negative={ + name="네거티브", + text={ + "{C:dark_edition}+#1#{}개의 조커 슬롯", + }, + }, + e_negative_consumable={ + name="네거티브", + text={ + "{C:dark_edition}+#1#{}개의 소모품 슬롯", + }, + }, + e_polychrome={ + name="폴리크롬", + text={ + "{X:mult,C:white} X#1# {} 배수", + }, + }, + }, + Enhanced={ + m_bonus={ + name="보너스 카드", + text={ + }, + }, + m_glass={ + name="글래스 카드", + text={ + "{X:mult,C:white} X#1# {} 배수", + "{C:green}#2# / #3#{} 의 확률로", + "카드를 파괴합니다", + }, + }, + m_gold={ + name="골드 카드", + text={ + "라운드가 끝날 때", + "핸드에 이 카드가 있으면", + "{C:money}$#1#{}", + }, + }, + m_lucky={ + name="럭키 카드", + text={ + "{C:green}#1# / #3#{} 의 확률로", + "{C:mult}+#2#{} 배수", + "{C:green}#1# / #3#{} 의 확률로", + "{C:money}$#4# 획득", + }, + }, + m_mult={ + name="배수 카드", + text={ + "{C:mult}+#1#{} 배수", + }, + }, + m_steel={ + name="스틸 카드", + text={ + "핸드에", + "이 카드가 있는 동안", + "{X:mult,C:white} X#1# {} 배수", + }, + }, + m_stone={ + name="스톤 카드", + text={ + "{C:chips}+#1#{} 개의 칩", + "랭크 또는 수트 없음", + }, + }, + m_wild={ + name="와일드 카드", + text={ + "아무 수트에", + "사용할 수 있습니다", + }, + }, + }, + Joker={ + j_8_ball={ + name="8볼", + text={ + "득점 시{C:green}#1#/#2#{}의 확률로", + "{C:attention}8{}마다", + "{C:tarot}타로{} 카드를 생성", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + j_abstract={ + name="추상화 조커", + text={ + "{C:attention}조커{} 카드마다", + "{C:mult}+#1#{} 배수", + "{C:inactive}(현재 {C:red}+#2#{C:inactive} 배수)", + }, + }, + j_acrobat={ + name="곡예사", + text={ + "라운드의 {C:attention}최종 핸드{} 에서", + "{X:red,C:white} X#1# {} 배수", + }, + unlock={ + "핸드를 {C:attention,E:1}#1#{} 번 플레이합니다", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="고대 조커", + text={ + "{V:1}#2#{} 수트의 카드를", + "플레이할 때마다 득점 시", + "{X:mult,C:white} X#1# {} 배수를 제공하며,", + "{s:0.8}라운드 종료 시 수트가 변경됩니다", + }, + }, + j_arrowhead={ + name="화살촉", + text={ + "{C:spades}스페이드{} 수트의", + "카드를 플레이할 때마다", + "득점 시 {C:chips}+#1#{} 개의 칩", + }, + unlock={ + "덱에서", + "{E:1,C:attention}#2#{} 수트의", + "카드를 최소 {E:1,C:attention}#1#{} 장 보유합니다", + }, + }, + j_astronomer={ + name="천문학자", + text={ + "모든 {C:planet}행성{} 카드와", + "{C:planet}천체 팩{}", + "{C:attention}무료{} 입니다", + }, + unlock={ + "모든 {E:1,C:planet}행성{} 카드를", + "발견합니다", + }, + }, + j_banner={ + name="현수막", + text={ + "남은", + "{C:attention}버리기{} 마다", + "{C:chips}+#1#{} 개의 칩", + }, + }, + j_baron={ + name="남작", + text={ + "핸드에 있는", + "{C:attention}킹{}마다", + "{X:mult,C:white} X#1# {} 배수를 제공합니다", + }, + }, + j_baseball={ + name="야구 카드", + text={ + "{C:green}희귀{} 조커마다", + "{X:mult,C:white} X#1# {} 배수를 제공합니다", + }, + }, + j_blackboard={ + name="칠판", + text={ + "핸드에 있는 모든 카드가", + "{C:spades}#2#{} 또는 {C:clubs}#3#{} 인 경우", + "{X:red,C:white} X#1# {} 배수", + }, + }, + j_bloodstone={ + name="혈석", + text={ + "{C:hearts}하트{} 수트의", + "카드를 플레이할 때마다", + "{C:green}#1#/#2#{} 확률", + "{X:mult,C:white} X#3# {} 배수를 제공하며,", + }, + unlock={ + "덱에서", + "{E:1,C:attention}#2#{} 수트의", + "카드를 최소 {E:1,C:attention}#1#{} 장 보유합니다", + }, + }, + j_blue_joker={ + name="블루 조커", + text={ + "{C:attention}덱{} 에 남은 각 카드마다", + "{C:chips}+#1#{} 개의 칩", + "{C:inactive}(현재 {C:chips}+#2#{C:inactive} 개의 칩)", + }, + }, + j_blueprint={ + name="청사진", + text={ + "오른쪽 {C:attention}조커{} 의", + "능력을 복사합니다", + }, + unlock={ + "런을 승리합니다", + }, + }, + j_bootstraps={ + name="자력", + text={ + "가지고 있는 {C:money}$#2#{}당", + "{C:mult}+#1#{} 배수", + "{C:inactive}(현재 {C:mult}+#3#{C:inactive} 배수)", + }, + unlock={ + "최소 {E:1,C:attention}#1#{} 장의", + "{C:dark_edition}폴리크롬{} 조커를 보유합니다", + }, + }, + j_brainstorm={ + name="브레인스토밍", + text={ + "가장 왼쪽 {C:attention}조커{}의 능력을", + "복사합니다", + }, + unlock={ + "{E:1,C:attention}로열 플러시{}를", + "버립니다", + }, + }, + j_bull={ + name="황소", + text={ + "가지고 있는 {C:money}$1{}당", + "{C:chips}+#1#{}개의 칩", + "{C:inactive}(현재 {C:chips}+#2#{C:inactive}개의 칩)", + }, + }, + j_burglar={ + name="절도범", + text={ + "{C:attention}블라인드{} 를 선택하면,", + "{C:blue}+#1#{} 핸드를 얻고", + "{C:attention}버리기를 모두 잃습니다", + }, + }, + j_burnt={ + name="타버린 조커", + text={ + "라운드마다 첫 번째", + "{C:attention}버린{} 포커 핸드의", + "레벨을 업그레이드합니다", + }, + unlock={ + "총 {E:1,C:attention}#1#{} 장의 카드를", + "판매합니다", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="명함", + text={ + "플레이할 때", + "{C:attention}그림{} 카드가", + "득점 시 1/2 확률로 {C:money}$2{}를 제공합니다", + }, + }, + j_caino={ + name="카니오", + text={ + "이 조커는 {C:attention}그림{} 카드가", + "파괴될 때", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="캠프파이어", + text={ + "이 조커는 카드가 {C:attention}팔릴{} 때마다", + "{X:mult,C:white}X#1#{} 배수를 획득하며,", + "{C:attention}보스 블라인드{}가 패배하면 초기화됩니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + }, + j_card_sharp={ + name="야바위꾼", + text={ + "이 라운드에서 이미 플레이된", + "{C:attention}포커 핸드{} 를 플레이할 시", + "{X:mult,C:white} X#1# {} 배수", + }, + }, + j_cartomancer={ + name="카토맨서", + text={ + "{C:attention}블라인드{} 를 선택할 때", + "{C:tarot}타로{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + unlock={ + "{C:tarot}타로{} 카드를", + "발견합니다", + }, + }, + j_castle={ + name="성", + text={ + "이 조커는 {V:1}#2#{} 카드를 버릴 때마다", + "{C:chips}+#1#{}개의 칩을 획득하며,", + "수트가 매 라운드 변경됩니다", + "{C:inactive}(현재 {C:chips}+#3#{C:inactive}개의 칩)", + }, + }, + j_cavendish={ + name="캐번디시", + text={ + "{X:mult,C:white} X#1# {} 배수", + "라운드가 끝날 때", + "{C:green}#2# / #3#{} 의 확률로", + "이 카드가 파괴됩니다", + }, + }, + j_ceremonial={ + name="의식용 단검", + text={ + "{C:attention}블라인드{}가 선택되면,", + "오른쪽의 조커를 파괴하고", + "이 {C:red} 배수{}에 그 판매 가치를", + " {C:attention}두 배{}로 영구적으로 추가합니다", + "{C:inactive}(현재 {C:mult}+#1#{C:inactive} 배수)", + }, + }, + j_certificate={ + name="증명서", + text={ + "라운드가 시작할 때,", + "무작위로 무작위의 {C:attention}플레잉", + "{C:attention}카드{}를 추가합니다", + "{C:attention}봉인{}을 추가합니다", + }, + unlock={ + "{C:attention,E:1}금 봉인{} 이 있는", + "골드 플레잉 카드를", + "보유합니다", + }, + }, + j_chaos={ + name="혼돈의 광대", + text={ + "상점당", + "{C:green}#1#{} 무료 {C:green}리롤", + }, + }, + j_chicot={ + name="치코", + text={ + "모든 {C:attention}보스 블라인드{} 의", + "효과를 비활성화합니다", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="영리한 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개", + }, + }, + j_cloud_9={ + name="클라우드 9", + text={ + "라운드가 끝날 때 {C:attention}풀 덱{}의", + "{C:attention}9{}마다", + "{C:money}$#1#{}를 획득합니다", + "{C:inactive}(현재 {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="별자리", + text={ + "이 조커는", + "{C:planet}행성{} 카드가 사용될 때마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + }, + j_crafty={ + name="간교한 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개", + }, + }, + j_crazy={ + name="정신 나간 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수", + }, + }, + j_credit_card={ + name="신용 카드", + text={ + "부채를", + "최대 {C:red}-$#1#{} 합니다", + }, + }, + j_delayed_grat={ + name="늦춰진 희열", + text={ + "라운드가 끝날 때까지", + "버리기를 사용하지 않으면", + "{C:attention}버리기{}당 {C:money}$#1#{}를 획득합니다", + }, + }, + j_devious={ + name="기만적인 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개", + }, + }, + j_diet_cola={ + name="다이어트 콜라", + text={ + "이 카드를 팔아서", + "무료 {C:attention}#1#", + "생성", + }, + }, + j_dna={ + name="DNA", + text={ + "라운드의 {C:attention}첫 핸드{} 에", + "{C:attention}1{} 장의 카드만 있으면,", + "덱에 복사 카드를 영구적으로 추가하고", + "{C:attention}핸드{}로 뽑습니다", + }, + }, + j_drivers_license={ + name="운전면허증", + text={ + "덱에 최소 강화된 카드가 {C:attention}16", + "장 이상이면", + "{X:mult,C:white} X#1# {} 배수", + "{C:inactive}(현재 {C:attention}#2#{C:inactive})", + }, + unlock={ + "덱에서 {E:1,C:attention}#1#{} 장의 카드를", + "강화합니다", + }, + }, + j_droll={ + name="괴짜 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수", + }, + }, + j_drunkard={ + name="술고래", + text={ + "라운드마다", + "{C:red}+#1#{} 버리기", + }, + }, + j_duo={ + name="듀오", + text={ + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수", + }, + unlock={ + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다", + }, + }, + j_dusk={ + name="땅거미", + text={ + "라운드의 {C:attention}최종 핸드{} 에서", + "플레이한 모든 카드를", + "다시 트리거합니다", + }, + }, + j_egg={ + name="알", + text={ + "라운드 종료 시", + "{C:money}$#1#{} 의", + "{C:attention}판매 가치{} 를 획득합니다", + }, + }, + j_erosion={ + name="침식", + text={ + "풀 덱에서 {C:attention}#3#{} 보다 적은 ", + "카드 매수만큼", + "{C:red}+#1#{} 배수", + "{C:inactive}(현재 {C:red}+#2#{C:inactive} 배수)", + }, + }, + j_even_steven={ + name="이븐 스티븐", + text={ + "{C:attention}짝수{} 랭크로", + "플레이한 카드는", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="얼굴 없는 조커", + text={ + "{C:attention}#2#{} 장 이상의", + "{C:attention}그림 카드{} 를 동시에", + "버리면", + "{C:money}$#1#{} 를 획득합니다", + }, + }, + j_family={ + name="가족", + text={ + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수", + }, + unlock={ + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다", + }, + }, + j_fibonacci={ + name="피보나치", + text={ + "득점할 때", + "{C:attention}에이스{}, {C:attention}2{}, {C:attention}3{}, {C:attention}5{} 또는 {C:attention}8{} 마다", + "{C:mult}+#1#{} 배수를 제공합니다", + }, + }, + j_flash={ + name="플래시 카드", + text={ + "이 조커는 상점 {C:attention}리롤{}당", + "{C:mult}+#1#{} 배수를 획득합니다", + "{C:inactive}(현재 {C:mult}+#2#{C:inactive} 배수)", + }, + }, + j_flower_pot={ + name="화분", + text={ + "포커", + "핸드에", + "{C:diamonds}다이아몬드{} 카드, {C:clubs}클럽{} 카드,", + "{C:hearts}하트{} 카드, {C:spades}스페이드{} 카드가 있을 경우 {X:mult,C:white} X#1# {} 배수", + }, + unlock={ + "앤티", + "레벨 {E:1,C:attention}#1#{} 을(를) 달성합니다", + }, + }, + j_fortune_teller={ + name="점쟁이", + text={ + "사용한 {C:purple}타로{} 카드당", + "{C:red}+#1#{} 배수", + "{C:inactive}(현재 {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="네 개의 손가락", + text={ + "모든 {C:attention}플러시{} 와", + "{C:attention}스트레이트{} 를", + "{C:attention}4{} 장의 카드로 만듭니다", + }, + }, + j_gift={ + name="기프트 카드", + text={ + "매 라운드가 종료될떄 마다 모든 {C:attention}조커{} 및", + "{C:attention}소모품{} 카드에", + "{C:money}$#1#{}의 {C:attention}판매 가치{}를 추가합니다", + " ", + }, + }, + j_glass={ + name="글래스 조커", + text={ + "이 조커는 {C:attention}글래스 카드가", + "파괴될 때마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + unlock={ + "덱에 최소", + "{E:1,C:attention}#1#{} 장의", + "{E:1,C:attention}#2#{} 을(를) 보유합니다", + }, + }, + j_gluttenous_joker={ + name="게걸스러운 조커", + text={ + "{C:clubs}#2#{} 수트와 함께", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다", + }, + }, + j_golden={ + name="골든 조커", + text={ + "라운드 종료 시", + "{C:money}$#1#{} 를 획득합니다", + }, + }, + j_greedy_joker={ + name="탐욕스러운 조커", + text={ + "{C:diamonds}#2#{} 문양과 함께", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다", + }, + }, + j_green_joker={ + name="그린 조커", + text={ + "플레이한 핸드당 {C:mult}+#1#{} 배수", + "버리기당 {C:mult}-#2#{} 배수", + "{C:inactive}(현재 {C:mult}+#3#{C:inactive} 배수)", + }, + }, + j_gros_michel={ + name="그로 미셸", + text={ + "{C:mult}+#1#{} 배수", + "라운드가 끝날 때", + "{C:green}#2# / #3#{} 의 확률로", + "이 카드가 파괴됩니다", + }, + }, + j_hack={ + name="사기꾼", + text={ + "플레이할 때마다", + "{C:attention}2{}, {C:attention}3{},", + "{C:attention}4{} 또는 {C:attention}5{} 카드를 다시 트리거합니다", + }, + }, + j_half={ + name="반쪽 조커", + text={ + "플레이한 핸드에", + "카드가 {C:attention}#2#{} 장 이하면", + "{C:red}+#1#{} 배수", + }, + }, + j_hallucination={ + name="환각", + text={ + "{C:attention}부스터 팩{}을 열 때마다", + "{C:green}#1#/#2#{}의 확률로", + "{C:tarot}타로{} 카드를 생성", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + j_hanging_chad={ + name="종이 구멍", + text={ + "득점에 사용된 {C:attention}첫{} 플레이한", + "카드를", + "추가 {C:attention}#1#{}회 리트리거합니다", + }, + unlock={ + "{E:1,C:attention}#1#{} (으)로", + "보스 블라인드를 물리칩니다", + }, + }, + j_hiker={ + name="도보 여행자", + text={ + "{C:attention}득점시 플레이된 카드{}는 ", + "영구적으로", + "{C:chips}+#1#{} 개의 칩을 추가로 얻습니다", + }, + }, + j_hit_the_road={ + name="여행 출발", + text={ + "이 조커는 이번 라운드에서", + "{C:attention}잭{}을 버릴 때마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + unlock={ + "동시에", + "{E:1,C:attention}잭 5{} 장을", + "버립니다", + }, + }, + j_hologram={ + name="홀로그램", + text={ + "이 조커는 {C:attention}플레이한 카드{}가", + "덱에 추가될 때마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + }, + j_ice_cream={ + name="아이스크림", + text={ + "{C:chips}+#1#{} 개의 칩", + "핸드를 플레이할 때마다", + "{C:chips}-#2#{} 개의 칩", + }, + }, + j_idol={ + name="우상", + text={ + "{V:1}#3#{}의 {C:attention}#2#{} 카드를 플레이할 때마다", + "득점시", + "{X:mult,C:white} X#1# {} 배수를 제공합니다", + "카드가 매 라운드 변경됩니다", + }, + unlock={ + "한 번의 핸드에서", + "최소{E:1,C:attention}#1#{} 개의 칩을", + "획득합니다", + }, + }, + j_invisible={ + name="투명 조커", + text={ + "{C:attention}#1#{}번의 라운드 후,", + "이 카드를 팔아서", + "무작위 조커를 {C:attention}중복합니다{}", + "{C:inactive}(현재 {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "보유한 {E:1,C:attention}조커 수가 4장{}을", + "넘지 않아도", + "런을 승리합니다", + }, + }, + j_joker={ + name="조커", + text={ + "{C:red,s:1.1}+#1#{} 배수", + }, + }, + j_jolly={ + name="쾌활한 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수", + }, + }, + j_juggler={ + name="저글러", + text={ + "{C:attention}+#1#{} 핸드 크기", + }, + }, + j_loyalty_card={ + name="로열티 카드", + text={ + "{C:attention}#2#{} 번의 핸드를 플레이할 때마다", + "{X:red,C:white} X#1# {} 배수", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="루차도르", + text={ + "이 카드를 팔아서", + "현재 {C:attention}보스 블라인드{}를", + "비활성화합니다", + }, + }, + j_lucky_cat={ + name="행운의 고양이", + text={ + "이 조커는 {C:attention}럭키{} 카드가", + "{C:green}성공적으로{} 트리거될 때마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + }, + j_lusty_joker={ + name="건장한 조커", + text={ + "{C:hearts}#2#{} 수트와 함께", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다", + }, + }, + j_mad={ + name="미친 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수", + }, + }, + j_madness={ + name="광기", + text={ + "{C:attention}스몰 블라인드{} 또는 {C:attention}빅 블라인드{}", + "를 선택한 경우, {X:mult,C:white} X#1# {} 배수를 획득하고", + "무작위 조커를{C:attention}파괴{}합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + }, + j_mail={ + name="편지", + text={ + "{C:attention}#2#{}을(를) 버릴 때마다", + "{C:money}$#1#{}를 획득하며,", + "랭크가 매 라운드 변경됩니다", + }, + }, + j_marble={ + name="마블 조커", + text={ + "{C:attention}블라인드{}가 선택되면", + "덱에", + "{C:attention}스톤{} 카드를 1장 추가합니다", + }, + }, + j_matador={ + name="투우사", + text={ + "플레이한 핸드가", + "{C:attention}보스 블라인드{} 능력을 트리거하면 ", + "{C:money}$#1#{} 를 획득합니다", + }, + unlock={ + "버리기를 사용하지 않고", + "{E:1,C:attention}한 번의 핸드{} 에서", + "보스 블라인드를 처치합니다", + }, + }, + j_merry_andy={ + name="즐거운 앤디", + text={ + "라운드마다", + "{C:red}+#1#{} 버리기,", + "{C:red}#2#{} 핸드 크기", + }, + unlock={ + "{E:1,C:attention}#1#{} 회 이하의 라운드 안에", + "런을 승리합니다", + }, + }, + j_midas_mask={ + name="미다스 가면", + text={ + "득점 시", + "플레이한 모든 {C:attention}그림{} 카드", + "가 {C:attention}골드{} 카드가 됩니다", + }, + }, + j_mime={ + name="마임", + text={ + "{C:attention}핸드에", + "{C:attention}있는{} 모든 카드 능력을", + "다시 트리거합니다", + }, + }, + j_misprint={ + name="오탈자", + text={ + "", + }, + }, + j_mr_bones={ + name="미스터 본즈", + text={ + "획득한 칩이", + "블라인드를 클리어 하기에", + "필요한 칩의 {C:attention}25%{} 이상인 경우", + "죽음을 막고 ", + "{S:1.1,C:red,E:2}자멸합니다{}", + }, + unlock={ + "{C:attention,E:1}#1#{} 런을 패배합니다", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="신비의 정점", + text={ + "남은 버리기가", + "{C:attention}#2#{} 번일 때", + "{C:mult}+#1#{} 배수", + }, + }, + j_obelisk={ + name="오벨리스크", + text={ + "이 조커는 {C:attention}연속{} 핸드 플레이마다", + "가장 많이 플레이한", + "{C:attention}포커 핸드 플레이 없이", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + }, + j_odd_todd={ + name="오드 토드", + text={ + "{C:attention}홀수{} 랭크로", + "플레이한 카드는", + "득점 시 {C:chips}+#1#{} 개의 칩을 제공합니다", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="오닉스 아게이트", + text={ + "{C:clubs}클럽{} 수트의", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다", + }, + unlock={ + "덱에서", + "{E:1,C:attention}#2#{} 수트의", + "카드를 최소 {E:1,C:attention}#1#{} 장 보유합니다", + }, + }, + j_oops={ + name="이런, 모두 6이야!", + text={ + "모든 {C:attention}나열된", + "{C:green,E:1,S:1.1}가능성{} 을 두배로 늘립니다", + "{C:inactive}(예: {C:green}1/3{C:inactive} -> {C:green}2/3{C:inactive})", + }, + unlock={ + "두 배로 만듭니다.", + "최소", + "{E:1,C:attention}#1#{} 개의 칩을 획득합니다", + }, + }, + j_order={ + name="지시", + text={ + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수", + }, + unlock={ + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다", + }, + }, + j_pareidolia={ + name="변상증", + text={ + "모든 카드가", + "{C:attention}그림{} 카드로", + "취급됩니다", + }, + }, + j_perkeo={ + name="페르케오", + text={ + "{C:attention}상점{}에서 끝날 때", + "소유한", + "{C:attention}1{}장의 무작위 {C:attentin}소모품{} 카드의", + "{C:dark_edition}네거티브{}를 생성합니다", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="사진", + text={ + "득점에 사용된", + "첫 번째 플레이한 {C:attention}페이스{} 카드에", + "{X:mult,C:white} X#1# {} 배수", + }, + }, + j_popcorn={ + name="팝콘", + text={ + "{C:mult}+#1#{} 배수", + "라운드를 플레이할 때마다", + "{C:mult}-#2#{} 배수", + }, + }, + j_raised_fist={ + name="들어 올린 주먹", + text={ + "핸드에 있는 {C:attention}최하{} 랭크 카드의", + "랭크의 {C:attention}두 배{}를", + "배수에 추가", + }, + }, + j_ramen={ + name="라면", + text={ + "{X:mult,C:white} X#1# {} 배수,", + "{C:attention}카드{}를 버릴 때마다", + "{X:mult,C:white} X#2# {} 배수를 잃습니다", + }, + }, + j_red_card={ + name="레드카드", + text={ + "이 조커는", + "{C:attention}부스터 팩{}을 건너뛸 때", + "{C:red}+#1#{} 배수를 획득합니다", + "{C:inactive}(현재 {C:red}+#2#{C:inactive} 배수)", + }, + }, + j_reserved_parking={ + name="지정 주차 공간", + text={ + "핸드에 보유한", + "{C:attention}그림{} 카드마다", + "{C:green}#2#/#3#{} 확률을 보유합니다", + "{C:money}$#1#{}을(를) 제공합니다", + }, + }, + j_ride_the_bus={ + name="버스 탑승", + text={ + "이 조커는 {C:attention}연속{} 핸드 플레이마다", + "{C:attention}그림{} 카드", + " 득점 없이", + "{C:mult}+#1#{} 배수를 획득합니다", + "{C:inactive}(현재 {C:mult}+#2#{C:inactive} 배수)", + }, + }, + j_riff_raff={ + name="쓰레기", + text={ + "{C:attention}블라인드{}가 선택될 때,", + "{C:attention}#1#장의 {C:blue}일반{} 조커를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + j_ring_master={ + name="링 마스터", + text={ + "{C:attention}조커{}, {C:tarot}타로{}, {C:planet}행성{}", + "그리고 {C:spectral}유령{} 카드가", + "여러 번 나타납니다", + }, + unlock={ + "앤티", + "레벨 {E:1,C:attention}#1#{} 을(를) 달성합니다", + }, + }, + j_rocket={ + name="로켓", + text={ + "라운드 종료 시 {C:money}$#1#{}를 획득합니다", + "{C:attention}보스 블라인드{} 처치 시", + "지불이 {C:money}$#2#{}인상됩니다", + }, + }, + j_rough_gem={ + name="원석", + text={ + "{C:diamonds}다이아몬드{} 수트의", + "카드를 플레이할 때마다", + "득점 시 {C:money}$#1#{}를 획득합니다", + }, + unlock={ + "덱에서", + "{E:1,C:attention}#2#{} 수트의", + "카드를 최소 {E:1,C:attention}#1#{} 장 보유합니다", + }, + }, + j_runner={ + name="주자", + text={ + "플레이한 핸드에", + "{C:attention}스트레이트{}가 있으면", + "{C:chips}+#2#{}개의 칩을 획득합니다", + "{C:inactive}(현재 {C:chips}+#1#{C:inactive}개의 칩)", + }, + }, + j_satellite={ + name="인공위성", + text={ + "이번 런에서 사용된", + "모든 고유 {C:planet}행성{} 카드에 대해", + "라운드가 끝나면 {C:money}$#1#{} 를 획득합니다", + "{C:inactive}(현재 {C:money}$#2#{C:inactive})", + }, + unlock={ + "{E:1,C:money}$#1# 이상", + "보유합니다", + }, + }, + j_scary_face={ + name="무서운 얼굴", + text={ + "득점할 때", + "{C:attention}그림{} 카드가", + "{C:chips}+#1#{} 개의 칩을 제공합니다", + }, + }, + j_scholar={ + name="학자", + text={ + "플레이할 때", + "각 에이스가", + "득점 시 추가 {C:mult}+#1#{} 배수 및", + "{C:chips}+#2#{}개의 칩을 제공합니다", + }, + }, + j_seance={ + name="교령회", + text={ + "{C:attention}포커 핸드{} 가", + "{C:attention}#1#{} 인 경우,", + "무작위 {C:spectral}유령{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + j_seeing_double={ + name="둘로 보기", + text={ + "플레이한 핸드가 득점하면", + "{X:mult,C:white} X#1# {} 배수", + "{C:clubs}클럽{} 카드 및", + "기타{C:attention} 수트의 득점 카드", + }, + unlock={ + "{E:1,C:attention}#1# 을(를) 포함한", + "핸드를", + "플레이합니다", + }, + }, + j_selzer={ + name="탄산수", + text={ + "다음 {C:attention}#1#{}번의 핸드에서", + "플레이한 모든 카드를", + "다시 트리거합니다", + }, + }, + j_shoot_the_moon={ + name="야반도주", + text={ + "핸드에 있는", + "{C:attention}퀸{}마다", + "{C:mult}+#1#{} 배수를 제공합니다", + }, + unlock={ + "단일 라운드에서", + "덱에 있는", + "모든 {E:1,C:attention}하트{} 를 플레이합니다", + }, + }, + j_shortcut={ + name="지름길", + text={ + "{C:attention}1 랭크 간격을 두고", + "{C:attention}스트레이트{}를 만들 수 있음", + "{C:inactive}(예: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="육감", + text={ + "라운드의 {C:attention}첫 번째{} 카드가", + "싱글 {C:attention}6{}이면, 그걸 파괴하고", + "{C:spectral}유령{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + j_sly={ + name="교활한 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개", + }, + }, + j_smeared={ + name="얼룩진 조커", + text={ + "{C:diamonds}하트{} 와 {C:diamonds}다이아몬드{} 가", + "같은 수트로 취급되며,", + "{C:spades}스페이드{} 와 {C:spades}클럽{} 이", + "같은 수트로 취급됩니다", + }, + unlock={ + "덱에 최소 {C:attention}#1#{} 장의", + "{E:1,C:attention}#2#{} 을(를)", + "보유합니다", + }, + }, + j_smiley={ + name="웃는 얼굴", + text={ + "득점하면", + "플레이한 {C:attention}페이스{} 카드가", + "{C:mult}+#1#{} 배수를 제공합니다", + }, + }, + j_sock_and_buskin={ + name="희극과 비극", + text={ + "플레이한 모든 {C:attention}그림", + "카드를 다시 트리거합니다", + }, + unlock={ + "총 {C:attention,E:1}#1#{} 장의 그림 카드를", + "플레이합니다", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="스페이스 조커", + text={ + "{C:green}#1# / #2#{} 의 확률로", + "플레이한 {C:attention}포커 핸드{} 레벨을", + "업그레이드합니다", + }, + }, + j_splash={ + name="첨벙", + text={ + "{C:attention}플레이한 카드{} 가 모두", + "득점에 계산됩니다", + }, + }, + j_square={ + name="정사각형 조커", + text={ + "이 조커는 플레이한 핸드에", + "정확히 {C:attention}4{}장의 카드가 있을 때", + "{C:chips}+#2#{}개의 칩을 획득합니다", + "{C:inactive}(현재 {C:chips}#1#{C:inactive}개의 칩)", + }, + }, + j_steel_joker={ + name="스틸 조커", + text={ + "{C:attention}내 풀 덱에 있는", + "각 {C:attention}스틸 카드마다", + "{X:mult,C:white} X#1# {} 배수 제공", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + }, + j_stencil={ + name="조커 스텐실", + text={ + "{s:0.8}조커 스텐실이 포함된", + "빈 {C:attention}조커{} 슬롯마다", + "{X:red,C:white} X1 {} 배수", + "{C:inactive}(현재 {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="스톤 조커", + text={ + "내 {C:attention}풀 덱에 있는", + "각 {C:attention}스톤 카드마다", + "{C:chips}+#1#{}개의 칩을 제공합니다", + "{C:inactive}(현재 {C:chips}+#2#{C:inactive}개의 칩)", + }, + }, + j_stuntman={ + name="스턴트맨", + text={ + "{C:chips}+#1#{}개의 칩,", + "{C:attention}-#2#{} 핸드 크기", + }, + unlock={ + "한 번의 핸드에서", + "최소{E:1,C:attention}#1#{} 개의 칩을", + "획득합니다", + }, + }, + j_supernova={ + name="초신성", + text={ + "이번 런에서", + "{C:attention}포커 핸드{}가 플레이된", + "횟수를 배수에 추가", + }, + }, + j_superposition={ + name="중첩", + text={ + "핸드가 플레이 시", + "{C:attention}에이스{} 가 포함된 {C:attention}스트레이트{}라면,", + "{C:tarot}타로{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + j_swashbuckler={ + name="깡패", + text={ + "다른 모든 소유한", + "{C:attention}조커{}의 판매 가치를", + "배수에 추가합니다", + "{C:inactive}(현재 {C:mult}+#1#{C:inactive} 배수)", + }, + unlock={ + "총 {C:attention,E:1}#1#{} 장의 조커 카드를", + "판매합니다", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="회귀", + text={ + "이 런을 건너뛴 {C:planet}블라인드{} 당", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + unlock={ + "메인 메뉴에서", + "저장된 런으로 계속합니다", + }, + }, + j_ticket={ + name="골든 티켓", + text={ + "{C:attention}골드{} 카드를 플레이할 때마다", + "득점 시 {C:money}$#1#{} 를 획득합니다", + }, + unlock={ + "{C:attention,E:1}골드{} 카드만 포함된", + "5장 카드의 핸드로", + "플레이합니다", + }, + }, + j_to_the_moon={ + name="달을 향해", + text={ + "라운드가 끝날 때", + "보유한 {C:money}$5{}마다 추가 {C:money}$#1#{}의", + "{C:attention}이자{}를 획득합니다", + }, + }, + j_todo_list={ + name="할 일 목록", + text={ + "{C:attention}포커 핸드{}", + "가 {C:attention}#2#{}인 경우 {C:money}$#1#{}를 획득합니다", + "라운드 종료 시", + "포커 핸드를 바꿉니다", + }, + }, + j_trading={ + name="트레이딩 카드", + text={ + "라운드의 {C:attention}첫 번째 버리기{}에", + "{C:attention}1{} 카드만 있으면, 그건 파괴하고", + "{C:money}$#1#{}를 획득합니다", + }, + }, + j_tribe={ + name="패거리", + text={ + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수", + }, + unlock={ + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다", + }, + }, + j_triboulet={ + name="트리불레", + text={ + "플레이한 {C:attention}킹{}과", + "{C:attention}퀸{}이 각각 x2 배수를", + "제공합니다", + "{X:mult,C:white} X#1# {} 배수를 제공하며,", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="트리오", + text={ + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수", + }, + unlock={ + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다", + }, + }, + j_troubadour={ + name="음유시인", + text={ + "{C:attention}+#1#{} 핸드 크기,", + "라운드마다 {C:blue}-#2#{} 핸드", + }, + unlock={ + "단 한 번의 핸드만", + "플레이하여", + "연속으로 {C:attention,E:1}#1#{} 회의 라운드를 승리합니다", + }, + }, + j_trousers={ + name="여벌 바지", + text={ + "이 조커는 플레이한 핸드에", + "{C:attention}#2# 포함 시", + "{C:mult}+#1#{} 배수를 획득합니다", + "{C:inactive}(현재 {C:red}+#3#{C:inactive} 배수)", + }, + }, + j_turtle_bean={ + name="거북 콩", + text={ + "{C:attention}+#1#{} 핸드 크기,", + "{C:red}#2#{} 라운드마다", + "감소합니다", + }, + }, + j_vagabond={ + name="방랑자", + text={ + "핸드가 {C:money}$#1#{} 이하로", + "플레이되면", + "{C:purple}타로{} 카드를 생성합니다", + }, + }, + j_vampire={ + name="뱀파이어", + text={ + "이 조커는 매 {C:attention}강화 카드{} 득점 시", + "{X:mult,C:white} X#1# {} 배수를 획득하고", + "카드 {C:attention}강화", + "를 제거합니다{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)", + }, + }, + j_walkie_talkie={ + name="워키토키", + text={ + "{C:attention}10{} 또는 {C:attention}4{}를 플레이할 때마다", + "득점 시 {C:chips}+#1#{}개의 칩과", + "{C:mult}+#2#{} 배수를 제공합니다", + }, + }, + j_wee={ + name="아주 작은 조커", + text={ + "플레이할 때마다 {C:attention}2{}를 득점하면", + "조커는", + "{C:chips}+#2#{}개의 칩을 획득합니다", + "{C:inactive}(현재 {C:chips}+#1#{C:inactive}개의 칩)", + }, + unlock={ + "{E:1,C:attention}#1#{} 회 이하의 라운드 안에", + "런을 승리합니다", + }, + }, + j_wily={ + name="악랄한 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개", + }, + }, + j_wrathful_joker={ + name="격노한 조커", + text={ + "{C:spades}#2#{} 문양과 함께", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다", + }, + }, + j_yorick={ + name="요릭", + text={ + "이 조커는", + "{C:attention}#2#{C:inactive} [#3#]{}개의", + "카드가 버려질 때마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다{C:inactive}(현재 {X:mult,C:white} X#4# {C:inactive} 배수)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="엉뚱한 조커", + text={ + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수", + }, + }, + }, + Other={ + black_sticker={ + name="블랙 스티커", + text={ + "이 조커를 사용하여", + "{C:attention}블랙 스테이크", + "난이도에서 승리함", + }, + }, + blue_seal={ + name="블루 봉인", + text={ + "핸드에 {C:attention}있을{} 경우", + "라운드에서 마지막으로 플레이한 {C:attention}포커 핸드{}에", + "{C:planet}행성{} 카드를 생성", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + blue_sticker={ + name="블루 스티커", + text={ + "이 조커를 사용하여", + "{C:attention}블루 스테이크", + "난이도에서 승리함", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} 개의 칩", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} 개의 추가 칩", + }, + }, + challenge_locked={ + name="잠김", + text={ + "챌린지 모드를 해제하려면", + "최소 #1#개의 다른 덱으로", + "런을 승리합니다", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="디버프됨", + text={ + "모든 능력이", + "비활성화됨", + }, + }, + debuffed_playing_card={ + name="디버프됨", + text={ + "칩 획득 불가 및", + "모든 능력이", + "비활성화됨", + }, + }, + deck_locked_discover={ + name="잠김", + text={ + "컬렉션에서", + "최소 {C:attention}#1#{} 개의 아이템을", + "발견합니다", + }, + }, + deck_locked_stake={ + name="잠김", + text={ + "최소 {V:1}#1#{} 난이도에서", + "아무 덱으로", + "런을 승리합니다", + }, + }, + deck_locked_win={ + name="잠김", + text={ + "아무 난이도에서", + "{C:attention}#1#{} (으)로", + "런을 승리합니다", + }, + }, + demo_locked={ + name="잠김", + text={ + "이 체험판에서는", + "사용할 수 없습니다", + }, + }, + demo_shop_locked={ + name="잠김", + text={ + "{C:attention}짐보{} 의 개인 컬렉션", + "카드로서,", + "{E:1,C:red}Balatro", + "정식 버전에서 사용할 수 있습니다", + }, + }, + eternal={ + name="이터널", + text={ + "판매하거나", + "파괴할 수 없습니다", + }, + }, + gold_seal={ + name="골드 봉인", + text={ + "이 카드를 플레이하면", + "{C:money}$3{}를 획득합니다", + "및 점수", + }, + }, + gold_sticker={ + name="골드 스티커", + text={ + "이 조커를 사용하여", + "{C:attention}골드 스테이크", + "난이도에서 승리함", + }, + }, + green_sticker={ + name="그린 스티커", + text={ + "이 조커를 사용하여", + "{C:attention}그린 스테이크", + "난이도에서 승리함", + }, + }, + joker_locked_legendary={ + name="잠김", + text={ + "{C:spectral}영혼{} 카드에서", + "이 조커를 찾습니다", + }, + }, + locked={ + name="잠김", + text={ + }, + }, + orange_sticker={ + name="오렌지 스티커", + text={ + "이 조커를 사용하여", + "{C:attention}오렌지 스테이크", + "난이도에서 승리함", + }, + }, + p_arcana_jumbo={ + name="점보 아르카나 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:tarot}타로{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_arcana_mega={ + name="메가 아르카나 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:tarot}타로{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_arcana_normal={ + name="아르카나 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:tarot}타로{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_buffoon_jumbo={ + name="점보 어릿광대 팩", + text={ + "최대 {C:attention}#2#{} 장의 {C:joker}조커{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_buffoon_mega={ + name="메가 어릿광대 팩", + text={ + "최대 {C:attention}#2#{} 장의 {C:joker}조커{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_buffoon_normal={ + name="어릿광대 팩", + text={ + "최대 {C:attention}#2#{} 장의 {C:joker}조커{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_celestial_jumbo={ + name="점보 천체 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:planet}행성{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_celestial_mega={ + name="메가 천체 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:planet}행성{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_celestial_normal={ + name="천체 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:planet}행성{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_spectral_jumbo={ + name="점보 유령 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:spectral}유령{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_spectral_mega={ + name="메가 유령 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:spectral}유령{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_spectral_normal={ + name="유령 팩", + text={ + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:spectral}유령{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_standard_jumbo={ + name="점보 표준 팩", + text={ + "덱에 추가할 최대", + "{C:attention}#2#{} 장의 {C:attention}플레잉{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_standard_mega={ + name="메가 표준 카드", + text={ + "덱에 추가할 최대", + "{C:attention}#2#{} 장의 {C:attention}플레잉{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + p_standard_normal={ + name="표준 팩", + text={ + "덱에 추가할 최대", + "{C:attention}#2#{} 장의 {C:attention}플레잉{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다", + }, + }, + perishable={ + name="부패", + text={ + "{C:attention}#1#{}라운드 후", + "디버프됨", + "{C:inactive}({C:attention}#2#{C:inactive} 남음)", + }, + }, + pinned_left={ + name="고정", + text={ + "이 조커는", + "가장 왼쪽에", + "고정됩니다", + }, + }, + playing_card={ + text={ + " {V:1}#2#의 {C:light_black}#1# ", + }, + }, + purple_seal={ + name="퍼플 봉인", + text={ + "{C:attention}버리면", + "{C:tarot}타로{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + purple_sticker={ + name="퍼플 스티커", + text={ + "이 조커를 사용하여", + "{C:attention}퍼플 스테이크", + "난이도에서 승리함", + }, + }, + red_seal={ + name="레드 봉인", + text={ + "이 카드를 {C:attention}1{}번", + "다시 트리거합니다", + }, + }, + red_sticker={ + name="레드 스티커", + text={ + "이 조커를 사용하여", + "{C:attention}레드 스테이크", + "난이도에서 승리함", + }, + }, + remove_negative={ + name="네거티브", + text={ + "{C:inactive,s:0.9}(제거 {C:dark_edition,s:0.9}네거티브{C:inactive,s:0.9} 복사로 부터)", + }, + }, + rental={ + name="렌탈", + text={ + "라운드 종료 시 ", + "{C:money}$#1#{}를 획득합니다", + }, + }, + undiscovered_booster={ + name="발견되지 않음", + text={ + "시드되지 않은 런에서", + "이 팩을 열어", + "기능을 알아보세요", + }, + }, + undiscovered_edition={ + name="발견되지 않음", + text={ + "시드되지 않은 런에서", + "이 에디션을 찾아", + "기능을 알아보세요", + }, + }, + undiscovered_joker={ + name="발견되지 않음", + text={ + "시드되지 않은 런에서", + "이 카드를 구매하거나", + "사용하여", + "기능을 알아보세요", + }, + }, + undiscovered_planet={ + name="발견되지 않음", + text={ + "시드되지 않은 런에서", + "이 카드를 구매하거나", + "사용하여", + "기능을 알아보세요", + }, + }, + undiscovered_spectral={ + name="발견되지 않음", + text={ + "시드되지 않은 런에서", + "이 카드를 구매하거나", + "사용하여", + "기능을 알아보세요", + }, + }, + undiscovered_tag={ + name="발견되지 않음", + text={ + "시드되지 않은 런에서", + "이 태그를 사용해", + "기능을 알아보세요", + }, + }, + undiscovered_tarot={ + name="발견되지 않음", + text={ + "시드되지 않은 런에서", + "이 카드를 구매하거나", + "사용하여", + "기능을 알아보세요", + }, + }, + undiscovered_voucher={ + name="발견되지 않음", + text={ + "시드되지 않은 런에서", + "이 바우처를", + "교환하여", + "기능을 알아보세요", + }, + }, + white_sticker={ + name="화이트 스티커", + text={ + "이 조커를 사용하여", + "{C:attention}화이트 스테이크", + "난이도에서 승리함", + }, + }, + wip_locked={ + name="잠김", + text={ + "작업", + "진행 중", + }, + }, + }, + Planet={ + c_ceres={ + name="세레스", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_earth={ + name="지구", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_eris={ + name="에리스", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} 플러시 파이브를 레벨업 합니다", + "{C:attention}#2#", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_jupiter={ + name="목성", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_mars={ + name="화성", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_mercury={ + name="수성", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_neptune={ + name="해왕성", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_planet_x={ + name="플래닛 X", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_pluto={ + name="명왕성", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_saturn={ + name="토성", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_uranus={ + name="천왕성", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + c_venus={ + name="금성", + text={ + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩", + }, + }, + }, + Spectral={ + c_ankh={ + name="앵크", + text={ + "무작위 {C:attention}조커{}의 복사본을", + "생성하고, 다른 모든 조커를", + "파괴합니다", + }, + }, + c_aura={ + name="아우라", + text={ + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{},", + "또는 {C:dark_edition}폴리크롬{} 효과를", + "핸드에 있는 {C:attention}1{} 장의 선택된 카드에 추가합니다", + }, + }, + c_black_hole={ + name="블랙홀", + text={ + "모든 {C:legendary,E:1}포커 핸드{} 를", + "{C:attention}1{} 레벨만큼", + "업그레이드합니다", + }, + }, + c_cryptid={ + name="크립티드", + text={ + "핸드에서 선택한 {C:attention}1{}장의", + "카드를 {C:attention}#1#{}장 복사해", + "얻습니다", + }, + }, + c_deja_vu={ + name="데자뷔", + text={ + "{C:red}레드 봉인{}을", + "핸드에서 선택한 {C:attention}1{}장의", + "카드에 추가합니다", + }, + }, + c_ectoplasm={ + name="심령체", + text={ + "무작위 {C:attention}조커{} 에", + "{C:dark_edition}네거티브{} 를 추가합니다", + "{C:red}-1{} 핸드 크기", + }, + }, + c_familiar={ + name="익숙함", + text={ + "핸드에 있는 {C:attention}1{} 장의", + "무작위 카드를 파괴하고,", + "핸드에 {C:attention}#1#{} 장의 무작위 {C:attention}강화 그림", + "{C:attention}카드{} 를 추가합니다", + }, + }, + c_grim={ + name="암울함", + text={ + "핸드에 있는 {C:attention}1{} 장의", + "무작위 카드를 파괴하고,", + "핸드에 {C:attention}#1#{} 장의 무작위 {C:attention}강화", + "{C:attention}에이스{} 를 추가합니다", + }, + }, + c_hex={ + name="헥스", + text={ + "무작위 {C:attention}조커{}에 {C:dark_edition}폴리크롬{}을", + "생성하고, 다른 모든 조커를", + "파괴합니다", + }, + }, + c_immolate={ + name="불멸", + text={ + "핸드에 있는 {C:attention}#1#{} 장의", + "무작위 카드를 파괴하고,", + "{C:money}$#2#{} 를 획득합니다", + }, + }, + c_incantation={ + name="주문", + text={ + "핸드에 있는 {C:attention}1{} 장의", + "무작위 카드를 파괴하고,", + "핸드에 {C:attention}#1#{} 장의 무작위 {C:attention}강화 숫자", + "{C:attention}카드{} 를 추가합니다", + }, + }, + c_medium={ + name="미디엄", + text={ + "{C:purple}퍼플 봉인{}을", + "핸드에서 선택한 {C:attention}1{}장의", + "카드에 추가합니다", + }, + }, + c_ouija={ + name="점판", + text={ + "핸드에 있는 모든 카드를", + "단일의 무작위", + "{C:attention}랭크{} 로 전환합니다", + "{C:red}-1{} 핸드 크기", + }, + }, + c_sigil={ + name="인장", + text={ + "핸드에 있는 모든 카드를", + "단일의 무작위", + "{C:attention}수트{} 로 전환합니다", + }, + }, + c_soul={ + name="영혼", + text={ + "{C:legendary,E:1}전설{} 조커를", + "생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + c_talisman={ + name="부적", + text={ + "핸드에 있는", + "{C:attention}1{} 장의 선택된 카드에", + "{C:attention}금 봉인{} 을 추가합니다", + }, + }, + c_trance={ + name="트랜스", + text={ + "{C:blue}블루 봉인{}을", + "핸드에서 선택한 {C:attention}1{}장의", + "카드에 추가합니다", + }, + }, + c_wraith={ + name="망령", + text={ + "무작위 {C:red}레어{C:attention} 조커{} 를", + "생성하고,", + "돈이 {C:money}$0{} 가 됩니다", + }, + }, + }, + Stake={ + stake_black={ + name="블랙 스테이크", + text={ + "상점에 {C:attention}이터널{} 조커가 있습니다.", + "{C:inactive,s:0.8}{판매하거나 파괴할 수 없습니다}", + "{s:0.8}이전 스테이크를 모두 적용합니다", + }, + }, + stake_blue={ + name="블루 스테이크", + text={ + "{C:red}-1{} 버리기", + "{s:0.8}이전 스테이크를 모두 적용합니다", + }, + }, + stake_gold={ + name="골드 스테이크", + text={ + "상점에 {C:attention}렌탈{} 조커가 있습니다", + "{C:inactive,s:0.8}(라운드당 비용 {C:money,s:0.8}$3{C:inactive,s:0.8})", + "{s:0.8}이전 스테이크를 모두 적용합니다", + }, + }, + stake_green={ + name="그린 스테이크", + text={ + "각 {C:attention}앤티{} 에", + "필요한 점수가 더 빠르게 증가합니다", + "{s:0.8}이전 스테이크를 모두 적용합니다", + }, + }, + stake_orange={ + name="오렌지 스테이크", + text={ + "상점에 {C:attention}부패{} 조커가 있습니다", + "{C:inactive,s:0.8}(5라운드 후 디버프됨)", + "{s:0.8}이전 스테이크를 모두 적용합니다", + }, + }, + stake_purple={ + name="퍼플 스테이크", + text={ + "각 {C:attention}앤티{} 에", + "필요한 점수가 더 빠르게 증가합니다", + "{s:0.8}이전 스테이크를 모두 적용합니다", + }, + }, + stake_red={ + name="레드 스테이크", + text={ + "{C:attention}스몰 블라인드{} 가", + "보상 돈을 제공하지 않습니다", + "{s:0.8}이전 스테이크를 모두 적용합니다", + }, + }, + stake_white={ + name="화이트 스테이크", + text={ + "기본 난이도", + }, + }, + }, + Tag={ + tag_boss={ + name="보스 태그", + text={ + "{C:attention}보스 블라인드{} 를", + "리롤합니다", + }, + }, + tag_buffoon={ + name="어릿광대 태그", + text={ + "무료 {C:attention}어릿광대 팩{} 을", + "제공합니다", + }, + }, + tag_charm={ + name="부적 태그", + text={ + "무료 {C:tarot}메가 아르카나 팩{} 을", + "제공합니다", + }, + }, + tag_coupon={ + name="쿠폰 태그", + text={ + "다음 상점의", + "초기 카드 및", + "부스터 팩이 무료입니다", + }, + }, + tag_d_six={ + name="D6 태그", + text={ + "다음 상점에서 리롤이", + "{C:money}$0{} 로 시작됩니다", + }, + }, + tag_double={ + name="더블 태그", + text={ + "다음에 선택한 {C:attention}태그{} 의", + "복사본을 제공합니다", + "{s:0.8,C:attention}더블 태그{s:0.8} 제외", + }, + }, + tag_economy={ + name="경제 태그", + text={ + "돈을 두 배로 만듭니다", + "{C:inactive}(최대 {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="천상의 태그", + text={ + "무료 {C:attention}유령 팩{} 을", + "제공합니다", + }, + }, + tag_foil={ + name="포일 태그", + text={ + "다음 기본 에디션 상점", + "조커가 무료이며", + "{C:dark_edition}포일이 됩니다", + }, + }, + tag_garbage={ + name="쓰레기 태그", + text={ + "이번 런에서 사용하지 않은 {C:red}버리기{}당", + "{C:money}$#1#{}를 제공합니다", + "{C:inactive}({C:money}$#2#{C:inactive} 제공)", + }, + }, + tag_handy={ + name="유용한 태그", + text={ + "이번 런에서 플레이한 {C:blue}핸드{}당", + "{C:money}$#1#{}를 제공합니다", + "{C:inactive}({C:money}$#2#{C:inactive} 제공)", + }, + }, + tag_holo={ + name="홀로그래픽 태그", + text={ + "다음 기본 에디션 상점", + "조커가 무료이며", + "{C:dark_edition}홀로그래픽이 됩니다", + }, + }, + tag_investment={ + name="투자 태그", + text={ + "보스 블라인드를", + "처치한 후,", + "{C:money}$#1#{} 를 획득합니다", + }, + }, + tag_juggle={ + name="저글러 태그", + text={ + "다음 라운드의", + "{C:attention}+#1#{} 핸드 크기", + }, + }, + tag_meteor={ + name="유성 태그", + text={ + "무료 {C:attention}메가 천체 팩{} 을", + "제공합니다", + }, + }, + tag_negative={ + name="네거티브 태그", + text={ + "다음 기본 에디션 상점", + "조커가 무료이며", + "{C:dark_edition}네거티브가 됩니다", + }, + }, + tag_orbital={ + name="궤도 태그", + text={ + "{C:attention}#1#{} 을(를)", + "{C:attention}#2# 레벨{} 만큼 업그레이드합니다", + }, + }, + tag_polychrome={ + name="폴리크롬 태그", + text={ + "다음 기본 에디션 상점", + "조커가 무료이며", + "{C:dark_edition}폴리크롬이 됩니다", + }, + }, + tag_rare={ + name="레어 태그", + text={ + "상점에 무료", + "{C:red}레어 조커가 있습니다", + }, + }, + tag_skip={ + name="속도 태그", + text={ + "이번 런에서 건너뛴 블라인드마다", + "{C:money}$#1#{} 를 제공합니다", + "{C:inactive}({C:money}$#2# 를 제공합니다{C:inactive})", + }, + }, + tag_standard={ + name="표준 태그", + text={ + "무료 {C:attention}메가 표준 팩{} 을", + "제공합니다", + }, + }, + tag_top_up={ + name="보충 태그", + text={ + "최대 {C:attention}#1#{} 장의", + "{C:blue}일반{} 조커를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + tag_uncommon={ + name="희귀 태그", + text={ + "상점에 무료", + "{C:green}희귀 조커가 있습니다", + }, + }, + tag_voucher={ + name="바우처 태그", + text={ + "다음 상점에", + "{C:voucher}바우처{} 하나를 추가합니다", + }, + }, + }, + Tarot={ + c_chariot={ + name="전차", + text={ + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다", + }, + }, + c_death={ + name="죽음", + text={ + "{C:attention}#1#{} 장의 카드를 선택하여,", + "{C:attention}왼쪽{} 카드를", + "{C:attention}오른쪽{} 카드로 전환합니다", + "{C:inactive}(드래그하여 재배열)", + }, + }, + c_devil={ + name="악마", + text={ + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다", + }, + }, + c_emperor={ + name="황제", + text={ + "최대 {C:attention}#1#{}장의", + "무작위 {C:tarot}타로{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + c_empress={ + name="여제", + text={ + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다", + }, + }, + c_fool={ + name="바보", + text={ + "이번 런 동안 사용한", + "마지막 {C:tarot}타로{} 또는", + "{C:planet}행성{} 카드를 생성합니다", + "{s:0.8,C:tarot}바보{s:0.8} 제외", + }, + }, + c_hanged_man={ + name="매달린 남자", + text={ + "최대 {C:attention}#1#{} 장의", + "선택한 카드를 파괴합니다", + }, + }, + c_heirophant={ + name="교황", + text={ + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다", + }, + }, + c_hermit={ + name="은둔자", + text={ + "돈을 두 배로 만듭니다", + "{C:inactive}(최대 {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="고위 여사제", + text={ + "최대 {C:attention}#1#{}장의", + "무작위 {C:planet}행성{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + c_judgement={ + name="심판", + text={ + "무작위 {C:attention}조커{} 카드를", + "생성합니다", + "{C:inactive}(공간이 있어야 합니다)", + }, + }, + c_justice={ + name="정의", + text={ + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다", + }, + }, + c_lovers={ + name="연인", + text={ + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다", + }, + }, + c_magician={ + name="마법사", + text={ + "{C:attention}#1#{}장의 선택한 카드를", + "{C:attention}#2#(으)로", + "강화합니다", + }, + }, + c_moon={ + name="달", + text={ + "최대 {C:attention}#1#{} 장의 선택한 카드를", + "{V:1}#2#{} (으)로", + "전환합니다", + }, + }, + c_star={ + name="별", + text={ + "최대 {C:attention}#1#{} 장의 선택한 카드를", + "{V:1}#2#{} (으)로", + "전환합니다", + }, + }, + c_strength={ + name="힘", + text={ + "선택한 {C:attention}#1#{} 장의", + "카드 랭크가 {C:attention}1{} 만큼", + "상승합니다", + }, + }, + c_sun={ + name="태양", + text={ + "최대 {C:attention}#1#{} 장의 선택한 카드를", + "{V:1}#2#{} (으)로", + "전환합니다", + }, + }, + c_temperance={ + name="절제", + text={ + "현재 모든 조커의", + "총 판매 가치를 제공합니다", + "{C:inactive}(최대 {C:money}$#1#{C:inactive})", + "{C:inactive}(현재 {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="탑", + text={ + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다", + }, + }, + c_wheel_of_fortune={ + name="운명의 수레바퀴", + text={ + "{C:green}#1# / #2#{} 의 확률로", + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{}, 또는", + "{C:dark_edition}폴리크롬{} 에디션을", + "무작위 {C:attention}조커{} 에 추가합니다", + }, + }, + c_world={ + name="세계", + text={ + "최대 {C:attention}#1#{} 장의 선택한 카드를", + "{V:1}#2#{} (으)로", + "전환합니다", + }, + }, + }, + Voucher={ + v_antimatter={ + name="반물질", + text={ + "{C:dark_edition}+1{} 개의 조커 슬롯", + }, + unlock={ + "{C:voucher}블랭크{} 를", + "총 {C:attention}#1#{} 회 교환합니다", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="빈 바우처", + text={ + "{C:inactive}아무 효과 없음?", + }, + }, + v_clearance_sale={ + name="대방출 세일", + text={ + "상점의 모든 카드와 팩이", + "{C:attention}#1#%{} 할인됩니다", + }, + }, + v_crystal_ball={ + name="수정 구슬", + text={ + "{C:attention}+1{} 소모품 슬롯", + }, + }, + v_directors_cut={ + name="디렉터스 컷", + text={ + "앤티당 보스 블라인드를", + "{C:attention}1{} 회 리롤합니다", + "롤당 {C:money}$#1#{}", + }, + }, + v_glow_up={ + name="글로우업", + text={ + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{}, 그리고", + "{C:dark_edition}폴리크롬{} 카드가", + "{C:attention}#1#X{} 만큼 더 자주 나타납니다", + }, + unlock={ + "최소 {C:attention}#1#{} 장의", + "{C:attention}조커{} 카드를", + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{}, 또는", + "{C:dark_edition}폴리크롬{} 에디션으로 보유합니다", + }, + }, + v_grabber={ + name="강탈자", + text={ + "라운드당", + "{C:blue}+#1#{} 핸드를", + "영구적으로 획득합니다", + }, + }, + v_hieroglyph={ + name="상형문자", + text={ + "라운드마다", + "{C:attention}-#1#{} 앤티,", + "{C:blue}-#1#{} 핸드", + }, + }, + v_hone={ + name="연마", + text={ + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{}, 그리고", + "{C:dark_edition}폴리크롬{} 카드가", + "{C:attention}#1#X{} 만큼 더 자주 나타납니다", + }, + }, + v_illusion={ + name="환상", + text={ + "상점 내 {C:attention}플레잉 카드{}에", + "{C:enhanced}강화{}, {C:dark_edition}에디션{},", + "및/또는 {C:attention}봉인{}이 있을 수 있습니다", + }, + unlock={ + "상점에서", + "총 {C:attention}#1#{} 장의 플레잉 카드를", + "구매합니다", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="청산", + text={ + "상점의 모든 카드와 팩이", + "{C:attention}#1#%{} 할인됩니다", + }, + unlock={ + "한 번의 런에서", + "최소 {C:attention}#1#{} 장의 {C:voucher}바우처{} 카드를", + "교환합니다", + }, + }, + v_magic_trick={ + name="마법 속임수", + text={ + "{C:attention}상점{} 에서", + "{C:attention}플레잉 카드{} 를", + "구매할 수 있습니다", + }, + }, + v_money_tree={ + name="돈나무", + text={ + "라운드마다 획득하는", + "이자 한도를", + "{C:money}$#1#{}로 상향", + }, + unlock={ + "{C:attention}#1#{} 회의 연속 라운드 동안", + "라운드 획득액당 이자를", + "최대로 받습니다", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="나초 통", + text={ + "라운드당", + "{C:blue}+#1#{} 핸드를", + "영구적으로 획득합니다", + }, + unlock={ + "총 {C:attention}#1#{} 장의 카드를", + "플레이합니다", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="관측소", + text={ + "{C:attention}소모품{} 지역의", + "{C:planet}행성{} 카드가", + "지정된 {C:attention}포커 핸드{} 에", + "{X:red,C:white} X#1# {} 배수를 제공합니다", + }, + unlock={ + "{C:planet}천체 팩{} 에서", + "총 {C:attention}#1#{} 장의 {C:planet}행성{} 카드를", + "사용합니다", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="징조의 구", + text={ + "{C:spectral}유령{} 카드가", + "{C:attention}아르카나 팩{} 에서", + "나타날 수 있습니다", + }, + unlock={ + "{C:attention}아르카나 팩{} 에서", + "총 {C:attention}#1#{} 장의 {C:tarot}타로{} 카드를", + "사용합니다", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="과잉", + text={ + "상점에서 {C:attention}+1{} 개의 카드 슬롯이", + "가능합니다", + }, + }, + v_overstock_plus={ + name="과잉 재고", + text={ + "상점에서 {C:attention}+1{} 개의 카드 슬롯이", + "가능합니다", + }, + unlock={ + "상점에서 총 {C:money}$#1#{} 를", + "지출합니다", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="페인트 붓", + text={ + "{C:attention}+#1#{} 핸드 크기", + }, + }, + v_palette={ + name="팔레트", + text={ + "{C:attention}+#1#{} 핸드 크기", + }, + unlock={ + "핸드 크기를", + "카드 {C:attention}#1#{}장으로 줄입니다", + }, + }, + v_petroglyph={ + name="암각화", + text={ + "라운드마다", + "{C:attention}-#1#{} 앤티,", + "{C:red}-#1#{} 버리기", + }, + unlock={ + "앤티 레벨", + "{E:1,C:attention}#1#{} 에 도달합니다", + }, + }, + v_planet_merchant={ + name="행성 상인", + text={ + "{C:planet}행성{} 카드가", + "상점에서 {C:attention}#1#X{} 만큼", + "더 자주 나타납니다", + }, + }, + v_planet_tycoon={ + name="행성 거물", + text={ + "{C:planet}행성{} 카드가", + "상점에서 {C:attention}#1#X{} 만큼", + "더 자주 나타납니다", + }, + unlock={ + "상점에서", + "총 {C:attention}#1#{} 장의 {C:tarot}행성{} 카드를", + "구매합니다", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="리사이클로맨시", + text={ + "라운드마다", + "{C:red}+#1#{} 버리기", + "영구적으로 획득", + }, + unlock={ + "총 {C:attention}#1#{} 장의 카드를", + "버립니다", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="리롤 과잉", + text={ + "리롤 비용이", + "{C:money}$#1#{} 감소합니다", + }, + unlock={ + "총 {C:attention}#1#{} 번", + "상점을 리롤합니다", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="잉여 리롤", + text={ + "리롤 비용이", + "{C:money}$#1#{} 감소합니다", + }, + }, + v_retcon={ + name="레트콘", + text={ + "앤티당 보스 블라인드를", + "{C:attention}무제한{},", + "리롤당 {C:money}$#1#{}", + }, + unlock={ + "{C:attention}#1#{} 블라인드를", + "발견합니다", + }, + }, + v_seed_money={ + name="시드 머니", + text={ + "라운드마다 획득하는", + "이자 한도를", + "{C:money}$#1#{}로 상향", + }, + }, + v_tarot_merchant={ + name="타로 상인", + text={ + "{C:tarot}타로{} 카드가", + "상점에서 {C:attention}#1#X{} 만큼", + "더 자주 나타납니다", + }, + }, + v_tarot_tycoon={ + name="타로 거물", + text={ + "{C:tarot}행성{} 카드가", + "상점에서 {C:attention}#1#X{} 만큼", + "더 자주 나타납니다", + }, + unlock={ + "상점에서", + "총 {C:attention}#1#{} 장의 {C:tarot}타로{} 카드를", + "구매합니다", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="망원경", + text={ + "{C:attention}천체 팩{} 이", + "가장 많이 플레이한", + "{C:attention}포커 핸드{} 의", + "{C:planet}행성{} 카드를 항상 보유합니다", + }, + }, + v_wasteful={ + name="낭비", + text={ + "라운드마다", + "{C:red}+#1#{} 버리기", + "영구적으로 획득", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="단일 핸드에서 칩 100,000,000개 획득", + _1000k="단일 핸드에서 칩 1,000,000개 획득", + _10k="단일 핸드에서 칩 10,000개 획득", + ante_up="앤티 4 도달", + ante_upper="앤티 8 도달", + astronomy="행성 카드 모두 발견", + big_hands="덱에 카드 80장 이상 보유", + card_discarder="카드 2,500장 이상 버리기", + card_player="카드 2,500장 이상 플레이", + cartomancy="타로 카드 모두 발견", + clairvoyance="유령 카드 모두 발견", + completionist="컬렉션 100% 발견", + completionist_plus="골드 스테이크 난이도에서 모든 덱으로 승리", + completionist_plus_plus="모든 조커에 골드 스티커 획득", + extreme_couponer="바우처 모두 발견", + flushed="5장의 와일드 카드로 플러시 플레이", + heads_up="런 승리", + high_stakes="골드 스테이크 난이도 이상에서 런 승리", + legendary="전설 조커 한 장 발견", + low_stakes="레드 스테이크 난이도 이상에서 런 승리", + mid_stakes="블루 스테이크 난이도 이상에서 런 승리", + nest_egg="단일 런에서 $400 이상 보유", + retrograde="어떤 포커 핸드든 레벨 10으로 만들기", + roi="앤티 4로 바우처 5개 구매", + royale="로열 플러시 플레이", + rule_bender="어떤 챌린지 런이든 완료", + rule_breaker="모든 챌린지 런 완료", + shattered="단일 핸드에서 글래스 카드 2장 깨기", + speedrunner="12회 이하의 라운드에서 런 승리", + tiny_hands="덱을 카드 20장 이하로 줄이기", + you_get_what_you_get="상점을 리롤하지 않고 런에서 승리", + }, + achievement_names={ + _100000k="100,000,000", + _1000k="10,000,000", + _10k="10,000", + ante_up="앤티 상승!", + ante_upper="앤티 더 상승!", + astronomy="천문학", + big_hands="큰 손", + card_discarder="카드 버리는 자", + card_player="카드 플레이어", + cartomancy="카드점", + clairvoyance="신통력", + completionist="완벽주의자", + completionist_plus="완벽주의자+", + completionist_plus_plus="완벽주의자++", + extreme_couponer="극한의 쿠폰 모으는 자", + flushed="플러시 홍조", + heads_up="알림", + high_stakes="높은 스테이크", + legendary="전설", + low_stakes="낮은 스테이크", + mid_stakes="중간 스테이크", + nest_egg="비상금", + retrograde="역행", + roi="ROI", + royale="로열", + rule_bender="규칙 남용자", + rule_breaker="규칙 파괴자", + shattered="산산조각", + speedrunner="스피드 러너", + tiny_hands="작은 손", + you_get_what_you_get="얻을 것 얻기", + }, + blind_states={ + Current="현재", + Defeated="패배함", + Select="선택", + Selected="선택함", + Skipped="건너뜀", + Upcoming="예정", + }, + challenge_names={ + c_blast_off_1="발사", + c_bram_poker_1="브램 포커", + c_city_1="15분 도시", + c_cruelty_1="잔인함", + c_double_nothing_1="두 배 또는 꽝", + c_five_card_1="카드 5장 뽑기", + c_fragile_1="연약함", + c_golden_needle_1="골든 바늘", + c_inflation_1="인플레이션", + c_jokerless_1="조커 없음", + c_knife_1="칼끝에서", + c_luxury_1="특별 소비세", + c_mad_world_1="미친 세계", + c_medusa_1="메두사", + c_monolith_1="모노리스", + c_non_perishable_1="비부패", + c_omelette_1="오믈렛", + c_rich_1="부자가 더 부자로", + c_typecast_1="정형화", + c_xray_1="엑스레이 시야", + }, + collabs={ + Clubs={ + ["1"]="기본", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="기본", + ["2"]="데이브 더 다이버", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="기본", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="기본", + ["2"]="더 위쳐", + ["3"]="사이버펑크 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="FAQ", + b_and_use="및 사용", + b_back="뒤로", + b_blinds="블라인드", + b_booster_packs="부스터 팩", + b_buy="구매", + b_cash_out="캐시 아웃", + b_challenges="챌린지", + b_collection="컬렉션", + b_collection_cap="컬렉션", + b_continue="계속하기", + b_copy="복사", + b_copy_seed="시드 복사", + b_create_profile="프로필 생성", + b_credits="크레딧", + b_current_profile="현재 프로필", + b_customize_deck="덱 사용자 지정", + b_deck="덱", + b_decks="덱", + b_delete_profile="프로필 삭제", + b_discard="버리기", + b_editions="에디션", + b_endless="무한 모드", + b_enhanced_cards="강화된 카드", + b_full_deck="풀 덱", + b_high_contrast_cards="고대비 카드", + b_how_to_play="게임 방법", + b_imagery="이미지", + b_jokers="조커", + b_load_profile="프로필 불러오기", + b_main_menu="메인 메뉴", + b_music="음악", + b_new_challenge="새로운 챌린지 시작", + b_new_run="새로운 런", + b_next="다음", + b_next_round_1="다음", + b_next_round_2="라운드", + b_open="열기", + b_options="옵션", + b_options_cap="옵션", + b_planet_cards="행성 카드", + b_play_cap="플레이", + b_play_hand="핸드 플레이", + b_playbalatro="playbalatro.com 방문", + b_poker_hands="포커 핸드", + b_quit_cap="나가기", + b_redeem="교환", + b_reduced_motion="동작 감소", + b_remaining="남음", + b_reroll_boss="보스 리롤", + b_reset_profile="프로필 초기화", + b_restrictions="제한", + b_retry="재시도", + b_rules="규칙", + b_run_info_1="런", + b_run_info_2="정보", + b_seals="봉인", + b_seed="시드", + b_select="선택", + b_sell="판매", + b_set_CRT="CRT", + b_set_CRT_bloom="CRT 블룸", + b_set_apply="적용", + b_set_audio="오디오", + b_set_crash_reports="충돌 보고서", + b_set_game="게임", + b_set_game_vol="게임 볼륨", + b_set_gamespeed="게임 속도", + b_set_graphics="그래픽", + b_set_master_vol="마스터 볼륨", + b_set_monitor="모니터 디스플레이", + b_set_music_vol="음악 볼륨", + b_set_pixel_smoothing="픽셀 아트 다듬기", + b_set_play_discard_pos="플레이/버리기 버튼 위치", + b_set_rumble="컨트롤러 진동", + b_set_screenshake="화면 흔들기", + b_set_shadows="그림자", + b_set_vibration="진동", + b_set_video="비디오", + b_set_windowmode="창 모드", + b_settings="설정", + b_skip="건너뛰기", + b_skip_blind="블라인드 건너뛰기", + b_skip_reward="보상 건너뛰기", + b_sort_hand="핸드 정렬", + b_sounds="사운드", + b_spectral_cards="유령 카드", + b_stake="스테이크", + b_start_new_run="새로운 런", + b_stat_consumables="소모품", + b_stat_jokers="조커", + b_stat_planets="행성", + b_stat_spectrals="유령", + b_stat_tarots="타로", + b_stat_vouchers="쿠폰", + b_stats="통계", + b_tags="태그", + b_tarot_cards="타로 카드", + b_unlock_all="모두 잠금 해제", + b_use="사용", + b_vouchers="바우처", + b_wishlist="Steam의 찜 목록", + k_aces="에이스", + k_achievement="도전과제", + k_achievements_disabled="도전과제 비활성화됨", + k_active="활성화", + k_active_ex="활성화!", + k_again_ex="다시!", + k_all_hands="모든 핸드", + k_also_applied="추가 적용", + k_ante="앤티", + k_ante_cap="앤티", + k_arcana_pack="아라카나 팩", + k_balanced="균형됨", + k_banned_cards="금지된 카드", + k_banned_tags="금지된 태그", + k_base_cap="기본", + k_base_cards="기본 카드", + k_best_hand="베스트 핸드", + k_booster="부스터", + k_buffoon_pack="어릿광대 팩", + k_cap_consumables="소모품", + k_card_stats="카드 통계", + k_celestial_pack="천체 팩", + k_challenge_mode="챌린지 모드", + k_challenges="챌린지", + k_choose="선택", + k_collection="컬렉션", + k_common="일반", + k_compatible="호환 가능", + k_copied_ex="복사됨!", + k_custom_rules="규칙 사용자 지정", + k_daily_run="일일 런", + k_debuffed="디버프됨", + k_deck="덱", + k_deck_stake_wins="덱 스테이크 승리", + k_defeated_by="패배한 대상:", + k_demo_version_ex="체험판 버전!", + k_disabled_ex="비활성화!", + k_drank_ex="소모함!", + k_duplicated_ex="복제됨!", + k_dwarf_planet="왜소행성", + k_eaten_ex="먹힘!", + k_edition="에디션", + k_effective="유효", + k_empty_caps="비어 있음", + k_enter_name="이름 입력", + k_enter_seed="시드 입력", + k_enter_text="텍스트 입력", + k_eroded_ex="무너짐!", + k_extinct_ex="소멸!", + k_face_cards="그림 카드", + k_game_modifiers="게임 사용자 정의", + k_gold="골드", + k_high_score_ex="높은 점수!", + k_hud_discards="버리기", + k_hud_hands="핸드", + k_incompatible="호환 불가능", + k_joker="조커", + k_joker_stickers="조커 스티커", + k_jokers_cap="조커", + k_legendary="레전더리", + k_level_prefix="Lv.", + k_level_up_ex="레벨 업!", + k_locked="잠김", + k_lower_score="점수", + k_lvl="Lv.", + k_melted_ex="녹음!", + k_money="돈", + k_mult="배수", + k_no_other_jokers="다른 조커 불가!", + k_no_reward="보상 없음", + k_no_room_ex="공간 없음!", + k_no_space_ex="자리 부족!", + k_none="없음", + k_nope_ex="아니요!", + k_not_allowed_ex="허용되지 않음!", + k_not_discovered="발견되지 않음", + k_numbered_cards="숫자 카드", + k_or="또는", + k_other="기타", + k_page="페이지", + k_planet="행성", + k_planet_q="행성?", + k_playing_as="플레이 이름:", + k_plus_joker="+1 조커", + k_plus_planet="+1 행성", + k_plus_spectral="+1 유령", + k_plus_stone="+1 스톤", + k_plus_tarot="+1 타로", + k_poker_hand="포커 핸드", + k_profile="프로필", + k_progress="진행 내용", + k_rank="랭크", + k_rare="레어", + k_redeemed_ex="교환됨!", + k_reroll="리롤", + k_reset="초기화", + k_reward="보상", + k_round="라운드", + k_safe_ex="안전!", + k_saved_ex="생존!", + k_seed="시드", + k_seeded_run="시드된 런", + k_skipped_cap="건너뜀", + k_spectral="유령", + k_spectral_pack="유령 팩", + k_stake="스테이크", + k_stake_level="스테이크 레벨", + k_standard_pack="표준 팩", + k_suit="수트", + k_swapped_ex="교체됨!", + k_tarot="타로", + k_trophies_disabled="트로피 비활성화됨", + k_trophy="트로피", + k_uncommon="희귀", + k_undisovered="발견되지 않음", + k_unknown="?????", + k_unlocked_ex="해제됨!", + k_upgrade_ex="업그레이드!", + k_val_up="가치 향상!", + k_view="보기", + k_voucher="바우처", + k_vouchers_cap="바우처", + k_wins="승리", + k_x_base="X 기본", + ml_bloom_opt={ + "꺼짐", + "켜짐", + }, + ml_buy_and_use_target={ + "구매", + "및 사용", + }, + ml_buy_target={ + "구매", + }, + ml_card_stats={ + "카드", + "통계", + }, + ml_controller_required={ + "플레이하려면 게임 컨트롤러가 필요합니다. ", + "계속하려면 컨트롤러를 연결하세요.", + }, + ml_crash_report_info={ + "충돌 보고서는 개발자에게 전달되어", + "향후 문제를 줄이는 데 도움이 됩니다.", + "신원 또는 개인 정보는 포함되지 않습니다.", + }, + ml_demo_thanks_message={ + "Steam에서 Balatro를 ", + "찜 목록에 담고 playbalatro.com에서", + "뉴스레터를 구독하세요", + }, + ml_disabled_seed={ + "모든 해제 및", + "발견이 비활성화됨", + }, + ml_edition_seal_enhancement_explanation={ + "플레잉 카드는 강화, 에디션, 봉인을", + "하나씩 가질 수도 있습니다", + }, + ml_eternal={ + "이터널은", + "판매하거나", + "파괴할 수 없습니다", + }, + ml_gold_seal_desc={ + "금 봉인은", + "플레이하면", + "핸드로 돌아옵니다", + }, + ml_offline_message={ + "이 기기는 오프라인입니다.", + "현재 저장 항목은 오래되었을 수 있습니다.", + }, + ml_open_target={ + "열기", + }, + ml_paste_seed={ + "붙이기", + "시드", + }, + ml_play_discard_pos_opt={ + "버리기/플레이", + "플레이/버리기", + }, + ml_redeem_target={ + "교환", + }, + ml_sell_target={ + "판매", + }, + ml_shadow_opt={ + "켜짐", + "꺼짐", + }, + ml_smoothing_opt={ + "꺼짐", + "켜짐", + }, + ml_unlock_all_explanation={ + "경고! 완전한 컬렉션을 잠금 해제하면", + "이 프로필의 도전과제가 비활성화됩니다!", + }, + ml_unlock_all_trophies={ + "경고! 완전한 컬렉션을 잠금 해제하면", + "이 프로필의 트로피가 비활성화됩니다!", + }, + ml_vsync_opt={ + "VSync 켜짐", + "VSync 꺼짐", + }, + ml_windowmode_opt={ + "창 모드", + "전체 화면", + "꽉 찬 화면", + }, + ph_1_level="+1 레벨", + ph_4_7_of_clubs="클럽7 4개 ", + ph_alert_debuff_confirm="'플레이'를 다시 눌러서 확인하세요", + ph_all_poker_hand="모든 포커 핸드", + ph_blind_reward="보상: ", + ph_blind_score_at_least="최소 득점:", + ph_boss_disabled="보스 비활성화!", + ph_choose_blind_1="다음 블라인드를", + ph_choose_blind_2="선택하세요", + ph_click_confirm="다시 눌러서 확인하세요", + ph_deck_preview_effective="조커, 블라인드 및 카드 강화에 따른 유효 합계", + ph_deck_preview_stones="스톤", + ph_defeat_the_boss="보스 블라인드 처치", + ph_defeat_this_blind_1="이 블라인드를 처치해서", + ph_defeat_this_blind_2="발견합니다", + ph_demo_thanks_1="BALATRO 체험판을", + ph_demo_thanks_2="플레이해 주셔서 감사합니다", + ph_display_stickers="런 중 스테이크 스티커 표시하기", + ph_game_over="게임 오버", + ph_improve_run="런을 업그레이드하세요!", + ph_most_played="(가장 많이 플레이한 핸드)", + ph_mr_bones="미스터 본즈에 의해 생존", + ph_no_boss_active="활성화된 보스 없음", + ph_no_vouchers="이번 런에서 교환한 바우처 없음", + ph_score_at_least="최소 득점:", + ph_score_cards_discarded="버린 카드", + ph_score_cards_played="플레이한 카드", + ph_score_cards_purchased="구매한 카드", + ph_score_furthest_ante="앤티", + ph_score_furthest_round="라운드", + ph_score_hand="베스트 핸드", + ph_score_new_collection="새로운 발견", + ph_score_poker_hand="가장 많이 플레이한 핸드", + ph_score_times_rerolled="리롤한 시간", + ph_select_challenge="챌린지 선택", + ph_sneak_peek="미리 보기", + ph_stat_consumable="이 카드를 사용한 횟수", + ph_stat_joker="이 카드로 완료한 라운드 합계", + ph_stat_voucher="이 바우처를 교환한 횟수", + ph_unscored_hand="핸드가 득점하지 않습니다", + ph_up_ante_1="앤티 상향", + ph_up_ante_2="모든 블라인드 향상", + ph_up_ante_3="블라인드 새로고침", + ph_vouchers_redeemed="이번 런에서 교환한 바우처", + ph_you_win="승리!", + ph_you_win_demo="체험판에서 승리했습니다!", + }, + high_scores={ + boss_streak="최다 연속 보스", + collection="컬렉션", + current_streak="", + furthest_ante="최고 앤티", + furthest_round="최고 라운드", + hand="베스트 핸드", + most_money="최고 금액", + poker_hand="가장 많이 플레이한 핸드", + win_streak="최다 연승", + }, + labels={ + blue_seal="블루 봉인", + common="일반", + eternal="이터널", + foil="포일", + gold_seal="골드 봉인", + holographic="홀로그래픽", + legendary="레전더리", + locked="잠김", + negative="네거티브", + perishable="부패", + pinned_left="고정", + planet="행성", + pluto_planet="왜소행성", + polychrome="폴리크롬", + purple_seal="퍼플 봉인", + rare="레어", + red_seal="레드 봉인", + rental="렌탈", + tarot="타로", + uncommon="희귀", + voucher="쿠폰", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "같은 랭크의 카드 5장", + }, + Flush={ + "같은 수트를 공유하는 5장의 카드", + }, + ["Flush Five"]={ + "같은 랭크 및 수트의 카드 5장", + }, + ["Flush House"]={ + "모든 카드가 같은 수트를 공유하는", + "트리플 및 페어", + }, + ["Four of a Kind"]={ + "같은 랭크의 카드 4장. 득점하지 않는", + "나머지 1장의 카드와 플레이할 수 있습니다", + }, + ["Full House"]={ + "트리플 및 페어", + }, + ["High Card"]={ + "플레이한 핸드가 위의 핸드에 해당하지", + "않으면, 가장 높은 랭크의 카드만 득점합니다", + }, + Pair={ + "같은 랭크를 공유하는 카드 2장. 득점하지 않는", + "나머지 3장의 카드와 플레이할 수 있습니다", + }, + ["Royal Flush"]={ + "모든 카드가 같은 수트를 공유하는", + "연속 5장의 카드 {연속 랭크}", + }, + Straight={ + "연속 5장의 카드 {연속 랭크}", + }, + ["Straight Flush"]={ + "모든 카드가 같은 수트를 공유하는", + "연속 5장의 카드 {연속 랭크}", + }, + ["Three of a Kind"]={ + "같은 랭크의 카드 3장.", + "나머지 2장의 카드와 플레이할 수 있습니다", + }, + ["Two Pair"]={ + "서로 다른 랭크의 카드 2쌍.", + "나머지 1장의 카드와 플레이할 수 있습니다", + }, + }, + poker_hands={ + ["Five of a Kind"]="파이브 카드", + Flush="플러시", + ["Flush Five"]="플러시 파이브", + ["Flush House"]="플러시 하우스", + ["Four of a Kind"]="포 카드", + ["Full House"]="풀하우스", + ["High Card"]="하이 카드", + Pair="페어", + ["Royal Flush"]="로열 플러시", + Straight="스트레이트", + ["Straight Flush"]="스트레이트 플러시", + ["Three of a Kind"]="트리플", + ["Two Pair"]="투 페어", + }, + quips={ + dq_1={ + "이런! 이 마지막", + "챌린지를 대비해", + "몇 가지 속임수를", + "숨겨 왔길 바라요!", + }, + lq_1={ + "낚시를 가는 게", + "더 빠를지도", + "모르겠네요...", + }, + lq_10={ + "완전히 실패네요!", + }, + lq_2={ + "우리는 싸구려 수트처럼", + "접었네요!", + }, + lq_3={ + "우리가 셔플을 해서", + "다시 시도할", + "차례네요!", + }, + lq_4={ + "그들이 뭐라고", + "했는지 아세요, 하우스가", + "항상 이긴대요!", + }, + lq_5={ + "누가 진짜", + "조커인지", + "알아낸 것 같네요!", + }, + lq_6={ + "이런, 당신도", + "허세 부린 건가요?", + }, + lq_7={ + "우리한테 장난을", + "치는 것 같네요!", + }, + lq_8={ + "저한테 손이 있었다면", + "제 눈을", + "가렸을 거예요!", + }, + lq_9={ + "전 말 그대로", + "바보예요, 당신", + "핑계는 뭔가요?", + }, + wq_1={ + "멋지게 해냈네요!", + }, + wq_2={ + "아주 잘", + "처리하셨습니다!", + }, + wq_3={ + "허세가 아니었던", + "것 같군요!", + }, + wq_4={ + "이 칩이 모두", + "가상이라니", + "안타깝네요...", + }, + wq_5={ + "제가 잘 가르친 것", + "같군요!", + }, + wq_6={ + "앞을 내다보는", + "플레이를 했군요!", + }, + wq_7={ + "당신에 맞서서", + "베팅을 안 해서", + "다행이군요!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="에이스", + Jack="잭", + King="킹", + Queen="퀸", + }, + suits_plural={ + Clubs="클럽", + Diamonds="다이아몬드", + Hearts="하트", + Spades="스페이드", + }, + suits_singular={ + Clubs="클럽", + Diamonds="다이아몬드", + Hearts="하트", + Spades="스페이드", + }, + tutorial={ + bb_1={ + "{C:attention}빅 블라인드{} 를 선택해서", + "더 많은 현금을 획득할 수 있어요", + }, + bb_2={ + "또는 {C:attention}건너뛰기{} 를 선택해서", + "{C:attention}태그{} 를 받을 수 있죠! 각", + "{C:attention}태그{} 에는 고유한 효과가 있습니다", + }, + bb_3={ + "하지만 {C:attention}보스 블라인드{} 를", + "주시하세요. 특정한 능력을", + "보유하고 있기 때문에", + "보다 계획적으로 플레이해야 합니다.", + }, + bb_4={ + "이기게 되면,", + "{C:attention}앤티{} 가 상승하며", + "모든 {C:attention}블라인드{} 가 어려워집니다", + }, + bb_5={ + "{C:attention}앤티{} #1# 을(를) 이겨 승리하세요.", + "이제 원하는 경로를 선택하세요!", + }, + fh_1={ + "{C:attention}포커 핸드{} 를 플레이하면", + "칩을 획득합니다", + }, + fh_2={ + "각 {C:attention}포커 핸드{} 는", + "{C:red}배수{} 를 곱한", + "기본 수량의 {C:blue}칩{} 을 획득합니다", + }, + fh_3={ + "{C:attention}런 정보{} 영역에서", + "{C:attention}포커 핸드{} 와 함께", + "현재 런에 대한", + "다른 정보도 확인해 보세요", + }, + fh_4={ + "또한 카드를 통해", + "{C:blue}칩{} 을 획득할 수 있으니", + "카드를 하나씩 확인해 보세요!", + }, + fh_4_touch={ + "또한 카드를 통해", + "{C:blue}칩{} 을 획득할 수 있으니", + "길게 눌러 확인하세요!", + }, + fh_5={ + "이제 최대 {C:attention}5{} 장의", + "플레이할 카드를 선택한 후", + "{C:blue}'핸드 플레이'{}를 누르세요", + }, + fh_5_touch={ + "이제 최대 {C:attention}5{} 장의", + "플레이할 카드를 탭한 후", + "{C:blue}'핸드 플레이'를 누르세요", + }, + fh_6={ + "또한 더 강한 핸드를 만들기 위해", + "최대 {C:attention}5{} 장의 카드를 선택해", + "{C:red}'버리기'{} 를 할 수도 있습니다.", + "한번 해보세요!", + }, + fh_7={ + "조심하세요! 라운드당", + "{C:blue}핸드{} 및 {C:red}버리기{} 의 수는", + "한정되어 있습니다.", + }, + fh_8={ + "이 라운드에서 승리하려면", + "{C:blue}핸드{} 가 떨어지기 전에", + "{C:attention}300개의 칩{} 을 획득해야 합니다.", + "행운을 빌어요!", + }, + s_1={ + "잘했어요! 이제", + "{C:money}현금{}이 {E:1}두둑{}하니까,", + "{C:attention}상점{} 에서 새 카드를", + "구매해 보세요", + }, + s_10={ + "{C:attention}바우처{} 는", + "{C:attention}보스 블라인드{} 를 처치해야", + "다시 채워집니다.", + }, + s_11={ + "또한, 상점마다", + "{C:booster}부스터 팩{} 두 개를", + "확인하세요. 좋은 걸로", + "가득 차 있습니다!", + }, + s_12={ + "{C:attention}다음 라운드{}로", + "넘어갑시다.", + }, + s_2={ + "이 잘생긴 악마를", + "구매해 보세요", + }, + s_2_touch={ + "이 잘생긴 악마를", + "구매해 보세요!", + "상점에서{C:attention}'구매'{}", + "구역으로 드래그하세요", + }, + s_3={ + "이것은 런에 추가할 수 있는", + "{C:attention}#1#{} 장의 {C:attention}조커{} 중 하나입니다.", + "모든 {C:attention}조커{} 는", + "각기 다른 기능을 합니다", + }, + s_4={ + "이것은 플레이하는 모든 핸드에", + "{C:red}+4 배수{} 를 추가합니다!", + }, + s_5={ + "한 번에 오직 {C:attention}5장의 조커{} 카드만", + "소지할 수 있으니", + "신중하게 선택하세요", + }, + s_6={ + "이제 {C:attention}상점{} 에서", + "다른 카드를 구매해 보세요", + }, + s_7={ + "이 {C:tarot}타로{} 카드는", + "{C:attention}소모품{} 입니다. 이것은", + "플레잉 카드를 강화합니다!", + "유용하니 넣어두세요.", + }, + s_8={ + "한 번에 최대", + "{C:attention}2장의 소모품{} 카드를", + "소지할 수 있습니다", + }, + s_9={ + "돈을 충분히 모으면,", + "{C:attention}바우처{} 를 구매할 수 있습니다.", + "{C:attention}바우처{} 는 패시브로", + "런을 업그레이드합니다!", + }, + sb_1={ + "안녕하세요! 게임 플레이", + "방법을 익히도록 도움을 드릴", + "{C:attention}짐보{}라고 합니다!", + }, + sb_2={ + "여러분의 목표는", + "{C:blue}칩{} 을 획득해서", + "적 {C:attention}블라인드{}를 물리치는 겁니다", + }, + sb_3={ + "이건 {C:blue}스몰 블라인드{}로,", + "물리치려면 {C:attention}칩 300개{} 만", + "획득하면 됩니다.", + }, + sb_4={ + "{C:blue}스몰 블라인드{} 를 선택해서", + "라운드를 시작하세요!", + }, + sh_1={ + "카드를 더 얻으면,", + "재배열할 수 있습니다", + "왼쪽에서 오른쪽으로 차례대로", + "{C:attention}조커{} 가 트리거됩니다", + }, + sh_2={ + "또한, 잊지 말고", + "소모품을 {C:attention}사용{} 하세요!", + }, + sh_3={ + "핸드에서 최대 {C:attention}2{} 장의 카드를", + "선택하고 해당 {C:tarot}타로{} 카드에서", + "{C:attention}'사용'{}을 눌러", + "강화하세요!", + }, + sh_3_touch={ + "핸드에서 최대 {C:attention}2{} 장의", + "카드를 선택하고", + "해당{C:tarot}타로{} 카드를 {C:attention}'사용'{} 구역으로", + "드래그하여 강화하세요!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# 핸드", + a_handsize="+#1# 핸드 크기", + a_handsize_minus="-#1# 핸드 크기", + a_mult="+#1# 배수", + a_mult_minus="-#1# 배수", + a_remaining="#1# 남음", + a_sold_tally="#1#/#2# 판매", + a_xmult="X#1# 배수", + a_xmult_minus="-X#1# 배수", + ante_x_voucher="앤티 #1# 바우처", + challenges_completed="완료한 #1#/#2# 챌린지", + completed="#1#/#2# 완료됨", + deck_preview_wheel_plural="#1# 카드가 뒤집혀서 나오기 때문에 숫자가 더 낮을 수도 있습니다", + deck_preview_wheel_singular="#1# 카드가 뒤집혀서 나오기 때문에 숫자가 더 낮을 수도 있습니다", + interest="$#2#당 이자 #1# (최대 #3#)", + loyalty_active="활성화!", + loyalty_inactive="#1# 남음", + ml_foil_desc={ + "포일", + "+#1# 개의 칩", + }, + ml_holo_desc={ + "홀로그래픽", + "+#1# 배수", + }, + ml_negative_consumable_desc={ + "네거티브", + "+#1# 소모품 슬롯", + }, + ml_negative_desc={ + "네거티브", + "매 라운드", + }, + ml_polychrome_desc={ + "폴리크롬", + "X#1# 배수", + }, + remaining_discard_money="남은 버리기 (각 $#1#)", + remaining_hand_money="남은 핸드 (각 $#1#)", + unlocked="#1#/#2# 해제됨", + }, + v_text={ + ch_c_all_eternal={ + "모든 상점 조커는 {C:eternal}이터널{}입니다", + }, + ch_c_chips_dollar_cap={ + "{C:blue}칩{} 은 현재 {C:money}${} 를 초과할 수 없습니다", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}일일 챌린지!", + }, + ch_c_debuff_played_cards={ + "모든 {C:attention}플레이한{} 카드가 득점 후 {C:attention}디버프됩니다{}", + }, + ch_c_discard_cost={ + "각 버리기 비용은 {C:money}$#1#{}입니다", + }, + ch_c_flipped_cards={ + "{C:green}1/#1#{}장의 카드가 뒤집혀서 나옵니다", + }, + ch_c_inflation={ + "구매할 때마다 가격을 {C:money}$1{}씩 영구적으로 인상합니다", + }, + ch_c_minus_hand_size_per_X_dollar={ + "{C:money}$#1#{}를 보유할 때마다 핸드에서 카드 {C:red}-1{}장을 보유합니다", + }, + ch_c_no_extra_hand_money={ + "추가 {C:blue}핸드{} 가 더 이상 돈을 획득하지 않습니다", + }, + ch_c_no_interest={ + "라운드 종료 시 {C:attention}이자{} 를 획득하지 않습니다", + }, + ch_c_no_reward={ + "모든 {C:attention}블라인드{} 가 보상 돈을 제공하지 않습니다", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# 블라인드{} 가 보상 돈을 제공하지 않습니다", + }, + ch_c_no_shop_jokers={ + "조커가 {C:attention}상점에서 더 이상 나타나지 않습니다", + }, + ch_c_none={ + "{C:inactive} 없음", + }, + ch_c_set_eternal_ante={ + "앤티 {C:attention}#1#{} 보스가 패배하면, 모든 조커는 {C:attention}이터널이 됩니다", + }, + ch_c_set_joker_slots_ante={ + "앤티 {C:attention}#1#{} 보스가 패배하면, 조커 슬롯은 {C:attention}0으로 설정됩니다", + }, + ch_c_set_seed={ + "설정된 시드로 1회 시도: {C:inactive}{숨김}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} 개의 소모품 슬롯", + }, + ch_m_discards={ + "라운드당 {C:red}#1#{} 번의 버리기", + }, + ch_m_dollars={ + "{C:money}$#1#{} 로 시작합니다", + }, + ch_m_hand_size={ + "{C:attention}#1#{} 핸드 크기", + }, + ch_m_hands={ + "라운드당 {C:blue}#1#{} 번의 핸드", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} 개의 조커 슬롯", + }, + ch_m_none={ + "{C:inactive}없음", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/nl.lua b/src/localization/nl.lua new file mode 100644 index 0000000..fea212c --- /dev/null +++ b/src/localization/nl.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Verlaten kaartspel", + text={ + "Begin het spel", + "zonder {C:attention}plaatjes", + "in je kaartspel", + }, + }, + b_anaglyph={ + name="Anaglyph kaartspel", + text={ + "Na het verslaan van elke", + "{C:attention}blind van een baas{}", + "verdien je een {C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Zwart kaartspel", + text={ + "{C:attention}+#1#{} Jokervak", + "", + "{C:blue}-#2#{} hand", + "elke ronde", + }, + }, + b_blue={ + name="Blauw kaartspel", + text={ + "{C:blue}+#1#{} hand", + "elke ronde", + }, + }, + b_challenge={ + name="Uitdagingskaartspel", + text={ + "", + }, + }, + b_checkered={ + name="Geruit kaartspel", + text={ + "Begin het spel met", + "{C:attention}26{C:spades} schoppen{} en", + "{C:attention}26{C:hearts} harten{} in het kaartspel", + }, + }, + b_erratic={ + name="Onzeker kaartspel", + text={ + "Alle {C:attention}rangen{} en", + "{C:attention}kleuren{} in het kaartspel", + "zijn willekeurig", + }, + }, + b_ghost={ + name="Spokenkaartspel", + text={ + "{C:spectral}Spectrale{} kaarten kunnen", + "verschijnen in de winkel,", + "je begint met een {C:spectral,T:c_hex}Hex{}-kaart", + }, + }, + b_green={ + name="Groen kaartspel", + text={ + "Aan het einde van elke ronde:", + "{C:money}$#1#{s:0.85} per overgebleven {C:blue}hand", + "{C:money}$#2#{s:0.85} per overgebleven {C:red}weggooimogelijkheid", + "Verdien geen {C:attention}rente", + }, + }, + b_magic={ + name="Magisch kaartspel", + text={ + "Begin het spel met de", + "{C:tarot,T:v_crystal_ball}#1#{} voucher", + "en {C:attention}2{} kopieën", + "van {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Nevel kaartspel", + text={ + "Begin het spel met de", + "{C:planet,T:v_telescope}#1#{} voucher", + "", + "{C:red}#2#{} verbruiksvak", + }, + }, + b_painted={ + name="Geschilderd kaartspel", + text={ + "{C:attention}+#1#{} handomvang", + "{C:red}#2#{} Jokervak", + }, + }, + b_plasma={ + name="Plasmakaartspel", + text={ + "Breng {C:blue}fiches{} en {C:red}Multi{} in", + "in evenwicht bij berekening", + "van score voor gespeelde hand", + "{C:red}X#1#{} basisomvang blind", + }, + }, + b_red={ + name="Rood kaartspel", + text={ + "{C:red}+#1#{} weggooimogelijkheid", + "elke ronde", + }, + }, + b_yellow={ + name="Geel kaartspel", + text={ + "Begin met", + "{C:money}$#1# extra", + }, + }, + b_zodiac={ + name="Sterrenbeeldkaartspel", + text={ + "Begin het spel met", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "en {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="Het wapen", + text={ + "Verlaag level van", + "gespeelde pokerhand", + }, + }, + bl_big={ + name="Big blind", + text={ + }, + }, + bl_club={ + name="De klaver", + text={ + "Alle klaverenkaarten", + "verliezen hun buff", + }, + }, + bl_eye={ + name="Het oog", + text={ + "Deze ronde geen", + "herhaalde handtypes", + }, + }, + bl_final_acorn={ + name="Amberkleurige eikel", + text={ + "Draait alle Jokerkaarten om", + "en schudt ze", + }, + }, + bl_final_bell={ + name="Azuurblauwe bel", + text={ + "Forceert 1 kaart om", + "altijd geselecteerd te zijn", + }, + }, + bl_final_heart={ + name="Karmozijnrood hart", + text={ + "Een willekeurige Joker is", + "per hand uitgeschakeld", + }, + }, + bl_final_leaf={ + name="Groen blaadje", + text={ + "Alle kaarten verliezen hun buff", + "tot er 1 Joker is verkocht", + }, + }, + bl_final_vessel={ + name="Violet vat", + text={ + "Zeer grote blind", + }, + }, + bl_fish={ + name="De vis", + text={ + "Met de afbeelding naar beneden getrokken", + "na elke gespeelde hand", + }, + }, + bl_flint={ + name="De vuursteen", + text={ + "Basisfiches en", + "Multi worden gehalveerd", + }, + }, + bl_goad={ + name="De aansporing", + text={ + "Alle schoppenkaarten", + "verliezen hun buff", + }, + }, + bl_head={ + name="Het hoofd", + text={ + "Alle hartenkaarten", + "verliezen hun buff", + }, + }, + bl_hook={ + name="De haak", + text={ + "Gooit 2 willekeurige kaarten", + "per gespeelde hand weg", + }, + }, + bl_house={ + name="Het huis", + text={ + "Eerste hand wordt met de ", + "afbeelding naar beneden getrokken", + }, + }, + bl_manacle={ + name="Boeien", + text={ + "-1 handomvang", + }, + }, + bl_mark={ + name="Het teken", + text={ + "Alle plaatjes worden getrokken", + "met de afbeelding naar beneden", + }, + }, + bl_mouth={ + name="De mond", + text={ + "Speel deze ronde", + "maar 1 handtype", + }, + }, + bl_needle={ + name="De naald", + text={ + "Speel maar 1 hand", + }, + }, + bl_ox={ + name="De os", + text={ + "Als je een #1# speelt,", + "gaat geld terug naar $ 0", + }, + }, + bl_pillar={ + name="De pilaar", + text={ + "Eerder gespeelde kaarten", + "bij deze ante verliezen hun buff", + }, + }, + bl_plant={ + name="De plant", + text={ + "Alle plaatjes", + "verliezen hun buff", + }, + }, + bl_psychic={ + name="De helderziende", + text={ + "Moet 5 kaarten spelen", + }, + }, + bl_serpent={ + name="Het serpent", + text={ + "Na spelen of weggooien,", + "trek je altijd 3 kaarten", + }, + }, + bl_small={ + name="Small blind", + text={ + }, + }, + bl_tooth={ + name="De tand", + text={ + "Verlies $ 1 per", + "gespeelde kaart", + }, + }, + bl_wall={ + name="De muur", + text={ + "Extra grote blind", + }, + }, + bl_water={ + name="Het water", + text={ + "Begin met", + "0 weggooimogelijkheden", + }, + }, + bl_wheel={ + name="Het rad", + text={ + " op 7 kaarten worden met de ", + "afbeelding naar beneden getrokken", + }, + }, + bl_window={ + name="Het raam", + text={ + "Alle ruitenkaarten", + "verliezen hun buff", + }, + }, + }, + Edition={ + e_base={ + name="Basis", + text={ + "Geen extra effecten", + }, + }, + e_foil={ + name="Folie", + text={ + "{C:chips}+#1#{} fiches", + }, + }, + e_holo={ + name="Holografisch", + text={ + "{C:mult}+#1#{} Multi", + }, + }, + e_negative={ + name="Negatief", + text={ + "{C:dark_edition}+#1#{} Jokervak", + }, + }, + e_negative_consumable={ + name="Negatief", + text={ + "{C:dark_edition}+#1#{} verbruiksvak", + }, + }, + e_polychrome={ + name="Polychroom", + text={ + "{X:mult,C:white} X#1# {} Multi", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Bonuskaart", + text={ + }, + }, + m_glass={ + name="Glazen kaart", + text={ + "{X:mult,C:white} X#1# {} Multi", + "Kans van {C:green}#2# op #3#{} om", + "kaart te vernietigen", + }, + }, + m_gold={ + name="Gouden kaart", + text={ + "{C:money}$#1#{} als deze", + "kaart in de hand ligt", + "aan het einde van ronde", + }, + }, + m_lucky={ + name="Bofkaart", + text={ + "Een kans van {C:green}#1# op #3#{}", + "op {C:mult}+#2#{} Multi", + "Een kans van {C:green}#1# op #5#{}", + "om {C:money}$#4#{} te winnen", + }, + }, + m_mult={ + name="Multikaart", + text={ + "{C:mult}+#1#{} Multi", + }, + }, + m_steel={ + name="Staalkaart", + text={ + "{X:mult,C:white} X#1# {} Multi", + "als deze kaart", + "in de hand blijft", + }, + }, + m_stone={ + name="Steenkaart", + text={ + "{C:chips}+#1#{} fiches", + "geen rang of kleur", + }, + }, + m_wild={ + name="Wildkaart", + text={ + "Kan gebruikt worden", + "als elke kleur", + }, + }, + }, + Joker={ + j_8_ball={ + name="8-bal", + text={ + "Kans van {C:green}#1# op #2#{} voor elke", + "gespeelde {C:attention}8{} om een", + "{C:tarot}tarot{}-kaart te creëren bij scoren", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + j_abstract={ + name="Abstracte Joker", + text={ + "{C:mult}+#1#{} Multi voor", + "elke {C:attention}Joker{}-kaart", + "{C:inactive}(Nu {C:red}+#2#{C:inactive} Multi)", + }, + }, + j_acrobat={ + name="Acrobaat", + text={ + "{X:red,C:white} X#1# {} Multi bij {C:attention}laatste", + "{C:attention}hand{} van de ronde", + }, + unlock={ + "Speel {C:attention,E:1}#1#{} handen", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Oeroude Joker", + text={ + "Elke gespeelde kaart met", + "de kleur {V:1}#2#{} geeft", + "{X:mult,C:white} X#1# {} Multi bij scoren,", + "{s:0.8}kleur verandert aan einde van ronde", + }, + }, + j_arrowhead={ + name="Pijlpunt", + text={ + "Gespeelde kaarten met", + "de kleur {C:spades}schoppen{} geven", + "{C:chips}+#1#{} fiches bij scoren", + }, + unlock={ + "Heb ten minste {E:1,C:attention}#1#", + "kaarten met de kleur {E:1,C:attention}#2#", + "in je kaartspel", + }, + }, + j_astronomer={ + name="Astronoom", + text={ + "Alle {C:planet}planeet{}-kaarten en", + "{C:planet}Hemelse pakketten{} in", + "de winkel zijn {C:attention}gratis", + }, + unlock={ + "Ontdek elke", + "{E:1,C:planet}planeet{}-kaart", + }, + }, + j_banner={ + name="Banner", + text={ + "{C:chips}+#1#{} fiches voor", + "elke overgebleven", + "{C:attention}weggooimogelijkheid", + }, + }, + j_baron={ + name="Baron", + text={ + "Elke {C:attention}heer{}", + "die je in je hand hebt", + "levert {X:mult,C:white} X#1# {} Multi op", + }, + }, + j_baseball={ + name="Honkbalkaart", + text={ + "{C:green}Ongewone{} Jokers", + "geven elk {X:mult,C:white} X#1# {} Multi", + }, + }, + j_blackboard={ + name="Krijtbord", + text={ + "{X:red,C:white} X#1# {} Multi als alle", + "niet-gespeelde kaarten in de hand", + "{C:spades}#2#{} of {C:clubs}#3#{} zijn", + }, + }, + j_bloodstone={ + name="Bloedsteen", + text={ + "Kans van {C:mult}#1# op #2#{} voor", + "gespeelde kaarten met", + "de kleur {C:hearts}harten{} geven", + "{X:mult,C:white} X#3# {} Multi bij scoren,", + }, + unlock={ + "Heb ten minste {E:1,C:attention}#1#", + "kaarten met de kleur {E:1,C:attention}#2#", + "in je kaartspel", + }, + }, + j_blue_joker={ + name="Blauwe Joker", + text={ + "{C:chips}+#1#{} fiches voor elke", + "overgebleven kaart in het {C:attention}kaartspel", + "{C:inactive}(Nu {C:chips}+#2#{C:inactive} fiches)", + }, + }, + j_blueprint={ + name="Bouwtekening", + text={ + "Kopieert vaardigheid van", + "{C:attention}Joker{} aan de rechterkant", + }, + unlock={ + "Win een spel", + }, + }, + j_bootstraps={ + name="Bijbenen", + text={ + "{C:mult}+#1#{} Multi voor elke", + "{C:money}$#2#{} die je hebt", + "{C:inactive}(Momenteel {C:mult}+#3#{C:inactive} Multi)", + }, + unlock={ + "Heb ten minste {E:1,C:attention}#1#", + "{C:dark_edition}polychrome{} Jokers", + }, + }, + j_brainstorm={ + name="Brainstormen", + text={ + "Kopieert de vaardigheid", + "van de meest linkse {C:attention}Joker", + }, + unlock={ + "Gooi een", + "{E:1,C:attention}Royal Flush weg", + }, + }, + j_bull={ + name="Stier", + text={ + "{C:chips}+#1#{} fiches voor", + "elke {C:money}$1{} die je hebt", + "{C:inactive}(Momenteel {C:chips}+#2#{C:inactive} fiches)", + }, + }, + j_burglar={ + name="Inbreker", + text={ + "Als {C:attention}blind{} is gekozen,", + "verdien je {C:red}+#1#{} handen en", + "{C:attention}verlies je alle weggooimogelijkheden", + }, + }, + j_burnt={ + name="Verbrande Joker", + text={ + "Upgrade het level van", + "de eerste {C:attention}weggegooide", + "pokerhand elke ronde", + }, + unlock={ + "Verkoop in totaal", + "{E:1,C:attention}#1#{} kaarten", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Visitekaartje", + text={ + "Gespeelde {C:attention}Plaatjes{} hebben", + "kans van {C:green}#1# op #2#{} om", + "geven {C:money}$ 2{} bij scoren", + }, + }, + j_caino={ + name="Canio", + text={ + "Deze joker levert {X:mult,C:white} X#1# {} Multi op", + "wanneer een {C:attention}plaatje{}", + "wordt vernietigd", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Kampvuur", + text={ + "Deze Joker verdient {X:mult,C:white}X#1#{} Multi", + "per {C:attention}verkochte{} kaart, reset", + "als {C:attention}blind van een baas{} is verslagen", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_card_sharp={ + name="Kaartscherp", + text={ + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "{C:attention}pokerhand{} deze ronde al", + "gespeeld is", + }, + }, + j_cartomancer={ + name="Kaartenmagiër", + text={ + "Maak een {C:tarot}tarot{}-kaart", + "als {C:attention}blind{} is geselecteerd,", + "{C:inactive}(Moet ruimte voor zijn)", + }, + unlock={ + "Ontdek elke", + "{E:1,C:tarot}tarot{}-kaart", + }, + }, + j_castle={ + name="Kasteel", + text={ + "Deze Joker verdient {C:chips}+#1#{} fiches", + "per weggegooide {V:1}#2#{} kaart,", + "de kleur verandert elke ronde", + "{C:inactive}(Nu {C:chips}+#3#{C:inactive} fiches)", + }, + }, + j_cavendish={ + name="Aanmatigend", + text={ + "{X:mult,C:white} X#1# {} Multi", + "kans van {C:green}#2# op #3#{} dat deze", + "kaart wordt vernietigd", + "aan het einde van ronde", + }, + }, + j_ceremonial={ + name="Ceremoniële dolk", + text={ + "Als {C:attention}blind{} is geselecteerd,", + "vernietig je de Joker aan de rechterkant", + "en voeg je zijn {C:attention}dubbele", + "verkoopwaarde permanent toe aan deze {C:attention}Multi", + "{C:inactive}(Nu {C:mult}+#1#{C:inactive} Multi)", + }, + }, + j_certificate={ + name="Certificaat", + text={ + "Als de ronde begint,", + "wordt een willekeurige {C:attention}speelkaart{}", + "{C:attention}{} met een willekeurige", + "{C:attention}zegel{} aan je hand toegevoegd", + }, + unlock={ + "Heb een gouden", + "speelkaart met", + "een {C:attention,E:1}gouden zegel", + }, + }, + j_chaos={ + name="Chaos de Clown", + text={ + "{C:green}#1#{} gratis keer {C:attention}verversen", + "per winkel", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Schakelt effect van", + "elke {C:attention}blind van een baas uit", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Slimme Joker", + text={ + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_cloud_9={ + name="Op wolkjes", + text={ + "Verdient {C:money}$#1#{} voor elke", + "{C:attention}9{} in je {C:attention}volledige kaartspel", + "aan het einde van ronde", + "{C:inactive}(Nu {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="Sterrenbeeld", + text={ + "Deze joker levert", + "{X:mult,C:white} X#1# {} Multi op telkens als", + "een {C:planet}planeet{}-kaart wordt gebruikt", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_crafty={ + name="Listige Joker", + text={ + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_crazy={ + name="Gekke Joker", + text={ + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_credit_card={ + name="Creditcard", + text={ + "Staat een schuld van", + "{C:red}-$#1#{} toe", + }, + }, + j_delayed_grat={ + name="Uitgestelde voldoening", + text={ + "Verdien {C:money}$#1#{} per {C:attention}weggooimogelijkheid{} als", + "er geen kaarten zijn weggegooid", + "aan het einde van de ronde", + }, + }, + j_devious={ + name="Vileine Joker", + text={ + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_diet_cola={ + name="Cola light", + text={ + "Verkoop deze kaart om", + "een gratis", + "{C:attention}#1# te maken", + }, + }, + j_dna={ + name="DNA", + text={ + "Als {C:attention}eerste hand{} van de ronde", + "maar {C:attention}1{} kaart heeft, voeg", + "je een permanente kopie toe aan het kaartspel", + "en trek je deze naar de {C:attention}hand", + }, + }, + j_drivers_license={ + name="Rijbewijs", + text={ + "{X:mult,C:white} X#1# {} Multi als je", + "ten minste {C:attention}16", + "verbeterde kaarten heeft", + "{C:inactive}(Nu {C:attention}#2#{C:inactive})", + }, + unlock={ + "Verbeter {E:1,C:attention}#1#{} kaarten", + "in je kaartspel", + }, + }, + j_droll={ + name="Grappige Joker", + text={ + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_drunkard={ + name="Dronkaard", + text={ + "{C:red}+#1#{} weggooimogelijkheid", + "per ronde", + }, + }, + j_duo={ + name="Het duo", + text={ + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + unlock={ + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen", + }, + }, + j_dusk={ + name="Schemering", + text={ + "Reactiveer alle gespeelde", + "kaarten in {C:attention}laatste", + "{C:attention}hand{} van de ronde", + }, + }, + j_egg={ + name="Ei", + text={ + "Verhoogt {C:attention}verkoopwaarde{}", + "met {C:money}$#1#{} aan", + "het einde van de ronde", + }, + }, + j_erosion={ + name="Erosie", + text={ + "{C:red}+#1#{} Multi voor elke", + "kaart onder {C:attention}#3#{}", + "in je volledige kaartspel", + "{C:inactive}(Nu {C:red}+#2#{C:inactive} Multi)", + }, + }, + j_even_steven={ + name="Gelijke Pijke", + text={ + "Gespeelde kaarten met", + "een {C:attention}even{} rang geven", + "{C:mult}+#1#{} Multi bij scoren", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Joker zonder gezicht", + text={ + "Verdien {C:money}$#1#{} als {C:attention}#2#{} of", + "meer {C:attention}plaatjes{}", + "tegelijkertijd worden", + "weggegooid", + }, + }, + j_family={ + name="De familie", + text={ + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + unlock={ + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "Elke gespeelde {C:attention}aas{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} of {C:attention}8{}", + "geven {C:mult}+#1#{} Multi bij scoren", + }, + }, + j_flash={ + name="Flash-kaart", + text={ + "Deze joker levert {C:mult}+#1#{} Multi", + "op per {C:attention}verversing{} in de winkel", + "{C:inactive}(Momenteel {C:mult}+#2#{C:inactive} Multi)", + }, + }, + j_flower_pot={ + name="Bloempot", + text={ + "{X:mult,C:white} X#1# {} Multi als", + "pokerhand een", + "{C:diamonds}ruiten{}-kaart, {C:clubs}klaveren{}-kaart,", + "{C:hearts}harten{}-kaart en {C:spades}schoppen{}-kaart bevat", + }, + unlock={ + "Bereik ante", + "level {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Waarzegger", + text={ + "{C:red}+#1#{} Multi per", + "gebruikte {C:purple}Tarot{}-kaart", + "{C:inactive}(Nu {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Vier vingers", + text={ + "Alle {C:attention}Flushes{} en", + "{C:attention}Straights{} kunnen gemaakt", + "worden met {C:attention}4{} kaarten", + }, + }, + j_gift={ + name="Cadeaukaart", + text={ + "Voegt {C:money}$#1#{} {C:attention}verkoopwaarde toe", + "aan elke {C:attention}Joker{} en", + "{C:attention}verbruiks{}-kaart bij", + "einde van ronde", + }, + }, + j_glass={ + name="Glazen Joker", + text={ + "Deze joker levert {X:mult,C:white} X#1# {} Multi", + "voor elke {C:attention}glaskaart", + "die wordt vernietigd", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + unlock={ + "Heb ten minste {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} in", + "je kaartspel", + }, + }, + j_gluttenous_joker={ + name="Gulzige Joker", + text={ + "Gespeelde kaarten met", + "de kleur {C:clubs}#2#{} geven", + "{C:mult}+#1#{} Multi bij scoren", + }, + }, + j_golden={ + name="Gouden Joker", + text={ + "Verdien {C:money}$#1#{} aan", + "einde van ronde", + }, + }, + j_greedy_joker={ + name="Hebberige Joker", + text={ + "Gespeelde kaarten met", + "de kleur {C:diamonds}#2#{} geven", + "{C:mult}+#1#{} Multi bij scoren", + }, + }, + j_green_joker={ + name="Groene Joker", + text={ + "{C:mult}+#1#{} Multi per gespeelde hand", + "{C:mult}-#2#{} Multi per weggegooide kaart", + "{C:inactive}(Nu {C:mult}+#3#{C:inactive} Multi)", + }, + }, + j_gros_michel={ + name="Gros Michel", + text={ + "{C:mult}+#1#{} Multi", + "Kans van {C:green}#2# op #3#{} dat deze", + "kaart wordt vernietigd", + "aan het einde van ronde", + }, + }, + j_hack={ + name="Bedrieger", + text={ + "Reactiveer", + "elke gespeelde", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} of {C:attention}5{}", + }, + }, + j_half={ + name="Halve Joker", + text={ + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "{C:attention}#2#{} of minder kaarten bevat", + }, + }, + j_hallucination={ + name="Hallucinatie", + text={ + "Kans van {C:green}#1# op #2#{} om een", + "{C:tarot}tarot{}-kaart te creëren als er een", + "{C:attention}Boosterpakket{} is geopend", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + j_hanging_chad={ + name="Ongeldige stem", + text={ + "Reactiveer de {C:attention}eerst{} gespeelde", + "kaart die scoort", + "{C:attention}#1#{} keer extra", + }, + unlock={ + "Versla een blind van een baas", + "met een {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Lifter", + text={ + "Elke gespeelde {C:attention}kaart{}", + "krijgt permanent", + "{C:chips}+#1#{} fiches bij scoren", + }, + }, + j_hit_the_road={ + name="De boer op", + text={ + "Deze joker levert {X:mult,C:white} X#1# {} Multi", + "op voor elke weggegooide {C:attention}boer{}", + "deze ronde", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + unlock={ + "Gooi {E:1,C:attention}5", + "{E:1,C:attention}boeren{} tegelijkertijd", + "weg", + }, + }, + j_hologram={ + name="Hologram", + text={ + "Deze joker levert {X:mult,C:white} X#1# {} Multi", + "op wanneer een {C:attention}speelkaart{}", + "aan je kaartspel wordt toegevoegd", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_ice_cream={ + name="IJsco", + text={ + "{C:chips}+#1#{} fiches", + "{C:chips}-#2#{} fiches voor", + "elke gespeelde hand", + }, + }, + j_idol={ + name="Het idool", + text={ + "Elke gespeelde {C:attention}#2#", + "van {V:1}#3#{} geeft", + "{X:mult,C:white} X#1# {} Multi bij scoren", + "{s:0.8}Kaart verandert elke ronde", + }, + unlock={ + "Verdien in één hand", + "ten minste", + "{E:1,C:attention}#1#{} fiches", + }, + }, + j_invisible={ + name="Onzichtbare Joker", + text={ + "Verkoop deze kaart na {C:attention}#1#{}", + "rondes om", + "een willekeurige Joker te {C:attention}verdubbelen{}", + "{C:inactive}(Nu {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Win een spel zonder", + "ooit meer dan", + "{E:1,C:attention}4 Jokers{} te hebben", + }, + }, + j_joker={ + name="Joker", + text={ + "{C:red,s:1.1}+#1#{} Multi", + }, + }, + j_jolly={ + name="Vrolijke Joker", + text={ + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_juggler={ + name="Jongleur", + text={ + "{C:attention}+#1#{} handomvang", + }, + }, + j_loyalty_card={ + name="Trouwheidskaart", + text={ + "{X:red,C:white} X#1# {} Multi per", + "{C:attention}#2#{} gespeelde handen", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Verkoop deze kaart", + "om de huidige", + "{C:attention}Blind van een baas{} uit te schakelen", + }, + }, + j_lucky_cat={ + name="Boffende kat", + text={ + "Deze joker levert {X:mult,C:white} X#1# {} Multi", + "op telkens als een {C:attention}bof{}-kaart", + "{C:green}succesvol{} activeert", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_lusty_joker={ + name="Lustige Joker", + text={ + "Gespeelde kaarten met", + "de kleur {C:hearts}#2#{} geven", + "{C:mult}+#1#{} Multi bij scoren", + }, + }, + j_mad={ + name="Maffe Joker", + text={ + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_madness={ + name="Krankzinnigheid", + text={ + "Als {C:attention}small blind{} of {C:attention}big blind{}", + "is geselecteerd, krijg {X:mult,C:white} X#1# {} Multi", + "en {C:attention}vernietig{} een willekeurige joker", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_mail={ + name="Cashback", + text={ + "Verdien {C:money}$#1#{} voor elke", + "weggegooide {C:attention}#2#{}, de rang", + "verandert elke ronde", + }, + }, + j_marble={ + name="Marmeren Joker", + text={ + "Voegt een {C:attention}steen{}-kaart toe", + "aan je kaartspel als", + "als {C:attention}blind{} is geselecteerd", + }, + }, + j_matador={ + name="Matador", + text={ + "Verdien {C:money}$#1#{} als gespeelde", + "hand de", + "{C:attention}blind van een baas{}-vaardigheid activeert", + }, + unlock={ + "Versla een blind van een baas", + "in {E:1,C:attention}1 hand{} zonder", + "kaarten weg te gooien", + }, + }, + j_merry_andy={ + name="Vrolijke Andy", + text={ + "{C:red}+#1#{} weggooimogelijkheden", + "per ronde,", + "{C:red}#2#{} handomvang", + }, + unlock={ + "Win een spel in maximaal {E:1,C:attention}#1#", + "rondes", + }, + }, + j_midas_mask={ + name="Midasmasker", + text={ + "Alle gespeelde {C:attention}plaatjes{}", + "worden {C:attention}gouden{} kaarten", + "bij scoren", + }, + }, + j_mime={ + name="Pantomime", + text={ + "Reactiveer alle", + "kaarten {C:attention}vastgehouden in", + "{C:attention}hand{}-vaardigheden", + }, + }, + j_misprint={ + name="Drukfout", + text={ + "", + }, + }, + j_mr_bones={ + name="Meneer Botjes", + text={ + "Voorkomt dood", + "als gescoorde fiches", + "ten minste {C:attention}25% bedragen", + "van de vereiste fiches", + "{S:1.1,C:red,E:2}vernietigt zichzelf{}", + }, + unlock={ + "Verlies {C:attention,E:1}#1#{} spelletjes", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Mystieke piek", + text={ + "{C:mult}+#1#{} Multi als er", + "{C:attention}#2#{} weggooimogelijkheden", + "resteren", + }, + }, + j_obelisk={ + name="Obelisk", + text={ + "Deze joker levert {X:mult,C:white} X#1# {} Multi", + "op per {C:attention}opeenvolgende{} gespeelde hand", + "zonder je meest gespeelde", + "{C:attention}pokerhand", + "{C:inactive} te spelen (Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_odd_todd={ + name="Oneven Steven", + text={ + "Gespeelde kaarten met", + "een {C:attention}oneven{} rang geven", + "{C:chips}+#1#{} fiches bij scoren", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Onyx-agaat", + text={ + "Gespeelde kaarten met", + "de kleur {C:clubs}klaveren{} geven", + "{C:mult}+#1#{} Multi bij scoren", + }, + unlock={ + "Heb ten minste {E:1,C:attention}#1#", + "kaarten met de kleur {E:1,C:attention}#2#", + "in je kaartspel", + }, + }, + j_oops={ + name="Oeps! Allemaal 6'en", + text={ + "Verdubbelt alle {C:attention}vermelde", + "{C:green,E:1,S:1.1}mogelijkheden", + "{C:inactive}(bijv.: {C:green}1 op 3{C:inactive} -> {C:green}2 op 3{C:inactive})", + }, + unlock={ + "Verdien in één hand", + "ten minste", + "{E:1,C:attention}#1#{} fiches", + }, + }, + j_order={ + name="De orde", + text={ + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + unlock={ + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen", + }, + }, + j_pareidolia={ + name="Pareidolie", + text={ + "Alle kaarten worden", + "beschouwd als", + "{C:attention}plaatjes{}", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Maak een {C:dark_edition}negatieve{} kopie van", + "{C:attention}1{} willekeurige {C:attention}verbruiks{}-", + "kaart in je bezit", + "aan het eind van de {C:attention}winkel", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Foto", + text={ + "Eerste gespeelde {C:attention}plaatje", + "levert {X:mult,C:white} X#1# {} Multi op", + "bij scoren", + }, + }, + j_popcorn={ + name="Popcorn", + text={ + "{C:mult}+#1#{} Multi", + "{C:mult}-#2#{} Multi per", + "gespeelde ronde", + }, + }, + j_raised_fist={ + name="Geheven vuist", + text={ + "Voegt de {C:attention}dubbele{} rang", + "van de kaart met de {C:attention}laagste{} rang", + "in de hand toe aan Multi", + }, + }, + j_ramen={ + name="Noedels", + text={ + "{X:mult,C:white} X#1# {} Multi,", + "verliest {X:mult,C:white} X#2# {} Multi", + "per weggegooide {C:attention}kaart{}", + }, + }, + j_red_card={ + name="Rode kaart", + text={ + "Deze joker levert", + "{C:red}+#1#{} Multi op wanneer een", + "{C:attention}boosterpakket{} wordt overgeslagen", + "{C:inactive}(Momenteel {C:red}+#2#{C:inactive} Multi)", + }, + }, + j_reserved_parking={ + name="Gereserveerde parkeerplaats", + text={ + "Elk {C:attention}plaatje{}", + "dat je in je hand hebt", + "heeft een kans van {C:green}#2# op #3#{}", + "om {C:money}$#1#{} op te leveren", + }, + }, + j_ride_the_bus={ + name="Met de bus mee", + text={ + "Deze joker levert {C:mult}+#1#{} Multi", + "op per {C:attention}opeenvolgende{} hand", + "die wordt gespeeld zonder een", + "scorend {C:attention}plaatje{}", + "{C:inactive}(Momenteel {C:mult}+#2#{C:inactive} Multi)", + }, + }, + j_riff_raff={ + name="Gespuis", + text={ + "Als {C:attention}blind{} is geselecteerd,", + "maak {C:attention}#1# {C:blue}gewone{C:attention} Joker", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + j_ring_master={ + name="Ringmeester", + text={ + "{C:attention}Jokers{}, {C:tarot}tarot{}-, {C:planet}planeet{}-kaarten", + "en {C:spectral}spectrale{} kaarten", + "verschijnen meerdere keren", + }, + unlock={ + "Bereik ante", + "level {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Raket", + text={ + "Verdien {C:money}$#1#{} aan het eind van de ronde", + "Uitbetaling stijgt met {C:money}$#2#{}", + "wanneer een {C:attention}baasblind{} wordt verslagen", + }, + }, + j_rough_gem={ + name="Ruwe diamant", + text={ + "Gespeelde kaarten met", + "de kleur {C:diamonds}ruiten{} leveren", + "{C:money}$#1#{} op bij scoren", + }, + unlock={ + "Heb ten minste {E:1,C:attention}#1#", + "kaarten met de kleur {E:1,C:attention}#2#", + "in je kaartspel", + }, + }, + j_runner={ + name="Hardloper", + text={ + "Levert {C:chips}+#2#{} fiches op", + "als gespeelde hand", + "een {C:chips}Straight{} bevat", + "{C:inactive}(Nu {C:chips}+#1#{C:inactive} fiches)", + }, + }, + j_satellite={ + name="Satelliet", + text={ + "Verdien {C:money}$#1#{} aan het einde", + "van ronde per unieke {C:planet}planeet-", + "kaart die je dit spel gebruikt", + "{C:inactive}(Nu {C:money}$#2#{C:inactive})", + }, + unlock={ + "Heb {E:1,C:money}$#1#", + "of meer", + }, + }, + j_scary_face={ + name="Eng gezicht", + text={ + "Gespeelde {C:attention}plaatjes{}", + "geven {C:chips}+#1#{} fiches", + "bij scoren", + }, + }, + j_scholar={ + name="Geleerde", + text={ + "Gespeelde {C:attention}azen{}", + "geven {C:chips}+#2#{} fiches", + "en {C:mult}+#1#{} Multi", + "bij scoren", + }, + }, + j_seance={ + name="Seance", + text={ + "Als een {C:attention}pokerhand{} een", + "{C:attention}#1#{} is, maak een", + "een willekeurige {C:spectral}spectrale{} kaart", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + j_seeing_double={ + name="Dubbel zien", + text={ + "{X:mult,C:white} X#1# {} Multi als gespeelde hand", + "een scorende {C:clubs}klaveren{}-kaart", + "en een scorende kaart van", + "een andere {C:attention}kleur{} bevat", + }, + unlock={ + "Speel een hand", + "met", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Seltzer", + text={ + "Reactiveer alle", + "gespeelde kaarten gedurende", + "de volgende {C:attention}#1#{} handen", + }, + }, + j_shoot_the_moon={ + name="Bereik de maan", + text={ + "Elke {C:attention}vrouw{}", + "in de hand", + "levert {C:mult}+#1#{} Multi op", + }, + unlock={ + "Speel elke {E:1,C:attention}hartenkaart", + "in je kaartspel in", + "één ronde", + }, + }, + j_shortcut={ + name="Kortere route", + text={ + "Staat toe dat {C:attention}straights{} worden", + "gemaakt met leemtes van {C:attention}1 rang", + "{C:inactive}(bijv.: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Zesde zintuig", + text={ + "Als {C:attention}eerste hand{} van ronde", + "een enkele {C:attention}6{} is, wordt deze vernietigd", + "en wordt een {C:spectral}spectrale{} kaart gecreëerd", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + j_sly={ + name="Sluwe Joker", + text={ + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_smeared={ + name="Besmeurde Joker", + text={ + "{C:diamonds}Harten{} en {C:diamonds}ruiten", + "tellen als dezelfde kleur,", + "{C:spades}schoppen{} en {C:spades}klaveren", + "tellen als dezelfde kleur", + }, + unlock={ + "Heb ten minste {C:attention}#1#", + "{E:1,C:attention}#2#{} in", + "je kaartspel", + }, + }, + j_smiley={ + name="Smiley", + text={ + "Gespeelde {C:attention}plaatjes{}", + "geven {C:mult}+#1#{} Multi", + "bij scoren", + }, + }, + j_sock_and_buskin={ + name="Komedie en tragedie", + text={ + "Reactiveer alle", + "gespeelde {C:attention}plaatjes{}", + }, + unlock={ + "Speel in totaal", + "{C:attention,E:1}#1#{} plaatjes", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Ruimtejoker", + text={ + "Kans van {C:green}#1# op #2#{} om", + "level van", + "gespeelde {C:attention}pokerhand{} te upgraden", + }, + }, + j_splash={ + name="Plons", + text={ + "Elke {C:attention}gespeelde kaart", + "telt mee bij de score", + }, + }, + j_square={ + name="Vierkante Joker", + text={ + "Deze joker levert {C:chips}+#2#{} fiches", + "op als gespeelde hand", + "precies {C:attention}4{} kaarten bevat", + "{C:inactive}(Momenteel {C:chips}#1#{C:inactive} fiches)", + }, + }, + j_steel_joker={ + name="Stalen Joker", + text={ + "Levert {X:mult,C:white} X#1# {} Multi op", + "voor elke {C:attention}staalkaart", + "in je {C:attention}volledige kaartspel", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_stencil={ + name="Jokerstencil", + text={ + "{X:red,C:white} X1 {} Multi voor elk", + "leeg {C:attention}Joker{}-vak", + "inclusief het {s:0.8}Jokerstencil", + "{C:inactive}(Nu {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Stenen Joker", + text={ + "Levert {C:chips}+#1#{} fiches op voor", + "elke {C:attention}steenkaart", + "in je {C:attention}volledige kaartspel", + "{C:inactive}(Momenteel {C:chips}+#2#{C:inactive} fiches)", + }, + }, + j_stuntman={ + name="Stuntman", + text={ + "{C:chips}+#1#{} fiches,", + "{C:attention}-#2#{} handomvang", + }, + unlock={ + "Verdien in één hand", + "ten minste", + "{E:1,C:attention}#1#{} fiches", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Voegt het aantal keren dat", + "{C:attention}pokerhand{} is gespeeld", + "in dit spel toe aan Multi", + }, + }, + j_superposition={ + name="Superpositie", + text={ + "Maak een {C:tarot}tarot-{}kaart als", + "pokerhand een", + "{C:attention}aas{} en een {C:attention}straight{} bevat", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + j_swashbuckler={ + name="Vrijbuiter", + text={ + "Voegt de verkoopwaarde", + "van alle andere", + "{C:attention}jokers{} in bezit toe aan Multi", + "{C:inactive}(Momenteel {C:mult}+#1#{C:inactive} Multi)", + }, + unlock={ + "Verkoop in totaal", + "{C:attention,E:1}#1#{} Jokerkaarten", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Retro", + text={ + "{X:mult,C:white} X#1# {} Multi voor elke", + "overgeslagen {C:attention}blind{} in dit spel", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + unlock={ + "Doorgaan met een opgeslagen spel", + "uit het hoofdmenu", + }, + }, + j_ticket={ + name="Gouden kaartje", + text={ + "Gespeelde {C:attention}gouden{} kaarten", + "leveren {C:money}$#1#{} op bij scoren", + }, + unlock={ + "Speel een hand met 5 kaarten", + "met alleen maar", + "{C:attention,E:1}gouden{} kaarten", + }, + }, + j_to_the_moon={ + name="Naar de maan", + text={ + "Verdien {C:money}$#1#{} extra", + "{C:attention}rente{} voor elke {C:money}$ 5{} die je", + "hebt aan het einde van ronde", + }, + }, + j_todo_list={ + name="Takenlijst", + text={ + "Verdien {C:money}$#1#{} als {C:attention}pokerhand{}", + "een {C:attention}#2#{} is.", + "Pokerhand verandert", + "aan het eind van de ronde", + }, + }, + j_trading={ + name="Ruilkaart", + text={ + "Als {C:attention}eerste weggooimogelijkheid{} van de ronde", + "maar {C:attention}1{} kaart heeft, vernietig", + "deze dan en verdien {C:money}$#1#", + }, + }, + j_tribe={ + name="De stam", + text={ + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + unlock={ + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "Gespeelde {C:attention}heren{} en", + "{C:attention}vrouwen{} geven elk", + "{X:mult,C:white} X#1# {} Multi bij scoren,", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="Het trio", + text={ + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + unlock={ + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen", + }, + }, + j_troubadour={ + name="Troubadour", + text={ + "{C:attention}+#1#{} handomvang,", + "{C:blue}-#2#{} hand elke ronde", + }, + unlock={ + "Win {C:attention,E:1}#1#{} opeenvolgende", + "rondes door slechts", + "1 hand te spelen", + }, + }, + j_trousers={ + name="Reservebroek", + text={ + "Deze joker levert {C:mult}+#1#{} Multi", + "op als gespeelde hand", + "een {C:attention}#2#", + "{C:inactive} bevat (Momenteel {C:red}+#3#{C:inactive} Multi)", + }, + }, + j_turtle_bean={ + name="Zwarte boon", + text={ + "{C:attention}+#1#{} handomvang,", + "vermindert met", + "{C:red}#2#{} per ronde", + }, + }, + j_vagabond={ + name="Vagebond", + text={ + "Maak een {C:purple}tarot-{}kaart", + "als een hand wordt gespeeld", + "met maximaal {C:money}$#1#{}", + }, + }, + j_vampire={ + name="Vampier", + text={ + "Deze joker levert {X:mult,C:white} X#1# {} Multi", + "op per scorende gespeelde {C:attention}verbeterde kaart{},", + "verwijdert {C:attention}kaartverbetering", + "{C:inactive}(Momenteel {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_walkie_talkie={ + name="Walkietalkie", + text={ + "Elke gespeelde {C:attention}10{} of {C:attention}4", + "geeft {C:chips}+#1#{} fiches en", + "{C:mult}+#2#{} Multi bij scoren", + }, + }, + j_wee={ + name="Mini-joker", + text={ + "Deze Joker levert", + "{C:chips}+#2#{} fiches op per", + "gespeelde {C:chips}2{} die heeft gescoord", + "{C:inactive}(Nu {C:chips}+#1#{C:inactive} fiches)", + }, + unlock={ + "Win een spel in maximaal {E:1,C:attention}#1#", + "rondes", + }, + }, + j_wily={ + name="Gehaaide Joker", + text={ + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + j_wrathful_joker={ + name="Wraakzuchtige Joker", + text={ + "Gespeelde kaarten met", + "de kleur {C:spades}#2#{} geven", + "{C:mult}+#1#{} Multi bij scoren", + }, + }, + j_yorick={ + name="Yorick", + text={ + "Deze joker levert", + "{X:mult,C:white} X#1# {} Multi op telkens als {C:attention}#2#{C:inactive} [#3#]{}", + "kaarten worden weggegooid", + "{C:inactive}(Momenteel {X:mult,C:white} X#4# {C:inactive} Multi)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Knotsgekke Joker", + text={ + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat", + }, + }, + }, + Other={ + black_sticker={ + name="Zwarte sticker", + text={ + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}zwarte", + "{C:attention}inzet{} te winnen", + }, + }, + blue_seal={ + name="Blauw zegel", + text={ + "Creëert de {C:planet}planeet{}-kaart", + "voor laatste gespeelde {C:attention}pokerhand{}", + "van ronde indien in hand {C:attention}gehouden{}", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + blue_sticker={ + name="Blauwe sticker", + text={ + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}blauwe", + "{C:attention}inzet{} te winnen", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} fiches", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} extra fiches", + }, + }, + challenge_locked={ + name="Vergrendeld", + text={ + "Win een spel met ten minste", + "#1# verschillende kaartspellen om", + "uitdagingsmodus vrij te spelen", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Zonder buff", + text={ + "Alle vaardigheden", + "zijn uitgeschakeld", + }, + }, + debuffed_playing_card={ + name="Zonder buff", + text={ + "Levert geen fiches op", + "en alle vaardigheden", + "zijn uitgeschakeld", + }, + }, + deck_locked_discover={ + name="Vergrendeld", + text={ + "Ontdek ten minste", + "{C:attention}#1#{} items uit", + "je verzameling", + }, + }, + deck_locked_stake={ + name="Vergrendeld", + text={ + "Win een spel met een", + "kaartspel op een moeilijkheidsgraad", + "van ten minste {V:1}#1#{}", + }, + }, + deck_locked_win={ + name="Vergrendeld", + text={ + "Win een spel met", + "{C:attention}#1#{}", + "op welke moeilijkheidsgraad dan ook", + }, + }, + demo_locked={ + name="Vergrendeld", + text={ + "Niet beschikbaar", + "in deze demo", + }, + }, + demo_shop_locked={ + name="Vergrendeld", + text={ + "Kaart van {C:attention}Jimbo's", + "persoonlijke verzameling,", + "beschikbaar in de volledige", + "versie van {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Eeuwig", + text={ + "Kan niet verkocht", + "of vernietigd worden", + }, + }, + gold_seal={ + name="Gouden zegel", + text={ + "Verdien {C:money}$ 3{} als deze", + "kaart wordt gespeeld", + "en scoort", + }, + }, + gold_sticker={ + name="Gouden sticker", + text={ + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}gouden", + "{C:attention}inzet{} te winnen", + }, + }, + green_sticker={ + name="Groene sticker", + text={ + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}groene", + "{C:attention}inzet{} te winnen", + }, + }, + joker_locked_legendary={ + name="Vergrendeld", + text={ + "Vind deze Joker", + "uit de {C:spectral}ziel{}-kaart", + }, + }, + locked={ + name="Vergrendeld", + text={ + }, + }, + orange_sticker={ + name="Oranje sticker", + text={ + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}oranje", + "{C:attention}inzet{} te winnen", + }, + }, + p_arcana_jumbo={ + name="Jumbo Arcanapakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:tarot} tarot{}-kaarten om", + "direct te gebruiken", + }, + }, + p_arcana_mega={ + name="Mega Arcanapakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:tarot} tarot{}-kaarten om", + "direct te gebruiken", + }, + }, + p_arcana_normal={ + name="Arcanapakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:tarot} tarot{}-kaarten om", + "direct te gebruiken", + }, + }, + p_buffoon_jumbo={ + name="Jumbo Lolbroekenpakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:joker} Joker{}-kaarten", + }, + }, + p_buffoon_mega={ + name="Mega Lolbroekenpakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:joker} Joker{}-kaarten", + }, + }, + p_buffoon_normal={ + name="Lolbroekenpakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:joker} Joker{}-kaarten", + }, + }, + p_celestial_jumbo={ + name="Jumbo Hemels pakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:planet} planeet{}-kaarten om", + "direct te gebruiken", + }, + }, + p_celestial_mega={ + name="Mega Hemels pakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:planet} planeet{}-kaarten om", + "direct te gebruiken", + }, + }, + p_celestial_normal={ + name="Hemels pakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:planet} planeet{}-kaarten om", + "direct te gebruiken", + }, + }, + p_spectral_jumbo={ + name="Jumbo Spectraal pakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:spectral} spectrale{} kaarten om", + "direct te gebruiken", + }, + }, + p_spectral_mega={ + name="Mega Spectraal pakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:spectral} spectrale{} kaarten om", + "direct te gebruiken", + }, + }, + p_spectral_normal={ + name="Spectraal pakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:spectral} spectrale{} kaarten om", + "direct te gebruiken", + }, + }, + p_standard_jumbo={ + name="Jumbo Standaardpakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:attention} speel{}-kaarten", + "om aan je kaartspel toe te voegen", + }, + }, + p_standard_mega={ + name="Mega Standaardpakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:attention} speel{}-kaarten", + "om aan je kaartspel toe te voegen", + }, + }, + p_standard_normal={ + name="Standaardpakket", + text={ + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:attention} speel{}-kaarten", + "om aan je kaartspel toe te voegen", + }, + }, + perishable={ + name="Vergankelijk", + text={ + "Zonder buff na", + "{C:attention}#1#{} rondes", + "{C:inactive}({C:attention}#2#{C:inactive} resterend)", + }, + }, + pinned_left={ + name="Vastgepind", + text={ + "Deze Joker blijft", + "vastgepind aan de", + "meest linkse positie", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# van {V:1}#2# ", + }, + }, + purple_seal={ + name="Paars zegel", + text={ + "Maakt een {C:tarot}tarot-{}kaart", + "als deze wordt {C:attention}weggegooid", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + purple_sticker={ + name="Paarse sticker", + text={ + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}paarse", + "{C:attention}inzet{} te winnen", + }, + }, + red_seal={ + name="Rood zegel", + text={ + "Reactiveer deze", + "kaart {C:attention}1{} keer", + }, + }, + red_sticker={ + name="Rode sticker", + text={ + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}rode", + "{C:attention}inzet{} te winnen", + }, + }, + remove_negative={ + name="Negatief", + text={ + "{C:inactief,s:0.9} (Verwijdert {C:dark_edition,s:0.9}Negative{C:inactive,s:0.9} uit kopie)", + }, + }, + rental={ + name="Huur", + text={ + "Verlies {C:money}$#1#{} aan", + "het einde van de ronde", + }, + }, + undiscovered_booster={ + name="Niet ontdekt", + text={ + "Open dit pakket", + "in een spel zonder seed", + "om te leren wat hij doet", + }, + }, + undiscovered_edition={ + name="Niet ontdekt", + text={ + "Vind deze editie", + "in een spel zonder seed", + "om te leren wat hij doet", + }, + }, + undiscovered_joker={ + name="Niet ontdekt", + text={ + "Koop of gebruik", + "deze kaart in een", + "spel zonder seed om", + "te leren wat hij doet", + }, + }, + undiscovered_planet={ + name="Niet ontdekt", + text={ + "Koop of gebruik", + "deze kaart in een", + "spel zonder seed om", + "te leren wat hij doet", + }, + }, + undiscovered_spectral={ + name="Niet ontdekt", + text={ + "Koop of gebruik", + "deze kaart in een", + "spel zonder seed om", + "te leren wat hij doet", + }, + }, + undiscovered_tag={ + name="Niet ontdekt", + text={ + "Gebruik deze tag in", + "een spel zonder seed om", + "te leren wat hij doet", + }, + }, + undiscovered_tarot={ + name="Niet ontdekt", + text={ + "Koop of gebruik", + "deze kaart in een", + "spel zonder seed om", + "te leren wat hij doet", + }, + }, + undiscovered_voucher={ + name="Niet ontdekt", + text={ + "Verzilver deze", + "voucher in een", + "spel zonder seed om", + "te leren wat hij doet", + }, + }, + white_sticker={ + name="Witte sticker", + text={ + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}witte", + "{C:attention}inzet{} te winnen", + }, + }, + wip_locked={ + name="Vergrendeld", + text={ + "Werk in", + "uitvoering", + }, + }, + }, + Planet={ + c_ceres={ + name="Ceres", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_earth={ + name="Aarde", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_jupiter={ + name="Jupiter", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_mars={ + name="Mars", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_mercury={ + name="Mercurius", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_neptune={ + name="Neptunus", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_planet_x={ + name="Planeet X", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_pluto={ + name="Pluto", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_saturn={ + name="Saturnus", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_uranus={ + name="Uranus", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + c_venus={ + name="Venus", + text={ + "{S:0.8}({S:0.8,V:1}level #1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches", + }, + }, + }, + Spectral={ + c_ankh={ + name="Ankh", + text={ + "Maak een kopie van een", + "willekeurige {C:attention}Joker{}, vernietig", + "alle andere Jokers", + }, + }, + c_aura={ + name="Aura", + text={ + "Voeg {C:dark_edition}folie{}, {C:dark_edition}holografisch{}", + "of {C:dark_edition}polychroom{} effect toe aan", + "{C:attention}1{} geselecteerde kaart in je hand", + }, + }, + c_black_hole={ + name="Zwart gat", + text={ + "Upgrade elke", + "{C:legendary,E:1}pokerhand", + "met {C:attention}1{} level", + }, + }, + c_cryptid={ + name="Cryptide", + text={ + "Maak {C:attention}#1#{} kopieën van", + "{C:attention}1{} geselecteerde kaart", + "in je hand", + }, + }, + c_deja_vu={ + name="Déjà vu", + text={ + "Voeg een {C:red}rode zegel{} toe", + "aan {C:attention}1{} geselecteerde", + "kaart in je hand", + }, + }, + c_ectoplasm={ + name="Ectoplasma", + text={ + "Voeg {C:dark_edition}negatief{} toe aan", + "een willekeurige {C:attention}Joker,", + "{C:red}-1{} handomvang", + }, + }, + c_familiar={ + name="Gezel", + text={ + "Vernietig {C:attention}1{} willekeurige", + "kaart in je hand, voegt", + "{C:attention}#1#{} willekeurige {C:attention}verbeterde plaatjes{} toe", + "{C:attention}{} aan je hand toe", + }, + }, + c_grim={ + name="Akelig", + text={ + "Vernietig {C:attention}1{} willekeurige", + "kaart in je hand,", + "voeg {C:attention}#1#{} willekeurige {C:attention}verbeterde", + "{C:attention}azen{} aan je hand toe", + }, + }, + c_hex={ + name="Hex", + text={ + "Voeg een {C:dark_edition}polychroom{} toe aan", + "willekeurige {C:attention}Joker{}, vernietig", + "alle andere Jokers", + }, + }, + c_immolate={ + name="In vlammen opgaan", + text={ + "Vernietigt {C:attention}#1#{} willekeurige", + "kaarten in de hand,", + "levert {C:money}$#2# op", + }, + }, + c_incantation={ + name="Betovering", + text={ + "Vernietig {C:attention}1{} willekeurige", + "kaart in je hand, voeg {C:attention}#1#", + "willekeurige {C:attention}verbeterde cijferkaarten", + "{C:attention}{} aan je hand toe", + }, + }, + c_medium={ + name="Medium", + text={ + "Voeg een {C:purple}paarse zegel{} toe", + "aan {C:attention}1{} geselecteerde", + "kaart in je hand", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Verandert alle kaarten", + "in de hand in een enkele", + "willekeurige {C:attention}rang", + "{C:red}-1{} handomvang", + }, + }, + c_sigil={ + name="Teken", + text={ + "Verandert alle kaarten", + "in de hand in een enkele", + "willekeurige {C:attention}kleur", + }, + }, + c_soul={ + name="De ziel", + text={ + "Creëert een", + "{C:legendary,E:1}mythische{} Joker", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + c_talisman={ + name="Talisman", + text={ + "Voeg {C:attention}gouden zegel{}", + "toe aan {C:attention}1{} geselecteerde", + "kaart in je hand", + }, + }, + c_trance={ + name="Trance", + text={ + "Voeg een {C:blue}blauwe zegel{} toe", + "aan {C:attention}1{} geselecteerde", + "kaart in je hand", + }, + }, + c_wraith={ + name="Schim", + text={ + "Maakt een willekeurige", + "{C:red}zeldzame{C:attention} Joker{} verschijnen,", + "zet geld terug op {C:money}$ 0", + }, + }, + }, + Stake={ + stake_black={ + name="Zwarte inzet", + text={ + "Winkel kan {C:attention}eeuwige{} Jokers hebben", + "{C:inactive,s:0.8}(Kan niet worden verkocht of vernietigd)", + "{s:0.8}Past alle eerdere inzetten toe", + }, + }, + stake_blue={ + name="Blauwe inzet", + text={ + "{C:red}-1{} weggooimogelijkheid", + "{s:0.8}Past alle eerdere inzetten toe", + }, + }, + stake_gold={ + name="Gouden inzet", + text={ + "Winkel kan {C:attention}huur{}-jokers hebben", + "{C:inactive,s:0.8}(Kosten {C:money,s:0.8}$3{C:inactive,s:0.8} per ronde)", + "{s:0.8}Past alle eerdere inzetten toe", + }, + }, + stake_green={ + name="Groene inzet", + text={ + "Vereiste score schaalt sneller op", + "voor elke {C:attention}ante", + "{s:0.8}Past alle eerdere inzetten toe", + }, + }, + stake_orange={ + name="Oranje inzet", + text={ + "Winkel kan {C:attention}vergankelijke{} jokers hebben", + "{C:inactive,s:0.8}(Zonder buff na 5 rondes)", + "{s:0.8}Past alle eerdere inzetten toe", + }, + }, + stake_purple={ + name="Paarse inzet", + text={ + "Vereiste score schaalt sneller op", + "voor elke {C:attention}ante", + "{s:0.8}Past alle eerdere inzetten toe", + }, + }, + stake_red={ + name="Rode inzet", + text={ + "{C:attention}small blind{} levert", + "geen beloningsgeld op", + "{s:0.8}Past alle eerdere inzetten toe", + }, + }, + stake_white={ + name="Witte inzet", + text={ + "Basismoeilijkheid", + }, + }, + }, + Tag={ + tag_boss={ + name="Baastag", + text={ + "Ververst de", + "{C:attention}blind van een baas", + }, + }, + tag_buffoon={ + name="Lolbroektag", + text={ + "Levert een gratis", + "{C:attention}Lolbroekenpakket{} op", + }, + }, + tag_charm={ + name="Toverspreuktag", + text={ + "Levert een gratis", + "{C:tarot}Mega Arcanapakket op", + }, + }, + tag_coupon={ + name="Coupontag", + text={ + "Initiële kaarten en", + "boosterpakketten in volgende", + "winkel zijn gratis", + }, + }, + tag_d_six={ + name="D6-tag", + text={ + "Ververst in de volgende winkel", + "begint met {C:money}$ 0", + }, + }, + tag_double={ + name="Dubbeltag", + text={ + "Levert een kopie van de", + "volgende geselecteerde {C:attention}tag{} op", + "{s:0.8}Maar geen {s:0.8,C:attention}Dubbeltag", + }, + }, + tag_economy={ + name="Economische tag", + text={ + "Verdubbelt je geld", + "{C:inactive}(max. {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="Etherische tag", + text={ + "Levert een gratis", + "{C:planet}Spectraal pakket{} op", + }, + }, + tag_foil={ + name="Folie tag", + text={ + "Volgende basiseditie-", + "winkeljoker is gratis en", + "wordt {C:dark_edition}folie", + }, + }, + tag_garbage={ + name="Afvaltag", + text={ + "Levert {C:money}$#1#{} op per ongebruikte", + "{C:red}weggooimogelijkheid{} dit spel", + "{C:inactive}(Levert {C:money}$#2#{C:inactive} op)", + }, + }, + tag_handy={ + name="Handige tag", + text={ + "Levert {C:money}$#1#{} op per gespeelde", + "{C:blue}hand{} dit spel", + "{C:inactive}(Levert {C:money}$#2#{C:inactive} op)", + }, + }, + tag_holo={ + name="Holografische tag", + text={ + "Volgende basiseditie-", + "winkeljoker is gratis en", + "wordt {C:dark_edition}holografisch", + }, + }, + tag_investment={ + name="Investeringstag", + text={ + "Na het verslaan van", + "de blind van een baas,", + "verdien je {C:money}$#1#", + }, + }, + tag_juggle={ + name="Jongleertag", + text={ + "{C:attention}+#1#{} handomvang", + "in de volgende ronde", + }, + }, + tag_meteor={ + name="Meteoortag", + text={ + "Levert een gratis", + "{C:planet}Mega Hemels pakket op", + }, + }, + tag_negative={ + name="Negatieve tag", + text={ + "Volgende basiseditie-", + "winkeljoker is gratis en", + "wordt {C:dark_edition}negatief", + }, + }, + tag_orbital={ + name="Orbitale tag", + text={ + "Upgrade {C:attention}#1#", + "met {C:attention}#2# levels", + }, + }, + tag_polychrome={ + name="Polychrome tag", + text={ + "Volgende basiseditie-", + "winkeljoker is gratis en", + "wordt {C:dark_edition}polychroom", + }, + }, + tag_rare={ + name="Zeldzame tag", + text={ + "Winkel heeft een gratis", + "{C:red}zeldzame joker", + }, + }, + tag_skip={ + name="Snelheidstag", + text={ + "Levert {C:money}$#1#{} op per overgeslagen", + "blind in dit spel", + "{C:inactive}(Levert {C:money}$#2#{C:inactive} op)", + }, + }, + tag_standard={ + name="Standaardtag", + text={ + "Levert een gratis", + "{C:attention}Mega standaard pakket op", + }, + }, + tag_top_up={ + name="Bijvultag", + text={ + "Maakt tot {C:attention}#1#", + "{C:blue}gewone{} Jokers", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + tag_uncommon={ + name="Ongewone tag", + text={ + "Winkel heeft een gratis", + "{C:green}ongewone joker", + }, + }, + tag_voucher={ + name="Vouchertag", + text={ + "Voeg één {C:voucher}voucher", + "aan de volgende winkel toe", + }, + }, + }, + Tarot={ + c_chariot={ + name="De zegewagen", + text={ + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#", + }, + }, + c_death={ + name="De dood", + text={ + "Selecteer {C:attention}#1#{} kaarten,", + "verander de {C:attention}linker{} kaart", + "in de {C:attention}rechter{} kaart", + "{C:inactive}(Sleep om te herordenen)", + }, + }, + c_devil={ + name="De duivel", + text={ + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="De keizer", + text={ + "Maakt tot {C:attention}#1#", + "willekeurige {C:tarot}tarot{}-kaarten verschijnen", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + c_empress={ + name="De keizerin", + text={ + "Verbetert {C:attention}#1#", + "geselecteerde kaarten naar", + "{C:attention}#2#en", + }, + }, + c_fool={ + name="De dwaas", + text={ + "Maakt de laatste", + "{C:tarot}tarot{}- of {C:planet}planeet{}-kaart", + "die in dit spel is gebruikt", + "met uitzondering van {s:0.8,C:tarot}de dwaas{s:0.8}", + }, + }, + c_hanged_man={ + name="De gehangene", + text={ + "Vernietigt maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + }, + }, + c_heirophant={ + name="De hiërofant", + text={ + "Verbetert {C:attention}#1#", + "geselecteerde kaarten naar", + "{C:attention}#2#en", + }, + }, + c_hermit={ + name="De kluizenaar", + text={ + "Verdubbelt geld", + "{C:inactive}(max. {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="De hogepriesteres", + text={ + "Maakt tot {C:attention}#1#", + "willekeurige {C:planet}planeet{}-kaarten verschijnen", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + c_judgement={ + name="Het oordeel", + text={ + "Maakt een willekeurige", + "{C:attention}Joker{}-kaart verschijnen", + "{C:inactive}(Moet ruimte voor zijn)", + }, + }, + c_justice={ + name="Gerechtigheid", + text={ + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="De geliefden", + text={ + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#", + }, + }, + c_magician={ + name="De magiër", + text={ + "Verbetert {C:attention}#1#{}", + "geselecteerde kaarten naar", + "{C:attention}#2#s", + }, + }, + c_moon={ + name="De maan", + text={ + "Verandert maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + "naar {V:1}#2#{}", + }, + }, + c_star={ + name="De ster", + text={ + "Verandert maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + "naar {V:1}#2#{}", + }, + }, + c_strength={ + name="Kracht", + text={ + "Verhoogt rang van", + "maximaal {C:attention}#1#{} geselecteerde", + "kaarten met {C:attention}1", + }, + }, + c_sun={ + name="De zon", + text={ + "Verandert maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + "naar {V:1}#2#{}", + }, + }, + c_temperance={ + name="Gematigdheid", + text={ + "Geeft de totale verkoopwaarde", + "van alle huidige", + "Jokers {C:inactive}(max. {C:money}$#1#{C:inactive})", + "{C:inactive}(Nu {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="De toren", + text={ + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="Het rad van fortuin", + text={ + "Een kans van {C:green}#1# op #2#{} om", + "{C:dark_edition}folie{}, {C:dark_edition}holografische{} of", + "{C:dark_edition}polychrome{} editie toe te voegen", + "aan een willekeurige {C:attention}Joker", + }, + }, + c_world={ + name="De wereld", + text={ + "Verandert maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + "naar {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimaterie", + text={ + "{C:dark_edition}+1{} Jokervak", + }, + unlock={ + "Verzilver {C:voucher}Blanco{}", + "{C:attention}#1#{} keer in totaal", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="Blanco", + text={ + "{C:inactive}Doet niets?", + }, + }, + v_clearance_sale={ + name="Uitverkoop", + text={ + "Alle kaarten en pakketten in", + "de winkel hebben {C:attention}#1#%{} korting", + }, + }, + v_crystal_ball={ + name="Kristallen bol", + text={ + "{C:attention}+1{} verbruiksvak", + }, + }, + v_directors_cut={ + name="Director's Cut", + text={ + "Ververs blind van een baas", + "{C:attention}1{} keer per ante opnieuw,", + "{C:money}$#1#{} per gooi", + }, + }, + v_glow_up={ + name="Opbloeien", + text={ + "{C:dark_edition}Folie{}, {C:dark_edition}holografische{} en", + "{C:dark_edition}polychrome{} kaarten", + "verschijnen {C:attention}#1# X{} vaker", + }, + unlock={ + "Heb ten minste {C:attention}#1#", + "{C:attention}Joker{}-kaarten met", + "{C:dark_edition}folie{}, {C:dark_edition}holografische{} of", + "{C:dark_edition}polychrome{} editie", + }, + }, + v_grabber={ + name="Grijper", + text={ + "Verdien", + "permanent {C:blue}+#1#{} hand", + "per ronde", + }, + }, + v_hieroglyph={ + name="Hiëroglief", + text={ + "{C:attention}-#1#{} Ante,", + "{C:blue}-#1#{} hand", + "elke ronde", + }, + }, + v_hone={ + name="Aanscherpen", + text={ + "{C:dark_edition}Folie{}, {C:dark_edition}holografische{} en", + "{C:dark_edition}polychrome{} kaarten", + "verschijnen {C:attention}#1# X{} vaker", + }, + }, + v_illusion={ + name="Illusie", + text={ + "{C:attention}Speelkaarten{} in de winkel", + "kunnen een {C:enhanced}verbetering{},", + "{C:dark_edition}editie{} en/of {C:attention}zegel{} hebben", + }, + unlock={ + "Koop in totaal", + "{C:attention}#1#{} speelkaarten", + "in de winkel", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Liquidatie", + text={ + "Alle kaarten en pakketten in", + "de winkel hebben {C:attention}#1#%{} korting", + }, + unlock={ + "Verzilver ten minste", + "{C:attention}#1#{C:voucher} voucher{}-kaarten", + "in één spel", + }, + }, + v_magic_trick={ + name="Goocheltruc", + text={ + "{C:attention}Speelkaarten{} kunnen", + "gekocht worden", + "in de {C:attention}winkel", + }, + }, + v_money_tree={ + name="Geldboompje", + text={ + "Verhoog de limiet", + "voor verdiende rente in", + "elke ronde tot {C:money}$#1#{}", + }, + unlock={ + "Maximaliseer de rente", + "per verdiensten per ronde gedurende", + "{C:attention}#1#{} opeenvolgende rondes", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Nacho Tong", + text={ + "Verdien", + "permanent {C:blue}+#1#{} hand", + "per ronde", + }, + unlock={ + "Speel in totaal", + "{C:attention}#1#{} kaarten", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Observatorium", + text={ + "{C:planet}Planeet{}-kaarten in je", + "{C:attention}verbruiks{}-vakken geven", + "{X:red,C:white} X#1# {} Multi voor hun", + "opgegeven {C:attention}pokerhand", + }, + unlock={ + "Gebruik in totaal {C:attention}#1#", + "{C:planet}planeet{}-kaarten uit een", + "{C:planet}Hemels pakket", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Voortekenglobe", + text={ + "{C:spectral}Spectrale{} kaarten kunnen", + "verschijnen in elk van de", + "{C:attention}Arcanapakketten", + }, + unlock={ + "Gebruik in totaal {C:attention}#1#", + "{C:tarot}tarot{}-kaarten uit een", + "{C:tarot}Arcanapakket", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Te grote voorraad", + text={ + "{C:attention}+1{} kaartvak", + "beschikbaar in winkel", + }, + }, + v_overstock_plus={ + name="Te grote voorraad Plus", + text={ + "{C:attention}+1{} kaartvak", + "beschikbaar in winkel", + }, + unlock={ + "Geef in totaal", + "{C:money}$#1#{} uit in de winkel", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="Penseel", + text={ + "{C:attention}+#1#{} handomvang", + }, + }, + v_palette={ + name="Palet", + text={ + "{C:attention}+#1#{} handomvang", + }, + unlock={ + "Beperk handomvang", + "tot {C:attention}#1#{} kaarten", + }, + }, + v_petroglyph={ + name="Rotstekening", + text={ + "{C:attention}-#1#{} Ante,", + "{C:red}-#1#{} weggooimogelijkheid", + "elke ronde", + }, + unlock={ + "Bereik ante", + "level {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Planeetverkoper", + text={ + "{C:planet}Planeet{}-kaarten verschijnen", + "{C:attention}#1# X{} vaker", + "in de winkel", + }, + }, + v_planet_tycoon={ + name="Planeettycoon", + text={ + "{C:planet}Planeet{}-kaarten verschijnen", + "{C:attention}#1# X{} vaker", + "in de winkel", + }, + unlock={ + "Koop in totaal", + "{C:attention}#1#{C:planet} planeet{}-kaarten", + "in de winkel", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Recyclomantie", + text={ + "Krijg", + "permanent {C:red}+#1#{} weggooimogelijkheid", + "per ronde", + }, + unlock={ + "Gooi in totaal", + "{C:attention}#1#{} kaarten weg", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Gulzig verversen", + text={ + "Verversen kost", + "{C:money}$#1#{} minder", + }, + unlock={ + "Ververs de winkel in totaal", + "{C:attention}#1#{} keer", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Overvloedig verversen", + text={ + "Verversen kost", + "{C:money}$#1#{} minder", + }, + }, + v_retcon={ + name="Teruggedraaid", + text={ + "Ververs blind van een baas", + "{C:attention}onbeperkt{} aantal keer,", + "{C:money}$#1#{} per keer", + }, + unlock={ + "Ontdek", + "{C:attention}#1#{} blinds", + }, + }, + v_seed_money={ + name="Startkapitaal", + text={ + "Verhoog de limiet", + "voor verdiende rente in", + "elke ronde tot {C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="Tarotverkoper", + text={ + "{C:tarot}Tarot{}-kaarten verschijnen", + "{C:attention}#1# X{} vaker", + "in de winkel", + }, + }, + v_tarot_tycoon={ + name="Tarottycoon", + text={ + "{C:tarot}Tarot{}-kaarten verschijnen", + "{C:attention}#1# X{} vaker", + "in de winkel", + }, + unlock={ + "Koop in totaal", + "{C:attention}#1#{C:tarot} tarot{}-kaarten", + "in de winkel", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Telescoop", + text={ + "{C:attention}Hemelse pakketten{} bevatten", + "altijd de {C:planet}planeet{}-kaart", + "voor je meest gespeelde", + "{C:attention}pokerhand", + }, + }, + v_wasteful={ + name="Verspillend", + text={ + "Krijg", + "permanent {C:red}+#1#{} weggooimogelijkheid", + "per ronde", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Scoor 100.000.000 fiches in één hand", + _1000k="Scoor 1.000.000 fiches in één hand", + _10k="Scoor 10.000 fiches in één hand", + ante_up="Bereik ante 4", + ante_upper="Bereik ante 8", + astronomy="Ontdek elke planeetkaart", + big_hands="Zorg dat je 80 of meer kaarten in je kaartspel hebt", + card_discarder="Gooi ten minste 2500 kaarten weg", + card_player="Speel ten minste 2500 kaarten", + cartomancy="Ontdek elke tarotkaart", + clairvoyance="Ontdek elke spectrale kaart", + completionist="Ontdek 100% van je verzameling", + completionist_plus="Win met elk kaartspel met moeilijkheidsgraad gouden inzet", + completionist_plus_plus="Verdien een gouden sticker met elke Joker", + extreme_couponer="Ontdek elke voucher", + flushed="Speel een flush met 5 Wildkaarten", + heads_up="Win een spel", + high_stakes="Win een spel met ten minste moeilijkheidsgraad gouden inzet", + legendary="Ontdek een mythische Joker", + low_stakes="Win een spel met ten minste moeilijkheidsgraad rode inzet", + mid_stakes="Win een spel met ten minste moeilijkheidsgraad zwarte inzet", + nest_egg="Zorg dat je $ 400 of meer hebt in één spel", + retrograde="Bereik level 10 in een pokerhand", + roi="Koop 5 vouchers vóór ante 4", + royale="Speel een royal flush", + rule_bender="Voltooi een uitdagingsspel", + rule_breaker="Voltooi elk uitdagingsspel", + shattered="Breek 2 glazen kaarten in één hand", + speedrunner="Win een spel in maximaal 12 rondes", + tiny_hands="Dun je kaartspel uit tot maximaal 20 kaarten", + you_get_what_you_get="Win een spel zonder de winkel te verversen", + }, + achievement_names={ + _100000k="100.000 K", + _1000k="1000 K", + _10k="10 K", + ante_up="Verhoog de ante!", + ante_upper="Anteverhoger!", + astronomy="Astronomie", + big_hands="Grote handen", + card_discarder="Kaartweggooier", + card_player="Kaartspeler", + cartomancy="Kaartenmagie", + clairvoyance="Helderziendheid", + completionist="Afronder", + completionist_plus="Afronder+", + completionist_plus_plus="Afronder++", + extreme_couponer="Koopjesjager", + flushed="Geflusht", + heads_up="Heads-up", + high_stakes="Hoge inzet", + legendary="Mythisch", + low_stakes="Lage inzet", + mid_stakes="Gemiddelde inzet", + nest_egg="Nestei", + retrograde="Achteruitgaand", + roi="Rendement", + royale="Royaal", + rule_bender="Buig de regels", + rule_breaker="Regelbreker", + shattered="Vernietigd", + speedrunner="Snelheidsduivel", + tiny_hands="Kleine handen", + you_get_what_you_get="Pak wat je pakken kunt", + }, + blind_states={ + Current="Huidig", + Defeated="Verslagen", + Select="Selecteren", + Selected="Geselecteerd", + Skipped="Overgeslagen", + Upcoming="Binnenkort", + }, + challenge_names={ + c_blast_off_1="Explosie", + c_bram_poker_1="Bram Poker", + c_city_1="15-minutenstad", + c_cruelty_1="Wreedheid", + c_double_nothing_1="Dubbel of niets", + c_five_card_1="Trekking van vijf kaarten", + c_fragile_1="Kwetsbaar", + c_golden_needle_1="Gouden naald", + c_inflation_1="Inflatie", + c_jokerless_1="Zonder jokers", + c_knife_1="Bloedstollend", + c_luxury_1="Welvaartsbelasting", + c_mad_world_1="Krankzinnige wereld", + c_medusa_1="Medusa", + c_monolith_1="Monoliet", + c_non_perishable_1="Houdbaar", + c_omelette_1="De omelet", + c_rich_1="Rijken worden rijker", + c_typecast_1="Beeldvorming", + c_xray_1="Röntgenogen", + }, + collabs={ + Clubs={ + ["1"]="Standaard", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Standaard", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Standaard", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Standaard", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="Veelgestelde vragen", + b_and_use="& GEBRUIKEN", + b_back="Terug", + b_blinds="Blinds", + b_booster_packs="Boosterpakketten", + b_buy="KOPEN", + b_cash_out="Uitbetalen", + b_challenges="Uitdagingen", + b_collection="Verzameling", + b_collection_cap="COLLECTIE", + b_continue="Doorgaan", + b_copy="Kopiëren", + b_copy_seed="Seed kopiëren", + b_create_profile="Profiel aanmaken", + b_credits="Credits", + b_current_profile="Huidig profiel", + b_customize_deck="Kaartspel Aanpassen", + b_deck="Kaartspel", + b_decks="Kaartspellen", + b_delete_profile="Profiel verwijderen", + b_discard="Weggooien", + b_editions="Edities", + b_endless="Eindeloze modus", + b_enhanced_cards="Verbeterde kaarten", + b_full_deck="Volledig kaartspel", + b_high_contrast_cards="Kaarten met hoog contrast", + b_how_to_play="Hoe te spelen", + b_imagery="Afbeeldingen", + b_jokers="Jokers", + b_load_profile="Profiel laden", + b_main_menu="Hoofdmenu", + b_music="Muziek", + b_new_challenge="Nieuwe uitdaging starten", + b_new_run="Nieuw spel", + b_next="Volgende", + b_next_round_1="Volgende", + b_next_round_2="Ronde", + b_open="OPENEN", + b_options="Opties", + b_options_cap="OPTIES", + b_planet_cards="Planeetkaarten", + b_play_cap="SPEEL", + b_play_hand="Hand spelen", + b_playbalatro="Ga naar playbalatro.com", + b_poker_hands="Pokerhanden", + b_quit_cap="SLUIT", + b_redeem="VERZILVEREN", + b_reduced_motion="Verminderde beweging", + b_remaining="Resterend", + b_reroll_boss="Baas verversen", + b_reset_profile="Profiel resetten", + b_restrictions="Beperkingen", + b_retry="Opnieuw proberen", + b_rules="Regels", + b_run_info_1="Spel", + b_run_info_2="Info", + b_seals="Zegels", + b_seed="Seed", + b_select="SELECTEREN", + b_sell="VERKOPEN", + b_set_CRT="CRT", + b_set_CRT_bloom="CRT-bloom", + b_set_apply="Toepassen", + b_set_audio="Audio", + b_set_crash_reports="Crashmeldingen", + b_set_game="Spel", + b_set_game_vol="Spelvolume", + b_set_gamespeed="Spelsnelheid", + b_set_graphics="Graphics", + b_set_master_vol="Hoofdvolume", + b_set_monitor="Monitor weergeven", + b_set_music_vol="Muziekvolume", + b_set_pixel_smoothing="Vloeiende pixel-art", + b_set_play_discard_pos="Positie speel-/weggooiknop", + b_set_rumble="Trilling van controller", + b_set_screenshake="Scherm schudden", + b_set_shadows="Schaduwen", + b_set_vibration="Trilling", + b_set_video="Video", + b_set_windowmode="Venstermodus", + b_settings="Instellingen", + b_skip="Overslaan", + b_skip_blind="Blind overslaan", + b_skip_reward="Beloning overslaan", + b_sort_hand="Hand ordenen", + b_sounds="Geluid", + b_spectral_cards="Spectrale kaarten", + b_stake="Inzet", + b_start_new_run="Nieuw spel", + b_stat_consumables="Verbruiksartikelen", + b_stat_jokers="Jokers", + b_stat_planets="Planeten", + b_stat_spectrals="Spectrale kaarten", + b_stat_tarots="Tarots", + b_stat_vouchers="Vouchers", + b_stats="Statistieken", + b_tags="Tags", + b_tarot_cards="Tarotkaarten", + b_unlock_all="Alles vrijspelen", + b_use="GEBRUIKEN", + b_vouchers="Vouchers", + b_wishlist="Verlanglijst op Steam", + k_aces="Azen", + k_achievement="Prestatie", + k_achievements_disabled="Prestaties uitgeschakeld", + k_active="actief", + k_active_ex="Actief!", + k_again_ex="Opnieuw!", + k_all_hands="Alle handen", + k_also_applied="Ook toegepast", + k_ante="Ante", + k_ante_cap="ANTE", + k_arcana_pack="Arcanapakket", + k_balanced="Gebalanceerd", + k_banned_cards="Verbannen kaarten", + k_banned_tags="Verbannen tags", + k_base_cap="BASIS", + k_base_cards="Basiskaarten", + k_best_hand="Beste hand", + k_booster="Booster", + k_buffoon_pack="Lolbroekenpakket", + k_cap_consumables="VERBRUIKSARTIKELEN", + k_card_stats="Kaartstatistieken", + k_celestial_pack="Hemels pakket", + k_challenge_mode="Uitdagingsmodus", + k_challenges="Uitdagingen", + k_choose="Kiezen", + k_collection="Verzameling", + k_common="Gewoon", + k_compatible="compatibel", + k_copied_ex="Gekopieerd!", + k_custom_rules="Aangepaste regels", + k_daily_run="Dagelijks spel", + k_debuffed="Zonder buff", + k_deck="Kaartspel", + k_deck_stake_wins="Kaartspel inzet gewonnen", + k_defeated_by="Verslagen door", + k_demo_version_ex="Demoversie!", + k_disabled_ex="Uitgeschakeld!", + k_drank_ex="Opgedronken!", + k_duplicated_ex="Verdubbeld!", + k_dwarf_planet="Dwergplaneet", + k_eaten_ex="Opgegeten!", + k_edition="Editie", + k_effective="Effectief", + k_empty_caps="LEEG", + k_enter_name="Naam invoeren", + k_enter_seed="Seed invoeren", + k_enter_text="Voer tekst in", + k_eroded_ex="Geërodeerd!", + k_extinct_ex="Uitgestorven!", + k_face_cards="Plaatjes", + k_game_modifiers="Spelaanpassingen", + k_gold="Goud", + k_high_score_ex="Highscore!", + k_hud_discards="Weggooimogelijkheden", + k_hud_hands="Handen", + k_incompatible="incompatibel", + k_joker="Joker", + k_joker_stickers="Jokerstickers", + k_jokers_cap="JOKERS", + k_legendary="Mythisch", + k_level_prefix="level", + k_level_up_ex="Level omhoog!", + k_locked="Vergrendeld", + k_lower_score="score", + k_lvl="level", + k_melted_ex="Gesmolten!", + k_money="Geld", + k_mult="Multi", + k_no_other_jokers="Geen andere Jokers!", + k_no_reward="Geen beloning", + k_no_room_ex="Geen ruimte!", + k_no_space_ex="Geen ruimte!", + k_none="Geen", + k_nope_ex="Echt niet!", + k_not_allowed_ex="Niet toegestaan!", + k_not_discovered="Niet ontdekt", + k_numbered_cards="Kaarten met getallen", + k_or="of", + k_other="Overig", + k_page="Pagina", + k_planet="Planeet", + k_planet_q="Planeet?", + k_playing_as="Speelt als", + k_plus_joker="+1 Joker", + k_plus_planet="+1 Planeet", + k_plus_spectral="+1 Spectraal", + k_plus_stone="+1 Stenen", + k_plus_tarot="+1 Tarot", + k_poker_hand="pokerhand", + k_profile="Profiel", + k_progress="Voortgang", + k_rank="Rang", + k_rare="Zeldzaam", + k_redeemed_ex="Verzilverd!", + k_reroll="Verversen", + k_reset="Resetten", + k_reward="Beloning", + k_round="Ronde", + k_safe_ex="Veilig!", + k_saved_ex="Gered!", + k_seed="Seed", + k_seeded_run="Spel met seed", + k_skipped_cap="OVERGESLAGEN", + k_spectral="Spectraal", + k_spectral_pack="Spectraal pakket", + k_stake="Inzet", + k_stake_level="Inzetniveau", + k_standard_pack="Standaardpakket", + k_suit="Kleur", + k_swapped_ex="Geruild!", + k_tarot="Tarot", + k_trophies_disabled="Prijzen uitgeschakeld", + k_trophy="Prijs", + k_uncommon="Ongewoon", + k_undisovered="Niet ontdekt", + k_unknown="?????", + k_unlocked_ex="Vrijgespeeld!", + k_upgrade_ex="Upgrade!", + k_val_up="Waarde omhoog!", + k_view="Weergave", + k_voucher="Voucher", + k_vouchers_cap="VOUCHERS", + k_wins="Gewonnen", + k_x_base="X-basis", + ml_bloom_opt={ + "Uit", + "Aan", + }, + ml_buy_and_use_target={ + "KOPEN", + "& GEBRUIKEN", + }, + ml_buy_target={ + "KOPEN", + }, + ml_card_stats={ + "Kaart", + "Statistieken", + }, + ml_controller_required={ + "Je hebt een controller nodig om te spelen.", + "Sluit een controller aan om door te gaan.", + }, + ml_crash_report_info={ + "Crashmeldingen worden naar de ontwikkelaar gestuurd", + "om toekomstige problemen te voorkomen.", + "Er worden geen identificerende of persoonlijke gegevens verstuurd.", + }, + ml_demo_thanks_message={ + "Overweeg om Balatro op je verlanglijst", + "op Steam te zetten en je aan te melden", + "voor de nieuwsbrief op playbalatro.com", + }, + ml_disabled_seed={ + "Alle ontgrendelingen en", + "Ontdekkingen uitgeschakeld", + }, + ml_edition_seal_enhancement_explanation={ + "Speelkaarten kunnen elk een", + "verbetering, editie en zegel hebben", + }, + ml_eternal={ + "Eeuwig", + "Kan niet verkocht", + "of vernietigd worden", + }, + ml_gold_seal_desc={ + "Gouden zegel", + "keert terug naar de hand", + "als deze wordt gespeeld", + }, + ml_offline_message={ + "Dit apparaat is offlline.", + "Het huidige opgeslagen spel is mogelijk verouderd.", + }, + ml_open_target={ + "OPENEN", + }, + ml_paste_seed={ + "Seed", + "plakken", + }, + ml_play_discard_pos_opt={ + "Weggooien/spelen", + "Spelen/weggooien", + }, + ml_redeem_target={ + "VERZILVEREN", + }, + ml_sell_target={ + "VERKOPEN", + }, + ml_shadow_opt={ + "Aan", + "Uit", + }, + ml_smoothing_opt={ + "Uit", + "Aan", + }, + ml_unlock_all_explanation={ + "PAS OP! Als je de complete verzameling ontgrendelt,", + "worden prestaties voor dit profiel uitgeschakeld!", + }, + ml_unlock_all_trophies={ + "PAS OP! Als je de complete verzameling ontgrendelt,", + "schakelt prijzen voor dit profiel uit!", + }, + ml_vsync_opt={ + "VSync aan", + "VSync uit", + }, + ml_windowmode_opt={ + "In een venster", + "Volledig scherm", + "Zonder randen", + }, + ph_1_level="+1 Niveau", + ph_4_7_of_clubs="vier 7 van Klaveren", + ph_alert_debuff_confirm="Druk opnieuw op 'Spelen' om te bevestigen", + ph_all_poker_hand="Alle pokerhanden", + ph_blind_reward="Beloning: ", + ph_blind_score_at_least="Scoor ten minste", + ph_boss_disabled="Baas uitgeschakeld!", + ph_choose_blind_1="Kies je", + ph_choose_blind_2="volgende blind", + ph_click_confirm="Druk nogmaals om te bevestigen", + ph_deck_preview_effective="Effectief totaal vanwege Jokers, blinds en kaartverbeteringen", + ph_deck_preview_stones="Stenen", + ph_defeat_the_boss="Versla de blind van een baas", + ph_defeat_this_blind_1="Versla deze blind", + ph_defeat_this_blind_2="om het te ontdekken", + ph_demo_thanks_1="Bedankt voor het spelen van de", + ph_demo_thanks_2="BALATRO-DEMO", + ph_display_stickers="Stickers met inzet weergeven tijdens het spel", + ph_game_over="SPEL VOORBIJ", + ph_improve_run="Verbeter je spel!", + ph_most_played="(meest gespeelde hand)", + ph_mr_bones="Gespaard door Meneer Botjes", + ph_no_boss_active="geen baas actief", + ph_no_vouchers="Geen vouchers verzilverd in dit spel", + ph_score_at_least="Scoor ten minste", + ph_score_cards_discarded="Weggegooide kaarten", + ph_score_cards_played="Gespeelde kaarten", + ph_score_cards_purchased="Gekochte kaarten", + ph_score_furthest_ante="Ante", + ph_score_furthest_round="Ronde", + ph_score_hand="Beste hand", + ph_score_new_collection="Nieuwe ontdekkingen", + ph_score_poker_hand="Meest gespeelde hand", + ph_score_times_rerolled="Keer ververst", + ph_select_challenge="Selecteer een uitdaging", + ph_sneak_peek="Voorproefje", + ph_stat_consumable="Aantal keer dat deze kaart is gebruikt", + ph_stat_joker="Totaal voltooide rondes met deze kaart", + ph_stat_voucher="Aantal keer dat deze voucher is verzilverd", + ph_unscored_hand="Hand geeft geen score", + ph_up_ante_1="Verhoog de ante", + ph_up_ante_2="Verhoog alle blinds", + ph_up_ante_3="Vernieuw blinds", + ph_vouchers_redeemed="Vouchers verzilverd in dit spel", + ph_you_win="JIJ WINT!", + ph_you_win_demo="JIJ WINT DE DEMO!", + }, + high_scores={ + boss_streak="Meeste bazen op rij", + collection="Verzameling", + current_streak="", + furthest_ante="Hoogste ante", + furthest_round="Hoogste ronde", + hand="Beste hand", + most_money="Meeste geld", + poker_hand="Meest gespeelde hand", + win_streak="Beste winreeks", + }, + labels={ + blue_seal="Blauw zegel", + common="Gewoon", + eternal="Eeuwig", + foil="Folie", + gold_seal="Gouden zegel", + holographic="Holografisch", + legendary="Mythisch", + locked="Vergrendeld", + negative="Negatief", + perishable="Vergankelijk", + pinned_left="Vastgepind", + planet="Planeet", + pluto_planet="Dwergplaneet", + polychrome="Polychroom", + purple_seal="Paars zegel", + rare="Zeldzaam", + red_seal="Rood zegel", + rental="Huur", + tarot="Tarot", + uncommon="Ongewoon", + voucher="Voucher", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 kaarten met dezelfde rang", + }, + Flush={ + "5 kaarten die dezelfde kleur hebben", + }, + ["Flush Five"]={ + "5 kaarten met dezelfde rang en kleur", + }, + ["Flush House"]={ + "Een Three of a Kind en een Pair waarbij", + "alle kaarten dezelfde kleur hebben", + }, + ["Four of a Kind"]={ + "4 kaarten met dezelfde rang. Ze mogen", + "worden gespeeld met 1 andere kaart die geen score heeft", + }, + ["Full House"]={ + "Een Three of a Kind en een Pair", + }, + ["High Card"]={ + "Als de gespeelde hand anders is dan bovenstaande,", + "scoort alleen de kaart met de hoogste rang", + }, + Pair={ + "2 kaarten met dezelfde rang. Ze mogen", + "gespeeld worden met 3 andere kaarten die geen score hebben", + }, + ["Royal Flush"]={ + "5 kaarten op rij {opeenvolgende rangen} waarbij", + "alle kaarten dezelfde kleur hebben", + }, + Straight={ + "5 kaarten op rij {opeenvolgende rangen}", + }, + ["Straight Flush"]={ + "5 kaarten op rij {opeenvolgende rangen} waarbij", + "alle kaarten dezelfde kleur hebben", + }, + ["Three of a Kind"]={ + "3 kaarten met dezelfde rang. Ze mogen", + "gespeeld worden met 2 andere kaarten die geen score hebben", + }, + ["Two Pair"]={ + "2 kaartparen met verschillende rangen, mogen", + "worden gespeeld met 1 andere kaart die geen score heeft", + }, + }, + poker_hands={ + ["Five of a Kind"]="Five of a Kind", + Flush="Flush", + ["Flush Five"]="5 flushes", + ["Flush House"]="Flush House", + ["Four of a Kind"]="Four of a Kind", + ["Full House"]="Full House", + ["High Card"]="High Card", + Pair="Pair", + ["Royal Flush"]="Royal Flush", + Straight="Straight", + ["Straight Flush"]="Straight Flush", + ["Three of a Kind"]="Three of a Kind", + ["Two Pair"]="Two Pair", + }, + quips={ + dq_1={ + "Jemig! Hopelijk heb", + "je nog wat trucs", + "in petto voor deze", + "laatste uitdaging!", + }, + lq_1={ + "Misschien kunnen we", + "beter gaan", + "kwartetten...", + }, + lq_10={ + "Wat een flop!", + }, + lq_2={ + "We hebben gefold", + "als een folder!", + }, + lq_3={ + "Tijd voor een nieuwe", + "ronde, en", + "nieuwe kansen!", + }, + lq_4={ + "Je weet toch wat ze", + "altijd zeggen: het", + "huis wint altijd!", + }, + lq_5={ + "Nu zijn we erachter", + "wie de echte", + "Joker is!", + }, + lq_6={ + "O nee, was jij", + "ook aan het bluffen?", + }, + lq_7={ + "Nu staan wij", + "voor paal!", + }, + lq_8={ + "Als ik handen had,", + "zou ik ze voor mijn", + "ogen houden!", + }, + lq_9={ + "Ik ben letterlijk", + "een nar, maar wat", + "is jouw excuus?", + }, + wq_1={ + "Geweldig gedaan!", + }, + wq_2={ + "Daar ben je goed", + "mee omgegaan!", + }, + wq_3={ + "Blijkbaar blufte", + "je toch niet!", + }, + wq_4={ + "Jammer dat die", + "fiches allemaal", + "virtueel zijn...", + }, + wq_5={ + "Zo te zien heb ik", + "je veel geleerd!", + }, + wq_6={ + "Je hebt wat", + "heads-up potjes gespeeld!", + }, + wq_7={ + "Maar goed dat", + "ik niet tegen", + "jou heb ingezet!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="Aas", + Jack="Boer", + King="Heer", + Queen="Vrouw", + }, + suits_plural={ + Clubs="Klaveren", + Diamonds="Ruiten", + Hearts="Harten", + Spades="Schoppen", + }, + suits_singular={ + Clubs="Klaveren", + Diamonds="Ruiten", + Hearts="Harten", + Spades="Schoppen", + }, + tutorial={ + bb_1={ + "Als je de {C:attention}big blind", + "selecteert, verdien je wat geld", + }, + bb_2={ + "Of kies {C:attention}overslaan", + "voor een {C:attention}tag{}! Elke", + "{C:attention}tag{} heeft een uniek effect", + }, + bb_3={ + "Maar let op", + "de {C:attention}blind van een baas{}. Hij", + "heeft een kracht waar je", + "omheen moet plannen.", + }, + bb_4={ + "Als je hem verslaat, gaat de", + "{C:attention}ante{} omhoog en worden", + "alle {C:attention}blinds{} moeilijker", + }, + bb_5={ + "Versla {C:attention}ante{} #1# om te winnen.", + "Kies nu je pad!", + }, + fh_1={ + "Je verdient fiches door", + "{C:attention}pokerhanden{} te spelen", + }, + fh_2={ + "Elke {C:attention}pokerhand{} levert een", + "basisaantal {C:blue}fiches", + "op dat vermenigvuldigd wordt met een {C:red}Multi", + }, + fh_3={ + "Bekijk je {C:attention}pokerhanden", + "in het {C:attention}spelinfo{}-gebied,", + "net als andere informatie", + "over je huidige spel", + }, + fh_4={ + "Kaarten leveren je ook", + "wat {C:blue}fiches{} op,", + "beweeg er maar eens overheen!", + }, + fh_4_touch={ + "Kaarten leveren je ook", + "wat {C:blue}fiches{} op,", + "houd ze ingedrukt om het te zien!", + }, + fh_5={ + "Selecteer nu maximaal", + "{C:attention}5{} kaarten om te spelen", + "en druk op {C:blue}Hand spelen", + }, + fh_5_touch={ + "Tik nu op maximaal", + "{C:attention}5{} kaarten om te spelen", + "en druk op {C:blue}Hand spelen", + }, + fh_6={ + "Je kunt ook {C:red}Weggooien{} tot", + "maximaal {C:attention}5{} geselecteerde kaarten", + "om een nog sterkere hand", + "te krijgen. Probeer maar!", + }, + fh_7={ + "Voorzichtig! Je hebt maar een", + "beperkt aantal {C:blue}handen", + "en {C:red}weggooimogelijkheden{} per ronde", + }, + fh_8={ + "Verdien {C:attention}300 fiches{} voor", + "je geen {C:blue}handen{} meer hebt", + "om deze ronde te winnen.", + "Succes!", + }, + s_1={ + "Goed gedaan! Nu je", + "met {C:money}geld{} {E:1}overspoeld{} wordt,", + "kun je wat nieuwe", + "kaarten uit de {C:attention}winkel{} kopen", + }, + s_10={ + "{C:attention}Vouchers{} worden aangevuld", + "als je de", + "{C:attention}blind van een baas{} hebt verslagen.", + }, + s_11={ + "En bekijk de", + "beide {C:booster}Boosterpakketten{} in", + "elke winkel. Ze zitten", + "boordevol handigheidjes!", + }, + s_12={ + "Laten we naar", + "de {C:attention}volgende ronde{} gaan.", + }, + s_2={ + "Probeer deze knappe", + "duivel maar eens te kopen", + }, + s_2_touch={ + "Probeer deze knappe duivel", + "maar eens te kopen!", + "Sleep hem vanuit de winkel", + "naar het gebied {C:attention}'KOPEN'{}", + }, + s_3={ + "Dit is een van de {C:attention}#1#", + "{C:attention}Jokers{} die je aan je spel kunt", + "toevoegen. Elke {C:attention}Joker", + "heeft een ander effect", + }, + s_4={ + "Deze voegt {C:red}+4 Multi{} toe aan", + "elke hand die je speelt!", + }, + s_5={ + "Wees kieskeurig, je mag maar", + "{C:attention}5 Joker{}-kaarten tegelijk", + "hebben", + }, + s_6={ + "Koop nu de andere", + "kaart uit de {C:attention}winkel", + }, + s_7={ + "Deze {C:tarot}tarot{}-kaart is een", + "{C:attention}verbruiksartikel{}. Deze", + "verbetert je speelkaarten!", + "Houd deze vast.", + }, + s_8={ + "Je kunt maximaal", + "{C:attention}2 verbruiks{}-kaarten tegelijk", + "hebben", + }, + s_9={ + "Als je genoeg hebt gespaard,", + "kun je een {C:attention}voucher{} kopen.", + "{C:attention}Vouchers{} upgraden", + "je spel vanzelf!", + }, + sb_1={ + "Hallo! Mijn naam is", + "{C:attention}Jimbo{}, ik help je graag", + "om dit spel onder de knie te krijgen!", + }, + sb_2={ + "Jouw doel is om", + "{C:blue}fiches{} te verdienen om", + "de {C:attention}blind{} van de vijand te verslaan", + }, + sb_3={ + "Dit is een {C:blue}small blind{},", + "je hoeft maar", + "{C:attention}300 fiches{} te halen om deze te verslaan.", + }, + sb_4={ + "Selecteer de {C:blue}small blind", + "om de ronde te starten!", + }, + sh_1={ + "Als je meer kaarten krijgt,", + "denk er dan aan dat je ze kunt", + "herschikken. {C:attention}Jokers{} activeren", + "van links naar rechts", + }, + sh_2={ + "En zorg ervoor dat je", + "je verbruiksartikelen {C:attention}GEBRUIKT{}!", + }, + sh_3={ + "Selecteer maximaal {C:attention}2{} kaarten", + "in je hand en druk op", + "{C:attention}gebruiken{} op de {C:tarot}tarot{}-kaart", + "om ze te verbeteren!", + }, + sh_3_touch={ + "Selecteer tot {C:attention}2{} kaarten", + "in je hand en sleep", + "de {C:tarot}tarot{}-kaart naar het gebied {C:attention}'GEBRUIKEN'{}", + "om ze te verbeteren!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Handen", + a_handsize="+#1# handomvang", + a_handsize_minus="-#1# handomvang", + a_mult="+#1# Multi", + a_mult_minus="-#1# Multi", + a_remaining="#1# resterend", + a_sold_tally="#1#/#2# verkocht", + a_xmult="X#1# Multi", + a_xmult_minus="-X#1# Multi", + ante_x_voucher="ANTE #1# VOUCHER", + challenges_completed="#1#/#2# uitdagingen voltooid", + completed="#1#/#2# voltooid", + deck_preview_wheel_plural="Getallen kunnen lager zijn vanwege #1# kaarten die met de afbeelding naar beneden is getrokken", + deck_preview_wheel_singular="Getallen kunnen lager zijn vanwege #1# kaart die met de afbeelding naar beneden is getrokken", + interest="#1# rente per $#2# (#3# max)", + loyalty_active="Actief!", + loyalty_inactive="#1# resterend", + ml_foil_desc={ + "Folie", + "+#1# fiches", + }, + ml_holo_desc={ + "Holografisch", + "+#1# Multi", + }, + ml_negative_consumable_desc={ + "Negatief", + "+#1# verbruiksvak", + }, + ml_negative_desc={ + "Negatief", + "+#1# Jokervak", + }, + ml_polychrome_desc={ + "Polychroom", + "X#1# Multi", + }, + remaining_discard_money="Resterende weggooimogelijkheden ($#1# per stuk)", + remaining_hand_money="Resterende handen ($#1# elk)", + unlocked="#1#/#2# vrijgespeeld", + }, + v_text={ + ch_c_all_eternal={ + "Alle winkeljokers zijn {C:eternal}eeuwig{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}Fiches{} kunnen niet hoger zijn dan het huidige {C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Dagelijkse uitdaging!", + }, + ch_c_debuff_played_cards={ + "Van alle {C:attention}gespeelde{} kaarten verdwijnen de {C:attention}extra's{} na het scoren", + }, + ch_c_discard_cost={ + "Weggooimogelijkheden kosten elk {C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "{C:green}1 op de #1#{} kaarten worden met de afbeelding naar beneden getrokken", + }, + ch_c_inflation={ + "Verhoog prijzen permanent met {C:money}$ 1{} bij elke aankoop", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Houd {C:red}-1{} kaarten in de hand voor elke {C:money}$#1#{} die je hebt", + }, + ch_c_no_extra_hand_money={ + "Extra {C:blue}handen{} leveren geen geld meer op", + }, + ch_c_no_interest={ + "Verdien geen {C:attention}rente{} aan het einde van ronde", + }, + ch_c_no_reward={ + "{C:attention}Blinds{} leveren geen beloningsgeld op", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# blinds{} leveren geen beloningsgeld op", + }, + ch_c_no_shop_jokers={ + "Jokers verschijnen niet meer in de {C:attention}winkel", + }, + ch_c_none={ + "{C:inactive}Geen", + }, + ch_c_set_eternal_ante={ + "Als ante {C:attention}#1#{} baas is verslagen, worden alle jokers {C:attention}eeuwig", + }, + ch_c_set_joker_slots_ante={ + "Als ante {C:attention}#1#{} baas is verslagen, gaan alle jokervakken terug naar {C:attention}0", + }, + ch_c_set_seed={ + "1 poging met ingestelde seed: {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} verbruiksvakken", + }, + ch_m_discards={ + "{C:red}#1#{} weggooimogelijkheden per ronde", + }, + ch_m_dollars={ + "Begin met {C:money}$#1#", + }, + ch_m_hand_size={ + "{C:attention}#1#{} handomvang", + }, + ch_m_hands={ + "{C:blue}#1#{} handen per ronde", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} Jokervakken", + }, + ch_m_none={ + "{C:inactive}Geen", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/pl.lua b/src/localization/pl.lua new file mode 100644 index 0000000..b85374b --- /dev/null +++ b/src/localization/pl.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Porzucona talia", + text={ + "Rozpoczynasz podejście", + "bez żadnych {C:attention}figur karcianych", + "w swojej talii", + }, + }, + b_anaglyph={ + name="Anaglificzna talia", + text={ + "Po pokonaniu każdej", + "{C:attention}Przeszkadzajki Bossa{}, zdobywasz", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Czarna talia", + text={ + "{C:attention}+#1#{} slot na jokera", + "", + "{C:blue}-#2#{} ręka", + "w każdej rundzie", + }, + }, + b_blue={ + name="Niebieska talia", + text={ + "{C:blue}+#1#{} ręka", + "w każdej rundzie", + }, + }, + b_challenge={ + name="Talia wyzwania", + text={ + "", + }, + }, + b_checkered={ + name="Talia w kratkę", + text={ + "Rozpoczynasz podejście z", + "{C:attention}26{C:spades} pikami{} oraz", + "{C:attention}26{C:hearts} kierami{} w talii", + }, + }, + b_erratic={ + name="Zmienna talia", + text={ + "Wszystkie {C:attention}rangi{} i", + "{C:attention}kolory{} w talii", + "są przydzielane losowo", + }, + }, + b_ghost={ + name="Talia Ducha", + text={ + "Karty {C:spectral}Duchy{} mogą", + "pojawia się podczas wizyty w sklepie,", + "rozpocznij z kartą {C:spectral,T:c_hex}Zły urok{}", + }, + }, + b_green={ + name="Zielona talia", + text={ + "Na końcu każdej rundy otrzymujesz:", + "{C:money}#1#${s:0.85} na każdą pozostałą {C:blue}rękę", + "{C:money}#2#${s:0.85} na każdą pozostałą {C:red}zrzutkę", + "Nie zarabiasz {C:attention}odsetek", + }, + }, + b_magic={ + name="Magiczna talia", + text={ + "Rozpoczynasz podejście z", + "kuponem {C:tarot,T:v_crystal_ball}#1#{}", + "oraz {C:attention}2{} kopiami", + "karty {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Mgławicowa talia", + text={ + "Rozpoczynasz podejście z", + "kuponem {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} slot na przedm. zużywalne", + }, + }, + b_painted={ + name="Malowana talia", + text={ + "{C:attention}+#1#{} do rozmiaru ręki", + "{C:red}#2#{} slot na jokera", + }, + }, + b_plasma={ + name="Plazmowa talia", + text={ + "Równoważy {C:blue}żetony{} i", + "{C:red}mnożnik{} przy obliczaniu", + "wyniku za rękę zagraną", + "{C:red}X#1#{} bazowej wartości Przeszkadzajki", + }, + }, + b_red={ + name="Czerwona talia", + text={ + "{C:red}+#1#{} zrzutka", + "w każdej rundzie", + }, + }, + b_yellow={ + name="Żółta talia", + text={ + "Rozpoczynasz", + "z dodatkową kwotą {C:money}#1#$", + }, + }, + b_zodiac={ + name="Talia Znaków zodiaku", + text={ + "Rozpoczynasz podejście z", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "i {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="Ramię", + text={ + "Zmniejsza poziom", + "zagranego układu pokerowego", + }, + }, + bl_big={ + name="Duża w ciemno", + text={ + }, + }, + bl_club={ + name="Klub", + text={ + "Wszystkie trefle", + "zostają osłabione", + }, + }, + bl_eye={ + name="Oko", + text={ + "Brak powtórzenia", + "tych samych rodzajów ręki w tej rundzie", + }, + }, + bl_final_acorn={ + name="Bursztynowy żołądź", + text={ + "Obraca i tasuje", + "wszystkie Jokery", + }, + }, + bl_final_bell={ + name="Modry dzwonek", + text={ + "Sprawia, że 1 karta", + "jest zawsze wybierana", + }, + }, + bl_final_heart={ + name="Szkarłatne serce", + text={ + "Jeden losowy joker", + "jest wyłączany z każdej ręki", + }, + }, + bl_final_leaf={ + name="Zielony liść", + text={ + "Wszystkie karty są osłabione", + "aż do sprzedania 1 jokera", + }, + }, + bl_final_vessel={ + name="Fioletowe naczynie", + text={ + "Bardzo duża przeszkadzajka", + }, + }, + bl_fish={ + name="Ryba", + text={ + "Karty są dobierane twarzą w dół", + "po każdej zagranej ręce", + }, + }, + bl_flint={ + name="Krzemień", + text={ + "Żetony bazowe i mnożnik", + "są pomniejszane o połowę", + }, + }, + bl_goad={ + name="Oścień", + text={ + "Wszystkie piki", + "zostają osłabione", + }, + }, + bl_head={ + name="Głowa", + text={ + "Wszystkie kiery", + "zostają osłabione", + }, + }, + bl_hook={ + name="Hak", + text={ + "Odrzuca 2 losowe", + "karty za rozegraną rękę", + }, + }, + bl_house={ + name="Dom", + text={ + "Pierwsza ręka jest", + "dobierana twarzą w dół", + }, + }, + bl_manacle={ + name="Kajdany", + text={ + "-1 do rozmiaru ręki", + }, + }, + bl_mark={ + name="Cel", + text={ + "Wszystkie figury karciane są", + "dobierane twarzą w dół", + }, + }, + bl_mouth={ + name="Usta", + text={ + "Zagrywasz tylko 1 rodzaj", + "ręki w tej rundzie", + }, + }, + bl_needle={ + name="Igła", + text={ + "Zagrywasz tylko 1 rękę", + }, + }, + bl_ox={ + name="Wół", + text={ + "Zagranie #1#", + "ustawia pieniądze na 0$", + }, + }, + bl_pillar={ + name="Filar", + text={ + "Karty zagrane wcześniej", + "w tym wejściu zostają osłabione", + }, + }, + bl_plant={ + name="Roślina", + text={ + "Wszystkie figury karciane", + "zostają osłabione", + }, + }, + bl_psychic={ + name="Medium", + text={ + "Należy zagrać 5 kart", + }, + }, + bl_serpent={ + name="Wąż", + text={ + "Po zagraniu lub zrzutce", + "zawsze dobierasz 3 karty", + }, + }, + bl_small={ + name="Mała w ciemno", + text={ + }, + }, + bl_tooth={ + name="Ząb", + text={ + "Tracisz 1$ za", + "każdą zagraną kartę", + }, + }, + bl_wall={ + name="Mur", + text={ + "Przeszkadzajka XL", + }, + }, + bl_water={ + name="Woda", + text={ + "Rozpoczynasz", + "z 0 zrzutek", + }, + }, + bl_wheel={ + name="Koło", + text={ + " na 7 kart jest", + "dobierana twarzą w dół", + }, + }, + bl_window={ + name="Okno", + text={ + "Wszystkie karo", + "zostają osłabione", + }, + }, + }, + Edition={ + e_base={ + name="Bazowa", + text={ + "Brak dodatkowych efektów", + }, + }, + e_foil={ + name="W folii", + text={ + "{C:chips}+#1#{} żet.", + }, + }, + e_holo={ + name="Holograficzna", + text={ + "Mnoż. {C:mult}+#1#{}", + }, + }, + e_negative={ + name="Negatyw", + text={ + "{C:dark_edition}+#1#{} slot na jokera", + }, + }, + e_negative_consumable={ + name="Negatyw", + text={ + "{C:dark_edition}+#1#{} slot na przedm. zużywalne", + }, + }, + e_polychrome={ + name="Polichromowana", + text={ + "Mnoż. {X:mult,C:white} X#1# {}", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Karta Bonusowa", + text={ + }, + }, + m_glass={ + name="Karta Szklana", + text={ + "Mnoż. {X:mult,C:white} X#1# {}", + "{C:green}#2# na #3#{} szanse", + "zniszczenia karty", + }, + }, + m_gold={ + name="Karta Złota", + text={ + "{C:money}#1#${}, jeśli ta", + "karta jest w ręce", + "na końcu rundy", + }, + }, + m_lucky={ + name="Karta Szczęścia", + text={ + "{C:green}#1# na #3#{} szans", + "na mnoż. {C:mult}+#2#{}", + "{C:green}#1# na #5#{} szans", + "na wygranie {C:money}#4#$", + }, + }, + m_mult={ + name="Karta Mnożnikowa", + text={ + "Mnoż. {C:mult}+#1#{}", + }, + }, + m_steel={ + name="Karta Stalowa", + text={ + "Mnoż. {X:mult,C:white} X#1# {},", + "gdy ta karta", + "pozostanie w ręce", + }, + }, + m_stone={ + name="Karta Kamienna", + text={ + "{C:chips}+#1#{} żet.", + "bez rangi lub koloru", + }, + }, + m_wild={ + name="Karta Dzika", + text={ + "Można jej użyć", + "jako dowolnego koloru", + }, + }, + }, + Joker={ + j_8_ball={ + name="Bila 8", + text={ + "{C:green}#1# na #2#{} szans za każdą", + "zagraną {C:attention}8{} na stworzenie", + "karty {C:tarot}Tarota{} przy punktacji", + "{C:inactive}(wymaga miejsca)", + }, + }, + j_abstract={ + name="Abstrakcyjny Joker", + text={ + "Mnoż. {C:mult}+#1#{} za", + "każdego {C:attention}jokera{}", + "{C:inactive}(obecnie mnoż. {C:red}+#2#{C:inactive})", + }, + }, + j_acrobat={ + name="Akrobata", + text={ + "Mnoż. {X:red,C:white} X#1# {} w ostatniej", + "{C:attention}ręce{} rundy", + }, + unlock={ + "Zagraj {C:attention,E:1}#1#{} kart", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Pradawny Joker", + text={ + "Każda zagrana karta w", + "kolorze {V:1}#2#{} daje", + "mnoż. {X:mult,C:white} X#1# {} przy zdobyciu punktów,", + "kolor {s:0.8} zmienia się na końcu rundy", + }, + }, + j_arrowhead={ + name="Grot", + text={ + "{C:chips}+#1#{} żet. za każdą", + "zagraną kartę w", + "kolorze {C:spades}pik{}", + }, + unlock={ + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "kart w kolorze {E:1,C:attention}#2#", + "swojej talii", + }, + }, + j_astronomer={ + name="Astronom", + text={ + "Wszystkie karty {C:planet}Planet{} oraz", + "{C:planet}paczki niebiańskie{} w", + "sklepie są {C:attention}za darmo", + }, + unlock={ + "Odkryj każdą", + "kartę {E:1,C:planet}Planet{}", + }, + }, + j_banner={ + name="Chorągiew", + text={ + "{C:chips}+#1#{} żet. za", + "każdą pozostałą", + "zrzutkę {C:attention}", + }, + }, + j_baron={ + name="Baron", + text={ + "Każdy {C:attention}Król{}", + "w ręce", + "daje mnoż. {X:mult,C:white} X#1# {}", + }, + }, + j_baseball={ + name="Karta bejsbolowa", + text={ + "{C:green}Niepospolite{} Jokery", + "dają mnoż. {X:mult,C:white} X#1# {}", + }, + }, + j_blackboard={ + name="Tablica", + text={ + "Mnoż. {X:red,C:white} X#1# {}, jeśli wszystkie", + "nie zagrane karty w ręce", + "to {C:spades}#2#{} lub {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Krwawy kamień", + text={ + "{C:green}#1# na #2#{} szans za każdą", + "zagraną kartę w", + "kolorze {C:hearts}kier{}", + "mnoż. {X:mult,C:white} X#3# {} przy zdobyciu punktów,", + }, + unlock={ + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "kart w kolorze {E:1,C:attention}#2#", + "swojej talii", + }, + }, + j_blue_joker={ + name="Niebieski Joker", + text={ + "{C:chips}+#1#{} żet. za każdą", + "pozostałą kartę w {C:attention}talii", + "{C:inactive}(obecnie {C:chips}+#2#{C:inactive} żet.)", + }, + }, + j_blueprint={ + name="Światłokopia", + text={ + "Powiela zdolność", + "{C:attention}jokera{} na prawo", + }, + unlock={ + "Wygraj podejście", + }, + }, + j_bootstraps={ + name="Ucha od buta", + text={ + "{C:mult}+#1#{} do mnoż. za", + "każde twoje {C:money}$#2#{}", + "{C:inactive}(obecnie: {C:mult}+#3#{C:inactive} do mnoż.)", + }, + unlock={ + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "Jokery {C:dark_edition}polichromowane{}", + }, + }, + j_brainstorm={ + name="Burza mózgów", + text={ + "Powiela zdolność", + "{C:attention}jokera najbardziej wysuniętego na lewo", + }, + unlock={ + "Odrzuca", + "{E:1,C:attention}pokera królewskiego", + }, + }, + j_bull={ + name="Byk", + text={ + "{C:chips}+#1#{} do żet. za", + "twój każdy {C:money}$1{}", + "{C:inactive}(obecnie: {C:chips}+#2#{C:inactive} do żet.)", + }, + }, + j_burglar={ + name="Włamywacz", + text={ + "Po wybraniu {C:attention}Przeszkadzajki{},", + "zyskujesz {C:blue}+#1#{} rąk oraz", + "{C:attention}tracisz wszystkie zrzutki", + }, + }, + j_burnt={ + name="Przypalony Joker", + text={ + "Podniesienie poziomu", + "pierwszego {C:attention}odrzuconego", + "układu pokerowego w każdej rundzie", + }, + unlock={ + "Sprzedaj łącznie", + "{E:1,C:attention}#1#{} karty", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Wizytówka", + text={ + "Figury {C:attention}karciane{} dają", + "{C:green}#1# na #2#{} szanse", + "zdobycia {C:money}2${}, przy ich zagraniu", + }, + }, + j_caino={ + name="Caino", + text={ + "Ten joker zdobywa {X:mult,C:white} X#1# {} do mnoż.,", + "gdy karta {C:attention}figury{}", + "zostaje zniszczona", + "{C:inactive}(obecny mnoż.: {X:mult,C:white} X#2# {C:inactive}.)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Ognisko", + text={ + "Ten joker daje mnoż. {X:mult,C:white}X#1#{}", + "za każdą {C:attention}sprzedaną{} kartę i zeruje się", + "po pokonaniu {C:attention}Przeszkadzajki Bossa{}", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_card_sharp={ + name="Ostra karta", + text={ + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrany", + "{C:attention}układ pokerowy{} został już", + "rozegrany w tej rundzie", + }, + }, + j_cartomancer={ + name="Kartomancja", + text={ + "Otrzymujesz kartę {C:tarot}Tarota{}", + "po wybraniu {C:attention}Przeszkadzajki{}", + "{C:inactive}(wymaga miejsca)", + }, + unlock={ + "Odkryj każdą", + "kartę {E:1,C:tarot}Tarota{}", + }, + }, + j_castle={ + name="Zamek", + text={ + "Ten joker zdobywa {C:chips}+#1#{} żet.", + "na odrzuconą kartę {V:1}#2#{},", + "kolor zmienia się co rundę", + "{C:inactive}(obecnie {C:chips}+#3#{C:inactive} żet.)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "Mnoż. {X:mult,C:white} X#1# {}", + "{C:green}#2# na #3#{} szans, że ta", + "karta zostanie zniszczona", + "na końcu rundy", + }, + }, + j_ceremonial={ + name="Sztylet Rytualny", + text={ + "Po wybraniu {C:attention}Przeszkadzajki{},", + "niszczy jokera po prawej", + "oraz na stałe dodaje {C:attention}podwojenie", + "wartości sprzedaży do tego {C:red}mnoż.", + "{C:inactive}(obecnie mnoż. {C:mult}+#1#{C:inactive})", + }, + }, + j_certificate={ + name="Świadectwo", + text={ + "Na początku rundy", + "dodaje losową {C:attention}kartę", + "{C:attention}rozgrywającą{}", + "{C:attention}pieczęć{} do twojej ręki", + }, + unlock={ + "Zyskaj Złotą", + "kartę rozgrywającą", + "ze {C:attention,E:1}Złotą Pieczęcią", + }, + }, + j_chaos={ + name="Klaun Chaos", + text={ + "{C:attention}#1#{} darmowy ponowny {C:green}rzut", + "na wizytę w sklepie", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Wyłącza efekt", + "każdej zdolności {C:attention}Przeszkadzajki Bossa", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Bystry Joker", + text={ + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_cloud_9={ + name="Dziewiątka z nieba", + text={ + "Zyskujesz {C:money}$#1#{} za każdą", + "{C:attention}9{} w {C:attention}kompletnej talii", + "na końcu rundy", + "{C:inactive}(obecnie {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="Gwiazdozbiór", + text={ + "Ten joker zdobywa", + "{X:mult,C:white} X#1# {} do mnoż. przy", + "każdym użyciu karty", + "{C:planet}Planety{} {C:inactive}(obecnie: {X:mult,C:white} X#2# {C:inactive} do mnoż.)", + }, + }, + j_crafty={ + name="Cwany Joker", + text={ + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_crazy={ + name="Szalony Joker", + text={ + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_credit_card={ + name="Karta kredytowa", + text={ + "Zaciągnij dług", + "do wartości {C:red}-#1#${}", + }, + }, + j_delayed_grat={ + name="Gratyfikacja z opóźnieniem", + text={ + "Zyskaj {C:money}#1#${} za {C:attention}zrzutkę{}, jeśli", + "nie skorzystano ze zrzutek", + "do końca rundy", + }, + }, + j_devious={ + name="Podstępny Joker", + text={ + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_diet_cola={ + name="Dietetyczna cola", + text={ + "Sprzedaj tę kartę, aby", + "stworzyć darmowy", + "{C:attention}#1#", + }, + }, + j_dna={ + name="DNA", + text={ + "Jeśli {C:attention}pierwsza ręką{} w rundzie", + "to tylko {C:attention}1{} karta, dodaje", + "na stałe do talii drugą tę samą kartę", + "i dobiera ją do {C:attention}ręki", + }, + }, + j_drivers_license={ + name="Prawo jazdy", + text={ + "Mnoż. {X:mult,C:white} X#1# {}, jeśli w talii", + "znajduje się przynajmniej {C:attention}16", + "ulepszonych kart", + "{C:inactive}(obecnie {C:attention}#2#{C:inactive})", + }, + unlock={ + "Ulepsz {E:1,C:attention}#1#{} kart", + "w swojej talii", + }, + }, + j_droll={ + name="Dziwaczny Joker", + text={ + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_drunkard={ + name="Pijak", + text={ + "{C:red}+#1#{} zrzutka", + "w każdej rundzie", + }, + }, + j_duo={ + name="Duet", + text={ + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + unlock={ + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Zmierzch", + text={ + "Uruchom ponownie wszystkie karty", + "punktujące w {C:attention}ostatniej", + "{C:attention}ręce{} rundy", + }, + }, + j_egg={ + name="Jajo", + text={ + "Zyskujesz {C:money}#1#${}", + "{C:attention}wartości sprzedaży{} na", + "końcu rundy", + }, + }, + j_erosion={ + name="Erozja", + text={ + "Mnoż. {C:red}+#1#{} za każdą", + "kartę poniżej {C:attention}#3#{}", + "w kompletnej talii", + "{C:inactive}(obecnie mnoż. {C:red}+#2#{C:inactive})", + }, + }, + j_even_steven={ + name="Równiacha", + text={ + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę", + "o {C:attention}parzystej{} randze", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Joker bez twarzy", + text={ + "Zyskujesz {C:money}#1#${}, jeśli {C:attention}#2#{} lub", + "więcej {C:attention}figur karcianych{}", + "zostanie odrzuconych", + "jednocześnie", + }, + }, + j_family={ + name="Rodzinka", + text={ + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + unlock={ + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Ciąg Fibonacciego", + text={ + "Mnoż. {C:mult}+#1#{} za każdego", + "zagranego {C:attention}asa{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} lub {C:attention}8{}", + }, + }, + j_flash={ + name="Szybka karta", + text={ + "Ten joker zdobywa {C:mult}+#1#{} do mnoż.", + "za {C:attention}ponowny rzut{} w sklepie", + "{C:inactive}(obecnie {C:mult}+#2#{C:inactive} do mnoż.)", + }, + }, + j_flower_pot={ + name="Doniczka", + text={ + "{X:mult,C:white} X#1# {} do mnoż., gdy", + "układ pokerowy", + "zawiera kartę {C:diamonds}karo{}, {C:clubs}trefl{},", + "{C:hearts}kier{} i {C:spades}pik{}", + }, + unlock={ + "Osiągnij stawkę", + "na poziomie {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Wróżbita", + text={ + "Mnoż. {C:red}+#1#{} za każdą", + "wykorzystaną kartę {C:purple}Tarota{}", + "{C:inactive}(obecnie {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Cztery Palce", + text={ + "Wszystkie {C:attention}kolory{} i", + "{C:attention}strity{} można", + "uzyskać z {C:attention}4{} kart", + }, + }, + j_gift={ + name="Karta podarunkowa", + text={ + "Dodaje {C:money}$#1#{} wartości {C:attention}sprzedaży", + "do każdego {C:attention}jokera{} oraz", + "karty {C:attention}zużywalnej{} przy", + "końcu rundy", + }, + }, + j_glass={ + name="Szklany Joker", + text={ + "Ten joker zdobywa {X:mult,C:white} X#1# {}", + "do mnoż. za każdą zniszczoną", + "{C:attention}Kartę Szklaną", + "{C:inactive}(obecnie {X:mult,C:white} X#2# {C:inactive} do mnoż.)", + }, + unlock={ + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "{E:1,C:attention}#2#{} w", + "swojej talii", + }, + }, + j_gluttenous_joker={ + name="Żarłoczny Joker", + text={ + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "kolorze {C:clubs}#2#{}", + }, + }, + j_golden={ + name="Złoty Joker", + text={ + "Zyskujesz {C:money}#1#${} na", + "końcu rundy", + }, + }, + j_greedy_joker={ + name="Chciwy Joker", + text={ + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "kolorze {C:diamonds}#2#{}", + }, + }, + j_green_joker={ + name="Zielony Joker", + text={ + "Mnoż. {C:mult}+#1#{} na rozegraną rękę", + "Mnoż. {C:mult}-#2#{} za zrzutkę", + "{C:inactive}(obecnie mnoż. {C:mult}+#3#{C:inactive})", + }, + }, + j_gros_michel={ + name="Gros Michel", + text={ + "Mnoż. {C:mult}+#1#{}", + "{C:green}#2# na #3#{} szans, że ta", + "karta zostanie zniszczona", + "na końcu rundy", + }, + }, + j_hack={ + name="Kabareciarz", + text={ + "Aktywuj ponownie", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} lub {C:attention}5{}", + "przy ich zagraniu", + }, + }, + j_half={ + name="Pół-Joker", + text={ + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#{} lub mniej kart", + }, + }, + j_hallucination={ + name="Halucynacja", + text={ + "{C:green}#1# na #2#{} szanse, aby stworzyć", + "kartę {C:tarot}Tarota{} przy", + "otworzeniu dowolnej {C:attention}paczki wzmacniającej{}", + "{C:inactive}(wymaga miejsca)", + }, + }, + j_hanging_chad={ + name="Na włosku", + text={ + "Aktywuj ponownie {C:attention}pierwszą{}", + "zagraną kartę w punktacji", + "jeszcze {C:attention}#1#{} raz(y)", + }, + unlock={ + "Pokonaj Przeszkadzajkę Bossa", + "za pomocą {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Wycieczkowicz", + text={ + "Przy zagraniu dowolnej {C:attention}karty{}", + "na stałe otrzymujesz", + "{C:chips}+#1#{} żet.", + }, + }, + j_hit_the_road={ + name="W drogę", + text={ + "Ten joker zdobywa {X:mult,C:white} X#1# {} do mnoż.", + "za każdego {C:attention}waleta{}", + "odrzuconego w tej rundzie", + "{C:inactive}(obecnie: {X:mult,C:white} X#2# {C:inactive} do mnoż.)", + }, + unlock={ + "Odrzuć {E:1,C:attention}5", + "{E:1,C:attention}waletów{}", + "jednocześnie", + }, + }, + j_hologram={ + name="Hologram", + text={ + "Ten joker zdobywa {X:mult,C:white} X#1# {} do mnoż.,", + "gdy {C:attention}karta rozgrywająca{}", + "zostaje dodana do twojej talii", + "{C:inactive}(obecny mnoż.: {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_ice_cream={ + name="Lody", + text={ + "{C:chips}+#1#{} żet.", + "{C:chips}-#2#{} żet. za", + "każdą rozegraną rękę", + }, + }, + j_idol={ + name="Bożek", + text={ + "Mnoż. {X:mult,C:white} X#1# {} za każdą", + "#2# z {V:1}#3#{} kart", + "przy jej zagraniu;", + "{s:0.8}karta zmienia się co rundę", + }, + unlock={ + "Zdobądź przynajmniej", + "{E:1,C:attention}#1#{} żet.", + "w ciągu jednej ręki", + }, + }, + j_invisible={ + name="Niewidzialny Joker", + text={ + "Po {C:attention}#1#{} rundach", + "sprzedaj tę kartę, aby", + "{C:attention}zduplikować{} losowego jokera", + "{C:inactive}(obecnie {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Wygraj podejście bez", + "posiadania więcej", + "niż {E:1,C:attention}4 jokerów{}", + }, + }, + j_joker={ + name="Joker", + text={ + "Mnoż. {C:red,s:1.1}+#1#{}", + }, + }, + j_jolly={ + name="Wesoły Joker", + text={ + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_juggler={ + name="Żongler", + text={ + "{C:attention}+#1#{} do rozmiaru ręki", + }, + }, + j_loyalty_card={ + name="Karta Lojalnościowa", + text={ + "Mnoż. {X:red,C:white} X#1# {} co", + "{C:attention}#2#{} rozegranych układów", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Sprzedaj tę kartę, aby", + "zablokować bieżącą", + "{C:attention}Przeszkadzajkę Bossa{}", + }, + }, + j_lucky_cat={ + name="Kot na szczęście", + text={ + "Ten joker zdobywa {X:mult,C:white} X#1# {} do mnoż.,", + "gdy karta {C:attention}szczęścia{}", + "zostanie {C:green}skutecznie{}", + "aktywowana {C:inactive}(obecny mnoż.: {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_lusty_joker={ + name="Żwawy Joker", + text={ + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "kolorze {C:hearts}#2#{}", + }, + }, + j_mad={ + name="Obłąkany Joker", + text={ + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_madness={ + name="Szaleństwo", + text={ + "Gdy {C:attention}mała w ciemno{} lub {C:attention}duża w ciemno{}", + "zostanie wybrana, zyskujesz {X:mult,C:white} X#1# {}", + "do mnoż. i {C:attention}niszczysz{} losowego jokera", + "{C:inactive}(obecny mnoż.: {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_mail={ + name="Rabat", + text={ + "Zdobywasz {C:money}$#1#{} za każdą", + "odrzuconą {C:attention}#2#{}, ranga", + "zmienia się co rundę", + }, + }, + j_marble={ + name="Marmurowy Joker", + text={ + "Dodaje jedną kartę {C:attention}Kamień{} do", + "do talii", + "po wybraniu {C:attention}Przeszkadzajki{}", + }, + }, + j_matador={ + name="Matador", + text={ + "Zyskaj {C:money}#1#${}, jeśli zagrana", + "ręka aktywuje", + "zdolność {C:attention}Przeszkadzajki Bossa{}", + }, + unlock={ + "Pokonaj Przeszkadzajkę Bossa", + "w ciągu {E:1,C:attention}1 ręki{} bez", + "wykorzystywania zrzutek", + }, + }, + j_merry_andy={ + name="Radosny Radek", + text={ + "{C:red}+#1#{} do zrzutek", + "co rundę,", + "{C:red}#2#{} do rozmiaru ręki", + }, + unlock={ + "Wygraj podejście w ciągu {E:1,C:attention}#1#", + "lub mniej rund", + }, + }, + j_midas_mask={ + name="Maska Midasa", + text={ + "Wszystkie zagrane karty {C:attention}figur{}", + "stają się {C:attention}złotymi{} kartami", + "przy punktacji", + }, + }, + j_mime={ + name="Mim", + text={ + "Aktywuj ponownie wszystkie", + "zdolności kart {C:attention}posiadanych w", + "{C:attention}dłoni{}", + }, + }, + j_misprint={ + name="Błąd w druku", + text={ + "", + }, + }, + j_mr_bones={ + name="Kostek", + text={ + "Chroni przed śmiercią,", + "jeśli punkty z żetonów", + "stanowią przynajmniej {C:attention}25%", + "wymaganych żetonów", + "{S:1.1,C:red,E:2}Ulega samozniszczeniu{}", + }, + unlock={ + "Przegrywasz {C:attention,E:1}#1#{} podejść", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Mistyczny Szczyt", + text={ + "Mnoż. {C:mult}+#1#{}, gdy", + "pozostanie {C:attention}#2#{} zrzutek", + "w grze", + }, + }, + j_obelisk={ + name="Obelisk", + text={ + "Ten joker zdobywa {X:mult,C:white} X#1# {} do mnoż.", + "za {C:attention}kolejne{} zagrywane ręce", + "bez zagrywania twojego", + "najczęściej zagrywanego {C:attention}układu pokerowego", + "{C:inactive}(obecny mnoż.: {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_odd_todd={ + name="Nierówniacha", + text={ + "{C:chips}+#1#{} żet. za", + "każdą zagraną kartę", + "o {C:attention}nieparzystej{} randze", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Agat onyksowy", + text={ + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "w kolorze {C:clubs}trefl{}", + }, + unlock={ + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "kart w kolorze {E:1,C:attention}#2#", + "swojej talii", + }, + }, + j_oops={ + name="Same szóstki!", + text={ + "Podwaja {C:attention}wszystkie", + "{C:green,E:1,S:1.1}prawdopodobieństwa", + "{C:inactive}(przykład: {C:green}1 na 3{C:inactive} -> {C:green}2 na 3{C:inactive})", + }, + unlock={ + "Zdobądź przynajmniej", + "{E:1,C:attention}#1#{} żet.", + "w ciągu jednej ręki", + }, + }, + j_order={ + name="Porządek", + text={ + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + unlock={ + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Pareidolia", + text={ + "Wszystkie karty są", + "traktowane jako", + "{C:attention}figury{}", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Tworzy {C:dark_edition}Negatyw{}", + "{C:attention}1{} losowej posiadanej", + "{C:attention}zużywalnej{} karty", + "na końcu zakupów w {C:attention}sklepie", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Zdjęcie", + text={ + "Mnoż. {X:mult,C:white} X#1# {} za", + "pierwszą zagraną {C:attention}figurę karcianą", + "przy zdobyciu punktów", + }, + }, + j_popcorn={ + name="Popcorn", + text={ + "Mnoż. {C:mult}+#1#{}", + "Mnoż. {C:mult}-#2#{} na", + "rozegraną rundę", + }, + }, + j_raised_fist={ + name="Uniesiona Pięść", + text={ + "Dodaje do mnoż. {C:attention}podwójną{}", + "rangę katy na ręce o", + "{C:attention}najniższej{} randze", + }, + }, + j_ramen={ + name="Ramen", + text={ + "Mnoż. {X:mult,C:white} X#1# {},", + "tracisz mnoż. {X:mult,C:white} X#2# {}", + "za każdą odrzuconą {C:attention}kartę{}", + }, + }, + j_red_card={ + name="Czerwona karta", + text={ + "Ten joker zdobywa", + "{C:red}+#1#{} do mnoż., gdy", + "{C:attention}paczka wzmacniająca{} zostaje pominięta", + "{C:inactive}(obecnie {C:red}+#2#{C:inactive} do mnoż.)", + }, + }, + j_reserved_parking={ + name="Parking zastrzeżony", + text={ + "Każda {C:attention}figura{} karciana", + "w ręce daje", + "{C:green}#2# na #3#{} szanse", + "daje {C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="Przejażdżka autobusem", + text={ + "Ten joker zdobywa {C:mult}+#1#{} do mnoż.", + "za {C:attention}kolejne{}", + "zagrywane ręce bez", + "punktowanej {C:attention}figury{}", + "{C:inactive}(obecnie: {C:mult}+#2#{C:inactive} do mnoż.)", + }, + }, + j_riff_raff={ + name="Motłoch", + text={ + "Po wybraniu {C:attention}Przeszkadzajki{},", + "zyskujesz {C:attention}#1# {C:blue}zwykłego{C:attention} jokera", + "{C:inactive}(wymaga miejsca)", + }, + }, + j_ring_master={ + name="Konferansjer cyrkowy", + text={ + "{C:attention}Jokery{}, karty {C:tarot}Tarota{}, karty {C:planet}Planet{}", + "oraz karty {C:spectral}Ducha{} mogą", + "pojawić się wielokrotnie", + }, + unlock={ + "Osiągnij stawkę", + "na poziomie {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Rakieta", + text={ + "Zyskujesz {C:money}$#1#{} na koniec rundy.", + "Wypłata rośnie o {C:money}$#2#{},", + "gdy pokonany zostanie {C:attention}Przeszkadzajka Bossa{}", + }, + }, + j_rough_gem={ + name="Surowy klejnot", + text={ + "{C:money}+#1#{} żet. za", + "zagraną kartę w", + "kolorze {C:diamonds}karo{}", + }, + unlock={ + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "kart w kolorze {E:1,C:attention}#2#", + "swojej talii", + }, + }, + j_runner={ + name="Biegacz", + text={ + "Zyskujesz {C:chips}+#2#{} żet.,", + "jeśli zagrana ręka", + "zawiera {C:attention}strita{}", + "{C:inactive}(obecnie {C:chips}+#1#{C:inactive} żet.)", + }, + }, + j_satellite={ + name="Satelita", + text={ + "Zyskujesz {C:money}#1#${} na końcu", + "rundy za każdą unikalną kartę {C:planet}Planety", + "wykorzystaną w tym podejściu", + "{C:inactive}(obecnie {C:money}$#2#{C:inactive})", + }, + unlock={ + "Posiadaj {E:1,C:money}#1#$", + "lub więcej", + }, + }, + j_scary_face={ + name="Straszna Twarz", + text={ + "Figury {C:attention}karciane{}", + "dają {C:chips}+#1#{} żet.", + "przy ich zagraniu", + }, + }, + j_scholar={ + name="Uczony", + text={ + "Zagrane {C:attention}asy{}", + "dają {C:chips}+#2#{} żet.", + "oraz mnoż. {C:mult}+#1#{}", + "przy ich zagraniu", + }, + }, + j_seance={ + name="Seans", + text={ + "Jeśli {C:attention}układ pokerowy{} to", + "{C:attention}#1#{}, otrzymujesz", + "losową kartę {C:spectral}Ducha{}", + "{C:inactive}(wymaga miejsca)", + }, + }, + j_seeing_double={ + name="Podwójne widzenie", + text={ + "Mnoż. {X:mult,C:white} X#1# {}, jeśli", + "w ręce znajdują się punktujące karty", + "{C:clubs}Trefl{} i punktująca", + "karta innego {C:attention}koloru", + }, + unlock={ + "Zagraj rękę,", + "która zawiera", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Tabletka musująca", + text={ + "Aktywuj ponownie wszystkie", + "zagrane karty przez", + "następne {C:attention}#1#{} rozd.", + }, + }, + j_shoot_the_moon={ + name="Mierz w Księżyc", + text={ + "Każda {C:attention}królowa{}", + "na ręce", + "daje {C:mult}+#1#{} do mnoż.", + }, + unlock={ + "Zagraj każdą kartą {E:1,C:attention}kier", + "w swojej talii w ciągu", + "jednej rundy", + }, + }, + j_shortcut={ + name="Skrót", + text={ + "Pozwala na {C:attention}strity{}", + "z przerwami {C:attention}1 rangi", + "{C:inactive}(np.: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Szósty zmysł", + text={ + "Gdy {C:attention}pierwsza ręka{} rundy to", + "pojedyncza {C:attention}6{}, ulega zniszczeniu, przy jednoczesnym", + "utworzeniu karty {C:spectral}Ducha{}", + "{C:inactive}(wymaga miejsca)", + }, + }, + j_sly={ + name="Przebiegły Joker", + text={ + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_smeared={ + name="Rozmazany Joker", + text={ + "{C:hearts}Kiery{} i {C:diamonds}karo", + "liczą się jako ten sam kolor", + "{C:spades}Piki{} i {C:clubs}trefle", + "liczą się jako ten sam kolor", + }, + unlock={ + "Posiadaj przynajmniej {C:attention}#1#", + "{E:1,C:attention}#2#{} w", + "swojej talii", + }, + }, + j_smiley={ + name="Uśmiechnięta buzia", + text={ + "Zagrane {C:attention}figury{} karciane", + "dają mnoż. {C:mult}+#1#{}", + "przy zdobyciu punktów", + }, + }, + j_sock_and_buskin={ + name="Maski teatralne", + text={ + "Aktywuj ponownie wszystkie", + "{C:attention}figury{} karciane przy ich zagraniu", + }, + unlock={ + "Zagraj łącznie", + "{C:attention,E:1}#1#{} figur karcianych", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Kosmiczny Joker", + text={ + "{C:green}#1# na #2#{} szans na", + "podniesienie poziomu", + "zagranego {C:attention}układu pokerowego{}", + }, + }, + j_splash={ + name="Plusk", + text={ + "Każda {C:attention}zagrana karta", + "zalicza się do punktacji", + }, + }, + j_square={ + name="Kwadratowy Joker", + text={ + "Ten joker zdobywa {C:chips}+#2#{} do żet.", + "jeśli zagrana ręka ma", + "dokładnie {C:attention}4{} karty", + "{C:inactive}(obecnie: {C:chips}#1#{C:inactive} żet.)", + }, + }, + j_steel_joker={ + name="Stalowy Joker", + text={ + "Daje {X:mult,C:white} X#1# {} do mnoż.", + "za każdą {C:attention}Kartę Stalową", + "w twojej {C:attention}kompletnej talii", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_stencil={ + name="Joker Szablon", + text={ + "mnoż. {X:red,C:white} X1 {} za każdy", + "pusty slot na {C:attention}jokera{}", + "{s:0.8}Joker Szablon zawarty", + "{C:inactive}(obecnie {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Kamienny Joker", + text={ + "Daje {C:chips}+#1#{} żet. za", + "każdą {C:attention}Kartę Kamienną", + "w twojej {C:attention}kompletnej talii", + "{C:inactive}(obecnie {C:chips}+#2#{C:inactive} żet.)", + }, + }, + j_stuntman={ + name="Kaskader", + text={ + "{C:chips}+#1#{} żet.,", + "{C:attention}-#2#{} do rozmiaru ręki", + }, + unlock={ + "Zdobądź przynajmniej", + "{E:1,C:attention}#1#{} żet.", + "w ciągu jednej ręki", + }, + }, + j_supernova={ + name="Supernowa", + text={ + "Dodaje do mnożnika liczbę razy", + "rozegrania w tym podejściu", + "{C:attention}układu pokerowego{}", + }, + }, + j_superposition={ + name="Superpozycja", + text={ + "Jeśli układ pokerowy zawiera", + "{C:attention}asa{} i {C:attention}strita{},", + "otrzymujesz kartę {C:tarot}Tarota{}", + "{C:inactive}(wymaga miejsca)", + }, + }, + j_swashbuckler={ + name="Korsarz", + text={ + "Dodaje wartość sprzedaży", + "pozostałych posiadanych", + "{C:attention}jokerów{} do mnoż.", + "{C:inactive}(obecnie: {C:mult}+#1#{C:inactive} do mnoż.)", + }, + unlock={ + "Sprzedaj łącznie", + "{C:attention,E:1}#1#{} jokerów", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Powrót do przeszłości", + text={ + "Zyskujesz mnoż. {X:mult,C:white} X#1# {}", + "za każdą pominiętą {C:attention}Przeszkadzajkę{} w tym podejściu", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})", + }, + unlock={ + "Kontynuuj zapisane podejście", + "z menu głównego", + }, + }, + j_ticket={ + name="Złoty bilet", + text={ + "Zyskujesz {C:money}#1#${} za", + "każdą zagraną {C:attention}Złotą{} kartę", + }, + unlock={ + "Zagraj rękę składającą się z 5 kart,", + "która zawiera tylko", + "karty {C:attention,E:1}Złote{}", + }, + }, + j_to_the_moon={ + name="Na Księżyc", + text={ + "Zdobywasz bonusowe {C:money}$#1#{}", + "{C:attention}odsetki{} za każde {C:money}$5{}, które", + "masz na końcu rundy", + }, + }, + j_todo_list={ + name="Lista zadań", + text={ + "Zyskujesz {C:money}$#1#{}, gdy {C:attention}układ", + "pokerowy{} to: {C:attention}#2#{}.", + "Układ pokerowy zmienia się", + "na koniec rundy", + }, + }, + j_trading={ + name="Karta kolekcjonerska", + text={ + "Jeśli {C:attention}pierwsza zrzutka{} w rundzie", + "to tylko {C:attention}1{} karta, niszczy", + "ją i zyskujesz {C:money}$#1#", + }, + }, + j_tribe={ + name="Plemię", + text={ + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + unlock={ + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "Każde zagranie {C:attention}króla{} i", + "{C:attention}królowej{} daje", + "mnoż. {X:mult,C:white} X#1# {} przy zdobyciu punktów,", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="Trio", + text={ + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + unlock={ + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Trubadur", + text={ + "{C:attention}+#1#{} do rozmiaru ręki,", + "{C:blue}-#2#{} od ręki co rundę", + }, + unlock={ + "Wygraj {C:attention,E:1}#1#{} rund", + "z rzędu, rozgrywając", + "tylko 1 rękę", + }, + }, + j_trousers={ + name="Zapasowe spodnie", + text={ + "Ten joker zdobywa {C:mult}+#1#{} do mnoż.,", + "jeśli zagrana ręka zawiera:", + "{C:attention}#2#", + "{C:inactive}(obecnie: {C:red}+#3#{C:inactive} do mnoż.)", + }, + }, + j_turtle_bean={ + name="Czarna fasola", + text={ + "{C:attention}+#1#{} do rozmiaru ręki,", + "zmniejsza się o", + "{C:red}#2#{} w każdej rundzie", + }, + }, + j_vagabond={ + name="Włóczęga", + text={ + "Tworzy kartę {C:purple}Tarota{},", + "jeśli została zagrana ręka", + "mając {C:money}$#1#{} lub mniej", + }, + }, + j_vampire={ + name="Wampir", + text={ + "Ten joker zdobywa {X:mult,C:white} X#1# {} do mnoż.", + "na punktację zagranej {C:attention}ulepszonej karty{}", + "i usuwa {C:attention}ulepszenie", + "{C:inactive}(obecny mnoż.: {X:mult,C:white} X#2# {C:inactive})", + }, + }, + j_walkie_talkie={ + name="Krótkofalówka", + text={ + "Każda zagrana {C:attention}10{} lub {C:attention}4", + "daje {C:chips}+#1#{} żet. oraz", + "mnoż. {C:mult}+#2#{} przy zdobyciu punktów", + }, + }, + j_wee={ + name="Maleńki Joker", + text={ + "Joker ten daje", + "{C:chips}+#2#{} żet., przy zagraniu", + "każdej {C:attention}2{}", + "{C:inactive}(obecnie {C:chips}+#1#{C:inactive} żet.)", + }, + unlock={ + "Wygraj podejście w ciągu {E:1,C:attention}#1#", + "lub mniej rund", + }, + }, + j_wily={ + name="Chytry Joker", + text={ + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Gniewny Joker", + text={ + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "kolorze {C:spades}#2#{}", + }, + }, + j_yorick={ + name="Yorick", + text={ + "Ten joker zdobywa", + "{X:mult,C:white} X#1# {} do mnoż. za każde {C:attention}#2#{C:inactive} [#3#]{}", + "szt. odrzuconych kart", + "{C:inactive}(obecny mnoż.: {X:mult,C:white} X#4# {C:inactive})", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Zwariowany Joker", + text={ + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Czarna naklejka", + text={ + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Czarna", + "{C:attention}stawka{}", + }, + }, + blue_seal={ + name="Niebieska Pieczęć", + text={ + "Tworzy kartę {C:planet}Planety{}", + "za ostatni zagrany {C:attention}układ pokerowy{}", + "w rundzie, jeśli {C:attention}jest na ręce{}", + "{C:inactive}(wymaga miejsca)", + }, + }, + blue_sticker={ + name="Niebieska naklejka", + text={ + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Niebieska", + "{C:attention}stawka{}", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} żet.", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} dod. żet.", + }, + }, + challenge_locked={ + name="Zablokowany", + text={ + "Wygraj podejście z co najmniej", + "#1# różnymi taliami, aby odblokować", + "Tryb wyzwań", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Osłabiono", + text={ + "Wszystkie zdolności", + "są wyłączone", + }, + }, + debuffed_playing_card={ + name="Osłabiono", + text={ + "Brak zdobywania żetonów,", + "wszystkie zdolności", + "są wyłączone", + }, + }, + deck_locked_discover={ + name="Zablokowane", + text={ + "Odkryj przynajmniej", + "{C:attention}#1#{} przedm. ze", + "swojej kolekcji", + }, + }, + deck_locked_stake={ + name="Zablokowane", + text={ + "Wygraj podejście dowolną", + "talią na poz. trudności:", + "{V:1}#1#{} lub wyższym", + }, + }, + deck_locked_win={ + name="Zablokowane", + text={ + "Wygraj podejście używając:", + "{C:attention}#1#{}", + "na dowolnym poz. trudności", + }, + }, + demo_locked={ + name="Zablokowane", + text={ + "Brak dostępu", + "w tym demie", + }, + }, + demo_shop_locked={ + name="Zablokowane", + text={ + "Karta z osobistej {C:attention}kolekcji", + "{C:attention}Jimbo,", + "dostępna w pełnej", + "wersji {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Wieczny", + text={ + "Nie można jej sprzedać", + "ani zniszczyć", + }, + }, + gold_seal={ + name="Złota Pieczęć", + text={ + "Zdobywasz {C:money}$3{}, gdy ta", + "karta zostanie zagrana", + "i zdobywa punkty", + }, + }, + gold_sticker={ + name="Złota naklejka", + text={ + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Złota", + "{C:attention}stawka{}", + }, + }, + green_sticker={ + name="Zielona naklejka", + text={ + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Zielona", + "{C:attention}stawka{}", + }, + }, + joker_locked_legendary={ + name="Zablokowane", + text={ + "Znajdź tego jokera", + "za pomocą karty {C:spectral}Duszy{}", + }, + }, + locked={ + name="Zablokowane", + text={ + }, + }, + orange_sticker={ + name="Pomarańczowa naklejka", + text={ + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Pomarańczowa", + "{C:attention}stawka{}", + }, + }, + p_arcana_jumbo={ + name="Olbrzymia paczka wiedzy tajemnej", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:tarot} Tarota{}, by", + "użyć ich natychmiast", + }, + }, + p_arcana_mega={ + name="Megapaczka wiedzy tajemnej", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:tarot} Tarota{}, by", + "użyć ich natychmiast", + }, + }, + p_arcana_normal={ + name="Paczka wiedzy tajemnej", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:tarot} Tarota{}, by", + "użyć ich natychmiast", + }, + }, + p_buffoon_jumbo={ + name="Olbrzymia paczka pajaca", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{C:joker} jokerów{}", + }, + }, + p_buffoon_mega={ + name="Megapaczka pajaca", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{C:joker} jokerów{}", + }, + }, + p_buffoon_normal={ + name="Paczka pajaca", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{C:joker} jokerów{}", + }, + }, + p_celestial_jumbo={ + name="Olbrzymia paczka niebiańska", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:planet} Planety{}, by", + "użyć ich natychmiast", + }, + }, + p_celestial_mega={ + name="Megapaczka niebiańska", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:planet} Planety{}, by", + "użyć ich natychmiast", + }, + }, + p_celestial_normal={ + name="Paczka niebiańska", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:planet} Planety{}, by", + "użyć ich natychmiast", + }, + }, + p_spectral_jumbo={ + name="Olbrzymia paczka kart Ducha", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:spectral} Ducha{}, by", + "użyć ich natychmiast", + }, + }, + p_spectral_mega={ + name="Megapaczka kart Ducha", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:spectral} Ducha{}, by", + "użyć ich natychmiast", + }, + }, + p_spectral_normal={ + name="Paczka kart Ducha", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:spectral} Ducha{}, by", + "użyć ich natychmiast", + }, + }, + p_standard_jumbo={ + name="Olbrzymia paczka standardowa", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart {C:attention}rozgrywających{}, by", + "dodać jej do swojej talii", + }, + }, + p_standard_mega={ + name="Megapaczka standardowa", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart {C:attention}rozgrywających{}, by", + "dodać jej do swojej talii", + }, + }, + p_standard_normal={ + name="Paczka standardowa", + text={ + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart {C:attention}rozgrywających{}, by", + "dodać jej do swojej talii", + }, + }, + perishable={ + name="Nietrwały", + text={ + "Osłabienie po", + "{C:attention}#1#{} rund.", + "{C:inactive}(pozostało: {C:attention}#2#{C:inactive})", + }, + }, + pinned_left={ + name="Przyszpilony", + text={ + "Ten joker pozostanie", + "przyszpilony w pozycji", + "najbardziej wysuniętej na lewo", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# z {V:1}#2# ", + }, + }, + purple_seal={ + name="Fioletowa Pieczęć", + text={ + "Tworzy kartę {C:tarot}Tarota{},", + "gdy zostanie {C:attention}odrzucona", + "{C:inactive}(wymaga miejsca)", + }, + }, + purple_sticker={ + name="Fioletowa naklejka", + text={ + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Fioletowa", + "{C:attention}stawka{}", + }, + }, + red_seal={ + name="Czerwona Pieczęć", + text={ + "Aktywuj ponownie tę", + "kartę {C:attention}1{} raz", + }, + }, + red_sticker={ + name="Czerwona naklejka", + text={ + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Czerwona", + "{C:attention}stawka{}", + }, + }, + remove_negative={ + name="Negatyw", + text={ + "{C:inactive,s:0.9}(Usuwa {C:dark_edition,s:0.9}Negatyw{C:inactive,s:0.9} z tej kopii)", + }, + }, + rental={ + name="Wypożyczany", + text={ + "Tracisz {C:money}#1#${} na", + "końcu rundy", + }, + }, + undiscovered_booster={ + name="Nie odkryto", + text={ + "Otwórz tę paczkę", + "w nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt", + }, + }, + undiscovered_edition={ + name="Nie odkryto", + text={ + "Znajdź tę wersję", + "w nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt", + }, + }, + undiscovered_joker={ + name="Nie odkryto", + text={ + "Kup albo użyj", + "tej karty w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt", + }, + }, + undiscovered_planet={ + name="Nie odkryto", + text={ + "Kup albo użyj", + "tej karty w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt", + }, + }, + undiscovered_spectral={ + name="Nie odkryto", + text={ + "Kup albo użyj", + "tej karty w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt", + }, + }, + undiscovered_tag={ + name="Nie odkryto", + text={ + "Użyj tego znacznika w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jego efekt", + }, + }, + undiscovered_tarot={ + name="Nie odkryto", + text={ + "Kup albo użyj", + "tej karty w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt", + }, + }, + undiscovered_voucher={ + name="Nie odkryto", + text={ + "Zrealizuj ten", + "kupon w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jego efekt", + }, + }, + white_sticker={ + name="Biała naklejka", + text={ + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Biała", + "{C:attention}stawka{}", + }, + }, + wip_locked={ + name="Zablokowane", + text={ + "Praca w", + "toku", + }, + }, + }, + Planet={ + c_ceres={ + name="Ceres", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_earth={ + name="Ziemia", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_jupiter={ + name="Jowisz", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_mars={ + name="Mars", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_mercury={ + name="Merkury", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_neptune={ + name="Neptun", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_planet_x={ + name="Planeta X", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_pluto={ + name="Pluton", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_saturn={ + name="Saturn", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_uranus={ + name="Uran", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + c_venus={ + name="Wenus", + text={ + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet.", + }, + }, + }, + Spectral={ + c_ankh={ + name="Ankh", + text={ + "Tworzy kopię", + "losowego {C:attention}jokera{}, niszczy", + "wszystkie inne jokery", + }, + }, + c_aura={ + name="Aura", + text={ + "Dodaje wersję {C:dark_edition}w folii{}, {C:dark_edition}holograficzną{},", + "lub {C:dark_edition}polichromowaną{} do", + "{C:attention}1{} wybranej karty w ręce", + }, + }, + c_black_hole={ + name="Czarna dziura", + text={ + "Ulepsza każdy", + "{C:legendary,E:1}układ pokerowy", + "o {C:attention}1{} poziom", + }, + }, + c_cryptid={ + name="Kryptyda", + text={ + "Tworzy {C:attention}#1#{} kopie", + "{C:attention}1{} wybranej karty", + "w ręce", + }, + }, + c_deja_vu={ + name="Déjà vu", + text={ + "Dodaj {C:red}Czerwoną Pieczęć{}", + "do {C:attention}1{} wybranej", + "karty w swojej ręce", + }, + }, + c_ectoplasm={ + name="Ektoplazma", + text={ + "Dodaje {C:dark_edition}Negatyw{} do", + "losowego {C:attention}jokera,", + "{C:red}-1{} do rozmiaru ręki", + }, + }, + c_familiar={ + name="Chowaniec", + text={ + "Niszczy {C:attention}1{} losową", + "kartę w twojej ręce,", + "dodaje {C:attention}#1#{} losowe {C:attention}ulepszone figury", + "{C:attention}karciane{} do twojej ręki", + }, + }, + c_grim={ + name="Ponurak", + text={ + "Niszczy {C:attention}1{} losową", + "kartę w twojej ręce,", + "dodaje {C:attention}#1#{} losowe {C:attention}ulepszone", + "{C:attention}asy{} do twojej ręki", + }, + }, + c_hex={ + name="Zły urok", + text={ + "Dodaj {C:dark_edition}polichromowanie{} do", + "losowego {C:attention}jokera{}, niszczy", + "wszystkie inne jokery", + }, + }, + c_immolate={ + name="Zniszczenie", + text={ + "Niszczy {C:attention}#1#{} losowych", + "kart w ręce,", + "zyskujesz {C:money}#2#$", + }, + }, + c_incantation={ + name="Inkantacja", + text={ + "Niszczy {C:attention}1{} losową", + "kartę w twojej ręce, dodaje {C:attention}#1#", + "losową {C:attention}ulepszoną numerowaną", + "{C:attention}kartę{} do twojej ręki", + }, + }, + c_medium={ + name="Medium", + text={ + "Dodaj {C:purple}Fioletową Pieczęć{}", + "do {C:attention}1{} wybranej", + "karty w swojej ręce", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Zamienia wszystkie karty", + "w ręce na pojedynczą", + "losową {C:attention}rangę", + "{C:red}-1{} do rozmiaru ręki", + }, + }, + c_sigil={ + name="Pieczęć", + text={ + "Zamienia wszystkie karty", + "w ręce na pojedynczy", + "losowy {C:attention}kolor", + }, + }, + c_soul={ + name="Dusza", + text={ + "Tworzy", + "{C:legendary,E:1}Legendarnego{} Jokera", + "{C:inactive}(wymaga miejsca)", + }, + }, + c_talisman={ + name="Talizman", + text={ + "Dodaje {C:attention}Złotą Pieczęć{}", + "do {C:attention}1{} wybranej", + "karty w twojej ręce", + }, + }, + c_trance={ + name="Trans", + text={ + "Dodaj {C:blue}Niebieską Pieczęć{}", + "do {C:attention}1{} wybranej", + "karty w swojej ręce", + }, + }, + c_wraith={ + name="Upiór", + text={ + "Otrzymujesz losowego", + "{C:red}rzadkiego{C:attention} jokera{},", + "ustawia pieniądze na {C:money}0$", + }, + }, + }, + Stake={ + stake_black={ + name="Czarna stawka", + text={ + "W sklepie mogą pojawić się {C:attention}Wieczne{} Jokery", + "{C:inactive,s:0.8}{Nie można ich sprzedaż lub zniszczyć}", + "{s:0.8}Działa na wszystkie poprzednie stawki", + }, + }, + stake_blue={ + name="Niebieska stawka", + text={ + "{C:red}-1{} zrzutka", + "{s:0.8}Działa na wszystkie poprzednie stawki", + }, + }, + stake_gold={ + name="Złota stawka", + text={ + "Sklepy mogą mieć {C:attention}wypożyczane{} jokery", + "{C:inactive,s:0.8}(kosztują {C:money,s:0.8}$3{C:inactive,s:0.8} na rundę).", + "{s:0.8}Działa na wszystkie poprzednie stawki", + }, + }, + stake_green={ + name="Zielona stawka", + text={ + "Wymagany wynik skaluje się", + "szybciej dla każdego {C:attention}wejścia", + "{s:0.8}Działa na wszystkie poprzednie stawki", + }, + }, + stake_orange={ + name="Pomarańczowa stawka", + text={ + "Sklepy mogą mieć {C:attention}nietrwałe{} jokery", + "{C:inactive,s:0.8}(osłabiane po 5 rundach).", + "{s:0.8}Działa na wszystkie poprzednie stawki", + }, + }, + stake_purple={ + name="Fioletowa stawka", + text={ + "Wymagany wynik skaluje się", + "szybciej dla każdego {C:attention}wejścia", + "{s:0.8}Działa na wszystkie poprzednie stawki", + }, + }, + stake_red={ + name="Czerwona stawka", + text={ + "{C:attention}Mała w ciemno{} nie daje", + "nagrody pieniężnej", + "{s:0.8}Działa na wszystkie poprzednie stawki", + }, + }, + stake_white={ + name="Biała stawka", + text={ + "Trudność podstawowa", + }, + }, + }, + Tag={ + tag_boss={ + name="Znacznik Bossa", + text={ + "Ponowne rzuty dają", + "{C:attention}Przeszkadzajkę Bossa", + }, + }, + tag_buffoon={ + name="Znacznik pajaca", + text={ + "Daje darmową", + "{C:attention}paczkę pajaca", + }, + }, + tag_charm={ + name="Znacznik czaru", + text={ + "Daje darmową", + "{C:tarot}megapaczkę wiedzy tajemnej", + }, + }, + tag_coupon={ + name="Znacznik kuponu", + text={ + "Początkowe karty oraz", + "paczki wzmacniające podczas", + "następnej wizyty w sklepie są za darmo", + }, + }, + tag_d_six={ + name="Znacznik K6", + text={ + "Ponowne rzuty podczas następnej wizyty w sklepie", + "zaczynają się od {C:money}0$", + }, + }, + tag_double={ + name="Znacznik podwójny", + text={ + "Daje kopię", + "następnego wybranego {C:attention}znacznika{}", + "{s:0.8}z wyjątkiem {s:0.8,C:attention}znacznika podwójnego", + }, + }, + tag_economy={ + name="Znacznik ekonomiczny", + text={ + "Podwaja pieniądze", + "{C:inactive}(maks. {C:money}#1#${C:inactive})", + }, + }, + tag_ethereal={ + name="Znacznik eteryczny", + text={ + "Daje darmową", + "{C:planet}paczkę kart Ducha", + }, + }, + tag_foil={ + name="Znacznik foliowy", + text={ + "Następny joker podstawowy", + "sklepu jest darmowy", + "i zostaje {C:dark_edition}w folii", + }, + }, + tag_garbage={ + name="Znacznik śmieciarza", + text={ + "Daje {C:money}$#1#{} na każdą niewykorzystaną", + "{C:red}zrzutkę{} w tym podejściu", + "{C:inactive}(da {C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="Znacznik podręczny", + text={ + "Daje {C:money}$#1#{} na każdą zagraną", + "{C:blue}rękę{} w tym podejściu", + "{C:inactive}(da {C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="Znacznik holograficzny", + text={ + "Następny joker podstawowy", + "sklepu jest darmowy", + "i staje się {C:dark_edition}holograficzny", + }, + }, + tag_investment={ + name="Znacznik inwestycji", + text={ + "Po pokonaniu", + "Przeszkadzajki Bossa", + "zyskujesz {C:money}#1#$", + }, + }, + tag_juggle={ + name="Znacznik żonglera", + text={ + "{C:attention}+#1#{} do rozmiaru ręki", + "w następnej rundzie", + }, + }, + tag_meteor={ + name="Znacznik meteorytu", + text={ + "Daje darmową", + "{C:planet}megapaczkę niebiańską", + }, + }, + tag_negative={ + name="Znacznik negatyw", + text={ + "Następny joker podstawowy", + "sklepu jest darmowy", + "i staje się {C:dark_edition}negatywem", + }, + }, + tag_orbital={ + name="Znacznik orbitalny", + text={ + "Ulepsza {C:attention}#1#", + "o {C:attention}#2# poz.", + }, + }, + tag_polychrome={ + name="Znacznik polichromowany", + text={ + "Następny joker podstawowy", + "sklepu jest darmowy", + "i staje się {C:dark_edition}polichromowany", + }, + }, + tag_rare={ + name="Znacznik rzadki", + text={ + "W sklepie jest darmowy", + "{C:red}rzadki joker", + }, + }, + tag_skip={ + name="Znacznik szybkości", + text={ + "Daje {C:money}#1#${} na pominiętą", + "Przeszkadzajkę w tym podejściu", + "{C:inactive}(da {C:money}#2#${C:inactive})", + }, + }, + tag_standard={ + name="Znacznik standardowy", + text={ + "Daje darmową", + "{C:attention}megapaczkę standardową", + }, + }, + tag_top_up={ + name="Znacznik doładowania", + text={ + "Otrzymujesz maks. {C:attention}#1#", + "{C:blue}Pospolitych{} Jokerów", + "{C:inactive}(wymaga miejsca)", + }, + }, + tag_uncommon={ + name="Znacznik niepospolity", + text={ + "W sklepie jest darmowy", + "{C:green}niepospolity joker", + }, + }, + tag_voucher={ + name="Znacznik kuponu", + text={ + "Dodaje jeden {C:voucher}kupon", + "do następnej wizyty w sklepie", + }, + }, + }, + Tarot={ + c_chariot={ + name="Rydwan", + text={ + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#", + }, + }, + c_death={ + name="Śmierć", + text={ + "Wybierz {C:attention}#1#{} karty,", + "zamień kartę {C:attention}po lewej{}", + "w kartę {C:attention}po prawej{}", + "{C:inactive}(przeciągnij, aby zmienić położenie)", + }, + }, + c_devil={ + name="Diabeł", + text={ + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="Cesarz", + text={ + "Otrzymujesz maks. {C:attention}#1#", + "losowych kart {C:tarot}Tarota{}", + "{C:inactive}(wymaga miejsca)", + }, + }, + c_empress={ + name="Cesarzowa", + text={ + "Ulepsza {C:attention}#1#", + "wybrane karty do:", + "{C:attention}#2#", + }, + }, + c_fool={ + name="Błazen", + text={ + "Otrzymujesz ostatnią", + "kartę {C:tarot}Tarota{} lub {C:planet}Planety{}", + "wykorzystaną w tym podejściu,", + "z wyjątkiem {s:0.8,C:tarot}Błazna{s:0.8}", + }, + }, + c_hanged_man={ + name="Wisielec", + text={ + "Niszczy do", + "{C:attention}#1#{} wybranych kart", + }, + }, + c_heirophant={ + name="Hierofant", + text={ + "Ulepsza {C:attention}#1#", + "wybrane karty do:", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="Pustelnik", + text={ + "Podwaja pieniądze", + "{C:inactive}(maks. {C:money}#1#${C:inactive})", + }, + }, + c_high_priestess={ + name="Arcykapłanka", + text={ + "Otrzymujesz maks. {C:attention}#1#", + "losowych kart {C:planet}Planet{}", + "{C:inactive}(wymaga miejsca)", + }, + }, + c_judgement={ + name="Wyrok", + text={ + "Otrzymujesz losowego", + "{C:attention}jokera{}", + "{C:inactive}(wymaga miejsca)", + }, + }, + c_justice={ + name="Sprawiedliwość", + text={ + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="Kochankowie", + text={ + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#", + }, + }, + c_magician={ + name="Mag", + text={ + "Ulepsza {C:attention}#1#{}", + "szt. wybranych kart do:", + "{C:attention}#2#", + }, + }, + c_moon={ + name="Księżyc", + text={ + "Zamienia do", + "{C:attention}#1#{} wybranych kart", + "w {V:1}#2#{}", + }, + }, + c_star={ + name="Gwiazda", + text={ + "Zamienia kolor", + "{C:attention}#1#{} wybranych kart", + "w {V:1}#2#{}", + }, + }, + c_strength={ + name="Siła", + text={ + "Zwiększa rangę", + "wybranych kart o maks. {C:attention}#1#{}", + "o {C:attention}1", + }, + }, + c_sun={ + name="Słońce", + text={ + "Zamienia do", + "{C:attention}#1#{} wybranych kart", + "w {V:1}#2#{}", + }, + }, + c_temperance={ + name="Umiarkowanie", + text={ + "Daje łączną wartość", + "sprzedaży wszystkich obecnych", + "jokerów {C:inactive}(maks. {C:money}#1#${C:inactive})", + "{C:inactive}(obecnie {C:money}#2#${C:inactive})", + }, + }, + c_tower={ + name="Wieża", + text={ + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="Koło Fortuny", + text={ + "{C:green}#1# na #2#{} szans zamiany", + "losowego {C:attention}jokera na jego wersję", + "{C:dark_edition}w folii{}, {C:dark_edition}holograficzną{} lub", + "{C:dark_edition}polichromowaną{}", + }, + }, + c_world={ + name="Świat", + text={ + "Zamienia do", + "{C:attention}#1#{} wybranych kart", + "w {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antymateria", + text={ + "{C:dark_edition}+1{} slot na jokera", + }, + unlock={ + "Zrealizuj {C:voucher}In-blanco{}", + "łącznie {C:attention}#1#{} razy", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="In-blanco", + text={ + "{C:inactive}Nie robi nic?", + }, + }, + v_clearance_sale={ + name="Wyprzedaż", + text={ + "Wszystkie karty i paczki w", + "w sklepie mają zniżkę {C:attention}#1#%{}", + }, + }, + v_crystal_ball={ + name="Kryształowa kula", + text={ + "{C:attention}+1{} slot na przedm. zużywalne", + }, + }, + v_directors_cut={ + name="Wersja reżyserska", + text={ + "Wyrzuć ponownie Przeszkadzajkę Bossa", + "{C:attention}1{} raz na wejście;", + "{C:money}#1#${} za rzut", + }, + }, + v_glow_up={ + name="Błysk", + text={ + "Karty {C:dark_edition}w folii{}, {C:dark_edition}holograficzne{} oraz", + "{C:dark_edition}polichromowane{}", + "pojawiają się {C:attention}#1#X{} częściej", + }, + unlock={ + "Posiadaj przynajmniej {C:attention}#1#", + "{C:attention}jokerów{} w wersji", + "{C:dark_edition}w folii{}, {C:dark_edition}holograficznej{} oraz", + "{C:dark_edition}polichromowanej{}", + }, + }, + v_grabber={ + name="Chwytacz", + text={ + "Zyskujesz na stałe", + "{C:blue}+#1#{} do ręki", + "na rundę", + }, + }, + v_hieroglyph={ + name="Hieroglif", + text={ + "{C:attention}-#1#{} od wejścia,", + "{C:blue}-#1#{} od ręki", + "w każdej rundzie", + }, + }, + v_hone={ + name="Udoskonalenie", + text={ + "Karty {C:dark_edition}w folii{}, {C:dark_edition}holograficzne{} oraz", + "{C:dark_edition}polichromowane{}", + "pojawiają się {C:attention}#1#X{} częściej", + }, + }, + v_illusion={ + name="Iluzja", + text={ + "{C:attention}Karty rozgrywające{} w sklepie", + "mogą być {C:enhanced}ulepszone{},", + "mieć {C:dark_edition}jedną wersję{} i/lub {C:attention}pieczęć{}", + }, + unlock={ + "Kup łącznie", + "{C:attention}#1#{} kart rozgrywających", + "w sklepie", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Sprzedaż zasobów", + text={ + "Wszystkie karty i paczki w", + "w sklepie mają zniżkę {C:attention}#1#%{}", + }, + unlock={ + "Zrealizuj co najmniej", + "{C:attention}#1#{C:voucher} kuponów{}", + "podczas jednego podejścia", + }, + }, + v_magic_trick={ + name="Magiczna sztuczka", + text={ + "{C:attention}Karty rozgrywające{} można", + "kupić", + "w {C:attention}sklepie", + }, + }, + v_money_tree={ + name="Drzewko pieniężne", + text={ + "Zwiększa limit", + "zdobywanych odsetek", + "w każdej rundzie do {C:money}$#1#{}", + }, + unlock={ + "Zwiększ maksymalnie zyski", + "z odsetek na rundę przez", + "{C:attention}#1#{} rund z rzędu", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Nacho Tong", + text={ + "Zyskujesz na stałe", + "{C:blue}+#1#{} do ręki", + "na rundę", + }, + unlock={ + "Zagraj łącznie", + "{C:attention}#1#{} kart", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Obserwatorium astronomiczne", + text={ + "Karty {C:planet}Planety{} w", + "obszarze przedm. {C:attention}zużywalnych{} dają", + "mnoż. {X:red,C:white} X#1# {} za utworzony", + "z nich konkretny {C:attention}układ pokerowy", + }, + unlock={ + "Wykorzystaj łącznie {C:attention}#1#", + "kart {C:planet}Planet{} z dowolnej", + "{C:planet}paczki niebiańskiej", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Kula Omen", + text={ + "Karty {C:spectral}Duchy{} mogą", + "pojawić się w dowolnych", + "{C:attention}paczkach wiedzy tajemnej", + }, + unlock={ + "Wykorzystaj łącznie {C:attention}#1#", + "kart {C:tarot}Tarota{} z dowolnej", + "{C:tarot}paczki wiedzy tajemnej", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Nadmiar zapasów", + text={ + "{C:attention}+1{} slot na kartę", + "dostępny w sklepie", + }, + }, + v_overstock_plus={ + name="Nadmiar zapasów+", + text={ + "{C:attention}+1{} slot na kartę", + "dostępny w sklepie", + }, + unlock={ + "Wydaj łącznie", + "{C:money}#1#${} w sklepie", + "{C:inactive}(#2#$)", + }, + }, + v_paint_brush={ + name="Pędzel malarski", + text={ + "{C:attention}+#1#{} do rozmiaru ręki", + }, + }, + v_palette={ + name="Paleta", + text={ + "{C:attention}+#1#{} do rozmiaru ręki", + }, + unlock={ + "Zmniejsz rozmiar ręki", + "do {C:attention}#1#{} kart.", + }, + }, + v_petroglyph={ + name="Petroglif", + text={ + "{C:attention}-#1#{} od wejścia,", + "{C:red}-#1#{} od zrzutek", + "w każdej rundzie", + }, + unlock={ + "Osiągnij stawkę", + "na poziomie {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Handlarz kart Planet", + text={ + "Karty {C:planet}Planet{} pojawiają się", + "{C:attention}#1#X{} częściej", + "w sklepie", + }, + }, + v_planet_tycoon={ + name="Planetowy magnat", + text={ + "Karty {C:planet}Planet{} pojawiają się", + "{C:attention}#1#X{} częściej", + "w sklepie", + }, + unlock={ + "Kup łącznie", + "{C:attention}#1# kart {C:planet} Planet{}", + "w sklepie", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Recyklomancja", + text={ + "Na stałe", + "zyskujesz {C:red}+#1#{} do zrzutek", + "w każdej rundzie", + }, + unlock={ + "Odrzuć łącznie", + "{C:attention}#1#{} kart", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Przesyt przerzutów", + text={ + "Ponowne rzuty kosztują", + "{C:money}#1#${} mniej", + }, + unlock={ + "Wykonaj ponowny rzut w sklepie", + "łącznie {C:attention}#1#{} razy", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Mniej za ponowny rzut", + text={ + "Ponowne rzuty kosztują", + "{C:money}#1#${} mniej", + }, + }, + v_retcon={ + name="Wsteczna ciągłość", + text={ + "Wyrzuć ponownie Przeszkadzajkę Bossa", + "{C:attention}nieograniczoną{} ilość razy;", + "daje {C:money}$#1#{} na rzut", + }, + unlock={ + "Odkryj", + "{C:attention}#1#{} Przeszkadzajki", + }, + }, + v_seed_money={ + name="Kapitał początkowy", + text={ + "Zwiększa limit", + "zdobywanych odsetek", + "w każdej rundzie do {C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="Handlarz kart Tarota", + text={ + "Karty {C:tarot}Tarota{} pojawiają się", + "{C:attention}#1#X{} częściej", + "w sklepie", + }, + }, + v_tarot_tycoon={ + name="Tarotowy magnat", + text={ + "Karty {C:tarot}Tarota{} pojawiają się", + "{C:attention}#1#X{} częściej", + "w sklepie", + }, + unlock={ + "Kup łącznie", + "{C:attention}#1# kart {C:tarot} Tarota{}", + "w sklepie", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Teleskop", + text={ + "{C:attention}Paczki niebiańskie{} zawsze", + "zawierają kartę {C:planet}Planety{}", + "dla najczęściej", + "zagrywanego {C:attention}układu pokerowego", + }, + }, + v_wasteful={ + name="Rozrzutny", + text={ + "Na stałe", + "zyskujesz {C:red}+#1#{} do zrzutek", + "w każdej rundzie", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Zdobądź 100 000 000 żetonów z pojedynczej ręki", + _1000k="Zdobądź 1 000 000 żetonów z pojedynczej ręki", + _10k="Zdobądź 10 000 żetonów z pojedynczej ręki", + ante_up="Osiągnij stawkę 4", + ante_upper="Osiągnij stawkę 8", + astronomy="Odkryj każdą kartę Planety", + big_hands="Posiadaj w swojej talii 80 kart lub więcej", + card_discarder="Odrzuć przynajmniej 2500 kart", + card_player="Zagraj przynajmniej 2500 kart", + cartomancy="Odkryj każdą kartę Tarota", + clairvoyance="Odkryj każdą kartę Ducha", + completionist="Odkryj 100% swojej kolekcji", + completionist_plus="Wygraj każdą talią na poz. trudności Złota stawka", + completionist_plus_plus="Zdobądź Złotą naklejkę dla każdego Jokera", + extreme_couponer="Odkryj każdy kupon", + flushed="Zagraj kolor za pomocą 5 Dzikich Kart", + heads_up="Wygraj podejście", + high_stakes="Wygraj podejście przynajmniej na poz. trudności Złota stawka", + legendary="Odkryj Legendarnego Jokera", + low_stakes="Wygraj podejście przynajmniej na poz. trudności Czerwona stawka", + mid_stakes="Wygraj podejście przynajmniej na poz. trudności Czarna stawka", + nest_egg="Posiadaj $400 lub więcej w trakcie jednego podejścia", + retrograde="Doprowadź dowolny układ pokerowy do poziomu 10.", + roi="Kup 5 kuponów przed stawką 4", + royale="Zagraj pokera królewskiego", + rule_bender="Ukończ dowolne podejście-wyzwanie", + rule_breaker="Ukończ każde podejście-wyzwanie", + shattered="Rozbij 2 Szklane Karty z pojedynczej ręki", + speedrunner="Wygraj podejście w ciągu 12 rund lub mniej", + tiny_hands="Odchudź talię do 20 kart lub mniej", + you_get_what_you_get="Wygraj podejście bez ponownego rzutu podczas wizyty w sklepie", + }, + achievement_names={ + _100000k="100 000 tysi", + _1000k="1000 tysi", + _10k="10 tysi", + ante_up="Stawka w górę!", + ante_upper="Stawka jeszcze w górę!", + astronomy="Astronomia", + big_hands="Duże ręce", + card_discarder="Miłośnik odrzucania kart", + card_player="Miłośnik zagrywania kart", + cartomancy="Kartomancja", + clairvoyance="Jasnowidztwo", + completionist="Pasjonat", + completionist_plus="Pasjonat+", + completionist_plus_plus="Pasjonat++", + extreme_couponer="Ekstremalny zbieracz kuponów", + flushed="Mamy kolor", + heads_up="Uwaga!", + high_stakes="Wysokie stawki", + legendary="Legendarny", + low_stakes="Niskie stawki", + mid_stakes="Średnie stawki", + nest_egg="Kura nioska", + retrograde="Wsteczny", + roi="Zwrot z inwestycji", + royale="Królewski", + rule_bender="Naginacz zasad", + rule_breaker="Łamacz zasad", + shattered="Roztrzaskanie", + speedrunner="Struś pędziwiatr", + tiny_hands="Małe ręce", + you_get_what_you_get="Dostajesz to, co dostajesz", + }, + blind_states={ + Current="Bieżący", + Defeated="Pokonano", + Select="Wybierz", + Selected="Wybrano", + Skipped="Pominięto", + Upcoming="Wkrótce", + }, + challenge_names={ + c_blast_off_1="Odpalenie", + c_bram_poker_1="Bram Poker", + c_city_1="15-minutowe miasto", + c_cruelty_1="Okrucieństwo", + c_double_nothing_1="Wszystko albo nic", + c_five_card_1="Losowanie pięciu kart", + c_fragile_1="Kruchy", + c_golden_needle_1="Złota igła", + c_inflation_1="Inflacja", + c_jokerless_1="Bez jokera", + c_knife_1="Na ostrzu noża", + c_luxury_1="Podatek od wzbogacenia", + c_mad_world_1="Szalony świat", + c_medusa_1="Meduza", + c_monolith_1="Monolit", + c_non_perishable_1="Trwały", + c_omelette_1="Omlet", + c_rich_1="Bogaci jeszcze bogatsi", + c_typecast_1="Szufladkowanie", + c_xray_1="Rentgenowski wzrok", + }, + collabs={ + Clubs={ + ["1"]="Domyślny", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Domyślny", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Domyślny", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Domyślny", + ["2"]="Wiedźmin", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="Częste pytania", + b_and_use="I UŻYJ", + b_back="Wstecz", + b_blinds="Przeszkadzajki", + b_booster_packs="Paczki wzmacniające", + b_buy="KUP", + b_cash_out="Wypłata", + b_challenges="Wyzwania", + b_collection="Kolekcja", + b_collection_cap="KOLEKCJA", + b_continue="Kontynuuj", + b_copy="Kopiuj", + b_copy_seed="Kopiuj rozstawienie", + b_create_profile="Utwórz profil", + b_credits="Twórcy", + b_current_profile="Bieżący profil", + b_customize_deck="Dostosowanie talia", + b_deck="Talia", + b_decks="Talie", + b_delete_profile="Usuń profil", + b_discard="Odrzuć", + b_editions="Wersje", + b_endless="Tryb niekończącej się rozgrywki", + b_enhanced_cards="Ulepszone karty", + b_full_deck="Kompletna talia", + b_high_contrast_cards="Karty o wysokim kontraście", + b_how_to_play="Jak grać", + b_imagery="Obrazki", + b_jokers="Jokery", + b_load_profile="Wczytaj profil", + b_main_menu="Menu główne", + b_music="Muzyka", + b_new_challenge="Rozpocznij nowe wyzwanie", + b_new_run="Nowe podejście", + b_next="Następna", + b_next_round_1="Następna", + b_next_round_2="Runda", + b_open="OTWÓRZ", + b_options="Opcje", + b_options_cap="OPCJE", + b_planet_cards="Karty Planet", + b_play_cap="GRAJ", + b_play_hand="Zagraj rękę", + b_playbalatro="Odwiedź stronę playbalatro.com", + b_poker_hands="Układy pokerowe", + b_quit_cap="WYJDŹ", + b_redeem="ZREALIZUJ", + b_reduced_motion="Ograniczony ruch", + b_remaining="Pozostało", + b_reroll_boss="Wyrzuć ponownie zdolność Bossa", + b_reset_profile="Resetuj profil", + b_restrictions="Ograniczenia", + b_retry="Ponów próbę", + b_rules="Zasady", + b_run_info_1="Podejście", + b_run_info_2="Informacje", + b_seals="Pieczęcie", + b_seed="Rozstawienie", + b_select="WYBIERZ", + b_sell="SPRZEDAJ", + b_set_CRT="Efekt monitora CRT", + b_set_CRT_bloom="Efekt poświaty CRT", + b_set_apply="Zastosuj", + b_set_audio="Ustawienia dźwięku", + b_set_crash_reports="Raporty o błędach", + b_set_game="Rozgrywka", + b_set_game_vol="Głośność gry", + b_set_gamespeed="Prędkość gry", + b_set_graphics="Ustawienia grafiki", + b_set_master_vol="Głośność ogólna", + b_set_monitor="Monitor", + b_set_music_vol="Głośność muzyki", + b_set_pixel_smoothing="Wygładzanie grafiki pikselowej", + b_set_play_discard_pos="Pozycja przycisku Zagraj/Odrzuć", + b_set_rumble="Wibracje kontrolera", + b_set_screenshake="Wstrząsanie ekranem", + b_set_shadows="Cienie", + b_set_vibration="Wibracje", + b_set_video="Ustawienia obrazu", + b_set_windowmode="Tryb okienkowy", + b_settings="Ustawienia", + b_skip="Pomiń", + b_skip_blind="Pomiń Przeszkadzajkę", + b_skip_reward="Pomiń nagrodę", + b_sort_hand="Sortuj rękę", + b_sounds="Dźwięki", + b_spectral_cards="Karty Ducha", + b_stake="Stawka", + b_start_new_run="Nowe podejście", + b_stat_consumables="Przedmioty zużywalne", + b_stat_jokers="Jokery", + b_stat_planets="Karty Planet", + b_stat_spectrals="Karty Ducha", + b_stat_tarots="Karty Tarota", + b_stat_vouchers="Kupony", + b_stats="Statystyki", + b_tags="Znaczniki", + b_tarot_cards="Karty Tarota", + b_unlock_all="Odblokuj wszystko", + b_use="UŻYJ", + b_vouchers="Kupony", + b_wishlist="Dodaj do listy życzeń na Steam", + k_aces="Asy", + k_achievement="Osiągnięcie", + k_achievements_disabled="Osiągnięcia są wyłączone", + k_active="aktywny", + k_active_ex="Aktywuj!", + k_again_ex="Znów!", + k_all_hands="Wszystkie ręce", + k_also_applied="Zastosowano również", + k_ante="Wejście", + k_ante_cap="WEJŚCIE", + k_arcana_pack="Paczka wiedzy tajemnej", + k_balanced="Zrównoważono", + k_banned_cards="Wykluczone karty", + k_banned_tags="Wykluczone znaczniki", + k_base_cap="BAZOWA", + k_base_cards="Karty bazowe", + k_best_hand="Najlepsza ręka", + k_booster="Wzmocnienie", + k_buffoon_pack="Paczka pajaca", + k_cap_consumables="PRZEDMIOTY ZUŻYWALNE", + k_card_stats="Statystyki kart", + k_celestial_pack="Paczka niebiańska", + k_challenge_mode="Tryb wyzwań", + k_challenges="Wyzwania", + k_choose="Wybierz", + k_collection="Kolekcja", + k_common="Pospolita", + k_compatible="kompatybil.", + k_copied_ex="Skopiowano!", + k_custom_rules="Zasady niestandardowe", + k_daily_run="Ilość podejść dziennie", + k_debuffed="Osłabiono", + k_deck="Talia", + k_deck_stake_wins="Wygrane stawki talią", + k_defeated_by="Przegrana z", + k_demo_version_ex="Wersja demo!", + k_disabled_ex="Wyłączone!", + k_drank_ex="Wypite!", + k_duplicated_ex="Zduplikowano!", + k_dwarf_planet="Planeta karłowata", + k_eaten_ex="Zjedzone!", + k_edition="Wersja", + k_effective="Skuteczna", + k_empty_caps="PUSTO", + k_enter_name="Wprowadź nazwę", + k_enter_seed="Wprowadź rozstawienie", + k_enter_text="Wprowadź tekst", + k_eroded_ex="Zniszczone!", + k_extinct_ex="Wyginięcie!", + k_face_cards="Figury karciane", + k_game_modifiers="Modyfikatory gry", + k_gold="Złoto", + k_high_score_ex="Wysoki wynik!", + k_hud_discards="Zrzutki", + k_hud_hands="Ręce", + k_incompatible="niekompatybil.", + k_joker="Joker", + k_joker_stickers="Naklejki na Jokery", + k_jokers_cap="JOKERY", + k_legendary="Legendarna", + k_level_prefix="poz.", + k_level_up_ex="Zwiększ poziom!", + k_locked="Zablokowano", + k_lower_score="wynik", + k_lvl="poz.", + k_melted_ex="Stopiono!", + k_money="Pieniądze", + k_mult="Mnożnik", + k_no_other_jokers="Brak innych Jokerów!", + k_no_reward="Brak nagrody", + k_no_room_ex="Brak miejsca!", + k_no_space_ex="Brak miejsca!", + k_none="Brak", + k_nope_ex="Nie!", + k_not_allowed_ex="Niedozwolony!", + k_not_discovered="Nie odkryto", + k_numbered_cards="Karty numerowane", + k_or="lub", + k_other="Inne", + k_page="Strona", + k_planet="Planeta", + k_planet_q="Karta Planeta?", + k_playing_as="Gram jako", + k_plus_joker="+1 Joker", + k_plus_planet="+1 Planeta", + k_plus_spectral="+1 Karta Ducha", + k_plus_stone="+1 Karty Kamień", + k_plus_tarot="+1 Tarot", + k_poker_hand="układ pokerowy", + k_profile="Profil", + k_progress="Postępy", + k_rank="Ranga", + k_rare="Rzadka", + k_redeemed_ex="Zrealizowano!", + k_reroll="Ponowny rzut", + k_reset="Zresetuj", + k_reward="Nagroda", + k_round="Runda", + k_safe_ex="Bezpiecznie!", + k_saved_ex="Zapisano!", + k_seed="Rozstawienie", + k_seeded_run="Rozstawione podejście", + k_skipped_cap="POMINIĘTO", + k_spectral="Karta Ducha", + k_spectral_pack="Paczka kart Ducha", + k_stake="Stawka", + k_stake_level="Poziom stawek", + k_standard_pack="Paczka standardowa", + k_suit="Kolor", + k_swapped_ex="Zamieniono!", + k_tarot="Tarot", + k_trophies_disabled="Trofea są wyłączone", + k_trophy="Trofeum", + k_uncommon="Niepospolita", + k_undisovered="Nieodkryto", + k_unknown="?????", + k_unlocked_ex="Odblokowane!", + k_upgrade_ex="Ulepsz!", + k_val_up="Zwiększ wartość!", + k_view="Widok", + k_voucher="Kupon", + k_vouchers_cap="KUPONY", + k_wins="Wygrane", + k_x_base="X bazowa", + ml_bloom_opt={ + "Wył.", + "Wł.", + }, + ml_buy_and_use_target={ + "KUP", + "I UŻYJ", + }, + ml_buy_target={ + "KUP", + }, + ml_card_stats={ + "kart", + "Statystyki", + }, + ml_controller_required={ + "Do gry wymagany jest kontroler.", + "Podłącz kontroler, aby kontynuować.", + }, + ml_crash_report_info={ + "Raporty o błędach będą wysyłane do twórców gry,", + "aby ograniczyć problemy w przyszłości.", + "Wysłane dane są anonimizowane.", + }, + ml_demo_thanks_message={ + "Rozważ dodanie", + "Balatro do listy życzeń na Steam oraz zapisz się", + "do biuletynu na stronie playbalatro.com", + }, + ml_disabled_seed={ + "Wszystkie przedm. odblokowane i", + "odkryte są wyłączone", + }, + ml_edition_seal_enhancement_explanation={ + "Karty rozgrywające mogą mieć jedno", + "ulepszenie, jedną wersję i pieczęć", + }, + ml_eternal={ + "Wieczny", + "Nie można jej sprzedać", + "ani zniszczyć", + }, + ml_gold_seal_desc={ + "Złota Pieczęć", + "wraca do ręki", + "przy zagraniu", + }, + ml_offline_message={ + "To urządzenie jest offline.", + "Obecny zapis może być nieaktualny.", + }, + ml_open_target={ + "OTWÓRZ", + }, + ml_paste_seed={ + "Wklej", + "Rozst.", + }, + ml_play_discard_pos_opt={ + "Odrzuć/Zagraj", + "Zagraj/Odrzuć", + }, + ml_redeem_target={ + "ZREALIZUJ", + }, + ml_sell_target={ + "SPRZEDAJ", + }, + ml_shadow_opt={ + "Wł.", + "Wył.", + }, + ml_smoothing_opt={ + "Wył.", + "Wł.", + }, + ml_unlock_all_explanation={ + "OSTRZEŻENIE! Odblokowanie pełnej kolekcji", + "wyłączy osiągnięcia dla tego profilu!", + }, + ml_unlock_all_trophies={ + "OSTRZEŻENIE! Odblokowanie pełnej kolekcji", + "wyłączy trofea dla tego profilu!", + }, + ml_vsync_opt={ + "Synchr. pion. wł.", + "Synchr. pion. wył.", + }, + ml_windowmode_opt={ + "W oknie", + "Pełny ekran", + "Bez ramki", + }, + ph_1_level="+1 poziom", + ph_4_7_of_clubs="cztery 7 trefl", + ph_alert_debuff_confirm="Kliknij ponownie „Zagraj”, aby potwierdzić", + ph_all_poker_hand="Wszystkie układy rąk w pokerze", + ph_blind_reward="Nagroda: ", + ph_blind_score_at_least="Zdobądź przynajmniej X pkt.", + ph_boss_disabled="Boss został wyłączony!", + ph_choose_blind_1="Wybierz", + ph_choose_blind_2="kolejną Przeszkadzajkę", + ph_click_confirm="Naciśnij ponownie, aby potwierdzić", + ph_deck_preview_effective="Całkowita wartość łączna wynikająca z posiadania jokerów, Przeszkadzajek i ulepszeń kart", + ph_deck_preview_stones="Karty Kamień", + ph_defeat_the_boss="Pokonaj Przeszkadzajkę Bossa", + ph_defeat_this_blind_1="Pokonaj tę Przeszkadzajkę, by", + ph_defeat_this_blind_2="ją odkryć", + ph_demo_thanks_1="Dziękujemy za grę w", + ph_demo_thanks_2="DEMO BALATRO", + ph_display_stickers="Wyświetlanie naklejek na stawkę podczas podejście", + ph_game_over="KONIEC GRY", + ph_improve_run="Popraw swoje podejście!", + ph_most_played="{najczęściej zagrywana ręka}", + ph_mr_bones="Kostek cię ocalił", + ph_no_boss_active="brak aktywnego bossa", + ph_no_vouchers="Brak realizacji kuponów w tym podejściu", + ph_score_at_least="Zdobądź przynajmniej X pkt.", + ph_score_cards_discarded="Odrzucone karty", + ph_score_cards_played="Zagrane karty", + ph_score_cards_purchased="Liczba zakupionych kart", + ph_score_furthest_ante="Wejście", + ph_score_furthest_round="Runda", + ph_score_hand="Najlepsza ręka", + ph_score_new_collection="Nowe odkrycia", + ph_score_poker_hand="Najczęściej zagrywana ręka", + ph_score_times_rerolled="Liczba ponownych rzutów", + ph_select_challenge="Wybierz wyzwanie", + ph_sneak_peek="Zapowiedź", + ph_stat_consumable="Ilość użyć tej karty", + ph_stat_joker="Łączna ilość ukończonych rund z tą kartą", + ph_stat_voucher="Ilość realizacji tego kuponu", + ph_unscored_hand="Niepunktująca ręka", + ph_up_ante_1="Podnieś stawkę", + ph_up_ante_2="Podbij stawkę dla wszystkich Przeszkadzajek", + ph_up_ante_3="Odśwież Przeszkadzajki", + ph_vouchers_redeemed="Liczba kuponów zrealizowanych w tym podejściu", + ph_you_win="WYGRYWASZ!", + ph_you_win_demo="WYGRYWASZ W DEMO!", + }, + high_scores={ + boss_streak="Najwięcej Bossów z rzędu", + collection="Kolekcja", + current_streak="", + furthest_ante="Najwyższe wejście", + furthest_round="Najwyższa runda", + hand="Najlepsza ręka", + most_money="Najwięcej pieniędzy", + poker_hand="Najczęściej zagrywana ręka", + win_streak="Najlepsza passa zwycięstw", + }, + labels={ + blue_seal="Niebieska Pieczęć", + common="Pospolita", + eternal="Wieczny", + foil="W folii", + gold_seal="Złota Pieczęć", + holographic="Holograficzna", + legendary="Legendarna", + locked="Zablokowany", + negative="Negatyw", + perishable="Nietrwały", + pinned_left="Przyszpilony", + planet="Planeta", + pluto_planet="Planeta karłowata", + polychrome="Polichromowana", + purple_seal="Fioletowa Pieczęć", + rare="Rzadka", + red_seal="Czerwona Pieczęć", + rental="Wypożyczany", + tarot="Tarot", + uncommon="Niepospolita", + voucher="Kupon", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 kart tej samej rangi", + }, + Flush={ + "5 kart tego samego koloru", + }, + ["Flush Five"]={ + "5 kart o tej samej randze i kolorze", + }, + ["Flush House"]={ + "Trójka i para, przy czym", + "wszystkie karty są tego samego koloru", + }, + ["Four of a Kind"]={ + "4 karty tej samej rangi. Mogą być", + "zagrane z 1 kartą niepunktowaną", + }, + ["Full House"]={ + "Trójka i para", + }, + ["High Card"]={ + "Jeśli zagrywana ręka nie odpowiada powyższym", + "rękom, punkty zdobywa się tylko kartami o najwyższej randze", + }, + Pair={ + "2 karty tej samej rangi. Mogą być", + "zagrane z maks. 3 kartami niepunktowanymi", + }, + ["Royal Flush"]={ + "5 kart z rzędu {kolejne rangi}, przy czym", + "wszystkie karty są tego samego koloru", + }, + Straight={ + "5 kart z rzędu {kolejne rangi}", + }, + ["Straight Flush"]={ + "5 kart z rzędu {kolejne rangi}, przy czym", + "wszystkie karty są tego samego koloru", + }, + ["Three of a Kind"]={ + "3 karty tej samej rangi. Mogą być", + "zagrane z maks. 2 kartami niepunktowanymi", + }, + ["Two Pair"]={ + "2 pary kart o różnych rangach. Mogą być", + "zagrane z 1 kartą niepunktowaną", + }, + }, + poker_hands={ + ["Five of a Kind"]="Piątka", + Flush="Kolor", + ["Flush Five"]="Kolorowa piątka", + ["Flush House"]="Garnitur koloru", + ["Four of a Kind"]="Kareta", + ["Full House"]="Full", + ["High Card"]="Wysoka karta", + Pair="Para", + ["Royal Flush"]="Poker królewski", + Straight="Strit", + ["Straight Flush"]="Poker", + ["Three of a Kind"]="Trójka", + ["Two Pair"]="Dwie pary", + }, + quips={ + dq_1={ + "Aj! Mam nadzieję,", + "że masz kilka asów", + "w rękawie na", + "ostatnie wyzwanie!", + }, + lq_1={ + "Może Go Fish", + "lepiej pasuje", + "do naszej szybkości...", + }, + lq_10={ + "Co za wpadka!", + }, + lq_2={ + "Pasujemy,", + "jak tani garnitur!", + }, + lq_3={ + "Czas", + "przetasować", + "i spróbować jeszcze raz!", + }, + lq_4={ + "Wiesz, jak", + "to jest,", + "kasyno zawsze wygrywa!", + }, + lq_5={ + "Wygląda na to,", + "że wiemy, kto", + "jest prawdziwym Jokerem!", + }, + lq_6={ + "No nie,", + "to też był blef?", + }, + lq_7={ + "Wygląda na to,", + "że padliśmy ofiarą własnego żartu!", + }, + lq_8={ + "Gdybym miał ręce,", + "zasłoniłbym", + "teraz oczy!", + }, + lq_9={ + "Nie mam zbyt dużo", + "oleju w głowie, a jaka", + "jest twoja wymówka?", + }, + wq_1={ + "Udało ci się!", + }, + wq_2={ + "Całkiem nieźle", + "zrobione!", + }, + wq_3={ + "Wygląda na to, że", + "to nie był blef!", + }, + wq_4={ + "Wielka szkoda, że", + "wszystkie żetony są", + "tylko wirtualne...", + }, + wq_5={ + "Wygląda na to, że", + "nauka nie poszła w las!", + }, + wq_6={ + "Udało ci się wykonać", + "kilka świetnych zagrań!", + }, + wq_7={ + "Dobrze, że", + "nie postawiłem", + "przeciwko tobie!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="As", + Jack="Walet", + King="Król", + Queen="Królowa", + }, + suits_plural={ + Clubs="Trefle", + Diamonds="Karo", + Hearts="Kiery", + Spades="Piki", + }, + suits_singular={ + Clubs="Trefl", + Diamonds="Karo", + Hearts="Kier", + Spades="Pik", + }, + tutorial={ + bb_1={ + "Wybranie przeszkadzajki {C:attention}Duża w ciemno", + "pozwoli ci zdobyć więcej pieniędzy", + }, + bb_2={ + "Możesz także wybrać {C:attention}jej pominięcie,", + "co da ci {C:attention}znacznik{}! Każdy", + "{C:attention}znacznik{} skutkuje unikalnym efektem", + }, + bb_3={ + "Należy jednak uważać na", + "{C:attention}Przeszkadzajki Bossów{}. Ma", + "on zdolność, do pokonania której trzeba", + "mieć dobry plan.", + }, + bb_4={ + "Jeśli go pokonasz, wtedy", + "{C:attention}stawka wejściowa{} rośnie, a wszystkie", + "{C:attention}Przeszkadzajki{} stają się trudniejsze do pokonania", + }, + bb_5={ + "Pobij {C:attention}stawkę wejściową{} #1# aby wygrać.", + "Teraz wybierz swoją ścieżkę!", + }, + fh_1={ + "Żetony zdobywasz poprzez", + "zagrywanie {C:attention}układów pokerowych", + }, + fh_2={ + "Każdy {C:attention}układ pokerowy{} pozwala wygrać", + "kwotę bazową {C:blue}żet.", + "pomnożoną przez dany mnoż. {C:red}", + }, + fh_3={ + "Zapoznaj się z {C:attention}układami pokerowymi", + "w obszarze {C:attention}Informacje o podejściu{},", + "gdzie znajdują się też inne informacje", + "dotyczące bieżącego podejścia", + }, + fh_4={ + "Karty pozwalają też zdobyć", + "pewną ilość {C:blue}żetonów{};", + "Najedź kursorem, aby ją sprawdzić!", + }, + fh_4_touch={ + "Karty dają też", + "trochę {C:blue}żetonów{};", + "przytrzymaj, by sprawdzić!", + }, + fh_5={ + "Teraz wybierz do", + "{C:attention}5{} kart, aby zagrać", + "i naciśnij przycisk {C:blue}„Zagraj rękę”", + }, + fh_5_touch={ + "Teraz dotknij maks.", + "{C:attention}5{} kart do zagrania", + "i naciśnij {C:blue}„Zagraj rękę”", + }, + fh_6={ + "Możesz też nacisnąć przycisk {C:red}„Odrzuć”{},", + "aby odrzucić do {C:attention}5{} wybranych kart", + "w celu uzyskania jeszcze", + "silniejszych układów ręki. Spróbuj!", + }, + fh_7={ + "Uważaj! Masz do dyspozycji jedynie", + "ograniczoną ilość układów {C:blue}ręki", + "i {C:red}zrzutek{} na rundę", + }, + fh_8={ + "Zdobądź {C:attention}300 żetonów{} zanim", + "skończą ci się układy {C:blue}ręki{}, aby", + "wygrać tę rundę.", + "Powodzenia!", + }, + s_1={ + "Świetnie! Teraz, gdy", + "{E:1}opływasz{} w {C:money}forsę{},", + "możesz kupić nowe", + "karty w {C:attention}Sklepie", + }, + s_10={ + "{C:attention}Kupony{} są uzupełniane", + "po pokonaniu", + "{C:attention}Przeszkadzajki Bossa{}.", + }, + s_11={ + "Sprawdź także obie", + "{C:booster}paczki wzmacniające{} podczas", + "każdej wizyty w sklepie. Jest", + "w nich mnóstwo mecyi!", + }, + s_12={ + "Przejdźmy do", + "następnej rundy{}.", + }, + s_2={ + "Spróbuj kupić tego", + "przystojnego Diabła", + }, + s_2_touch={ + "Spróbuj kupić tego", + "przystojnego Diabła!", + "Przeciągnij go ze sklepu", + "na obszar {C:attention}„KUP”{}", + }, + s_3={ + "To jeden z {C:attention}#1#", + "{C:attention}Jokerów{}, które można dodać", + "do podejścia. Każdy {C:attention}Joker", + "daje inny efekt", + }, + s_4={ + "Ten dodaje mnoż. {C:red}+4{} do", + "każdej rozegranej ręki!", + }, + s_5={ + "Bądź wybredny! Możesz mieć tylko", + "{C:attention}5 jokerów{}", + "jednocześnie", + }, + s_6={ + "Kup teraz drugą", + "kartę w {C:attention}Sklepie", + }, + s_7={ + "To karta {C:tarot}Tarota{}, która jest", + "{C:attention}zużywalna{}. Ta pozwoli ci", + "ulepszyć twoje karty", + "rozgrywające! Nie pozbywaj się jej.", + }, + s_8={ + "Możesz mieć do", + "{C:attention}2 zużywalnych{} kart", + "jednocześnie", + }, + s_9={ + "Jeśli zgromadzisz ich wystarczająco dużo,", + "możesz kupić {C:attention}kupon{}.", + "{C:attention}Kupony{} to pasywne", + "ulepszenia twojego podejścia!", + }, + sb_1={ + "Witaj! Jestem", + "{C:attention}Jimbo{} i będą pomagać ci", + "w nauce gry!", + }, + sb_2={ + "Twoim celem jest zdobywanie", + "{C:blue}żetonów{} w celu pokonania", + "{C:attention}Przeszkadzajki przeciwnika", + }, + sb_3={ + "Tutaj mamy przeszkadzajkę {C:blue}Mała w ciemno{},", + "której pokonanie wymaga jedynie zdobycia", + "{C:attention}300 żetonów{}.", + }, + sb_4={ + "Wybierz przeszkadzajkę {C:blue}Mała w ciemno,", + "aby rozpocząć rundkę!", + }, + sh_1={ + "Kiedy zdobędziesz więcej kart,", + "pamiętaj, że możesz zmieniać", + "ich położenie. {C:attention}Jokery{} wyzwalane są", + "w kolejności od lewej do prawej", + }, + sh_2={ + "Upewnij się także, aby", + "{C:attention}UŻYWAĆ{} przedmiotów zużywalnych!", + }, + sh_3={ + "Wybierz do {C:attention}2{} kart", + "z twojej ręki i naciśnij przycisk", + "{C:attention}„UŻYJ”{} na karcie {C:tarot}Tarota{},", + "aby je ulepszyć!", + }, + sh_3_touch={ + "Wybierz maks. {C:attention}2{} karty", + "na ręce i przeciągnij", + "kartę {C:tarot}Tarota{} na obszar", + "{C:attention}„UŻYJ”{}, aby je ulepszyć!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Ręce", + a_handsize="+#1# do rozmiaru ręki", + a_handsize_minus="-#1# do rozmiaru ręki", + a_mult="Mnoż. +#1#", + a_mult_minus="Mnoż. -#1#", + a_remaining="Pozostało #1#", + a_sold_tally="Sprzedano #1#/#2#", + a_xmult="Mnoż. X#1#", + a_xmult_minus="-Mnoż. X#1#", + ante_x_voucher="WEJŚCIE #1# KUPON", + challenges_completed="Ukończono #1#/#2# wyzwań", + completed="Ukończono #1#/#2#", + deck_preview_wheel_plural="Liczby mogą być niższe przez #1# karty dobrane twarzą w dół", + deck_preview_wheel_singular="Liczby mogą być niższe przez #1# kartę dobraną twarzą w dół", + interest="#1# odsetek na $#2# (#3# maks.)", + loyalty_active="Aktywuj!", + loyalty_inactive="pozostało #1#", + ml_foil_desc={ + "W folii", + "+#1# żet.", + }, + ml_holo_desc={ + "Holograficzna", + "+#1# Mnoż.", + }, + ml_negative_consumable_desc={ + "Negatyw", + "+#1# slot na przedm. zużywalne", + }, + ml_negative_desc={ + "Negatyw", + "+#1# slot na jokera", + }, + ml_polychrome_desc={ + "Polichromowana", + "Mnoż. X#1#", + }, + remaining_discard_money="Pozostałe zrzutki (#1#$ każda)", + remaining_hand_money="Pozostałe ręce (#1#$ każda)", + unlocked="Odblokowano #1#/#2#", + }, + v_text={ + ch_c_all_eternal={ + "Wszystkie zakupione Jokery są {C:eternal}Wieczne{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}Żetony{} nie mogą przekroczyć obecnej wartości {C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Wyzwanie dnia!", + }, + ch_c_debuff_played_cards={ + "Wszystkie {C:attention}zagrane{} karty zostają {C:attention}osłabione{} po zdobyciu punktów", + }, + ch_c_discard_cost={ + "Każda zrzutka kosztuje {C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "{C:green}1 na #1#{} kart jest dobierana twarzą w dół", + }, + ch_c_inflation={ + "Na stałe podnosi ceny o {C:money}$1{} z każdym zakupem", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Trzymaj {C:red}-1{} kart w ręce za każdego {C:money}$#1#{}, którego masz", + }, + ch_c_no_extra_hand_money={ + "Dodatkowe {C:blue}ręce{} nie zdobywają pieniędzy", + }, + ch_c_no_interest={ + "Brak {C:attention}odsetek{} na końcu rundy", + }, + ch_c_no_reward={ + "Wszystkie {C:attention}Przeszkadzajki{} nie dają nagrody pieniężnej", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# Przeszkadzajki{} nie dają nagrody pieniężnej", + }, + ch_c_no_shop_jokers={ + "Jokery już się nie pojawiają podczas wizyty w {C:attention}sklepie", + }, + ch_c_none={ + "{C:inactive}Brak", + }, + ch_c_set_eternal_ante={ + "Gdy w grze ze stawką pokonasz bossa {C:attention}#1#{}, wszystkie Jokery stają się {C:attention}Wieczne", + }, + ch_c_set_joker_slots_ante={ + "Gdy w grze ze stawką pokonasz bossa {C:attention}#1#{}, sloty na jokery mają przypisaną wartość {C:attention}0", + }, + ch_c_set_seed={ + "1 próba z ustalonym rozstawieniem: {C:inactive}{ukryte}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} slot. na przedm. zużywalne", + }, + ch_m_discards={ + "{C:red}#1#{} zrzutek na rundę", + }, + ch_m_dollars={ + "Rozpocznij z {C:money}#1#$", + }, + ch_m_hand_size={ + "{C:attention}#1#{} do rozmiaru ręki", + }, + ch_m_hands={ + "{C:blue}#1#{} rąk na rundę", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} slotów na jokery", + }, + ch_m_none={ + "{C:inactive}Brak", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/pt_BR.lua b/src/localization/pt_BR.lua new file mode 100644 index 0000000..3a78d03 --- /dev/null +++ b/src/localization/pt_BR.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Baralho Abandonado", + text={ + "Comece a tentativa", + "sem {C:attention}Cartas de Realeza", + "no seu baralho", + }, + }, + b_anaglyph={ + name="Baralho Anáglifo", + text={ + "Após derrotar cada", + "{C:attention}Blind de Chefe{}, ganhe", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Baralho Preto", + text={ + "{C:attention}+#1#{} Espaço de Curinga", + "", + "{C:blue}-#2#{} mão", + "em cada rodada", + }, + }, + b_blue={ + name="Baralho Azul", + text={ + "{C:blue}+#1#{} mão", + "em cada rodada", + }, + }, + b_challenge={ + name="Baralho Desafiante", + text={ + "", + }, + }, + b_checkered={ + name="Baralho Xadrez", + text={ + "Comece a tentativa com", + "{C:attention}26{C:spades} Espadas{} e", + "{C:attention}26{C:hearts} Copas{} no baralho", + }, + }, + b_erratic={ + name="Baralho Errático", + text={ + "Todas as {C:attention}Classes{} e", + "{C:attention}Naipes{} no baralho", + "são aleatórios", + }, + }, + b_ghost={ + name="Baralho Fantasma", + text={ + "Cartas {C:spectral}Espectrais{} podem", + "aparecer na loja,", + "comece com uma carta de {C:spectral,T:c_hex}Feitiço{}", + }, + }, + b_green={ + name="Baralho Verde", + text={ + "No fim de cada Rodada:", + "{C:money}$#1#{s:0.85} por {C:blue}Mão restante", + "{C:money}$#2#{s:0.85} por {C:red}Descarte restante", + "Sem {C:attention}Juros", + }, + }, + b_magic={ + name="Baralho Mágico", + text={ + "Comece a tentativa com o", + "cupom de {C:tarot,T:v_crystal_ball}#1#{}", + "e {C:attention}2{} cópias", + "de {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Baralho de Nebulosa", + text={ + "Comece a tentativa com o", + "cupom de {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} espaço(s) de consumível", + }, + }, + b_painted={ + name="Baralho Pintado", + text={ + "{C:attention}+#1#{} tamanho de mão", + "{C:red}#2#{} espaço de Curinga", + }, + }, + b_plasma={ + name="Baralho de Plasma", + text={ + "Equilibre {C:blue}Fichas{} e", + "{C:red}Multi{} ao calcular a", + "pontuação para a mão preferida", + "{C:red}X#1#{} de tamanho base do Blind", + }, + }, + b_red={ + name="Baralho Vermelho", + text={ + "{C:red}+#1#{} descarte", + "em cada rodada", + }, + }, + b_yellow={ + name="Baralho Amarelo", + text={ + "Inicia com", + "mais {C:money}$#1#", + }, + }, + b_zodiac={ + name="Baralho do Zodíaco", + text={ + "Comece a tentativa com", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planeta,T:v_planet_merchant}#2#{},", + "e {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="O Braço", + text={ + "Reduz o nível da", + "mão de pôquer jogada", + }, + }, + bl_big={ + name="Big Blind", + text={ + }, + }, + bl_club={ + name="Paulada", + text={ + "Todas as cartas de Paus", + "recebem desvantagem", + }, + }, + bl_eye={ + name="O Olho", + text={ + "Nenhum tipo de", + "mão repetida nesta rodada", + }, + }, + bl_final_acorn={ + name="Semente Dourada", + text={ + "Vira e embaralha", + "todas as cartas Curinga", + }, + }, + bl_final_bell={ + name="Sino Cerúleo", + text={ + "Obriga 1 carta a", + "sempre ser selecionada", + }, + }, + bl_final_heart={ + name="Coração Rubro", + text={ + "Um Curinga aleatório", + "desativado em cada mão", + }, + }, + bl_final_leaf={ + name="Folha Verdejante", + text={ + "Todas as cartas têm desvantagem", + "até 1 Curinga ser vendido", + }, + }, + bl_final_vessel={ + name="Recipiente Roxo", + text={ + "Blind muito grande", + }, + }, + bl_fish={ + name="O Peixe", + text={ + "Cartas vêm viradas para baixo", + "após cada mão jogada", + }, + }, + bl_flint={ + name="A Pederneira", + text={ + "Fichas Básicas e", + "Multi são reduzidas pela metade", + }, + }, + bl_goad={ + name="Aguilhão", + text={ + "Todas as cartas de Espadas", + "recebem desvantagem", + }, + }, + bl_head={ + name="A Cabeça", + text={ + "Todas as cartas de Copas", + "recebem desvantagem", + }, + }, + bl_hook={ + name="O Gancho", + text={ + "Descarta 2 cartas", + "aleatórias por mão jogada", + }, + }, + bl_house={ + name="A Casa", + text={ + "A primeira mão é", + "comprada virada para baixo", + }, + }, + bl_manacle={ + name="As Algemas", + text={ + "-1 de tamanho de mão", + }, + }, + bl_mark={ + name="A Marca", + text={ + "Todas as cartas de Realeza são", + "compradas viradas para baixo", + }, + }, + bl_mouth={ + name="A Boca", + text={ + "Jogue só 1 tipo", + "de mão nesta rodada", + }, + }, + bl_needle={ + name="A Agulha", + text={ + "Jogue somente 1 mão", + }, + }, + bl_ox={ + name="O Touro", + text={ + "Jogar #1#", + "define o dinheiro para $0", + }, + }, + bl_pillar={ + name="O Pilar", + text={ + "Cartas jogadas antes", + "desta Aposta recebem desvantagem", + }, + }, + bl_plant={ + name="A Planta", + text={ + "Todas as cartas de Realeza", + "recebem desvantagem", + }, + }, + bl_psychic={ + name="O Psíquico", + text={ + "Deve jogar 5 cartas", + }, + }, + bl_serpent={ + name="A Serpente", + text={ + "Após Jogar ou Descartar,", + "sempre compre 3 cartas", + }, + }, + bl_small={ + name="Small Blind", + text={ + }, + }, + bl_tooth={ + name="O Dente", + text={ + "Perde $1 por", + "carta jogada", + }, + }, + bl_wall={ + name="O Muro", + text={ + "Blind ainda maior", + }, + }, + bl_water={ + name="A Água", + text={ + "Inicia com", + "0 descartes", + }, + }, + bl_wheel={ + name="A Roda", + text={ + " em 7 cartas são", + "compradas viradas para baixo", + }, + }, + bl_window={ + name="A Janela", + text={ + "Todas as cartas de Ouros", + "recebem desvantagem", + }, + }, + }, + Edition={ + e_base={ + name="Base", + text={ + "Nenhum efeito adicional", + }, + }, + e_foil={ + name="Laminado", + text={ + "{C:chips}+#1#{} fichas", + }, + }, + e_holo={ + name="Holográfico", + text={ + "{C:mult}+#1#{} Multi", + }, + }, + e_negative={ + name="Negativo", + text={ + "{C:dark_edition}+#1#{} espaço(s) de Curinga", + }, + }, + e_negative_consumable={ + name="Negativo", + text={ + "{C:dark_edition}+#1#{} espaço(s) de consumível", + }, + }, + e_polychrome={ + name="Policromático", + text={ + "{X:mult,C:white} X#1# {} Multi", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Carta Bônus", + text={ + }, + }, + m_glass={ + name="Carta de Vidro", + text={ + "{X:mult,C:white} X#1# {} Multi", + "Chance de {C:green}#2# em #3#{} de", + "destruir carta", + }, + }, + m_gold={ + name="Carta Dourada", + text={ + "{C:money}$#1#{} se esta", + "carta estiver na mão", + "no fim da rodada", + }, + }, + m_lucky={ + name="Carta da Sorte", + text={ + "Chance de {C:green}#1# em #3#{}", + "de {C:mult}+#2#{} Multi", + "Chance de {C:green}#1# em #5#{}", + "para ganhar {C:money}$#4#", + }, + }, + m_mult={ + name="Carta Multi", + text={ + "{C:mult}+#1#{} Multi", + }, + }, + m_steel={ + name="Carta de Aço", + text={ + "{X:mult,C:white} X#1# {} Multi", + "enquanto esta carta", + "permanece na mão", + }, + }, + m_stone={ + name="Carta de Pedra", + text={ + "{C:chips}+#1#{} Fichas", + "sem classe ou naipe", + }, + }, + m_wild={ + name="Carta Naipe Curinga", + text={ + "Pode ser usada", + "como qualquer naipe", + }, + }, + }, + Joker={ + j_8_ball={ + name="Bola 8", + text={ + "Chance de {C:green}#1# em #2#{} para cada", + "{C:attention}8{} jogado para criar", + "uma carta de {C:tarot}Tarô{} quando pontuada", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_abstract={ + name="Curinga Abstrato", + text={ + "{C:mult}+#1#{} Multi por", + "cada carta {C:attention}Curinga{}", + "{C:inactive}(No momento {C:red}+#2#{C:inactive} Multi)", + }, + }, + j_acrobat={ + name="Acrobata", + text={ + "{X:red,C:white} X#1# {} Multi na {C:attention}mão", + "{C:attention}final{} da rodada", + }, + unlock={ + "Jogue {C:attention,E:1}#1#{} mãos", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Curinga Antigo", + text={ + "Cada carta jogada com", + "naipe {V:1}#2#{} dá", + "{X:mult,C:white} X#1# {} Multi ao pontuar,", + "{s:0.8}naipe muda no fim da rodada", + }, + }, + j_arrowhead={ + name="Ponta de Flecha", + text={ + "Cartas jogadas com", + "naipe de {C:spades}Espadas{} dão", + "{C:chips}+#1#{} Fichas quando pontuadas", + }, + unlock={ + "Tenha pelo menos {E:1,C:attention}#1#", + "cartas com naipe de {E:1,C:attention}#2#", + "no seu baralho", + }, + }, + j_astronomer={ + name="Astrônomo", + text={ + "Todas as cartas de {C:planet}Planeta{} e", + "{C:planet}Pacotes Celestiais{} em", + "na loja ficam {C:attention}grátis", + }, + unlock={ + "Descubra cada", + "carta de {E:1,C:planet}Planeta{}", + }, + }, + j_banner={ + name="Estandarte", + text={ + "{C:chips}+#1#{} Fichas", + "por cada", + "{C:attention}descarte restante", + }, + }, + j_baron={ + name="Barão", + text={ + "Cada {C:attention}Rei{}", + "na mão", + "dá {X:mult,C:white} X#1# {} Multi", + }, + }, + j_baseball={ + name="Carta de Beisebol", + text={ + "Curingas {C:green}Incomuns{}", + "cada um dá {X:mult,C:white} X#1# {} Multi", + }, + }, + j_blackboard={ + name="Quadro Negro", + text={ + "{X:red,C:white} X#1# {} Multi se todas as", + "cartas mantidas na mão", + "forem {C:spades}#2#{} ou {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Pedra de Sangue", + text={ + "Chance de {C:green}#1# em #2#{} para", + "cartas jogadas com", + "naipe de {C:hearts}Copas{} darem", + "{X:mult,C:white} X#3# {} Multi ao pontuar,", + }, + unlock={ + "Tenha pelo menos {E:1,C:attention}#1#", + "cartas com naipe de {E:1,C:attention}#2#", + "no seu baralho", + }, + }, + j_blue_joker={ + name="Curinga Azul", + text={ + "{C:chips}+#1#{} Fichas por cada", + "carta restante no {C:attention}baralho", + "{C:inactive}(No momento {C:chips}+#2#{C:inactive} Fichas)", + }, + }, + j_blueprint={ + name="Projeto", + text={ + "Copia a habilidade do", + "{C:attention}Curinga{} da direita", + }, + unlock={ + "Vença uma tentativa", + }, + }, + j_bootstraps={ + name="Bonificação", + text={ + "{C:mult}+#1#{} Multi para cada", + "{C:money}$#2#{} que você tem", + "{C:inactive}(No momento, {C:mult}+#3#{C:inactive} Multi)", + }, + unlock={ + "Tenha pelo menos {E:1,C:attention}#1#", + "Curingas {C:dark_edition}Policromáticos{}", + }, + }, + j_brainstorm={ + name="Boa Ideia", + text={ + "Copia a habilidade", + "do {C:attention}Curinga que está mais à esquerda", + }, + unlock={ + "Descarte um", + "{E:1,C:attention}Royal Flush", + }, + }, + j_bull={ + name="Touro", + text={ + "{C:chips}+#1#{} Fichas para", + "cada {C:money}$1{} que você tem", + "{C:inactive}(No momento, {C:chips}+#2#{C:inactive} Fichas)", + }, + }, + j_burglar={ + name="Ladrão", + text={ + "Quando o {C:attention}Blind{} é selecionado,", + "ganha {C:blue}+#1#{} Mãos e", + "{C:attention}perde todos os descartes", + }, + }, + j_burnt={ + name="Curinga Queimado", + text={ + "Aprimore o nível da", + "primeira mão {C:attention}descartada", + "em cada rodada", + }, + unlock={ + "Venda um total", + "de {E:1,C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Cartão de Visita", + text={ + "Cartas de {C:attention}realeza{} jogadas têm", + "a chance de {C:green}#1# em #2#{} de", + "dar {C:money}$2{} quando pontuadas", + }, + }, + j_caino={ + name="Caino", + text={ + "Este Curinga ganha {X:mult,C:white} X#1# {} Multi", + "quando uma carta de {C:attention}realeza{}", + "é destruída", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Fogueira", + text={ + "Este Curinga ganha {X:mult,C:white}X#1#{} Multi", + "por cada carta {C:attention}vendida{}, redefine", + "quando o {C:attention}Blind de Chefe{} é derrotado", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_card_sharp={ + name="Carta Afiada", + text={ + "{X:mult,C:white} X#1# {} Multi se a", + "{C:attention}mão de pôquer{} já tiver sido", + "jogada nesta rodada", + }, + }, + j_cartomancer={ + name="Cartomante", + text={ + "Cria uma carta de {C:tarot}Tarô{}", + "quando o {C:attention}Blind{} é selecionado", + "{C:inactive}(Deve ter espaço)", + }, + unlock={ + "Descubra todas as", + "cartas de {E:1,C:tarot}Tarô{}", + }, + }, + j_castle={ + name="Castelo", + text={ + "Este Curinga ganha {C:chips}+#1#{} Fichas", + "por cada carta {V:1}#2#{} descartada,", + "naipe muda em cada rodada", + "{C:inactive}(No momento {C:chips}+#3#{C:inactive} Fichas)", + }, + }, + j_cavendish={ + name="Cavendish", + text={ + "{X:mult,C:white} X#1# {} Multi", + "{C:green}#2# de #3#{} chance desta", + "carta ser destruída", + "no fim da rodada", + }, + }, + j_ceremonial={ + name="Adaga Cerimonial", + text={ + "Quando o {C:attention}Blind{} é selecionado,", + "destrói o Curinga da direita", + "e adiciona, permanentemente, o {C:attention}dobro", + "do valor de venda a esta {C:red}Multi", + "{C:inactive}(No momento {C:mult}+#1#{C:inactive} Multi)", + }, + }, + j_certificate={ + name="Certificado", + text={ + "Quando a rodada começa,", + "adiciona uma {C:attention}carta de jogo", + "{C:attention}aleatória{} com um", + "{C:attention}selo{} para a sua mão", + }, + unlock={ + "Tenha uma", + "carta de jogo de Ouro com", + "um {C:attention,E:1}Selo Dourado", + }, + }, + j_chaos={ + name="Caos, o Palhaço", + text={ + "{C:attention}#1#{} {C:green}atualização(ões) grátis", + "na loja", + }, + }, + j_chicot={ + name="Chicot", + text={ + "Desativa o efeito de", + "cada {C:attention}Blind de Chefe", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Curinga Astuto", + text={ + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_cloud_9={ + name="9dades", + text={ + "Ganhe {C:money}$#1#{} por cada", + "{C:attention}9{} no seu {C:attention}baralho completo", + "no fim da rodada", + "{C:inactive}(No momento {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="Constelação", + text={ + "Este Curinga ganha", + "{X:mult,C:white} X#1# {} Multi sempre", + "que uma carta de {C:planet}Planeta{} é usada", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_crafty={ + name="Curinga Engenhoso", + text={ + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_crazy={ + name="Curinga Maluco", + text={ + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_credit_card={ + name="Cartão de Crédito", + text={ + "Tenha até", + "{C:red}-$#1#{} em dívida", + }, + }, + j_delayed_grat={ + name="Gratificação Atrasada", + text={ + "Ganhe {C:money}$#1#{} por {C:attention}descarte{} se", + "nenhum descarte for usado", + "até o fim da rodada", + }, + }, + j_devious={ + name="Curinga Desonesto", + text={ + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_diet_cola={ + name="Cola Diet", + text={ + "Venda esta carta para", + "criar um(a)", + "{C:attention}#1# grátis", + }, + }, + j_dna={ + name="DNA", + text={ + "Se a {C:attention}primeira mão{} da rodada", + "tiver somente {C:attention}1{} carta, adiciona uma", + "cópia permanente ao baralho", + "e a coloca na {C:attention}mão", + }, + }, + j_drivers_license={ + name="Carteira de Habilitação", + text={ + "{X:mult,C:white} X#1# {} Multi se você", + "tiver pelo menos {C:attention}16", + "cartas aprimoradas", + "{C:inactive}(No momento {C:attention}#2#{C:inactive})", + }, + unlock={ + "Aprimore {E:1,C:attention}#1#{} cartas", + "no seu baralho", + }, + }, + j_droll={ + name="Curinga Engraçado", + text={ + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_drunkard={ + name="Bêbado", + text={ + "{C:red}+#1#{} descarte", + "a cada rodada", + }, + }, + j_duo={ + name="A Dupla", + text={ + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + unlock={ + "Vença uma tentativa", + "sem jogar", + "{E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Anoitecer", + text={ + "Reativa as cartas", + "pontuadoras na {C:attention}mão", + "{C:attention}final{} da rodada", + }, + }, + j_egg={ + name="Ovo", + text={ + "Ganha {C:money}$#1#{} do", + "{C:attention}valor de venda{} ao", + "fim da rodada", + }, + }, + j_erosion={ + name="Erosão", + text={ + "{C:red}+#1#{} Multi por cada", + "carta abaixo de {C:attention}#3#{}", + "no seu baralho completo", + "{C:inactive}(No momento {C:red}+#2#{C:inactive} Multi)", + }, + }, + j_even_steven={ + name="Osmar Vados", + text={ + "Cartas jogadas com", + "classe {C:attention}par{} dão", + "{C:mult}+#1#{} Multi quando pontuadas", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Curinga Plebeu", + text={ + "Ganhe {C:money}$#1#{} se {C:attention}#2#{} ou", + "mais {C:attention}cartas de Realeza{}", + "são descartadas", + "ao mesmo tempo", + }, + }, + j_family={ + name="A Família", + text={ + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + unlock={ + "Vença uma tentativa", + "sem jogar", + "um {E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Fibonacci", + text={ + "Cada {C:attention}Ás{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} ou {C:attention}8{} jogados dão", + "{C:mult}+#1#{} Multi quando pontuados", + }, + }, + j_flash={ + name="Carta Relâmpago", + text={ + "Este Curinga ganha {C:mult}+#1#{} Multi", + "por {C:attention}atualização{} na loja", + "{C:inactive}(No momento, {C:mult}+#2#{C:inactive} Multi)", + }, + }, + j_flower_pot={ + name="Vaso de Flores", + text={ + "{X:mult,C:white} X#1# {} Multi se a mão", + "de pôquer contém", + "uma carta de {C:diamonds}Ouros{}, uma carta de {C:clubs}Paus{},", + "uma carta de {C:hearts}Copas{} e uma carta de {C:spades}Espadas{}", + }, + unlock={ + "Alcance", + "Nível de Aposta {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Vidente", + text={ + "{C:red}+#1#{} Multi por", + "carta de {C:purple}Tarô{} usada", + "{C:inactive}(No momento {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Quatro Dedos", + text={ + "Todos os {C:attention}Flushes{} e", + "{C:attention}Sequências{} podem", + "ser efetuados com {C:attention}4{} cartas", + }, + }, + j_gift={ + name="Cartão Presente", + text={ + "Adiciona {C:money}$#1#{} do {C:attention}valor de venda", + "a cada {C:attention}Curinga{} e", + "a cada carta {C:attention}Consumível{} em", + "fim da rodada", + }, + }, + j_glass={ + name="Curinga de Vidro", + text={ + "Este Curinga ganha {X:mult,C:white} X#1# {} Multi", + "para cada {C:attention}Carta de Vidro", + "destruída", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + unlock={ + "Tenha pelo menos {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} no", + "seu baralho", + }, + }, + j_gluttenous_joker={ + name="Curinga Guloso", + text={ + "Cartas jogadas com", + "naipe de {C:clubs}#2#{} dão", + "{C:mult}+#1#{} Multi quando pontuadas", + }, + }, + j_golden={ + name="Curinga Dourado", + text={ + "Ganhe {C:money}$#1#{} no", + "fim da rodada", + }, + }, + j_greedy_joker={ + name="Curinga Ganancioso", + text={ + "Cartas jogadas com", + "naipe de {C:diamonds}#2#{} dão", + "{C:mult}+#1#{} Multi quando pontuadas", + }, + }, + j_green_joker={ + name="Curinga Verde", + text={ + "{C:mult}+#1#{} Multi por mão jogada", + "{C:mult}-#2#{} Multi por descarte", + "{C:inactive}(No momento {C:mult}+#3#{C:inactive} Multi)", + }, + }, + j_gros_michel={ + name="Banana-prata", + text={ + "{C:mult}+#1#{} Multi", + "{C:green}#2# de #3#{} chance desta", + "carta ser destruída", + "no fim da rodada", + }, + }, + j_hack={ + name="Impostor", + text={ + "Reativa", + "cada", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} ou {C:attention}5{}", + }, + }, + j_half={ + name="Meio Curinga", + text={ + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "{C:attention}#2#{} ou menos cartas", + }, + }, + j_hallucination={ + name="Alucinação", + text={ + "{C:green}#1# em #2#{} chances de criar", + "uma carta de {C:tarot}Tarô{} quando qualquer", + "{C:attention}Pacote de Reforço{} for aberto", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_hanging_chad={ + name="Comprovante", + text={ + "Reativa a {C:attention}primeira{} carta", + "jogada usada em pontuação", + "{C:attention}#1#{} vezes adicionais", + }, + unlock={ + "Acabe com o Blind de Chefe", + "com uma {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Caminhante", + text={ + "Todas as {C:attention}cartas{} jogadas", + "ganham, permanentemente,", + "{C:chips}+#1#{} Fichas quando pontuadas", + }, + }, + j_hit_the_road={ + name="Cai Fora", + text={ + "Este Curinga ganha {X:mult,C:white} X#1# {} Multi", + "para cada {C:attention}Valete{}", + "descartado nesta rodada", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + unlock={ + "Descarte {E:1,C:attention}5", + "{E:1,C:attention}Valetes{} ao", + "mesmo tempo", + }, + }, + j_hologram={ + name="Holograma", + text={ + "Este Curinga ganha {X:mult,C:white} X#1# {} Multi", + "sempre que uma {C:attention}carta de jogo{}", + "é adicionada ao seu baralho", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_ice_cream={ + name="Sorvete", + text={ + "{C:chips}+#1#{} Fichas", + "{C:chips}-#2#{} Fichas por", + "cada mão jogada", + }, + }, + j_idol={ + name="O Ídolo", + text={ + "Cada {C:attention}#2#", + "de {V:1}#3#{} jogado dá", + "{X:mult,C:white} X#1# {} Multi ao pontuar", + "{s:0.8}Carta muda em cada rodada", + }, + unlock={ + "Em uma mão,", + "ganhe pelo menos", + "{E:1,C:attention}#1#{} fichas", + }, + }, + j_invisible={ + name="Curinga Invisível", + text={ + "Após {C:attention}#1#{} rodadas,", + "venda esta carta para", + "{C:attention}Duplicar{} um Curinga aleatório", + "{C:inactive}(No momento {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Vença uma tentativa sem", + "ter mais de", + "{E:1,C:attention}4 Curingas{}", + }, + }, + j_joker={ + name="Curinga", + text={ + "{C:red,s:1.1}+#1#{} Multi", + }, + }, + j_jolly={ + name="Curinga Alegre", + text={ + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_juggler={ + name="Malabarista", + text={ + "{C:attention}+#1#{} tamanho de mão", + }, + }, + j_loyalty_card={ + name="Carta de Lealdade", + text={ + "{X:red,C:white} X#1# {} Multi a cada", + "{C:attention}#2#{} mãos jogadas", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Luchador", + text={ + "Venda esta carta para", + "desativar o", + "{C:attention}Blind de Chefe{} atual", + }, + }, + j_lucky_cat={ + name="Gato Sortudo", + text={ + "Este Curinga ganha {X:mult,C:white} X#1# {} Multi", + "sempre que uma carta da {C:attention}Sorte{}", + "ativa {C:green}com êxito{}", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_lusty_joker={ + name="Curinga Vigoroso", + text={ + "Cartas jogadas com", + "naipe de {C:hearts}#2#{} dão", + "{C:mult}+#1#{} Multi quando pontuadas", + }, + }, + j_mad={ + name="Curinga Irritado", + text={ + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_madness={ + name="Insanidade", + text={ + "Quando {C:attention}Small Blind{} ou {C:attention}Big Blind{}", + "é selecionado, ganhe {X:mult,C:white} X#1# {} Multi", + "e {C:attention}destrua{} um Curinga aleatório", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_mail={ + name="Desconto de Correio", + text={ + "Ganhe {C:money}$#1#{} por cada", + "{C:attention}#2#{} descartado, a classe", + "muda em cada rodada", + }, + }, + j_marble={ + name="Curinga de Mármore", + text={ + "Adiciona uma carta de {C:attention}Pedra{}", + "ao seu baralho quando", + "o {C:attention}Blind{} é selecionado", + }, + }, + j_matador={ + name="Matador", + text={ + "Ganhe {C:money}$#1#{} se a", + "mão jogada ativa a", + "habilidade {C:attention}Blind de Chefe{}", + }, + unlock={ + "Derrote um Blind de Chefe", + "em {E:1,C:attention}1 mão{} sem", + "usar qualquer descarte", + }, + }, + j_merry_andy={ + name="Jogada de Descartes", + text={ + "{C:red}+#1#{} descartes", + "a cada rodada,", + "{C:red}#2#{} de tamanho de mão", + }, + unlock={ + "Vença uma tentativa em {E:1,C:attention}#1#", + "ou menos rodadas", + }, + }, + j_midas_mask={ + name="Máscara de Midas", + text={ + "Todas as cartas de {C:attention}realeza{}", + "se tornam cartas de {C:attention}Ouro{}", + "quando pontuadas", + }, + }, + j_mime={ + name="Mímico", + text={ + "Reativa todas as", + "habilidades das cartas {C:attention}na sua", + "{C:attention}mão{}", + }, + }, + j_misprint={ + name="Erro de Impressão", + text={ + "", + }, + }, + j_mr_bones={ + name="Sr. Osso", + text={ + "Evita a Morte", + "se as fichas pontuadas", + "forem, pelo menos, {C:attention}25%", + "das fichas necessárias", + "{S:1.1,C:red,E:2}se autodestrói{}", + }, + unlock={ + "Perca {C:attention,E:1}#1#{} tentativas", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Pico Místico", + text={ + "{C:mult}+#1#{} Multi quando", + "{C:attention}#2#{} descartes", + "restantes", + }, + }, + j_obelisk={ + name="Obelisco", + text={ + "Este Curinga ganha {X:mult,C:white} X#1# {} Multi", + "por mão jogada {C:attention}consecutiva{}", + "sem jogar a sua", + "{C:attention}mão de pôquer mais jogada", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_odd_todd={ + name="Ímpar Imperfeito", + text={ + "Cartas jogadas com", + "classe {C:attention}ímpar{} dão", + "{C:chips}+#1#{} Fichas quando pontuadas", + "{C:inactive}(A, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Ágata Ônix", + text={ + "Cartas jogadas com", + "naipe de {C:clubs}Paus{} dão", + "{C:mult}+#1#{} Multi quando pontuadas", + }, + unlock={ + "Tenha pelo menos {E:1,C:attention}#1#", + "cartas com naipe de {E:1,C:attention}#2#", + "no seu baralho", + }, + }, + j_oops={ + name="Opa! Tudo 6", + text={ + "Dobra {C:attention}todas as", + "{C:green,E:1,S:1.1}probabilidades", + "{C:inactive}(ex: {C:green}1 em 3{C:inactive} -> {C:green}2 em 3{C:inactive})", + }, + unlock={ + "Em uma mão,", + "ganhe pelo menos", + "{E:1,C:attention}#1#{} fichas", + }, + }, + j_order={ + name="A Ordem", + text={ + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + unlock={ + "Vença uma tentativa", + "sem jogar", + "um {E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Pareidolia", + text={ + "Todas as cartas são", + "consideradas", + "cartas de {C:attention}Realeza{}", + }, + }, + j_perkeo={ + name="Perkeo", + text={ + "Cria uma cópia {C:dark_edition}Negativa{} de", + "{C:attention}1{} carta {C:attention}consumível{} aleatória", + "em sua posse", + "no final da {C:attention}loja", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Fotografia", + text={ + "Primeira carta de {C:attention}realeza", + "jogada dá {X:mult,C:white} X#1# {} Multi", + "quando pontuada", + }, + }, + j_popcorn={ + name="Pipoca", + text={ + "{C:mult}+#1#{} Multi", + "{C:mult}-#2#{} Multi por", + "rodada jogada", + }, + }, + j_raised_fist={ + name="Punho Erguido", + text={ + "Adiciona o {C:attention}dobro{} da classe", + "da carta de classe {C:attention}mais baixa{}", + "presente na mão ao Multi", + }, + }, + j_ramen={ + name="Lámen", + text={ + "{X:mult,C:white} X#1# {} Multi,", + "perde {X:mult,C:white} X#2# {} Multi", + "por {C:attention}carta{} descartada", + }, + }, + j_red_card={ + name="Carta Vermelha", + text={ + "Este Curinga ganha", + "{C:red}+#1#{} Multi quando qualquer", + "{C:attention}Pacote de Reforço{} é ignorado", + "{C:inactive}(No momento, {C:red}+#2#{C:inactive} Multi)", + }, + }, + j_reserved_parking={ + name="Estacionamento Reservado", + text={ + "Cada carta de {C:attention}realeza{}", + "na sua mão tem", + "uma chance de {C:green}#2# em #3#{}", + "para dar {C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="Passear de Ônibus", + text={ + "Este Curinga ganha {C:mult}+#1#{} Multi", + "por mão jogada {C:attention}consecutiva{}", + "sem nenhuma", + "carta de {C:attention}realeza{} de pontuação", + "{C:inactive}(No momento, {C:mult}+#2#{C:inactive} Multi)", + }, + }, + j_riff_raff={ + name="Ralé", + text={ + "Quando o {C:attention}Blind{} é selecionado,", + "cria {C:attention}#1# {C:blue}{C:attention}Curinga Comum", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_ring_master={ + name="Mestre do Ringue", + text={ + "Cartas de {C:attention}Curinga{}, {C:tarot}Tarô{}, {C:planet}Planeta{}", + "e {C:spectral}Espectral{} podem", + "aparecer várias vezes", + }, + unlock={ + "Alcance", + "Nível de Aposta {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Foguete", + text={ + "Ganhe {C:money}$#1#{} no fim da rodada", + "O pagamento aumenta em {C:money}$#2#{}", + "quando o {C:attention}Blind de Chefe{} é derrotado", + }, + }, + j_rough_gem={ + name="Joia Bruta", + text={ + "Cartas jogadas com", + "naipe de {C:diamonds}Ouros{} ganham", + "{C:money}$#1#{} quando pontuadas", + }, + unlock={ + "Tenha pelo menos {E:1,C:attention}#1#", + "cartas com naipe de {E:1,C:attention}#2#", + "no seu baralho", + }, + }, + j_runner={ + name="Atleta", + text={ + "Ganha {C:chips}+#2#{} Fichas", + "se a mão jogada", + "tiver uma {C:attention}Sequência{}", + "{C:inactive}(No momento {C:chips}+#1#{C:inactive} Fichas)", + }, + }, + j_satellite={ + name="Satélite", + text={ + "Ganhe {C:money}$#1#{} no fim da", + "rodada por {C:planet}Planeta único", + "usada nesta tentativa", + "{C:inactive}(No momento {C:money}$#2#{C:inactive})", + }, + unlock={ + "Tenha {E:1,C:money}$#1#", + "ou mais", + }, + }, + j_scary_face={ + name="Realeza Assustadora", + text={ + "Cartas de {C:attention}realeza{} jogadas", + "dão {C:chips}+#1#{} Fichas", + "quando pontuadas", + }, + }, + j_scholar={ + name="Estudioso", + text={ + "{C:attention}Ases{} jogados", + "dão {C:chips}+#2#{} Fichas", + "e {C:mult}+#1#{} Multi", + "quando pontuados", + }, + }, + j_seance={ + name="Sessão Mediúnica", + text={ + "Se a {C:attention}mão de pôquer{} for", + "{C:attention}#1#{}, cria um(a)", + "carta {C:spectral}Espectral{} aleatória", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_seeing_double={ + name="Visão Duplicada", + text={ + "{X:mult,C:white} X#1# {} Multi se jogar", + "uma mão com carta pontuadora de", + "Carta de {C:clubs}Paus{} e uma carta", + "de pontuação de qualquer outro {C:attention}naipe", + }, + unlock={ + "Jogue uma mão", + "que contém", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Seltzer", + text={ + "Reativa todas as", + "cartas jogadas para as", + "próximas {C:attention}#1#{} mãos", + }, + }, + j_shoot_the_moon={ + name="Alcance os Céus", + text={ + "Cada {C:attention}Dama{}", + "na mão", + "dá {C:mult}+#1#{} Multi", + }, + unlock={ + "Jogue cada carta de {E:1,C:attention}Copas", + "do seu baralho em", + "uma única rodada", + }, + }, + j_shortcut={ + name="Atalho", + text={ + "Permite fazer {C:attention}Sequências{}", + "com lacunas de {C:attention}1 classe", + "{C:inactive}(ex.: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Sexto Sentido", + text={ + "Se a {C:attention}primeira mão{} da rodada for", + "um único {C:attention}6{}, destrói a mesma e", + "cria uma carta {C:spectral}Espectral{}", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_sly={ + name="Curinga Malandro", + text={ + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_smeared={ + name="Curinga Borrado", + text={ + "{C:hearts}Copas{} e {C:diamonds}Ouros", + "contam como o mesmo naipe,", + "{C:spades}Espadas{} e {C:clubs}Paus", + "contam como o mesmo naipe", + }, + unlock={ + "Tenha pelo menos {C:attention}#1#", + "{E:1,C:attention}#2#{} no", + "seu baralho", + }, + }, + j_smiley={ + name="Carinha Sorridente", + text={ + "Cartas de {C:attention}realeza{} jogadas", + "dão {C:mult}+#1#{} Multi", + "quando pontuadas", + }, + }, + j_sock_and_buskin={ + name="A Meia e o Coturno", + text={ + "Reativa todas as", + "cartas de {C:attention}realeza{} jogadas", + }, + unlock={ + "Jogue um total de", + "{C:attention,E:1}#1#{} cartas de Realeza", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Curinga Espacial", + text={ + "Chance de {C:green}#1# em #2#{} para", + "aprimorar o nível da", + "{C:attention}mão de pôquer{} jogada", + }, + }, + j_splash={ + name="Splash", + text={ + "Cada {C:attention}carta jogada", + "conta na pontuação", + }, + }, + j_square={ + name="Curinga Quadrado", + text={ + "Este Curinga ganha {C:chips}+#2#{} Fichas", + "se a mão jogada tem", + "exatamente {C:attention}4{} cartas", + "{C:inactive}(No momento, {C:chips}#1#{C:inactive} Fichas)", + }, + }, + j_steel_joker={ + name="Curinga de Aço", + text={ + "Dá {X:mult,C:white} X#1# {} Multi", + "para cada {C:attention}Carta de Aço", + "do seu {C:attention}baralho completo", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_stencil={ + name="Curinga Estampado", + text={ + "{X:red,C:white} X1 {} Multi por cada", + "espaço de {C:attention}Curinga{} vazio", + "{s:0.8}Curinga Estampado incluído", + "{C:inactive}(No momento {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Curinga de Pedra", + text={ + "Dá {C:chips}+#1#{} Fichas para", + "cada {C:attention}Carta de Pedra", + "do seu {C:attention}baralho completo", + "{C:inactive}(No momento, {C:chips}+#2#{C:inactive} Fichas)", + }, + }, + j_stuntman={ + name="Dublê", + text={ + "{C:chips}+#1#{} Fichas,", + "{C:attention}-#2#{} de tamanho de mão", + }, + unlock={ + "Em uma mão,", + "ganhe pelo menos", + "{E:1,C:attention}#1#{} fichas", + }, + }, + j_supernova={ + name="Supernova", + text={ + "Adiciona o número de vezes", + "que a {C:attention}mão de pôquer{} foi", + "jogada nesta tentativa ao Multi", + }, + }, + j_superposition={ + name="Sobreposição", + text={ + "Cria uma carta de {C:tarot}Tarô{} se", + "a mão de pôquer tiver um", + "{C:attention}Às{} e uma {C:attention}Sequência{}", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_swashbuckler={ + name="Aventureiro", + text={ + "Adiciona o valor de venda", + "de todos os outros ", + "{C:attention}Curingas{} em posse ao Multi", + "{C:inactive}(No momento, {C:mult}+#1#{C:inactive} Multi)", + }, + unlock={ + "Venda um total de", + "{C:attention,E:1}#1#{} cartas Curinga", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Retorno", + text={ + "{X:mult,C:white} X#1# {} Multi por cada", + "{C:attention}Blind{} ignorado nesta rodada", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + unlock={ + "Continue uma tentativa salva", + "através do menu principal", + }, + }, + j_ticket={ + name="Bilhete Dourado", + text={ + "Cartas {C:attention}Douradas{} jogadas", + "ganham {C:money}$#1#{} quando pontuadas", + }, + unlock={ + "Jogue uma mão de 5 cartas", + "contendo somente", + "cartas {C:attention,E:1}Douradas{}", + }, + }, + j_to_the_moon={ + name="Para a Lua", + text={ + "Ganhe {C:money}$#1#{} adicional de", + "{C:attention}juros{} por cada {C:money}$5{} que", + "tiver no fim da rodada", + }, + }, + j_todo_list={ + name="Lista de Tarefas", + text={ + "Ganhe {C:money}$#1#{} se a {C:attention}mão de pôquer{}", + "for uma {C:attention}#2#{},", + "a mão de pôquer muda", + "no fim da rodada", + }, + }, + j_trading={ + name="Carta de Troca", + text={ + "Se o {C:attention}primeiro descarte{} da rodada", + "tiver somente {C:attention}1{} carta, destrói", + "a mesma e ganha {C:money}$#1#", + }, + }, + j_tribe={ + name="A Tribo", + text={ + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + unlock={ + "Vença uma tentativa", + "sem jogar", + "um {E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Triboulet", + text={ + "{C:attention}Reis{} e", + "{C:attention}Rainhas{} jogados dão", + "{X:mult,C:white} X#1# {} Multi ao pontuar,", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="O Trio", + text={ + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + unlock={ + "Vença uma tentativa", + "sem jogar", + "um {E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Trovador", + text={ + "{C:attention}+#1#{} de tamanho de mão,", + "{C:blue}-#2#{} mão a cada rodada", + }, + unlock={ + "Vença {C:attention,E:1}#1#{} rodadas", + "consecutivas jogando", + "somente 1 mão", + }, + }, + j_trousers={ + name="Calças Sobressalentes", + text={ + "Este Curinga ganha {C:mult}+#1#{} Multi", + "se a mão jogada contém", + "um(a) {C:attention}#2#", + "{C:inactive}(No momento, {C:red}+#3#{C:inactive} Multi)", + }, + }, + j_turtle_bean={ + name="Feijão Preto", + text={ + "{C:attention}+#1#{} tamanho de mão,", + "reduz por", + "{C:red}#2#{} a cada rodada", + }, + }, + j_vagabond={ + name="Vagabundo", + text={ + "Cria uma carta de {C:purple}Tarô{}", + "se a mão é jogada", + "com {C:money}$#1#{} ou menos", + }, + }, + j_vampire={ + name="Vampiro", + text={ + "Este Curinga ganha {X:mult,C:white} X#1# {} Multi", + "por {C:attention}carta Aprimorada{} de pontuação jogada,", + "remove o {C:attention}Aprimoramento da carta", + "{C:inactive}(No momento, {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_walkie_talkie={ + name="Walkie Talkie", + text={ + "Cada vez que joga {C:attention}10{} ou {C:attention}4", + "dá {C:chips}+#1#{} Fichas e", + "{C:mult}+#2#{} Multi ao pontuar", + }, + }, + j_wee={ + name="Curinguinha", + text={ + "Este Curinga ganha", + "{C:chips}+#2#{} Fichas quando cada", + "{C:attention}2{} jogado pontua", + "{C:inactive}(No momento {C:chips}+#1#{C:inactive} Fichas)", + }, + unlock={ + "Vença uma tentativa em {E:1,C:attention}#1#", + "ou menos rodadas", + }, + }, + j_wily={ + name="Curinga Sagaz", + text={ + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Curinga Furioso", + text={ + "Cartas jogadas com", + "naipe de {C:spades}#2#{} dão", + "{C:mult}+#1#{} Multi quando pontuadas", + }, + }, + j_yorick={ + name="Yorick", + text={ + "Este Curinga ganha", + "{X:mult,C:white} X#1# {} Multi a cada {C:attention}#2#{C:inactive} [#3#]{}", + "cartas descartadas", + "{C:inactive}(No momento, {X:mult,C:white} X#4# {C:inactive} Multi)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Curinga Bobo", + text={ + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Adesivo Preto", + text={ + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Preta{}", + }, + }, + blue_seal={ + name="Selo Azul", + text={ + "Cria a carta de {C:planet}Planeta{}", + "por {C:attention}mão de pôquer{} final jogada", + "da rodada se {C:attention}contida{} na mão", + "{C:inactive}(Deve ter espaço)", + }, + }, + blue_sticker={ + name="Adesivo Azul", + text={ + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Azul{}", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} fichas", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{} fichas adicionais", + }, + }, + challenge_locked={ + name="Bloqueado", + text={ + "Vença uma tentativa com pelo menos", + "#1# baralhos diferentes para desbloquear", + "Modo Desafio", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Com desvantagem", + text={ + "Todas as habilidades", + "são desativadas", + }, + }, + debuffed_playing_card={ + name="Com desvantagem", + text={ + "Não pontua fichas", + "e todas as habilidades", + "são desativadas", + }, + }, + deck_locked_discover={ + name="Bloqueada", + text={ + "Descubra pelo menos", + "{C:attention}#1#{} itens da", + "sua coleção", + }, + }, + deck_locked_stake={ + name="Bloqueada", + text={ + "Vença uma tentativa com qualquer", + "baralho pelo menos na", + "dificuldade {V:1}#1#{}", + }, + }, + deck_locked_win={ + name="Bloqueada", + text={ + "Vença uma tentativa com", + "{C:attention}#1#{}", + "em qualquer dificuldade", + }, + }, + demo_locked={ + name="Bloqueada", + text={ + "Não disponível", + "neste demo", + }, + }, + demo_shop_locked={ + name="Bloqueada", + text={ + "Carta da coleção", + "pessoal do {C:attention}Jimbo", + "disponível na versão", + "completa de {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Eterna", + text={ + "Não é possível vender", + "ou destruir", + }, + }, + gold_seal={ + name="Selo Dourado", + text={ + "Ganhe {C:money}$3{} quando esta", + "carta é jogada", + "e pontua", + }, + }, + gold_sticker={ + name="Adesivo Dourado", + text={ + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta de Ouro{}", + }, + }, + green_sticker={ + name="Adesivo Verde", + text={ + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Verde{}", + }, + }, + joker_locked_legendary={ + name="Bloqueada", + text={ + "Encontre este Curinga", + "através da carta de {C:spectral}Alma{}", + }, + }, + locked={ + name="Bloqueada", + text={ + }, + }, + orange_sticker={ + name="Adesivo Laranja", + text={ + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Laranja{}", + }, + }, + p_arcana_jumbo={ + name="Pacote Arcano Jumbo", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:tarot} cartas de Tarô{} para", + "serem usadas imediatamente", + }, + }, + p_arcana_mega={ + name="Pacote Arcano Mega", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:tarot} cartas de Tarô{} para", + "serem usadas imediatamente", + }, + }, + p_arcana_normal={ + name="Pacote Arcano", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:tarot} cartas de Tarô{} para", + "serem usadas imediatamente", + }, + }, + p_buffoon_jumbo={ + name="Pacote Bufão Jumbo", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:joker} cartas Curinga{}", + }, + }, + p_buffoon_mega={ + name="Pacote Bufão Mega", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:joker} cartas Curinga{}", + }, + }, + p_buffoon_normal={ + name="Pacote Bufão", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:joker} cartas Curinga{}", + }, + }, + p_celestial_jumbo={ + name="Pacote Celestial Jumbo", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:planet} cartas de Planeta{} para", + "serem usadas imediatamente", + }, + }, + p_celestial_mega={ + name="Pacote Celestial Mega", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:planet} cartas de Planeta{} para", + "serem usadas imediatamente", + }, + }, + p_celestial_normal={ + name="Pacote Celestial", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:planet} cartas de Planeta{} para", + "serem usadas imediatamente", + }, + }, + p_spectral_jumbo={ + name="Pacote Espectral Jumbo", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:spectral} cartas Espectrais{} para", + "serem usadas imediatamente", + }, + }, + p_spectral_mega={ + name="Pacote Espectral Mega", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:spectral} cartas Espectrais{} para", + "serem usadas imediatamente", + }, + }, + p_spectral_normal={ + name="Pacote Espectral", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:spectral} cartas Espectrais{} para", + "serem usadas imediatamente", + }, + }, + p_standard_jumbo={ + name="Pacote Padrão Jumbo", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:attention} cartas de Jogo{} para", + "serem adicionadas ao seu baralho", + }, + }, + p_standard_mega={ + name="Pacote Padrão Mega", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:attention} cartas de Jogo{} para", + "serem adicionadas ao seu baralho", + }, + }, + p_standard_normal={ + name="Pacote Padrão", + text={ + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:attention} cartas de Jogo{} para", + "serem adicionadas ao seu baralho", + }, + }, + perishable={ + name="Perecível", + text={ + "Com desvantagem após", + "{C:attention}#1#{} rodadas", + "{C:inactive}(resta(m) {C:attention}#2#{C:inactive})", + }, + }, + pinned_left={ + name="Encurralado", + text={ + "Este Curinga permanece", + "encurralado na", + "posição mais à esquerda", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# de {V:1}#2# ", + }, + }, + purple_seal={ + name="Selo Roxo", + text={ + "Cria uma carta {C:tarot}Tarô{}", + "quando {C:attention}descartada", + "{C:inactive}(Deve ter espaço)", + }, + }, + purple_sticker={ + name="Adesivo Roxo", + text={ + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Roxa{}", + }, + }, + red_seal={ + name="Selo Vermelho", + text={ + "Reativa esta", + "carta {C:attention}1{} vez", + }, + }, + red_sticker={ + name="Adesivo Vermelho", + text={ + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Vermelha{}", + }, + }, + remove_negative={ + name="Negativo", + text={ + "{C:inactive,s:0.9}(Remove {C:dark_edition,s:0.9}Negativo{C:inactive,s:0.9} da cópia)", + }, + }, + rental={ + name="Aluguel", + text={ + "Perca {C:money}$#1#{} no", + "fim da rodada", + }, + }, + undiscovered_booster={ + name="Não descoberto", + text={ + "Abra este pacote", + "em uma tentativa sem código", + "para descobrir o que ele faz", + }, + }, + undiscovered_edition={ + name="Não descoberto", + text={ + "Encontre esta edição", + "em uma tentativa sem código", + "para descobrir o que ela faz", + }, + }, + undiscovered_joker={ + name="Não descoberto", + text={ + "Compre ou use", + "esta carta em uma", + "tentativa sem código", + "para descobrir o que ela faz", + }, + }, + undiscovered_planet={ + name="Não descoberto", + text={ + "Compre ou use", + "esta carta em uma", + "tentativa sem código", + "para descobrir o que ela faz", + }, + }, + undiscovered_spectral={ + name="Não descoberto", + text={ + "Compre ou use", + "esta carta em uma", + "tentativa sem código", + "para descobrir o que ela faz", + }, + }, + undiscovered_tag={ + name="Não descoberto", + text={ + "Use esta marca em", + "uma tentativa sem código", + "para descobrir o que ela faz", + }, + }, + undiscovered_tarot={ + name="Não descoberto", + text={ + "Compre ou use", + "esta carta em uma", + "tentativa sem código", + "para descobrir o que ela faz", + }, + }, + undiscovered_voucher={ + name="Não descoberto", + text={ + "Resgate este", + "cupom em uma", + "tentativa sem código", + "para descobrir o que ele faz", + }, + }, + white_sticker={ + name="Adesivo Branco", + text={ + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Branca{}", + }, + }, + wip_locked={ + name="Bloqueada", + text={ + "Em", + "construção", + }, + }, + }, + Planet={ + c_ceres={ + name="Ceres", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_earth={ + name="Terra", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_eris={ + name="Eris", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_jupiter={ + name="Júpiter", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_mars={ + name="Marte", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_mercury={ + name="Mercúrio", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_neptune={ + name="Neptuno", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_planet_x={ + name="Planeta X", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_pluto={ + name="Plutão", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_saturn={ + name="Saturno", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_uranus={ + name="Urano", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + c_venus={ + name="Vênus", + text={ + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas", + }, + }, + }, + Spectral={ + c_ankh={ + name="Ankh", + text={ + "Cria uma cópia de um", + "{C:attention}Curinga{} aleatório, destrói", + "todos os outros Curingas", + }, + }, + c_aura={ + name="Aura", + text={ + "Adiciona o efeito {C:dark_edition}Laminado{}, {C:dark_edition}Holográfico{}", + "ou {C:dark_edition}Policromático{} a", + "{C:attention}1{} carta selecionada na sua mão", + }, + }, + c_black_hole={ + name="Buraco Negro", + text={ + "Melhora cada", + "{C:legendary,E:1}mão de pôquer", + "em {C:attention}1{} nível", + }, + }, + c_cryptid={ + name="Criptídeo", + text={ + "Cria {C:attention}#1#{} cópias de", + "{C:attention}1{} carta selecionada", + "na sua mão", + }, + }, + c_deja_vu={ + name="Déjà vu", + text={ + "Adiciona um {C:red}Selo Vermelho{}", + "a {C:attention}1{} carta selecionada", + "na sua mão", + }, + }, + c_ectoplasm={ + name="Ectoplasma", + text={ + "Adiciona {C:dark_edition}Negativo{} a", + "um {C:attention}Curinga aleatório,", + "{C:red}-1{} de tamanho de mão", + }, + }, + c_familiar={ + name="Familiar", + text={ + "Destrói {C:attention}1{} carta", + "na sua mão, adiciona", + "{C:attention}#1#{} {C:attention}realeza Aprimorada", + "{C:attention}aleatórias{} na sua mão", + }, + }, + c_grim={ + name="Sombrio", + text={ + "Destrói {C:attention}1{} carta", + "aleatória na sua mão,", + "adiciona {C:attention}#1#{} {C:attention}Ases", + "{C:attention}aprimorado(s){} aleatório(s) na sua mão", + }, + }, + c_hex={ + name="Feitiço", + text={ + "Adiciona {C:dark_edition}Policromático{} a um", + "{C:attention}Curinga{} aleatório, destrói", + "todos os outros Curingas", + }, + }, + c_immolate={ + name="Imolação", + text={ + "Destrói {C:attention}#1#{} cartas", + "aleatórias na mão,", + "ganha {C:money}$#2#", + }, + }, + c_incantation={ + name="Encantamento", + text={ + "Destrói {C:attention}1{} carta", + "na sua mão, adiciona {C:attention}#1#", + "{C:attention}cartas Aprimoradas e numeradas", + "{C:attention}aleatórias{} na sua mão", + }, + }, + c_medium={ + name="Médium", + text={ + "Adiciona um {C:purple}Selo Roxo{}", + "a {C:attention}1{} carta selecionada", + "na sua mão", + }, + }, + c_ouija={ + name="Ouija", + text={ + "Converte todas as cartas", + "da mão em uma única", + "{C:attention}classe aleatória", + "{C:red}-1{} de tamanho de mão", + }, + }, + c_sigil={ + name="Símbolo", + text={ + "Converte todas as cartas", + "da mão em um único", + "{C:attention}naipe aleatório", + }, + }, + c_soul={ + name="A Alma", + text={ + "Cria um", + "Curinga {C:legendary,E:1}Lendário{}", + "{C:inactive}(Deve ter espaço)", + }, + }, + c_talisman={ + name="Talismã", + text={ + "Adiciona um {C:attention}Selo Dourado{}", + "a {C:attention}1{} carta", + "escolhida na sua mão", + }, + }, + c_trance={ + name="Transe", + text={ + "Adiciona um {C:blue}Selo Azul{}", + "a {C:attention}1{} carta selecionada", + "na sua mão", + }, + }, + c_wraith={ + name="Espectro", + text={ + "Cria um", + "{C:attention}Curinga{} {C:red}Raro,", + "define o dinheiro para {C:money}$0", + }, + }, + }, + Stake={ + stake_black={ + name="Aposta Preta", + text={ + "A loja pode ter Curingas {C:attention}Eternos{}", + "{C:inactive,s:0.8}{Não é possível vender ou destruir}", + "{s:0.8}Aplica todas as Apostas anteriores", + }, + }, + stake_blue={ + name="Aposta Azul", + text={ + "{C:red}-1{} Descarte", + "{s:0.8}Aplica todas as Apostas anteriores", + }, + }, + stake_gold={ + name="Aposta Dourada", + text={ + "A loja pode ter Curingas de {C:attention}Aluguel{}", + "{C:inactive,s:0.8}(Custa {C:money,s:0.8}$3{C:inactive,s:0.8} por rodada)", + "{s:0.8}Aplica-se a todas as Apostas anteriores", + }, + }, + stake_green={ + name="Aposta Verde", + text={ + "A pontuação necessária escala", + "cada vez mais rapidamente com cada {C:attention}Aposta", + "{s:0.8}Aplica todas as Apostas anteriores", + }, + }, + stake_orange={ + name="Aposta Laranja", + text={ + "A loja pode ter Curingas {C:attention}Perecíveis{}", + "{C:inactive,s:0.8}(Com desvantagem após 5 Rodadas)", + "{s:0.8}Aplica-se a todas as Apostas anteriores", + }, + }, + stake_purple={ + name="Aposta Roxa", + text={ + "A pontuação necessária escala", + "cada vez mais rapidamente com cada {C:attention}Aposta", + "{s:0.8}Aplica todas as Apostas anteriores", + }, + }, + stake_red={ + name="Aposta Vermelha", + text={ + "{C:attention}Small Blind{} não dá", + "recompensas em dinheiro", + "{s:0.8}Aplica todas as Apostas anteriores", + }, + }, + stake_white={ + name="Aposta Branca", + text={ + "Dificuldade Base", + }, + }, + }, + Tag={ + tag_boss={ + name="Marca de Chefe", + text={ + "Atualiza o", + "{C:attention}Blind de Chefe", + }, + }, + tag_buffoon={ + name="Marca de Bufão", + text={ + "Oferece gratuitamente um", + "{C:attention}Pacote Bufão", + }, + }, + tag_charm={ + name="Marca de Amuleto", + text={ + "Oferece gratuitamente um", + "{C:tarot}Pacote Arcano Mega", + }, + }, + tag_coupon={ + name="Marca de Cupom", + text={ + "Cartas iniciais e", + "pacotes de reforço na próxima", + "loja ficam gratuitos", + }, + }, + tag_d_six={ + name="Marca D6", + text={ + "Atualização na próxima loja", + "começa em {C:money}$0", + }, + }, + tag_double={ + name="Marca Dupla", + text={ + "Oferece uma cópia da", + "próxima {C:attention}Marca{} selecionada", + "{s:0.8,C:attention}Marca Dupla{s:0.8} excluída", + }, + }, + tag_economy={ + name="Marca Econômica", + text={ + "Duplica o seu dinheiro", + "{C:inactive}(Máximo de {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="Marca Etérea", + text={ + "Oferece gratuitamente um", + "{C:planet}Pacote Espectral", + }, + }, + tag_foil={ + name="Marca Laminada", + text={ + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Laminado", + }, + }, + tag_garbage={ + name="Marca de Lixo", + text={ + "Dá {C:money}$#1#{} por", + "{C:red}descarte{} não usado nesta rodada", + "{C:inactive}(Dará {C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="Marca Útil", + text={ + "Dá {C:money}$#1#{} por", + "{C:blue}mão{} jogada nesta tentativa", + "{C:inactive}(Dará {C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="Marca Holográfica", + text={ + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Holográfico", + }, + }, + tag_investment={ + name="Marca de Investimento", + text={ + "Após derrotar", + "o Blind de Chefe,", + "ganhe {C:money}$#1#", + }, + }, + tag_juggle={ + name="Marca de Malabarismo", + text={ + "{C:attention}+#1#{} tamanho de mão", + "próxima rodada", + }, + }, + tag_meteor={ + name="Marca de Meteoro", + text={ + "Oferece gratuitamente um", + "{C:planet}Pacote Celestial Mega", + }, + }, + tag_negative={ + name="Marca Negativa", + text={ + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Negativo", + }, + }, + tag_orbital={ + name="Marca Orbital", + text={ + "Melhora {C:attention}#1#", + "em {C:attention}#2# níveis", + }, + }, + tag_polychrome={ + name="Marca Policromática", + text={ + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Policromático", + }, + }, + tag_rare={ + name="Marca Rara", + text={ + "A loja tem um", + "{C:red}Curinga Raro grátis", + }, + }, + tag_skip={ + name="Marca Veloz", + text={ + "Dá {C:money}$#1#{} por", + "Blind ignorado nesta tentativa", + "{C:inactive}(Dará {C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="Marca Padrão", + text={ + "Oferece gratuitamente um", + "{C:attention}Pacote Padrão Mega", + }, + }, + tag_top_up={ + name="Marca de Abastecimento", + text={ + "Cria até {C:attention}#1#", + "Curingas {C:blue}Comuns{}", + "{C:inactive}(Deve ter espaço)", + }, + }, + tag_uncommon={ + name="Marca Incomum", + text={ + "A loja tem um", + "{C:green}Curinga Incomum grátis", + }, + }, + tag_voucher={ + name="Marca de Cupom", + text={ + "Adiciona um {C:voucher}Cupom", + "à próxima loja", + }, + }, + }, + Tarot={ + c_chariot={ + name="A Carruagem", + text={ + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#", + }, + }, + c_death={ + name="Morte", + text={ + "Selecione {C:attention}#1#{} cartas,", + "converta a carta da {C:attention}esquerda{}", + "na carta da {C:attention}direita{}", + "{C:inactive}(Arraste para reorganizar)", + }, + }, + c_devil={ + name="O Demônio", + text={ + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="O Imperador", + text={ + "Cria até {C:attention}#1#", + "cartas de {C:tarot}Tarô{} aleatórias", + "{C:inactive}(Deve ter espaço)", + }, + }, + c_empress={ + name="A Imperatriz", + text={ + "Aprimora {C:attention}#1#", + "cartas selecionadas para", + "{C:attention}#2#s", + }, + }, + c_fool={ + name="O Tolo", + text={ + "Cria a última", + "carta de {C:tarot}Tarô{} ou {C:planet}Planeta{}", + "usada durante esta tentativa", + "{s:0.8,C:tarot}O Tolo{s:0.8} excluído", + }, + }, + c_hanged_man={ + name="O Enforcado", + text={ + "Destrói até", + "{C:attention}#1#{} cartas selecionadas", + }, + }, + c_heirophant={ + name="O Hierofante", + text={ + "Aprimora {C:attention}#1#", + "cartas selecionadas para", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="O Eremita", + text={ + "Duplica o dinheiro", + "{C:inactive}(Máximo de {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="A Sacerdotisa", + text={ + "Cria até {C:attention}#1#", + "cartas de {C:planet}Planeta{} aleatórias", + "{C:inactive}(Deve ter espaço)", + }, + }, + c_judgement={ + name="Julgamento", + text={ + "Cria uma", + "carta {C:attention}Curinga{} aleatória", + "{C:inactive}(Deve ter espaço)", + }, + }, + c_justice={ + name="Justiça", + text={ + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="Os Amantes", + text={ + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#", + }, + }, + c_magician={ + name="O Mago", + text={ + "Aprimora {C:attention}#1#{}", + "cartas selecionadas para", + "{C:attention}#2#s", + }, + }, + c_moon={ + name="A Lua", + text={ + "Converte até", + "{C:attention}#1#{} cartas selecionadas", + "para {V:1}#2#{}", + }, + }, + c_star={ + name="A Estrela", + text={ + "Converte até", + "{C:attention}#1#{} cartas selecionadas", + "para {V:1}#2#{}", + }, + }, + c_strength={ + name="Força", + text={ + "Aumenta a classe de", + "até {C:attention}#1#{} cartas", + "selecionadas em {C:attention}1", + }, + }, + c_sun={ + name="O Sol", + text={ + "Converte até", + "{C:attention}#1#{} cartas selecionadas", + "para {V:1}#2#{}", + }, + }, + c_temperance={ + name="Temperança", + text={ + "Dá o valor total", + "de venda de todos os", + "Curingas atuais {C:inactive}(Máximo de {C:money}$#1#{C:inactive})", + "{C:inactive}(No momento {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="A Torre", + text={ + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="A Roda da Fortuna", + text={ + "Chance de {C:green}#1# em #2#{} de adicionar", + "edição {C:dark_edition}Laminada{}, {C:dark_edition}Holográfica{} ou", + "{C:dark_edition}Policromática{}", + "a um {C:attention}Curinga aleatório", + }, + }, + c_world={ + name="O Mundo", + text={ + "Converte até", + "{C:attention}#1#{} cartas selecionadas", + "para {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Antimatéria", + text={ + "{C:dark_edition}+1{} Espaço de Curinga", + }, + unlock={ + "Resgata {C:voucher}Em Branco{}", + "um total de {C:attention}#1#{} vezes", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="Em Branco", + text={ + "{C:inactive}Não faz nada?", + }, + }, + v_clearance_sale={ + name="Promoção", + text={ + "Todas as cartas e pacotes na", + "loja têm {C:attention}#1#%{} de desconto", + }, + }, + v_crystal_ball={ + name="Bola de Cristal", + text={ + "{C:attention}+1{} espaço de consumível", + }, + }, + v_directors_cut={ + name="Edição do Diretor", + text={ + "Atualiza Blind de Chefe", + "{C:attention}1{} vez por Aposta,", + "{C:money}$#1#{} por lançamento", + }, + }, + v_glow_up={ + name="Brilhando", + text={ + "Cartas {C:dark_edition}Laminadas{}, {C:dark_edition}Holográficas{} e", + "{C:dark_edition}Policromáticas{}", + "aparecem {C:attention}#1#X{} mais frequentemente", + }, + unlock={ + "Tenha pelo menos {C:attention}#1#", + "cartas de {C:attention}Curinga{} com", + "edição {C:dark_edition}Laminada{}, {C:dark_edition}Holográfica{} ou", + "{C:dark_edition}Policromática{}", + }, + }, + v_grabber={ + name="Agarrador", + text={ + "Ganha", + "permanentemente {C:blue}+#1#{} mão", + "por rodada", + }, + }, + v_hieroglyph={ + name="Hieróglifo", + text={ + "{C:attention}-#1#{} de Aposta,", + "{C:blue}-#1#{} mão", + "a cada rodada", + }, + }, + v_hone={ + name="Apuramento", + text={ + "Cartas {C:dark_edition}Laminadas{}, {C:dark_edition}Holográficas{} e", + "{C:dark_edition}Policromáticas{}", + "aparecem {C:attention}#1#X{} mais frequentemente", + }, + }, + v_illusion={ + name="Ilusão", + text={ + "{C:attention}Cartas de jogo{} na loja", + "pode ter um {C:enhanced}Aprimoramento{},", + "{C:dark_edition}Edição{} e/ou um {C:attention}Selo{}", + }, + unlock={ + "Compre um total de", + "{C:attention}#1#{} cartas de jogo", + "na loja", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Super Promoção", + text={ + "Todas as cartas e pacotes na", + "loja têm {C:attention}#1#%{} de desconto", + }, + unlock={ + "Resgate pelo menos", + "cartas de{C:attention}#1#{C:voucher} Cupom{}", + "em uma tentativa", + }, + }, + v_magic_trick={ + name="Truque de Mágica", + text={ + "{C:attention}Cartas de jogo{} podem", + "ser compradas", + "na {C:attention}loja", + }, + }, + v_money_tree={ + name="Árvore de Dinheiro", + text={ + "Eleva o limite de", + "juros ganhos em", + "cada rodada para {C:money}$#1#{}", + }, + unlock={ + "Maximiza os juros", + "por lucros de rodada por", + "{C:attention}#1#{} rodadas consecutivas", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Mão Boba", + text={ + "Ganha", + "permanentemente {C:blue}+#1#{} mão", + "por rodada", + }, + unlock={ + "Jogue um total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Observatório", + text={ + "Cartas de {C:planet}Planeta{} na sua", + "área de {C:attention}consumíveis{} dão", + "{X:red,C:white} X#1# {} Multi pela", + "{C:attention}mão de pôquer especificada", + }, + unlock={ + "Use um total de {C:attention}#1#", + "cartas de {C:planet}Planeta{} de qualquer", + "{C:planet}Pacote Celestial", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Globo Auspicioso", + text={ + "Cartas {C:spectral}Espectrais{} podem", + "aparecer em qualquer um", + "dos {C:attention}Pacotes Arcanos", + }, + unlock={ + "Use um total de {C:attention}#1#", + "cartas de {C:tarot}Tarô{} de qualquer", + "{C:tarot}Pacote Arcano", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Estoque", + text={ + "{C:attention}+1{} espaço de carta", + "disponível na loja", + }, + }, + v_overstock_plus={ + name="Excesso de Estoque", + text={ + "{C:attention}+1{} espaço de carta", + "disponível na loja", + }, + unlock={ + "Gaste um total de", + "{C:money}$#1#{} na loja", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="Pincel", + text={ + "{C:attention}+#1#{} tamanho de mão", + }, + }, + v_palette={ + name="Paleta", + text={ + "{C:attention}+#1#{} tamanho de mão", + }, + unlock={ + "Reduz o tamanho da mão", + "para {C:attention}#1#{} cartas", + }, + }, + v_petroglyph={ + name="Petróglifo", + text={ + "{C:attention}-#1#{} de Aposta,", + "{C:red}-#1#{} descarte", + "a cada rodada", + }, + unlock={ + "Alcance", + "Nível de Aposta {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Comerciante de Planetas", + text={ + "Cartas de {C:planet}Planeta{} aparecem", + "{C:attention}#1#X{} mais frequentemente", + "na loja", + }, + }, + v_planet_tycoon={ + name="Magnata dos Planetas", + text={ + "Cartas de {C:planet}Planeta{} aparecem", + "{C:attention}#1#X{} mais frequentemente", + "na loja", + }, + unlock={ + "Compre um total de", + "{C:attention}#1#{C:planet} cartas de Planeta{}", + "na loja", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Reciclomancia", + text={ + "Ganha", + "permanentemente {C:red}+#1#{} descarte", + "a cada rodada", + }, + unlock={ + "Descarte um total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Excesso de Atualizações", + text={ + "Custo de Atualizações", + "{C:money}$#1#{} a menos", + }, + unlock={ + "Atualize a loja um", + "total de {C:attention}#1#{} vezes", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Atualizações", + text={ + "Custo de Atualizações", + "{C:money}$#1#{} a menos", + }, + }, + v_retcon={ + name="Refazer", + text={ + "Atualiza Blind de Chefe", + "{C:attention}ilimitadas{} vezes,", + "{C:money}$#1#{} por lançamento", + }, + unlock={ + "Descubra", + "{C:attention}#1#{} Blinds", + }, + }, + v_seed_money={ + name="Dinheiro Inicial", + text={ + "Eleva o limite de", + "juros ganhos em", + "cada rodada para {C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="Comerciante de Tarô", + text={ + "Cartas de {C:tarot}Tarô{} aparecem", + "{C:attention}#1#X{} mais frequentemente", + "na loja", + }, + }, + v_tarot_tycoon={ + name="Magnata do Tarô", + text={ + "Cartas de {C:tarot}Tarô{} aparecem", + "{C:attention}#1#X{} mais frequentemente", + "na loja", + }, + unlock={ + "Compre um total de", + "{E:1,C:attention}#1# cartas de {C:tarot}Tarô{}", + "na loja", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Telescópio", + text={ + "{C:attention}Pacotes Celestiais{} sempre", + "têm a carta de {C:planet}Planeta{}", + "para a", + "{C:attention}mão de pôquer mais jogada", + }, + }, + v_wasteful={ + name="Desperdício", + text={ + "Ganha", + "permanentemente {C:red}+#1#{} descarte", + "a cada rodada", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Pontue 100.000.000 Fichas com uma só mão", + _1000k="Pontue 1.000.000 Fichas com uma só mão", + _10k="Pontue 10.000 Fichas com uma só mão", + ante_up="Alcance Aposta 4", + ante_upper="Alcance Aposta 8", + astronomy="Descubra todas as cartas de Planeta", + big_hands="Tenha 80 cartas ou mais no seu baralho", + card_discarder="Descarte no mínimo 2500 cartas", + card_player="Jogue no mínimo 2500 cartas", + cartomancy="Descubra todas as cartas de Tarô", + clairvoyance="Descubra todas as cartas Espectrais", + completionist="Descubra 100% da sua coleção", + completionist_plus="Vença com todos os baralhos na dificuldade Aposta Dourada", + completionist_plus_plus="Ganhe um Adesivo Dourado em cada Curinga", + extreme_couponer="Descubra todos os Cupons", + flushed="Jogue um Flush com 5 Cartas Curinga", + heads_up="Vença uma Tentativa", + high_stakes="Vença uma tentativa com no mínimo a dificuldade Aposta Dourada", + legendary="Descubra um Curinga Lendário", + low_stakes="Vença uma tentativa com no mínimo a dificuldade Aposta Vermelha", + mid_stakes="Vença uma tentativa com no mínimo a dificuldade Aposta Negra", + nest_egg="Tenha $400 ou mais durante uma única tentativa", + retrograde="Suba o nível de qualquer mão de pôquer até o 10", + roi="Compre 5 Cupons em Aposta 4", + royale="Jogue um Royal Flush", + rule_bender="Complete qualquer tentativa de desafio", + rule_breaker="Complete todas as tentativas de desafio", + shattered="Quebre 2 Cartas de Vidro em uma mão", + speedrunner="Vença uma tentativa em 12 ou menos rodadas", + tiny_hands="Reduza o seu baralho para 20 cartas ou menos.", + you_get_what_you_get="Vença uma tentativa sem atualizar a loja", + }, + achievement_names={ + _100000k="100 Milhões", + _1000k="1 Milhão", + _10k="10 Mil", + ante_up="Aumento de Aposta!", + ante_upper="Aumento Maior de Aposta!", + astronomy="Astronomia", + big_hands="Mãos Grandes", + card_discarder="Descartador de Cartas", + card_player="Jogador de Cartas", + cartomancy="Cartomancia", + clairvoyance="Clarividência", + completionist="Complecionista", + completionist_plus="Complecionista+", + completionist_plus_plus="Complecionista++", + extreme_couponer="Apreciador de Cupons", + flushed="Cheio de Dinheiro", + heads_up="Atenção", + high_stakes="Aposta Alta", + legendary="Lendário", + low_stakes="Aposta Baixa", + mid_stakes="Aposta Média", + nest_egg="Pé de Meia", + retrograde="Retrógrado", + roi="Retorno de Investimento", + royale="Royale", + rule_bender="Manipulador de Regras", + rule_breaker="Quebrador de Regras", + shattered="Quebrado", + speedrunner="Speedrunner", + tiny_hands="Mãos Pequenas", + you_get_what_you_get="É o que É", + }, + blind_states={ + Current="Atual", + Defeated="Derrotado", + Select="Selecionar", + Selected="Selecionado", + Skipped="Ignorado", + Upcoming="Próximo", + }, + challenge_names={ + c_blast_off_1="Decolar", + c_bram_poker_1="Bram Pôquer", + c_city_1="Cidade dos 15 Minutos", + c_cruelty_1="Crueldade", + c_double_nothing_1="O Dobro ou Nada", + c_five_card_1="Saque de Cinco Cartas", + c_fragile_1="Frágil", + c_golden_needle_1="Agulha Dourada", + c_inflation_1="Inflação", + c_jokerless_1="Sem Curinga", + c_knife_1="No Fio da Navalha", + c_luxury_1="Imposto de Luxo", + c_mad_world_1="Mundo Maluco", + c_medusa_1="Medusa", + c_monolith_1="Monólito", + c_non_perishable_1="Não Perecível", + c_omelette_1="A Omelete", + c_rich_1="Ricos ficam Mais Ricos", + c_typecast_1="Estereótipo", + c_xray_1="Visão de Raio X", + }, + collabs={ + Clubs={ + ["1"]="Padrão", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="Padrão", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="Padrão", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="Padrão", + ["2"]="The Witcher", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="Perguntas frequentes", + b_and_use="E USAR", + b_back="Voltar", + b_blinds="Blinds", + b_booster_packs="Pacotes de Reforço", + b_buy="COMPRAR", + b_cash_out="Pegar a Grana", + b_challenges="Desafios", + b_collection="Coleção", + b_collection_cap="COLEÇÃO", + b_continue="Continuar", + b_copy="Cópia", + b_copy_seed="Copiar Código", + b_create_profile="Criar Perfil", + b_credits="Créditos", + b_current_profile="Perfil Atual", + b_customize_deck="Personalizar o baralho", + b_deck="Baralho", + b_decks="Baralhos", + b_delete_profile="Eliminar Perfil", + b_discard="Descartar", + b_editions="Edições", + b_endless="Modo Infinito", + b_enhanced_cards="Cartas Aprimoradas", + b_full_deck="Baralho Completo", + b_high_contrast_cards="Carta de Alto Contraste", + b_how_to_play="Como jogar", + b_imagery="Exibição", + b_jokers="Curingas", + b_load_profile="Carregar Perfil", + b_main_menu="Menu Principal", + b_music="Música", + b_new_challenge="Iniciar Novo Desafio", + b_new_run="Nova Tentativa", + b_next="Próxima", + b_next_round_1="Próxima", + b_next_round_2="Rodada", + b_open="ABRIR", + b_options="Opções", + b_options_cap="OPÇÕES", + b_planet_cards="Cartas de Planeta", + b_play_cap="JOGAR", + b_play_hand="Jogar mão", + b_playbalatro="Visite playbalatro.com", + b_poker_hands="Mãos de Pôquer", + b_quit_cap="SAIR", + b_redeem="RESGATAR", + b_reduced_motion="Animação de Fundo Reduzida", + b_remaining="Restante(s)", + b_reroll_boss="Atualizar Chefe", + b_reset_profile="Redefinir Perfil", + b_restrictions="Restrições", + b_retry="Tentar novamente", + b_rules="Regras", + b_run_info_1="da Tentativa", + b_run_info_2="Informação", + b_seals="Selos", + b_seed="Código", + b_select="SELECIONAR", + b_sell="VENDER", + b_set_CRT="CRT", + b_set_CRT_bloom="Brilho CRT", + b_set_apply="Aplicar", + b_set_audio="Áudio", + b_set_crash_reports="Relatórios de Falha", + b_set_game="Jogo", + b_set_game_vol="Volume do Jogo", + b_set_gamespeed="Velocidade de Jogo", + b_set_graphics="Gráficos", + b_set_master_vol="Volume Principal", + b_set_monitor="Monitor de Exibição", + b_set_music_vol="Volume da Música", + b_set_pixel_smoothing="Filtro de Pixel Art", + b_set_play_discard_pos="Posição do Botão Jogar/Descartar", + b_set_rumble="Vibração do Controle", + b_set_screenshake="Vibração da Tela", + b_set_shadows="Sombras", + b_set_vibration="Vibração", + b_set_video="Vídeo", + b_set_windowmode="Modo Janela", + b_settings="Configurações", + b_skip="Ignorar", + b_skip_blind="Ignorar Blind", + b_skip_reward="Ignorar Recompensa", + b_sort_hand="Organizar Mão", + b_sounds="Sons", + b_spectral_cards="Cartas Espectrais", + b_stake="Aposta", + b_start_new_run="Nova Tentativa", + b_stat_consumables="Consumíveis", + b_stat_jokers="Curingas", + b_stat_planets="Planetas", + b_stat_spectrals="Espectrais", + b_stat_tarots="Tarôs", + b_stat_vouchers="Cupons", + b_stats="Estatísticas", + b_tags="Marcas", + b_tarot_cards="Cartas de Tarô", + b_unlock_all="Desbloquear Tudo", + b_use="USAR", + b_vouchers="Cupons", + b_wishlist="Adicionar à lista de desejos da Steam", + k_aces="Ases", + k_achievement="Conquista", + k_achievements_disabled="Conquistas Desativadas", + k_active="ativo", + k_active_ex="Ativo!", + k_again_ex="De novo!", + k_all_hands="Todas as Mãos", + k_also_applied="Também aplicado", + k_ante="Aposta", + k_ante_cap="APOSTA", + k_arcana_pack="Pacote Arcano", + k_balanced="Equilibrado", + k_banned_cards="Cartas Banidas", + k_banned_tags="Marcas Banidas", + k_base_cap="BASE", + k_base_cards="Cartas base", + k_best_hand="Melhor Mão", + k_booster="Reforço", + k_buffoon_pack="Pacote Bufão", + k_cap_consumables="CONSUMÍVEIS", + k_card_stats="Estatísticas de Carta", + k_celestial_pack="Pacote Celestial", + k_challenge_mode="Modo Desafio", + k_challenges="Desafios", + k_choose="Escolha", + k_collection="Coleção", + k_common="Comum", + k_compatible="compatível", + k_copied_ex="Copiou!", + k_custom_rules="Regras Personalizadas", + k_daily_run="Tentativa Diária", + k_debuffed="Com desvantagem", + k_deck="Baralho", + k_deck_stake_wins="Vitórias de Aposta de Baralho", + k_defeated_by="Derrotado por", + k_demo_version_ex="Versão de Demonstração!", + k_disabled_ex="Desativou!", + k_drank_ex="Bebeu!", + k_duplicated_ex="Duplicado!", + k_dwarf_planet="Planeta Anão", + k_eaten_ex="Comido!", + k_edition="Edição", + k_effective="Funcional:", + k_empty_caps="VAZIO", + k_enter_name="Inserir Nome", + k_enter_seed="Inserir código", + k_enter_text="Inserir Texto", + k_eroded_ex="Derretido!", + k_extinct_ex="Extinto!", + k_face_cards="Cartas de Realeza", + k_game_modifiers="Modificadores de Jogo", + k_gold="Ouro", + k_high_score_ex="Pontuação Alta!", + k_hud_discards="Descartes", + k_hud_hands="Mãos", + k_incompatible="incompatível", + k_joker="Curinga", + k_joker_stickers="Adesivos de Curingas", + k_jokers_cap="CURINGAS", + k_legendary="Lendário", + k_level_prefix="nv.", + k_level_up_ex="Subiu de nível!", + k_locked="Bloqueada", + k_lower_score="Pontuação", + k_lvl="nv.", + k_melted_ex="Derreteu!", + k_money="Dinheiro", + k_mult="Multi", + k_no_other_jokers="Sem outros Curingas!", + k_no_reward="Sem Recompensa", + k_no_room_ex="Sem Espaço!", + k_no_space_ex="Sem Espaço!", + k_none="Nada", + k_nope_ex="Não!", + k_not_allowed_ex="Não Permitido!", + k_not_discovered="Não descoberto", + k_numbered_cards="Cartas Numeradas", + k_or="ou", + k_other="Outro(a)", + k_page="Página", + k_planet="Planeta", + k_planet_q="Planeta?", + k_playing_as="Jogando como", + k_plus_joker="+1 Curinga", + k_plus_planet="+1 Planeta", + k_plus_spectral="+1 Espectral", + k_plus_stone="+1 Pedras", + k_plus_tarot="+1 Tarô", + k_poker_hand="mão de pôquer", + k_profile="Perfil", + k_progress="Progresso", + k_rank="Classe", + k_rare="Raro", + k_redeemed_ex="Resgatado!", + k_reroll="Atualizar", + k_reset="Redefinir", + k_reward="Recompensa", + k_round="da Rodada", + k_safe_ex="Seguro!", + k_saved_ex="Salvou!", + k_seed="Código", + k_seeded_run="Tentativa com Código", + k_skipped_cap="IGNORADO(A)", + k_spectral="Espectral", + k_spectral_pack="Pacote Espectral", + k_stake="Aposta", + k_stake_level="Nível de Aposta", + k_standard_pack="Pacote Padrão", + k_suit="Naipe", + k_swapped_ex="Trocou!", + k_tarot="Tarô", + k_trophies_disabled="Troféus Desativados", + k_trophy="Troféu", + k_uncommon="Incomum", + k_undisovered="Não Descoberto", + k_unknown="?????", + k_unlocked_ex="Desbloqueado!", + k_upgrade_ex="Melhoria!", + k_val_up="Aumento de Valor!", + k_view="Ver", + k_voucher="Cupom", + k_vouchers_cap="CUPONS", + k_wins="Vitórias", + k_x_base="Base X", + ml_bloom_opt={ + "Desl.", + "Lig.", + }, + ml_buy_and_use_target={ + "COMPRAR", + "E USAR", + }, + ml_buy_target={ + "COMPRAR", + }, + ml_card_stats={ + "Carta", + "Estatísticas", + }, + ml_controller_required={ + "Um controle é necessário para jogar.", + "Conecte um controle para continuar.", + }, + ml_crash_report_info={ + "Relatórios de falhas serão enviados para o desenvolvedor", + "para ajudar a corrigir os problemas no futuro. Nenhuma", + "informação de identificação ou pessoal será enviada.", + }, + ml_demo_thanks_message={ + "Considere colocar", + "Balatro na lista de desejos da Steam e se inscrever", + "na newsletter em playbalatro.com", + }, + ml_disabled_seed={ + "Todos os Desbloqueios e", + "Descobertas desativados", + }, + ml_edition_seal_enhancement_explanation={ + "As cartas de jogo podem ter", + "Aprimoramento, Edição e Selo", + }, + ml_eternal={ + "Eterno", + "Não é possível vender", + "ou destruir", + }, + ml_gold_seal_desc={ + "Selo Dourado", + "retorna para a mão", + "quando jogada", + }, + ml_offline_message={ + "O dispositivo está off-line.", + "O salvamento atual pode estar desatualizado. ", + }, + ml_open_target={ + "ABRIR", + }, + ml_paste_seed={ + "Colar", + "Código", + }, + ml_play_discard_pos_opt={ + "Descartar/Jogar", + "Jogar/Descartar", + }, + ml_redeem_target={ + "RESGATAR", + }, + ml_sell_target={ + "VENDER", + }, + ml_shadow_opt={ + "Lig.", + "Desl.", + }, + ml_smoothing_opt={ + "Desl.", + "Lig.", + }, + ml_unlock_all_explanation={ + "AVISO! Liberar a Coleção completa", + "desativará as conquistas para este perfil!", + }, + ml_unlock_all_trophies={ + "AVISO! Liberar a Coleção completa", + "desativará os troféus para este perfil!", + }, + ml_vsync_opt={ + "Sinc. Vertical Lig.", + "Sinc. Vertical Desl.", + }, + ml_windowmode_opt={ + "Janela", + "Tela Cheia", + "Sem Bordas", + }, + ph_1_level="+1 nível", + ph_4_7_of_clubs="quatro 7 de Paus", + ph_alert_debuff_confirm="Pressione 'Jogar' novamente para confirmar", + ph_all_poker_hand="Todas as Mãos de Pôquer", + ph_blind_reward="Recompensa: ", + ph_blind_score_at_least="Pontue pelo menos", + ph_boss_disabled="Chefe Desativado!", + ph_choose_blind_1="Escolha seu", + ph_choose_blind_2="próximo Blind", + ph_click_confirm="Pressione novamente para confirmar", + ph_deck_preview_effective="Funcional graças ao total de Curingas, Blinds e aprimoramentos de carta", + ph_deck_preview_stones="Pedras", + ph_defeat_the_boss="Derrote o Blind de Chefe", + ph_defeat_this_blind_1="Derrote este Blind", + ph_defeat_this_blind_2="para descobrir", + ph_demo_thanks_1="Obrigado por jogar a", + ph_demo_thanks_2="DEMO DE BALATRO", + ph_display_stickers="Exibir adesivos de aposta durante a tentativa", + ph_game_over="FIM DE JOGO", + ph_improve_run="Melhore a sua tentativa!", + ph_most_played="{mão mais jogada}", + ph_mr_bones="Salvo pelo Sr. Osso", + ph_no_boss_active="sem chefe ativo", + ph_no_vouchers="Nenhum cupom resgatado nesta tentativa", + ph_score_at_least="Pontue pelo menos", + ph_score_cards_discarded="Cartas Descartadas", + ph_score_cards_played="Mãos Jogadas", + ph_score_cards_purchased="Cartas Compradas", + ph_score_furthest_ante="Aposta", + ph_score_furthest_round="Rodada", + ph_score_hand="Melhor Mão", + ph_score_new_collection="Novas Descobertas", + ph_score_poker_hand="Mão Mais Jogada", + ph_score_times_rerolled="Vezes em que Atualizou", + ph_select_challenge="Escolha um Desafio", + ph_sneak_peek="Espiadinha", + ph_stat_consumable="Número de vezes que esta carta foi usada", + ph_stat_joker="Total de rodadas concluídas com esta carta", + ph_stat_voucher="Número de vezes que este Cupom foi resgatado", + ph_unscored_hand="A mão não pontuará", + ph_up_ante_1="Aumentar a Aposta", + ph_up_ante_2="Aumentar todos os Blinds", + ph_up_ante_3="Atualizar Blinds", + ph_vouchers_redeemed="Cupons resgatados nesta tentativa", + ph_you_win="VOCÊ VENCEU!", + ph_you_win_demo="VOCÊ VENCEU NA DEMO!", + }, + high_scores={ + boss_streak="Maior Número de Chefes Consecutivos", + collection="Coleção", + current_streak="", + furthest_ante="Aposta Mais Alta", + furthest_round="Rodada Mais Alta", + hand="Melhor Mão", + most_money="Maior Quantidade de Dinheiro", + poker_hand="Mão Mais Jogada", + win_streak="Melhor Sequência de Vitórias", + }, + labels={ + blue_seal="Selo Azul", + common="Comum", + eternal="Eterna", + foil="Laminado", + gold_seal="Selo Dourado", + holographic="Holográfico", + legendary="Lendário", + locked="Bloqueada", + negative="Negativo", + perishable="Perecível", + pinned_left="Encurralada", + planet="Planeta", + pluto_planet="Planeta Anão", + polychrome="Policromático", + purple_seal="Selo Roxo", + rare="Raro", + red_seal="Selo Vermelho", + rental="Aluguel", + tarot="Tarô", + uncommon="Incomum", + voucher="Cupom", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 cartas com a mesma classe", + }, + Flush={ + "5 cartas com o mesmo naipe", + }, + ["Flush Five"]={ + "5 cartas com a mesma classe e naipe", + }, + ["Flush House"]={ + "Uma Trinca e um Par com", + "todas as cartas tendo o mesmo naipe", + }, + ["Four of a Kind"]={ + "4 cartas com a mesma classe. Elas podem", + "ser jogadas com 1 outra carta não pontuada", + }, + ["Full House"]={ + "Uma Trinca e um Par", + }, + ["High Card"]={ + "Se a mão jogada não for uma das mãos", + "acima, somente as cartas de classe mais alta pontuarão", + }, + Pair={ + "2 cartas com a mesma classe. Elas podem", + "ser jogadas com até 3 outras cartas não pontuadas", + }, + ["Royal Flush"]={ + "5 cartas em sequência {classes consecutivas} com", + "todas as cartas tendo o mesmo naipe", + }, + Straight={ + "5 cartas em sequência {classes consecutivas}", + }, + ["Straight Flush"]={ + "5 cartas em sequência {classes consecutivas} com", + "todas as cartas tendo o mesmo naipe", + }, + ["Three of a Kind"]={ + "3 cartas com a mesma classe. Elas podem ser", + "jogadas com até 2 outras cartas não pontuadas", + }, + ["Two Pair"]={ + "2 pares de cartas com classes diferentes, podem", + "ser jogadas com 1 outra carta não pontuada", + }, + }, + poker_hands={ + ["Five of a Kind"]="Five of a Kind", + Flush="Flush", + ["Flush Five"]="Flush Five", + ["Flush House"]="Flush House", + ["Four of a Kind"]="Quadra", + ["Full House"]="Full House", + ["High Card"]="Carta Alta", + Pair="Par", + ["Royal Flush"]="Royal Flush", + Straight="Sequência", + ["Straight Flush"]="Straight Flush", + ["Three of a Kind"]="Trinca", + ["Two Pair"]="Dois Pares", + }, + quips={ + dq_1={ + "Nossa, espero que você", + "tenha alguns truques", + "na manga para", + "este desafio final!", + }, + lq_1={ + "Talvez jogar", + "Mico Doido combine", + "mais com você...", + }, + lq_10={ + "Que fracasso!", + }, + lq_2={ + "Fomos completamente", + "derrotados!", + }, + lq_3={ + "Está na hora", + "de embaralhar", + "e tentar outra vez!", + }, + lq_4={ + "Você sabe o", + "que costumam dizer,", + "a casa sempre vence!", + }, + lq_5={ + "Parece que", + "descobrimos quem é", + "o verdadeiro Curinga!", + }, + lq_6={ + "Oh não, você também", + "estava blefando?", + }, + lq_7={ + "Parece que", + "fomos enganados!", + }, + lq_8={ + "Se eu tivesse mãos", + "acho que tinha", + "tampado os meus olhos!", + }, + lq_9={ + "Sou, literalmente,", + "um bobo, qual é a", + "sua desculpa?", + }, + wq_1={ + "Mandou Bem!", + }, + wq_2={ + "Você lidou com", + "isso muito bem!", + }, + wq_3={ + "Parece que você", + "não estava blefando!", + }, + wq_4={ + "É uma pena", + "estas fichas serem", + "virtuais...", + }, + wq_5={ + "Parece que", + "ensinei direitinho!", + }, + wq_6={ + "Você fez umas", + "jogadas bem calculadas!", + }, + wq_7={ + "Ainda bem", + "que eu não apostei", + "contra você!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="Ás", + Jack="Valete", + King="Rei", + Queen="Dama", + }, + suits_plural={ + Clubs="Paus", + Diamonds="Ouros", + Hearts="Copas", + Spades="Espadas", + }, + suits_singular={ + Clubs="Paus", + Diamonds="Ouros", + Hearts="Copas", + Spades="Espadas", + }, + tutorial={ + bb_1={ + "Selecionar o {C:attention}Big Blind", + "permite ganhar um pouco de grana...", + }, + bb_2={ + "Ou escolha {C:attention}ignorá-lo", + "para obter uma {C:attention}Marca{}! Cada", + "{C:attention}Marca{} tem um efeito exclusivo", + }, + bb_3={ + "Mas fique de olho", + "no {C:attention}Blind de Chefe{}. Ele", + "tem uma habilidade que", + "vai exigir um pouco de planejamento.", + }, + bb_4={ + "Se você derrotá-lo, a", + "{C:attention}Aposta{} sobe e todos os", + "{C:attention}Blinds{} ficam mais difíceis", + }, + bb_5={ + "Vença a {C:attention}Aposta{} #1# para ganhar.", + "Escolha seu caminho!", + }, + fh_1={ + "Você ganha fichas", + "jogando {C:attention}mãos de pôquer", + }, + fh_2={ + "Cada {C:attention}Mão de pôquer{} ganha uma", + "quantidade definida de {C:blue}Fichas", + "multiplicada pelo {C:red}Multi", + }, + fh_3={ + "Veja suas {C:attention}mãos de pôquer", + "na área de {C:attention}Informação da Tentativa{},", + "junto com outras informações", + "sobre a tentativa atual", + }, + fh_4={ + "As cartas também podem", + "ganhar algumas {C:blue}Fichas{}.", + "Passe por cima pra ver!", + }, + fh_4_touch={ + "As cartas também dão", + "algumas {C:blue}Fichas{}.", + "Aperte e segure para ver!", + }, + fh_5={ + "Agora, selecione até", + "{C:attention}5{} cartas pra jogar", + "e pressione {C:blue}'Jogar Mão'", + }, + fh_5_touch={ + "Agora, toque em até", + "{C:attention}5{} cartas pra jogar", + "e pressione {C:blue}'Jogar Mão'", + }, + fh_6={ + "Você também pode {C:red}'Descartar'{} até", + "{C:attention}5{} cartas selecionadas", + "para experimentar e deixar", + "as mãos ainda mais fortes. Experimente!", + }, + fh_7={ + "Cuidado! Você tem somente um", + "um número limitado de {C:blue}Mãos", + "e {C:red}Descartes{} por rodada", + }, + fh_8={ + "Ganhe {C:attention}300 Fichas{} antes", + "de ficar sem {C:blue}Mãos", + "para vencer esta rodada.", + "Boa sorte!", + }, + s_1={ + "Muito bem! Agora que", + "você tem {E:1}muita{} {C:money}Grana{},", + "você pode comprar algumas", + "cartas novas na {C:attention}Loja.", + }, + s_10={ + "{C:attention}Cupons{} são reabastecidos", + "após derrotar o", + "{C:attention}Blind de Chefe{}.", + }, + s_11={ + "E confira ambos os", + "{C:booster}Pacotes de Reforço{} em", + "cada loja. Eles são", + "cheios de coisas boas!", + }, + s_12={ + "Vamos avançar para", + "a {C:attention}próxima rodada{}.", + }, + s_2={ + "Experimente comprar", + "esta belezinha.", + }, + s_2_touch={ + "Experimente comprar esta", + "belezinha!", + "Arraste-a da loja", + "para a área de {C:attention}‘COMPRA’{}", + }, + s_3={ + "Este é um dos {C:attention}#1#", + "{C:attention}Curingas{} que você pode adicionar", + "à sua tentativa. Cada {C:attention}Curinga", + "faz algo diferente.", + }, + s_4={ + "Este adiciona um {C:red}Multi +4{} para", + "cada mão jogada!", + }, + s_5={ + "Tenha cuidado: você só pode", + "carregar {C:attention}5 cartas Curinga{}", + "ao mesmo tempo.", + }, + s_6={ + "Agora compre a outra", + "carta na {C:attention}Loja", + }, + s_7={ + "Esta carta de {C:tarot}Tarô{} é um", + "{C:attention}consumível{}. Ela vai", + "aprimorar suas cartas", + "de jogo! Guarde ela.", + }, + s_8={ + "Você pode carregar até", + "{C:attention}2 cartas consumíveis{}", + "ao mesmo tempo", + }, + s_9={ + "Se poupar o suficiente,", + "você poderá comprar um {C:attention}Cupom{}.", + "{C:attention}Cupons{} melhoram,", + "passivamente, a sua tentativa!", + }, + sb_1={ + "Olá! Meu nome é", + "{C:attention}Jimbo{}, estou aqui pra te ajudar", + "a descobrir como jogar!", + }, + sb_2={ + "Seu objetivo é ganhar", + "{C:blue}Fichas{} pra derrotar", + "o {C:attention}Blind do inimigo", + }, + sb_3={ + "Aqui temos um {C:blue}Small Blind{}.", + "Você só precisa pontuar", + "{C:attention}300 Fichas{} para derrotá-lo.", + }, + sb_4={ + "Selecione o {C:blue}Small Blind", + "para iniciar a rodada!", + }, + sh_1={ + "Quando ganhar mais cartas,", + "não se esqueça de reorganizá-las.", + "{C:attention}Curingas{} são ativados em", + "ordem, da esquerda para a direita.", + }, + sh_2={ + "E não se esqueça de que você pode", + "{C:attention}USAR{} os seus consumíveis!", + }, + sh_3={ + "Selecione até {C:attention}2{} cartas", + "da sua mão e pressione", + "{C:attention}'USAR'{} na carta de {C:tarot}Tarô{}", + "para aprimorá-la!", + }, + sh_3_touch={ + "Selecione até {C:attention}2{} cartas", + "em sua mão e arraste", + "a carta {C:tarot}Tarô{} para área {C:attention}‘USAR’{}", + " para melhorá-las!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Mãos", + a_handsize="+#1# de tamanho de mão", + a_handsize_minus="-#1# Tamanho de Mão", + a_mult="+#1# Multi.", + a_mult_minus="-#1# Multi", + a_remaining="#1# Restante(s)", + a_sold_tally="#1#/#2# Vendido(s)", + a_xmult="X#1# Multi", + a_xmult_minus="-X#1# Multi", + ante_x_voucher="CUPOM DE APOSTA #1#", + challenges_completed="Completou #1#/#2# Desafios", + completed="#1#/#2# Concluído(s)", + deck_preview_wheel_plural="Os números podem ser mais baixos graças às #1# cartas compradas viradas para baixo", + deck_preview_wheel_singular="Os números podem ser mais baixos graças a #1# carta comprada virada para baixo", + interest="#1# de juros por $#2# (#3# máx.)", + loyalty_active="Ativo!", + loyalty_inactive="#1# restante(s)", + ml_foil_desc={ + "Laminado", + "+#1# Fichas", + }, + ml_holo_desc={ + "Holográfico", + "+#1# Multi", + }, + ml_negative_consumable_desc={ + "Negativo", + "+#1# espaço(s) de consumível", + }, + ml_negative_desc={ + "Negativo", + "+#1# Espaço de Curinga", + }, + ml_polychrome_desc={ + "Policromático", + "X#1# Multi", + }, + remaining_discard_money="Descartes Restantes ($#1# cada)", + remaining_hand_money="Mãos Restantes ($#1# cada)", + unlocked="#1#/#2# Desbloqueado(s)", + }, + v_text={ + ch_c_all_eternal={ + "Todos os Curingas são {C:eternal}Eternos{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}Fichas{} não podem exceder {C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Desafio Diário!", + }, + ch_c_debuff_played_cards={ + "Todas as cartas {C:attention}Jogadas{} ficam {C:attention}com desvantagem{} após pontuar", + }, + ch_c_discard_cost={ + "Cada descarte custa {C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "{C:green}1 em #1#{} cartas são compradas viradas para baixo", + }, + ch_c_inflation={ + "Aumente, permanentemente, os preços em {C:money}$1{} por cada compra", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Segure {C:red}-1{} cartas na mão por cada {C:money}$#1#{} que tiver", + }, + ch_c_no_extra_hand_money={ + "{C:blue}Mãos{} Adicionais não ganham mais dinheiro", + }, + ch_c_no_interest={ + "Sem {C:attention}Juros{} ao fim da rodada", + }, + ch_c_no_reward={ + "Nenhum {C:attention}Blind{} dá recompensas em dinheiro", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# Blinds{} não dão recompensas em dinheiro", + }, + ch_c_no_shop_jokers={ + "Os Curingas não aparecem mais na {C:attention}loja", + }, + ch_c_none={ + "{C:inactive}Nenhum(a)", + }, + ch_c_set_eternal_ante={ + "Quando o chefe da aposta {C:attention}#1#{} é derrotado, todos os Curingas ficam {C:attention}eternos", + }, + ch_c_set_joker_slots_ante={ + "Quando o chefe da aposta {C:attention}#1#{} é derrotado, define os espaços de Curinga para {C:attention}0", + }, + ch_c_set_seed={ + "1 tentativa com Código definido: {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{} Espaços de Consumíveis", + }, + ch_m_discards={ + "{C:red}#1#{} descartes por rodada", + }, + ch_m_dollars={ + "Começa com {C:money}$#1#", + }, + ch_m_hand_size={ + "{C:attention}#1#{} tamanho de mão", + }, + ch_m_hands={ + "{C:blue}#1#{} mãos por rodada", + }, + ch_m_joker_slots={ + "{C:attention}#1#{} Espaços de Curinga", + }, + ch_m_none={ + "{C:inactive}Nenhum(a)", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/ru.lua b/src/localization/ru.lua new file mode 100644 index 0000000..3fb763f --- /dev/null +++ b/src/localization/ru.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="Заброшенная колода", + text={ + "Начинаете партию", + "без {C:attention}карт с лицом", + "в вашей колоде", + }, + }, + b_anaglyph={ + name="Анаглифическая колода", + text={ + "После победы над каждым", + "{C:attention}Босс-блайндом{} получите:", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="Черная колода", + text={ + "{C:attention}+#1#{} слот джокера", + "", + "{C:blue}-#2#{} рука", + "в каждом раунде", + }, + }, + b_blue={ + name="Синяя колода", + text={ + "{C:blue}+#1#{} рука", + "в каждом раунде", + }, + }, + b_challenge={ + name="Колода испытаний", + text={ + "", + }, + }, + b_checkered={ + name="Клетчатая колода", + text={ + "Начинаете партию с", + "{C:attention}26{C:spades} пиками{} и", + "{C:attention}26{C:hearts} червами{} в колоде", + }, + }, + b_erratic={ + name="Неустойчивая колода", + text={ + "Все {C:attention}достоинства{} и", + "{C:attention}масти{} в колоде", + "случайны", + }, + }, + b_ghost={ + name="Призрачная колода", + text={ + "{C:spectral}Спектральные{} карты могут", + "появляться в лавке,", + "начинайте с карты {C:spectral,T:c_hex}Порчи{}", + }, + }, + b_green={ + name="Зеленая колода", + text={ + "В конце каждого раунда:", + "{C:money}$#1#{s:0.85} за каждую оставшуюся {C:blue}руку", + "{C:money}$#2#{s:0.85} за каждый оставшийся {C:red}сброс", + "Без набора {C:attention}процентов", + }, + }, + b_magic={ + name="Волшебная колода", + text={ + "Начинаете партию с", + "{C:tarot,T:v_crystal_ball}#1#{} ваучером", + "и {C:attention}2{} копиями:", + "из {C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="Колода туманности", + text={ + "Начинаете партию с", + "{C:planet,T:v_telescope}#1#{} ваучером", + "", + "и {C:red}#2#{} слотом расходуемого", + }, + }, + b_painted={ + name="Рисованная колода", + text={ + "{C:attention}+#1#{} размер руки", + "{C:red}#2#{} слот джокера", + }, + }, + b_plasma={ + name="Плазменная колода", + text={ + "Баланс {C:blue}фишек{} и", + "{C:red}множ.{} при расчете", + "очков для сыгранной руки", + "{C:red}X#1#{} базовый размер блайнда", + }, + }, + b_red={ + name="Красная колода", + text={ + "{C:red}+#1#{} сброс", + "в каждом раунде", + }, + }, + b_yellow={ + name="Желтая колода", + text={ + "Начинайте с", + "дополнительными {C:money}$#1#", + }, + }, + b_zodiac={ + name="Зодиакальная колода", + text={ + "Начинаете партию с", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "и {C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="Рука", + text={ + "Уменьшает уровень", + "играемой покерной руки", + }, + }, + bl_big={ + name="Большой блайнд", + text={ + }, + }, + bl_club={ + name="Трефа", + text={ + "Все трефовые карты", + "ослабляются", + }, + }, + bl_eye={ + name="Глаз", + text={ + "Без повторяемых типов", + "рук в этом раунде", + }, + }, + bl_final_acorn={ + name="Янтарный желудь", + text={ + "Переворачивает и тасует", + "все карты джокеров", + }, + }, + bl_final_bell={ + name="Лазурный колокольчик", + text={ + "1 карта принудительно", + "выбирается всегда", + }, + }, + bl_final_heart={ + name="Багровое сердце", + text={ + "Один случайный джокер", + "отключается с каждой рукой", + }, + }, + bl_final_leaf={ + name="Зеленый лист", + text={ + "Все карты ослабляются", + "до продажи 1 джокера", + }, + }, + bl_final_vessel={ + name="Фиолетовый сосуд", + text={ + "Очень большой блайнд", + }, + }, + bl_fish={ + name="Рыба", + text={ + "Карты тянутся лицом вниз", + "после каждой сыгранной руки", + }, + }, + bl_flint={ + name="Кремень", + text={ + "Базовые фишки и", + "множ. делятся пополам", + }, + }, + bl_goad={ + name="Побуждение", + text={ + "Все пиковые карты", + "ослабляются", + }, + }, + bl_head={ + name="Голова", + text={ + "Все червовые карты", + "ослабляются", + }, + }, + bl_hook={ + name="Крюк", + text={ + "Сбрасывает по 2 случайные", + "карты за каждую сыгранную руку", + }, + }, + bl_house={ + name="Дом", + text={ + "Первая рука тянется", + "лицом вниз", + }, + }, + bl_manacle={ + name="Кандалы", + text={ + "-1 размер руки", + }, + }, + bl_mark={ + name="Знак", + text={ + "Все карты с лицом", + "тянутся лицом вниз", + }, + }, + bl_mouth={ + name="Пасть", + text={ + "Играйте только 1 тип", + "руки в этом раунде", + }, + }, + bl_needle={ + name="Игла", + text={ + "Играйте только 1 руку", + }, + }, + bl_ox={ + name="Буйвол", + text={ + "Игра #1#", + "устанавливает деньги на $0", + }, + }, + bl_pillar={ + name="Столп", + text={ + "Ранее сыгранные карты", + "ослабляются в этом анте", + }, + }, + bl_plant={ + name="Цветок", + text={ + "Все карты с лицом", + "ослабляются", + }, + }, + bl_psychic={ + name="Экстрасенс", + text={ + "Необходимо сыграть 5 карт", + }, + }, + bl_serpent={ + name="Змей", + text={ + "После игры или сброса", + "всегда тяните 3 карты", + }, + }, + bl_small={ + name="Малый блайнд", + text={ + }, + }, + bl_tooth={ + name="Зуб", + text={ + "Потеряйте $1 за каждую", + "сыгранную карту", + }, + }, + bl_wall={ + name="Стена", + text={ + "Особо большой блайнд", + }, + }, + bl_water={ + name="Вода", + text={ + "Начинайте с", + "0 сбросов", + }, + }, + bl_wheel={ + name="Колесо", + text={ + " из 7 карт тянутся", + "лицом вниз", + }, + }, + bl_window={ + name="Окно", + text={ + "Все бубновые карты", + "ослабляются", + }, + }, + }, + Edition={ + e_base={ + name="База", + text={ + "Без дополнительных эффектов", + }, + }, + e_foil={ + name="Фольговый", + text={ + "{C:chips}+#1#{} шт. фишек", + }, + }, + e_holo={ + name="Голографический", + text={ + "{C:mult}+#1#{} множ.", + }, + }, + e_negative={ + name="Негативный", + text={ + "{C:dark_edition}+#1#{} слот джокера", + }, + }, + e_negative_consumable={ + name="Негативный", + text={ + "{C:dark_edition}+#1#{} слот расходуемого", + }, + }, + e_polychrome={ + name="Полихромный", + text={ + "{X:mult,C:white} X#1# {} множ.", + }, + }, + }, + Enhanced={ + m_bonus={ + name="Бонусная карта", + text={ + }, + }, + m_glass={ + name="Стеклянная карта", + text={ + "{X:mult,C:white} X#1# {} множ.", + "Шанс {C:green}#2# из #3#{}", + "уничтожить карту", + }, + }, + m_gold={ + name="Золотая карта", + text={ + "{C:money}$#1#{}, если эта", + "карта есть в руке", + "в конце раунда", + }, + }, + m_lucky={ + name="Счастливая карта", + text={ + "Шанс {C:green}#1# из #3#{}", + "на {C:mult}+#2#{} множ.", + "Шанс {C:green}#1# из #5#{}", + "выиграть {C:money}$#4#", + }, + }, + m_mult={ + name="Карта множителя", + text={ + "{C:mult}+#1#{} множ.", + }, + }, + m_steel={ + name="Стальная карта", + text={ + "{X:mult,C:white} X#1# {} множ.,", + "пока эта карта", + "остается в руке", + }, + }, + m_stone={ + name="Каменная карта", + text={ + "{C:chips}+#1#{} шт. фишек", + "без достоинства или масти", + }, + }, + m_wild={ + name="Дикая карта", + text={ + "Может использоваться", + "как любая масть", + }, + }, + }, + Joker={ + j_8_ball={ + name="8 шар", + text={ + "За каждую разыгранную", + "{C:attention}8{} есть шанс {C:green}#1# из #2#{} создать", + "карту {C:tarot}таро{} при подсчете очков", + "{C:inactive}(должно быть место)", + }, + }, + j_abstract={ + name="Абстрактный джокер", + text={ + "{C:mult}+#1#{} множ. за", + "каждую карту {C:attention}джокера{}", + "{C:inactive}(сейчас {C:red}+#2#{C:inactive} множ.)", + }, + }, + j_acrobat={ + name="Акробат", + text={ + "{X:red,C:white} X#1# {} множ. на {C:attention}последней", + "{C:attention}руке{} раунда", + }, + unlock={ + "Сыграйте {C:attention,E:1}#1#{} рук(и)", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="Древний джокер", + text={ + "Каждая сыгранная карта с", + "мастью {V:1}#2#{} дает", + "{X:mult,C:white} X#1# {} множ. при подсчете очков,", + "{s:0.8}масть меняется в конце раунда", + }, + }, + j_arrowhead={ + name="Наконечник стрелы", + text={ + "Сыгранные карты с", + "{C:spades}пиковой{} мастью дают", + "{C:chips}+#1#{} шт. фишек при подсчете", + }, + unlock={ + "Иметь минимум {E:1,C:attention}#1#", + "карт(ы) масти {E:1,C:attention}#2#", + "в колоде", + }, + }, + j_astronomer={ + name="Астроном", + text={ + "Все карты {C:planet}планет{} и", + "{C:planet}небесные наборы{} в", + "лавке {C:attention}бесплатны", + }, + unlock={ + "Открыть каждую", + "карту {E:1,C:planet}планет{}", + }, + }, + j_banner={ + name="Баннер", + text={ + "{C:chips}+#1#{} шт. фишек за", + "каждый оставшийся", + "{C:attention}сброс", + }, + }, + j_baron={ + name="Барон", + text={ + "Каждый {C:attention}король{}", + "в руке", + "дает {X:mult,C:white} X#1# {} множ.", + }, + }, + j_baseball={ + name="Бейсбольная карточка", + text={ + "{C:green}Необычные{} джокеры", + "дают по {X:mult,C:white} X#1# {} множ.", + }, + }, + j_blackboard={ + name="Школьная доска", + text={ + "{X:red,C:white} X#1# {} множ., если все", + "карты в руке", + "являются {C:spades}#2#{} или {C:clubs}#3#{}", + }, + }, + j_bloodstone={ + name="Гелиотроп", + text={ + "{C:green}#1# из #2#{} шанс для", + "сыгранных карт с", + "{C:hearts}червовой{} мастью дать", + "{X:mult,C:white} X#3# {} множ. при подсчете очков,", + }, + unlock={ + "Иметь минимум {E:1,C:attention}#1#", + "карт(ы) масти {E:1,C:attention}#2#", + "в колоде", + }, + }, + j_blue_joker={ + name="Синий джокер", + text={ + "{C:chips}+#1#{} шт. фишек за каждую", + "оставшуюся карту в {C:attention}колоде", + "{C:inactive}(сейчас {C:chips}+#2#{C:inactive} шт. фишек)", + }, + }, + j_blueprint={ + name="Чертеж", + text={ + "Копирует способность", + "{C:attention}джокера{} справа", + }, + unlock={ + "Выиграть партию", + }, + }, + j_bootstraps={ + name="Бутстрэп", + text={ + "Множ. {C:mult}+#1#{} за кажд.", + "{C:money}#2#${} у вас", + "{C:inactive}(Сейчас: множ. {C:mult}+#3#{C:inactive})", + }, + unlock={ + "Иметь минимум {E:1,C:attention}#1#", + "{C:dark_edition}Полихромных{} джокеров", + }, + }, + j_brainstorm={ + name="Мозговой штурм", + text={ + "Копирует способность", + "крайнего левого {C:attention}джокера", + }, + unlock={ + "Сбросьте", + "{E:1,C:attention}флеш-рояль", + }, + }, + j_bull={ + name="Бык", + text={ + "{C:chips}+#1#{} шт. фишек за", + "каждый {C:money}1${} у вас", + "{C:inactive}(Сейчас {C:chips}+#2#{C:inactive} шт. фишек)", + }, + }, + j_burglar={ + name="Грабитель", + text={ + "При выборе {C:attention}блайнда{}", + "вы получите {C:blue}+#1#{} рук(и) и", + "{C:attention}потеряете все сбросы", + }, + }, + j_burnt={ + name="Горелый джокер", + text={ + "Повысить уровень", + "первой {C:attention}сброшенной", + "покерной руки в каждом раунде", + }, + unlock={ + "Продать суммарно", + "{E:1,C:attention}#1#{} карт(ы)", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="Бизнес-карта", + text={ + "Сыгранные карты {C:attention}с лицом{} имеют", + "шанс {C:green}#1# из #2#{}", + "дать {C:money}$2{} при подсчете", + }, + }, + j_caino={ + name="Канио", + text={ + "Этот джокер дает множ. {X:mult,C:white} x#1# {}", + "за ", + "уничтожение карты {C:attention}с лицом{}", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="Костер", + text={ + "Этот джокер дает {X:mult,C:white}X#1#{} множ.", + "за каждую {C:attention}проданную{} карту, сбрасывается", + "при победе над {C:attention}Босс-блайндом{}", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)", + }, + }, + j_card_sharp={ + name="Острая карта", + text={ + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "{C:attention}покерная рука{} уже", + "сыграла в этом раунде", + }, + }, + j_cartomancer={ + name="Картомант", + text={ + "Создайте карту {C:tarot}Таро{}", + "при выборе {C:attention}блайнда{}", + "{C:inactive}(должно быть место)", + }, + unlock={ + "Открыть каждую", + "карту {E:1,C:tarot}Таро{}", + }, + }, + j_castle={ + name="Замок", + text={ + "Этот джокер получает {C:chips}+#1#{} шт. фишек", + "за каждую сброшенную карту {V:1}#2#{},", + "масть меняется каждый раунд", + "{C:inactive}(сейчас {C:chips}+#3#{C:inactive} шт. фишек)", + }, + }, + j_cavendish={ + name="Кавендиш", + text={ + "{X:mult,C:white} X#1# {} множ.", + "шанс {C:green}#2# из #3#{}, что", + "карта будет уничтожена", + "в конце раунда", + }, + }, + j_ceremonial={ + name="Церемониальный кинжал", + text={ + "При выборе {C:attention}блайнда{}", + "уничтожается джокер справа", + "и навсегда добавляется {C:attention}двойная", + "стоимость продажи к этому {C:red}множ.", + "{C:inactive}(сейчас {C:mult}+#1#{C:inactive} множ.)", + }, + }, + j_certificate={ + name="Сертификат", + text={ + "Когда начинается раунд,", + "добавляется случайная {C:attention}играющая", + "{C:attention}карта{} со случайным множ.", + "{C:attention}печать{} в вашу руку", + }, + unlock={ + "Иметь золотую", + "играемую карту с", + "{C:attention,E:1}Золотой печатью", + }, + }, + j_chaos={ + name="Клоун Хаос", + text={ + "{C:attention}#1#{} бесплатных {C:green}перебросов", + "за каждую лавку", + }, + }, + j_chicot={ + name="Шико", + text={ + "Отключает эффект", + "каждого {C:attention}Босс-блайнда", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="Умный джокер", + text={ + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_cloud_9={ + name="Девятое небо", + text={ + "Получите {C:money}$#1#{} за каждую", + "{C:attention}9{} в вашей {C:attention}полной колоде", + "в конце раунда", + "{C:inactive}(сейчас {C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="Созвездие", + text={ + "Этот джокер дает", + "множ. {X:mult,C:white} x#1# {} за каждую использованную карту ", + "{C:planet}планеты{}", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_crafty={ + name="Пронырливый джокер", + text={ + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_crazy={ + name="Сумасшедший джокер", + text={ + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_credit_card={ + name="Кредитная карта", + text={ + "Взять до", + "{C:red}-$#1#{} в долг", + }, + }, + j_delayed_grat={ + name="Запоздалое признание", + text={ + "Получите {C:money}$#1#{} за каждый {C:attention}сброс{}, если", + "сбросы не использовались", + "до конца раунда", + }, + }, + j_devious={ + name="Коварный джокер", + text={ + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_diet_cola={ + name="Диетическая кола", + text={ + "Продайте эту карту, чтобы", + "бесплатно создать", + "{C:attention}#1#", + }, + }, + j_dna={ + name="ДНК", + text={ + "Если в {C:attention}первой руке{} раунда", + "только {C:attention}1{} карта, добавьте", + "постоянную копию в колоду", + "и положите ее в {C:attention}руку", + }, + }, + j_drivers_license={ + name="Водительские права", + text={ + "{X:mult,C:white} X#1# {} множ., если у вас", + "не менее {C:attention}16", + "улучшенных карт", + "{C:inactive}(сейчас {C:attention}#2#{C:inactive})", + }, + unlock={ + "Улучшить {E:1,C:attention}#1#{} карт(ы)", + "в вашей колоде", + }, + }, + j_droll={ + name="Забавный джокер", + text={ + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_drunkard={ + name="Пьяница", + text={ + "{C:red}+#1#{} сброс", + "в каждом раунде", + }, + }, + j_duo={ + name="Дуэт", + text={ + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + unlock={ + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="Сумерки", + text={ + "Перезапуск всех сыгранных", + "карт в {C:attention}последней", + "{C:attention}руке{} раунда", + }, + }, + j_egg={ + name="Яйцо", + text={ + "Добавляет {C:money}$#1#{} к", + "{C:attention}стоимости продажи{} в", + "конце раунда", + }, + }, + j_erosion={ + name="Эрозия", + text={ + "{C:red}+#1#{} множ. за каждую", + "карту ниже {C:attention}#3#{}", + "в вашей полной колоде", + "{C:inactive}(сейчас {C:red}+#2#{C:inactive} множ.)", + }, + }, + j_even_steven={ + name="Все че(с)тно", + text={ + "Сыгранные карты с", + "{C:attention}четным{} достоинством дают", + "{C:mult}+#1#{} множ. при подсчете", + "{C:inactive}(10, 8, 6, 4, 2)", + }, + }, + j_faceless={ + name="Безликий джокер", + text={ + "Получите {C:money}$#1#{}, если {C:attention}#2#{} или", + "больше {C:attention}карт с лицом{}", + "сбрасываются", + "за один раз", + }, + }, + j_family={ + name="Семья", + text={ + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + unlock={ + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="Фибоначчи", + text={ + "Каждый сыгранный {C:attention}туз{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} или {C:attention}8{} дает", + "{C:mult}+#1#{} множ. при подсчете", + }, + }, + j_flash={ + name="Флеш-карта", + text={ + "Этот джокер дает множ. {C:mult}+#1#{} за", + "каждый {C:attention}переброс{} в лавке", + "{C:inactive}(Сейчас: множ. {C:mult}+#2#{C:inactive})", + }, + }, + j_flower_pot={ + name="Цветочный горшок", + text={ + "Множ. {X:mult,C:white} x#1# {}, если", + "покерная рука содержит", + "{C:diamonds}бубновую{}, {C:clubs}трефовую{},", + "{C:hearts}червовую{} и {C:spades}пиковую{} карту", + }, + unlock={ + "Достичь анте", + "уровня {E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="Предсказатель", + text={ + "{C:red}+#1#{} множ. за каждую", + "использованную карту {C:purple}Таро{}", + "{C:inactive}(сейчас {C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="Четыре пальца", + text={ + "Все {C:attention}флеши{} и", + "{C:attention}стриты{} можно", + "собрать с {C:attention}4{} картами", + }, + }, + j_gift={ + name="Подарочная карта", + text={ + "Добавляет {C:money}$#1#{} {C:attention}стоимости продажи", + "каждому {C:attention}джокеру{} и", + "{C:attention}расходуемой карте{} при", + "конце раунда", + }, + }, + j_glass={ + name="Стеклянный джокер", + text={ + "Этот джокер дает множ. {X:mult,C:white} x#1# {}", + "за каждую", + "уничтоженную {C:attention}стеклянную карту", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + unlock={ + "Иметь минимум {E:1,C:attention}#1#", + "{E:1,C:attention}#2#{} в", + "своей колоде", + }, + }, + j_gluttenous_joker={ + name="Прожорливый джокер", + text={ + "Сыгранные карты с", + "мастью {C:clubs}#2#{} дают", + "{C:mult}+#1#{} множ. при подсчете", + }, + }, + j_golden={ + name="Золотой джокер", + text={ + "Получайте {C:money}$#1#{} в", + "конце раунда", + }, + }, + j_greedy_joker={ + name="Жадный джокер", + text={ + "Сыгранные карты с", + "мастью {C:diamonds}#2#{} дают", + "{C:mult}+#1#{} множ. при подсчете", + }, + }, + j_green_joker={ + name="Зеленый джокер", + text={ + "{C:mult}+#1#{} множ. за каждую сыгранную руку", + "{C:mult}-#2#{} множ. за каждый сброс", + "{C:inactive}(сейчас {C:mult}+#3#{C:inactive} множ.)", + }, + }, + j_gros_michel={ + name="Гро Мишель", + text={ + "{C:mult}+#1#{} множ.", + "шанс {C:green}#2# из #3#{}, что", + "карта будет уничтожена", + "в конце раунда", + }, + }, + j_hack={ + name="Паяц", + text={ + "Перезапуск", + "каждой сыгранной", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} или {C:attention}5{}", + }, + }, + j_half={ + name="Полуджокер", + text={ + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#{} или меньше карт", + }, + }, + j_hallucination={ + name="Галлюцинация", + text={ + "Шанс {C:green}#1# из #2#{} создать", + "карту {C:tarot}Таро{} при открытии", + "любого {C:attention}бустерного набора{}", + "{C:inactive}(должно быть место)", + }, + }, + j_hanging_chad={ + name="Еще разок", + text={ + "Перезапуск {C:attention}первой{} сыгранной карты,", + "использованной в подсчете ", + "{C:attention}#1#{} доп. р.", + }, + unlock={ + "Победить Босс-блайнд", + "с: {E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="Турист", + text={ + "Каждая сыгранная {C:attention}карта{}", + "навсегда дает", + "{C:chips}+#1#{} шт. фишек при подсчете", + }, + }, + j_hit_the_road={ + name="В путь", + text={ + "Этот джокер дает множ. {X:mult,C:white} x#1# {}", + "за каждого{}", + "сброшенного в раунде {C:attention}валета", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + unlock={ + "Сбросить {E:1,C:attention}5", + "{E:1,C:attention}валетов{} за", + "один раз", + }, + }, + j_hologram={ + name="Голограмма", + text={ + "Этот джокер дает множ. {X:mult,C:white} x#1# {} за", + "каждую добавленную в колоду {C:attention}играющую карту{}", + "", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_ice_cream={ + name="Мороженое", + text={ + "{C:chips}+#1#{} шт. фишек", + "{C:chips}-#2#{} шт. фишек за", + "каждую сыгранную руку", + }, + }, + j_idol={ + name="Идол", + text={ + "Каждая играемая {C:attention}#2#", + "из {V:1}#3#{} дает", + "{X:mult,C:white} X#1# {} множ. при подсчете", + "{s:0.8}Карта меняется каждый раунд", + }, + unlock={ + "В одной руке", + "набрать минимум", + "{E:1,C:attention}#1#{} шт. фишек", + }, + }, + j_invisible={ + name="Невидимый джокер", + text={ + "После {C:attention}#1#{} раундов", + "продайте эту карту, чтобы", + "{C:attention}дублировать{} случайного джокера", + "{C:inactive}(сейчас {C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "Выиграйте партию,", + "имея не более", + "{E:1,C:attention}4 джокеров{}", + }, + }, + j_joker={ + name="Джокер", + text={ + "{C:red,s:1.1}+#1#{} множ.", + }, + }, + j_jolly={ + name="Веселый джокер", + text={ + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_juggler={ + name="Жонглер", + text={ + "{C:attention}+#1#{} размер руки", + }, + }, + j_loyalty_card={ + name="Карта лояльности", + text={ + "{X:red,C:white} X#1# {} множ. с каждыми", + "{C:attention}#2#{} сыгранными руками", + "{C:inactive}#3#", + }, + }, + j_luchador={ + name="Лучадор", + text={ + "Продайте эту карту, чтобы", + "отключить текущий", + "{C:attention}Босс-блайнд{}", + }, + }, + j_lucky_cat={ + name="Счастливый кот", + text={ + "Этот джокер даетмнож. {X:mult,C:white} x#1# {} за", + "каждую {C:green}успешно{} активированную", + "{C:attention}счастливую{} карту", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_lusty_joker={ + name="Похотливый джокер", + text={ + "Сыгранные карты с", + "мастью {C:hearts}#2#{} дают", + "{C:mult}+#1#{} множ. при подсчете", + }, + }, + j_mad={ + name="Безумный джокер", + text={ + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_madness={ + name="Безумие", + text={ + "При выборе {C:attention}малого блайнда{} или {C:attention}большого блайнда{}", + " получите множ. {X:mult,C:white} x#1# {}", + "и {C:attention}уничтожьте{} случайного джокера", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_mail={ + name="Почтовая скидка", + text={ + "Получите {C:money}$#1#{} за каждую", + "сброшенную {C:attention}#2#{}, достоинство", + "меняется каждый раунд", + }, + }, + j_marble={ + name="Мраморный джокер", + text={ + "Добавляет одну {C:attention}каменную{} карту", + "в колоду при", + "выборе {C:attention}блайнда{}", + }, + }, + j_matador={ + name="Матадор", + text={ + "Получите {C:money}$#1#{}, если сыгранная", + "рука активирует", + "способность {C:attention}Босс-блайнда{}", + }, + unlock={ + "Победить Босс-блайнд", + "в {E:1,C:attention}1 руку{} без", + "использования сбросов", + }, + }, + j_merry_andy={ + name="Веселый Энди", + text={ + "{C:red}+#1#{} к сбросу", + "в каждом раунде,", + "размер руки: {C:red}#2#{}", + }, + unlock={ + "Выиграть партию за {E:1,C:attention}#1#", + "или меньше раундов", + }, + }, + j_midas_mask={ + name="Маска Мидаса", + text={ + "Все разыгранные карты {C:attention}с лицом{}", + "становятся {C:attention}золотыми{}", + "при подсчете", + }, + }, + j_mime={ + name="Мим", + text={ + "Перезапустить все", + "способности {C:attention}удерживаемых", + "в {C:attention}руке{} карт", + }, + }, + j_misprint={ + name="Опечатка", + text={ + "", + }, + }, + j_mr_bones={ + name="Костлявый", + text={ + "Предотвращает смерть,", + "если фишки с очками", + "составляют минимум {C:attention}25%", + "от необходимых фишек", + "{S:1.1,C:red,E:2}самоуничтожается{}", + }, + unlock={ + "Проиграть {C:attention,E:1}#1#{} парт.", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="Мистическая вершина", + text={ + "{C:mult}+#1#{} множ. при", + "{C:attention}#2#{} оставшихся", + "сбросах", + }, + }, + j_obelisk={ + name="Обелиск", + text={ + "Этот джокер дает множ. {X:mult,C:white} x#1# {}", + "за каждую {C:attention}последовательную{} комбинацию, разыгранную", + "без розыгрыша самой", + "частой {C:attention}покерной руки", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_odd_todd={ + name="Нече(с)тные правила", + text={ + "Сыгранные карты с", + "{C:attention}нечетным{} достоинством дают", + "{C:chips}+#1#{} шт. фишек при подсчете", + "{C:inactive}(Т, 9, 7, 5, 3)", + }, + }, + j_onyx_agate={ + name="Ониксовый агат", + text={ + "Сыгранные карты с", + "{C:clubs}трефовой{} мастью дают", + "{C:mult}+#1#{} множ. при подсчете", + }, + unlock={ + "Иметь минимум {E:1,C:attention}#1#", + "карт(ы) масти {E:1,C:attention}#2#", + "в колоде", + }, + }, + j_oops={ + name="Упс! Все шестерки", + text={ + "Удваивает все {C:attention}перечисленные", + "{C:green,E:1,S:1.1}вероятности", + "{C:inactive}(напр.: {C:green}1 из 3{C:inactive} -> {C:green}2 из 3{C:inactive})", + }, + unlock={ + "В одной руке", + "набрать минимум", + "{E:1,C:attention}#1#{} шт. фишек", + }, + }, + j_order={ + name="Орден", + text={ + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + unlock={ + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="Парейдолия", + text={ + "Все карты", + "считаются", + "картами с {C:attention}лицом{}", + }, + }, + j_perkeo={ + name="Перкео", + text={ + "Создает {C:dark_edition}негативную{} копию", + "{C:attention}1{} случайной {C:attention}расходуемой{}", + "карты в вашем владении", + "в конце {C:attention}лавки", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="Фотография", + text={ + "Первая сыгранная карта {C:attention}с лицом", + "дает {X:mult,C:white} X#1# {} множ.", + "при подсчете", + }, + }, + j_popcorn={ + name="Попкорн", + text={ + "{C:mult}+#1#{} множ.", + "{C:mult}-#2#{} множ. за каждый", + "сыгранный раунд", + }, + }, + j_raised_fist={ + name="Поднятый кулак", + text={ + "Добавляет к множ. {C:attention}удвоенное{}", + "достоинство {C:attention}карты с наименьшим{} достоинством", + "в вашей руке", + }, + }, + j_ramen={ + name="Рамен", + text={ + "{X:mult,C:white} X#1# {} множ.,", + "теряет {X:mult,C:white} X#2# {} множ.", + "за каждую сброшенную {C:attention}карту{}", + }, + }, + j_red_card={ + name="Красная карта", + text={ + "Этот джокер дает", + "множ. {C:red}+#1#{} за пропуск любого", + "{C:attention}бустерного набора{}", + "{C:inactive}(Сейчас: множ. {C:red}+#2#{C:inactive})", + }, + }, + j_reserved_parking={ + name="Зарезервированное место", + text={ + "Каждая карта {C:attention}с лицом{}", + "в руке имеет", + "{C:green}#2# из #3#{} шанс", + "дать {C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="Автобусный тур", + text={ + "Этот джокер дает множ. {C:mult}+#1#{} за", + "каждую {C:attention}последовательную{} комбинацию,", + "разыгранную без", + "подсчета карты с {C:attention}лицом{}", + "{C:inactive}(Сейчас: множ. {C:mult}+#2#{C:inactive})", + }, + }, + j_riff_raff={ + name="Рифф-рафф", + text={ + "При выборе {C:attention}блайнда{}", + "создает {C:attention}#1# {C:blue}обычного(ых){C:attention} джокера", + "{C:inactive}(должно быть место)", + }, + }, + j_ring_master={ + name="Мастер колец", + text={ + "{C:attention}Джокер{}, {C:tarot}Таро{}, карты {C:planet}планет{}", + "и {C:spectral}спектральные{} карты могут", + "появляться многократно", + }, + unlock={ + "Достичь анте", + "уровня {E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="Ракета", + text={ + "Получайте {C:money}#1#${} в конце раунда", + "Выплата увеличивается на {C:money}#2#${}", + "после победы над {C:attention}босс-блайндом{}", + }, + }, + j_rough_gem={ + name="Грубый самоцвет", + text={ + "Сыгранные карты с", + "{C:diamonds}бубновой{} мастью дают", + "{C:money}$#1#{} при подсчете очков", + }, + unlock={ + "Иметь минимум {E:1,C:attention}#1#", + "карт(ы) масти {E:1,C:attention}#2#", + "в колоде", + }, + }, + j_runner={ + name="Бегун", + text={ + "Дает {C:chips}+#2#{} шт. фишек,", + "если сыгранная рука", + "содержит {C:attention}стрит{}", + "{C:inactive}(сейчас {C:chips}+#1#{C:inactive} шт. фишек)", + }, + }, + j_satellite={ + name="Спутник", + text={ + "Получите {C:money}$#1#{} в конце", + "раунда за каждую уникальную {C:planet}планету,", + "использованную в этой партии", + "{C:inactive}(сейчас {C:money}$#2#{C:inactive})", + }, + unlock={ + "Иметь {E:1,C:money}$#1#", + "или более", + }, + }, + j_scary_face={ + name="Жуткое лицо", + text={ + "Сыгранные карты {C:attention}с лицом{}", + "дают {C:chips}+#1#{} шт. фишек", + "при подсчете", + }, + }, + j_scholar={ + name="Ученый", + text={ + "Сыгранные {C:attention}тузы{}", + "дают {C:chips}+#2#{} шт. фишек", + "и {C:mult}+#1#{} множ.", + "при подсчете", + }, + }, + j_seance={ + name="Сеанс", + text={ + "Если {C:attention}покерная рука{} содержит", + "{C:attention}#1#{}, создает", + "случайную {C:spectral}спектральную{} карту", + "{C:inactive}(должно быть место)", + }, + }, + j_seeing_double={ + name="Двоение в глазах", + text={ + "{X:mult,C:white} X#1# {} множ., если играемая", + "рука содержит подсчитываемую", + "{C:clubs}Трефовая{} карта и подсчет", + "карты любой другой {C:attention}масти", + }, + unlock={ + "Сыграть руку,", + "что содержит", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="Зельцер", + text={ + "Перезапуск всех", + "сыгранных карт для", + "{C:attention}#1#{} следующих рук", + }, + }, + j_shoot_the_moon={ + name="На Луну", + text={ + "Каждая {C:attention}дама{}", + "в руке", + "дает множ. {C:mult}+#1#{}", + }, + unlock={ + "Сыграть все {E:1,C:attention}черви", + "из вашей колоды в", + "одном раунде", + }, + }, + j_shortcut={ + name="Короткий путь", + text={ + "Позволяет формировать {C:attention}стриты{} с", + "пропуском карты {C:attention}1 достоинства", + "{C:inactive}(пример: {C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="Шестое чувство", + text={ + "Если {C:attention}первой рукой{} раунда является", + "одиночная {C:attention}6{}, она уничтожается, и", + "создается {C:spectral}спектральная{} карта", + "{C:inactive}(должно быть место)", + }, + }, + j_sly={ + name="Хитрый джокер", + text={ + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_smeared={ + name="Смазанный джокер", + text={ + "{C:hearts}черви{} и {C:diamonds}бубны", + "считаются одной мастью,", + "{C:spades}пики{} и {C:clubs}трефы", + "также считаются одной мастью", + }, + unlock={ + "Иметь минимум {C:attention}#1#", + "{E:1,C:attention}#2#{} в", + "своей колоде", + }, + }, + j_smiley={ + name="Улыбочка", + text={ + "Сыгранные карты {C:attention}с лицом{}", + "дают {C:mult}+#1#{} множ.", + "при подсчете очков", + }, + }, + j_sock_and_buskin={ + name="Трагедия и комедия", + text={ + "Перезапуск всех", + "сыгранных карт {C:attention}с лицом{}", + }, + unlock={ + "Сыграйте суммарно", + "{C:attention,E:1}#1#{} карт(ы) с лицом", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="Космический джокер", + text={ + "{C:green}#1# из #2#{} шанс", + "повысить уровень", + "играемой {C:attention}покерной руки{}", + }, + }, + j_splash={ + name="Всплеск", + text={ + "Каждая {C:attention}сыгранная карта", + "учитывается при подсчете", + }, + }, + j_square={ + name="Квадратный джокер", + text={ + "Этот джокер дает {C:chips}+#2#{} шт. фишек,", + "если в разыгранной руке", + "ровно {C:attention}4{} карты", + "{C:inactive}(Сейчас: {C:chips}#1#{C:inactive} шт. фишек)", + }, + }, + j_steel_joker={ + name="Стальной джокер", + text={ + "Дает множ. {X:mult,C:white} x#1#{}", + "за каждую {C:attention}стальную карту", + "в вашей {C:attention}полной колоде", + "{C:inactive}(сейчас множ. {X:mult,C:white} x#2#{C:inactive})", + }, + }, + j_stencil={ + name="Трафарет джокера", + text={ + "{X:red,C:white} X1 {} множ. за каждый", + "пустой слот {C:attention}джокера{},", + "{s:0.8}включая трафарет джокера", + "{C:inactive}(сейчас {X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="Каменный джокер", + text={ + "Дает {C:chips}+#1#{} шт. фишек за", + "каждую {C:attention}каменную карту", + "в {C:attention}полной колоде", + "{C:inactive}(сейчас {C:chips}+#2#{C:inactive} шт. фишек)", + }, + }, + j_stuntman={ + name="Каскадер", + text={ + "{C:chips}+#1#{} шт. фишек,", + "{C:attention}-#2#{} размер руки", + }, + unlock={ + "В одной руке", + "набрать минимум", + "{E:1,C:attention}#1#{} шт. фишек", + }, + }, + j_supernova={ + name="Сверхновая", + text={ + "Добавляет к множ. кол-во раз,", + "которое в партии была", + "разыграна {C:attention}покерная рука{}", + }, + }, + j_superposition={ + name="Суперпозиция", + text={ + "Создайте карту {C:tarot}Таро{}, если", + "покерная рука содержит", + "{C:attention}туз{} и {C:attention}стрит{}", + "{C:inactive}(должно быть место)", + }, + }, + j_swashbuckler={ + name="Головорез", + text={ + "Добавляет стоимость продажи", + "всех имеющихся", + "{C:attention}джокеров{} к множ.", + "{C:inactive}(Сейчас: множ. {C:mult}+#1#{C:inactive})", + }, + unlock={ + "Продайте суммарно", + "{C:attention,E:1}#1#{} карт(ы) джокера", + "{C:inactive}(#2#)", + }, + }, + j_throwback={ + name="Возврат", + text={ + "{X:mult,C:white} X#1# {} для каждого", + "{C:attention}блайнда{}, пропущенного в этой партии", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)", + }, + unlock={ + "Продолжить сохраненную партию", + "из главного меню", + }, + }, + j_ticket={ + name="Золотой билет", + text={ + "Сыгранные {C:attention}золотые{} карты", + "дают {C:money}$#1#{} при подсчете", + }, + unlock={ + "Сыграйте руку из 5 карт,", + "которая содержит только", + "{C:attention,E:1}золотые{} карты", + }, + }, + j_to_the_moon={ + name="До Луны", + text={ + "Получите дополнительно {C:money}$#1#{}", + "{C:attention}процентов{} за каждые {C:money}$5{} у вас", + "в конце раунда", + }, + }, + j_todo_list={ + name="Список дел", + text={ + "Получите {C:money}#1#${}, если {C:attention}покерная рука{}", + " — {C:attention}#2#{},", + "покерная рука меняется", + "в конце раунда", + }, + }, + j_trading={ + name="Торговая карта", + text={ + "Если в {C:attention}первом сбросе{} раунда", + "только {C:attention}1{} карта, уничтожьте", + "ее и получите {C:money}$#1#", + }, + }, + j_tribe={ + name="Племя", + text={ + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + unlock={ + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="Трибуле", + text={ + "Сыгранные {C:attention}короли{} и", + "{C:attention}дамы{} дают", + "{X:mult,C:white} X#1# {} множ. при подсчете очков,", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="Трио", + text={ + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + unlock={ + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="Трубадур", + text={ + "{C:attention}+#1#{} к размеру руки,", + "{C:blue}-#2#{} от руки в каждом раунде", + }, + unlock={ + "Выиграйте {C:attention,E:1}#1#{} последовательных", + "раунда(ов) с игрой", + "только 1 руки", + }, + }, + j_trousers={ + name="Запасные брюки", + text={ + "Этот джокер дает множ. {C:mult}+#1#{},", + "если сыгранная рука содержит", + "{C:attention}#2#", + "{C:inactive}(Сейчас: множ. {C:red}+#3#{C:inactive})", + }, + }, + j_turtle_bean={ + name="Черепаховый боб", + text={ + "Размер руки {C:attention}+#1#{},", + "уменьшается на", + "{C:red}#2#{} каждый раунд", + }, + }, + j_vagabond={ + name="Бродяга", + text={ + "Создайте карту {C:purple}Таро{},", + "если рука сыграна", + "с {C:money}$#1#{} или меньше", + }, + }, + j_vampire={ + name="Вампир", + text={ + "Этот джокер дает множ. {X:mult,C:white} x#1# {}", + "за разыгранную и подсчитанную {C:attention}улучшенную карту{},", + "а также убирает {C:attention}улучшение карты", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#2# {C:inactive})", + }, + }, + j_walkie_talkie={ + name="Рация", + text={ + "Каждая сыгранная {C:attention}10{} или {C:attention}4", + "дает {C:chips}+#1#{} шт. фишек и", + "{C:mult}+#2#{} множ. при подсчете очков", + }, + }, + j_wee={ + name="Трусливый джокер", + text={ + "Этот джокер дает", + "{C:chips}+#2#{} шт. фишей при подсчете", + "каждой сыгранной {C:attention}2-ки{}", + "{C:inactive}(сейчас {C:chips}+#1#{C:inactive} шт. фишек)", + }, + unlock={ + "Выиграть партию за {E:1,C:attention}#1#", + "или меньше раундов", + }, + }, + j_wily={ + name="Ловкий джокер", + text={ + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + j_wrathful_joker={ + name="Гневный джокер", + text={ + "Сыгранные карты с", + "мастью {C:spades}#2#{} дают", + "{C:mult}+#1#{} множ. при подсчете", + }, + }, + j_yorick={ + name="Йорик", + text={ + "Этот джокер дает", + "множ. {X:mult,C:white} x#1# {} за каждую карту {C:attention}#2#{C:inactive} [#3#]{}", + "в сбросе", + "{C:inactive}(Сейчас: множ. {X:mult,C:white} x#4# {C:inactive})", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="Дурацкий джокер", + text={ + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#", + }, + }, + }, + Other={ + black_sticker={ + name="Черная наклейка", + text={ + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}черной", + "{C:attention}ставки{}", + }, + }, + blue_seal={ + name="Синяя печать", + text={ + "Создает карту {C:planet}планеты{}", + "для последней разыгранной {C:attention}покерной руки{}", + "раунда, если {C:attention}есть{} в руке", + "{C:inactive}(Должно быть место)", + }, + }, + blue_sticker={ + name="Синяя наклейка", + text={ + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}синей", + "{C:attention}ставки{}", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{} шт. фишек", + }, + }, + card_extra_chips={ + text={ + "Бонус {C:chips}+#1#{} шт. фишек", + }, + }, + challenge_locked={ + name="Заблокировано", + text={ + "Выиграйте партию с минимум", + "#1# разными колодами, чтобы открыть", + "режим испытания", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="Ослаблено", + text={ + "Все способности", + "отключены", + }, + }, + debuffed_playing_card={ + name="Ослаблено", + text={ + "Подсчет без фишек", + "и все способности", + "отключены", + }, + }, + deck_locked_discover={ + name="Заблокировано", + text={ + "Открыть минимум", + "{C:attention}#1#{} предм. из", + "вашей коллекции", + }, + }, + deck_locked_stake={ + name="Заблокировано", + text={ + "Выиграть партию с любой", + "колодой на сложности", + "минимум {V:1}#1#{}", + }, + }, + deck_locked_win={ + name="Заблокировано", + text={ + "Выиграть партию с:", + "{C:attention}#1#{}", + "на любой сложности", + }, + }, + demo_locked={ + name="Заблокировано", + text={ + "Недоступно", + "в этом демо", + }, + }, + demo_shop_locked={ + name="Заблокировано", + text={ + "Карта {C:attention}Джимбо", + "из личной коллекции,", + "доступная в полной", + "версии {E:1,C:red}Balatro", + }, + }, + eternal={ + name="Вечное", + text={ + "Нельзя продать", + "или уничтожить", + }, + }, + gold_seal={ + name="Золотая печать", + text={ + "Получите {C:money}$3{}, когда", + "разыгрывается эта карта", + "и подсчитывается", + }, + }, + gold_sticker={ + name="Золотая наклейка", + text={ + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}золотой", + "{C:attention}ставки{}", + }, + }, + green_sticker={ + name="Зеленая наклейка", + text={ + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}зеленой", + "{C:attention}ставки{}", + }, + }, + joker_locked_legendary={ + name="Заблокировано", + text={ + "Найти этого джокера", + "из карты {C:spectral}Души{}", + }, + }, + locked={ + name="Заблокировано", + text={ + }, + }, + orange_sticker={ + name="Оранжевая наклейка", + text={ + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}оранжевой", + "{C:attention}ставки{}", + }, + }, + p_arcana_jumbo={ + name="Набор аркана Джамбо", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:tarot} карт Таро{}, чтобы", + "использовать немедленно", + }, + }, + p_arcana_mega={ + name="Набор мегааркана", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:tarot} карт Таро{}, чтобы", + "использовать немедленно", + }, + }, + p_arcana_normal={ + name="Набор аркана", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:tarot} карт Таро{}, чтобы", + "использовать немедленно", + }, + }, + p_buffoon_jumbo={ + name="Набор шута Джамбо", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:joker} карт джокеров{}", + }, + }, + p_buffoon_mega={ + name="Меганабор шута", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:joker} карт джокеров{}", + }, + }, + p_buffoon_normal={ + name="Набор шута", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:joker} карт джокеров{}", + }, + }, + p_celestial_jumbo={ + name="Небесный набор Джамбо", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:planet} карт планет{}, чтобы", + "использовать немедленно", + }, + }, + p_celestial_mega={ + name="Меганебесный набор", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:planet} карт планет{}, чтобы", + "использовать немедленно", + }, + }, + p_celestial_normal={ + name="Небесный набор", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:planet} карт планет{}, чтобы", + "использовать немедленно", + }, + }, + p_spectral_jumbo={ + name="Спектральный набор Джамбо", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:spectral} спектральных{} карт, чтобы", + "использовать немедленно", + }, + }, + p_spectral_mega={ + name="Мегаспектральный набор", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:spectral} спектральных{} карт, чтобы", + "использовать немедленно", + }, + }, + p_spectral_normal={ + name="Спектральный набор", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:spectral} спектральных{} карт, чтобы", + "использовать немедленно", + }, + }, + p_standard_jumbo={ + name="Стандартный набор Джамбо", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:attention} играемых{} карт, чтобы", + "добавить их в вашу колоду", + }, + }, + p_standard_mega={ + name="Мегастандартный набор", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:attention} играемых{} карт, чтобы", + "добавить их в вашу колоду", + }, + }, + p_standard_normal={ + name="Стандартный набор", + text={ + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:attention} играемых{} карт, чтобы", + "добавить их в вашу колоду", + }, + }, + perishable={ + name="Портящийся", + text={ + "Ослабляется через ", + "{C:attention}#1#{} рнд", + "{C:inactive}(Осталось: {C:attention}#2#{C:inactive})", + }, + }, + pinned_left={ + name="Закреплено", + text={ + "Этот джокер остается", + "закрепленным в", + "крайней левой позиции", + }, + }, + playing_card={ + text={ + " {C:light_black}#1# из {V:1}#2# ", + }, + }, + purple_seal={ + name="Фиолетовая печать", + text={ + "Создает карту {C:tarot}Таро{}", + "при {C:attention}сбросе", + "{C:inactive}(должно быть место)", + }, + }, + purple_sticker={ + name="Фиолетовая наклейка", + text={ + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}фиолетовой", + "{C:attention}ставки{}", + }, + }, + red_seal={ + name="Красная печать", + text={ + "Перезапуск этой", + "карты {C:attention}1{} раз", + }, + }, + red_sticker={ + name="Красная наклейка", + text={ + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}красной", + "{C:attention}ставки{}", + }, + }, + remove_negative={ + name="Негативный", + text={ + "{C:inactive,s:0.9}(Удаляет {C:dark_edition,s:0.9}Негативный эффект{C:inactive,s:0.9} с копии)", + }, + }, + rental={ + name="Прокатный", + text={ + "Вы тратите {C:money}#1#${} в", + "конце раунда", + }, + }, + undiscovered_booster={ + name="Не открыто", + text={ + "Откройте этот набор", + "в партии без сида,", + "чтобы узнать, что он делает", + }, + }, + undiscovered_edition={ + name="Не открыто", + text={ + "Найдите этот выпуск", + "в партии без сида,", + "чтобы узнать, что он делает", + }, + }, + undiscovered_joker={ + name="Не открыто", + text={ + "Купите или используйте", + "эту карту в партии", + "без сида, чтобы", + "узнать, что она делает", + }, + }, + undiscovered_planet={ + name="Не открыто", + text={ + "Купите или используйте", + "эту карту в партии", + "без сида, чтобы", + "узнать, что она делает", + }, + }, + undiscovered_spectral={ + name="Не открыто", + text={ + "Купите или используйте", + "эту карту в партии", + "без сида, чтобы", + "узнать, что она делает", + }, + }, + undiscovered_tag={ + name="Не открыто", + text={ + "Используйте этот тег в", + "партии без сида, чтобы", + "узнать, что он делает", + }, + }, + undiscovered_tarot={ + name="Не открыто", + text={ + "Купите или используйте", + "эту карту в партии", + "без сида, чтобы", + "узнать, что она делает", + }, + }, + undiscovered_voucher={ + name="Не открыто", + text={ + "Выкупите этот", + "ваучер в партии", + "без сида, чтобы", + "узнать, что он делает", + }, + }, + white_sticker={ + name="Белая наклейка", + text={ + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}белой", + "{C:attention}ставки{}", + }, + }, + wip_locked={ + name="Заблокировано", + text={ + "Разработка", + "в процессе", + }, + }, + }, + Planet={ + c_ceres={ + name="Церера", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_earth={ + name="Земля", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_eris={ + name="Эрида", + text={ + "{S:0.8}({S:0.8,V:1}ур. #1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_jupiter={ + name="Юпитер", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_mars={ + name="Марс", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_mercury={ + name="Меркурий", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_neptune={ + name="Нептун", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_planet_x={ + name="Планета X", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_pluto={ + name="Плутон", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_saturn={ + name="Сатурн", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_uranus={ + name="Уран", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + c_venus={ + name="Венера", + text={ + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек", + }, + }, + }, + Spectral={ + c_ankh={ + name="Анх", + text={ + "Создайте копию", + "случайного {C:attention}джокера{}, уничтожьте", + "всех остальных джокеров", + }, + }, + c_aura={ + name="Аура", + text={ + "Добавляет {C:dark_edition}фольговый{}, {C:dark_edition}голографический{}", + "или {C:dark_edition}полихромный{} эффект к", + "{C:attention}1{} выбранной карте в руке", + }, + }, + c_black_hole={ + name="Черная дыра", + text={ + "Повышает каждую", + "{C:legendary,E:1}покерную руку", + "на {C:attention}1{} уровень", + }, + }, + c_cryptid={ + name="Криптид", + text={ + "Создайте {C:attention}#1#{} копии", + "{C:attention}1{} выбранной карты", + "в руке", + }, + }, + c_deja_vu={ + name="Дежавю", + text={ + "Добавьте {C:red}красную печать{}", + "к {C:attention}1{} выбранной", + "карте в вашей руке", + }, + }, + c_ectoplasm={ + name="Эктоплазма", + text={ + "Добавляет {C:dark_edition}негатив{} к", + "случайному {C:attention}джокеру,", + "{C:red}-1{} размер руки", + }, + }, + c_familiar={ + name="Фамильяр", + text={ + "Уничтожает {C:attention}1{} случайную", + "карту в вашей руке, добавляет", + "{C:attention}#1#{} случайную {C:attention}улучшенную карту", + "{C:attention}с лицом{} в вашу руку", + }, + }, + c_grim={ + name="Мрак", + text={ + "Уничтожает {C:attention}1{} случайную", + "карту в вашей руке,", + "добавляет {C:attention}#1#{} случайную {C:attention}улучшенную карту", + "{C:attention}туза(ов){} в вашу руку", + }, + }, + c_hex={ + name="Порча", + text={ + "Добавьте {C:dark_edition}полихром{}", + "случайному {C:attention}джокеру{}, уничтожьте", + "всех остальных джокеров", + }, + }, + c_immolate={ + name="Жертвоприношение", + text={ + "Уничтожает {C:attention}#1#{} случ.", + "карт(ы) в руке,", + "дает {C:money}$#2#", + }, + }, + c_incantation={ + name="Заклинание", + text={ + "Уничтожает {C:attention}1{} случайную", + "карту в вашей руке, добавляет {C:attention}#1#", + "случайную {C:attention}улучшенную числовую", + "{C:attention}карт(ы){} в вашу руку", + }, + }, + c_medium={ + name="Медиум", + text={ + "Добавьте {C:purple}фиолетовую печать{}", + "к {C:attention}1{} выбранной", + "карте в вашей руке", + }, + }, + c_ouija={ + name="Уиджа", + text={ + "Преобразует все карты", + "в руке в одно", + "случайное {C:attention}достоинство", + "{C:red}-1{} размер руки", + }, + }, + c_sigil={ + name="Символ", + text={ + "Преобразует все карты", + "в руке в одну", + "случайную {C:attention}масть", + }, + }, + c_soul={ + name="Душа", + text={ + "Создает", + "{C:legendary,E:1}легендарного{} джокера", + "{C:inactive}(должно быть место)", + }, + }, + c_talisman={ + name="Талисман", + text={ + "Добавляет {C:attention}золотую печать{}", + "к {C:attention}1{} выбранной", + "карте в вашей руке", + }, + }, + c_trance={ + name="Транс", + text={ + "Добавьте {C:blue}синюю печать{}", + "к {C:attention}1{} выбранной", + "карте в вашей руке", + }, + }, + c_wraith={ + name="Призрак", + text={ + "Создает случайного", + "{C:red}редкого{C:attention} джокера{},", + "устанавливает деньги на {C:money}$0", + }, + }, + }, + Stake={ + stake_black={ + name="Черная ставка", + text={ + "В лавке могут быть {C:attention}вечные{} джокеры", + "{C:inactive,s:0.8}{нельзя продать или уничтожить}", + "{s:0.8}Применяет все предыдущие ставки", + }, + }, + stake_blue={ + name="Синяя ставка", + text={ + "{C:red}-1{} сброс", + "{s:0.8}Применяет все предыдущие ставки", + }, + }, + stake_gold={ + name="Золотая ставка", + text={ + "В лавке могут появиться {C:attention}прокатные{} джокеры", + "{C:inactive,s:0.8}(Стоимость: {C:money,s:0.8}3 ${C:inactive,s:0.8} за раунд)", + "{s:0.8}Применяет все предыдущие ставки", + }, + }, + stake_green={ + name="Зеленая ставка", + text={ + "Требуемые очки масштабируются", + "быстрее для каждого {C:attention}анте", + "{s:0.8}Применяет все предыдущие ставки", + }, + }, + stake_orange={ + name="Оранжевая ставка", + text={ + "В лавке могут появиться {C:attention}портящиеся{} джокеры", + "{C:inactive,s:0.8}(Ослабляется после 5 раундов)", + "{s:0.8}Применяет все предыдущие ставки", + }, + }, + stake_purple={ + name="Фиолетовая ставка", + text={ + "Требуемые очки масштабируются", + "быстрее для каждого {C:attention}анте", + "{s:0.8}Применяет все предыдущие ставки", + }, + }, + stake_red={ + name="Красная ставка", + text={ + "{C:attention}Малый блайнд{} не дает", + "денег в награду", + "{s:0.8}Применяет все предыдущие ставки", + }, + }, + stake_white={ + name="Белая ставка", + text={ + "Базовая сложность", + }, + }, + }, + Tag={ + tag_boss={ + name="Тег босса", + text={ + "Перебрасывает", + "{C:attention}Босс-блайнд", + }, + }, + tag_buffoon={ + name="Тег шута", + text={ + "Дает бесплатный", + "{C:attention}Набор шута", + }, + }, + tag_charm={ + name="Тег очарования", + text={ + "Дает бесплатный", + "{C:tarot}Набор мегааркана", + }, + }, + tag_coupon={ + name="Тег купона", + text={ + "Начальные карты и", + "бустерные наборы в следующей", + "лавке бесплатны", + }, + }, + tag_d_six={ + name="Тег D6", + text={ + "Перебросы в следующей лавке", + "начинаются при {C:money}$0", + }, + }, + tag_double={ + name="Двойной тег", + text={ + "Дает копию", + "следующего выбранного {C:attention}тега{},", + "{s:0.8}за исключением {s:0.8,C:attention}двойного тега", + }, + }, + tag_economy={ + name="Экономический тег", + text={ + "Удваивает ваши деньги", + "{C:inactive}(макс. {C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="Эфирный тег", + text={ + "Дает бесплатный", + "{C:planet}Спектральный набор", + }, + }, + tag_foil={ + name="Фольговый тег", + text={ + "Следующий джокер базового", + "выпуска из лавки бесплатен и", + "становится {C:dark_edition}фольговым", + }, + }, + tag_garbage={ + name="Мусорный тег", + text={ + "Дает {C:money}$#1#{} за каждый неиспользованный", + "{C:red}сброс{} в этой партии", + "{C:inactive}(даст {C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="Ручной тег", + text={ + "Дает {C:money}$#1#{} за каждую сыгранную", + "{C:blue}руку{} в этой партии", + "{C:inactive}(даст {C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="Голографический тег", + text={ + "Следующий джокер базового", + "выпуска из лавки бесплатен и", + "становится {C:dark_edition}голографическим", + }, + }, + tag_investment={ + name="Инвестиционный тег", + text={ + "После победы", + "над Босс-блайндом", + "дает {C:money}$#1#", + }, + }, + tag_juggle={ + name="Жонглерский тег", + text={ + "{C:attention}+#1#{} размер руки", + "на следующий раунд", + }, + }, + tag_meteor={ + name="Тег метеора", + text={ + "Дает бесплатный", + "{C:planet}Меганебесный набор", + }, + }, + tag_negative={ + name="Негативный тег", + text={ + "Следующий джокер базового", + "выпуска из лавки бесплатен и", + "становится {C:dark_edition}негативным", + }, + }, + tag_orbital={ + name="Орбитальный тег", + text={ + "Повышает {C:attention}#1#", + "на {C:attention}#2# ур.", + }, + }, + tag_polychrome={ + name="Полихромный тег", + text={ + "Следующий джокер базового", + "выпуска из лавки бесплатен и", + "становится {C:dark_edition}полихромным", + }, + }, + tag_rare={ + name="Редкий тег", + text={ + "В лавке есть бесплатный", + "{C:red}редкий джокер", + }, + }, + tag_skip={ + name="Тег скорости", + text={ + "Дает по {C:money}$#1#{} за пропущенный", + "блайнд в этой партии", + "{C:inactive}(даст {C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="Стандартный тег", + text={ + "Дает бесплатный", + "{C:attention}Мегастандартный набор", + }, + }, + tag_top_up={ + name="Тег пополнения", + text={ + "Создать до {C:attention}#1#", + "{C:blue}обычных{} джокеров", + "{C:inactive}(должно быть место)", + }, + }, + tag_uncommon={ + name="Необычный тег", + text={ + "В лавке есть бесплатный", + "{C:green}необычный джокер", + }, + }, + tag_voucher={ + name="Тег ваучера", + text={ + "Добавляет один {C:voucher}ваучер", + "в следующую лавку", + }, + }, + }, + Tarot={ + c_chariot={ + name="Колесница", + text={ + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#", + }, + }, + c_death={ + name="Смерть", + text={ + "Выберите {C:attention}#1#{} карт(ы),", + "{C:attention}левая{} карта будет", + "преобразована в {C:attention}правую{}", + "{C:inactive}(перетащите, чтобы изменить)", + }, + }, + c_devil={ + name="Дьявол", + text={ + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="Император", + text={ + "Создает до {C:attention}#1#", + "случайных карт {C:tarot}Таро{}", + "{C:inactive}(должно быть место)", + }, + }, + c_empress={ + name="Императрица", + text={ + "Улучшает {C:attention}#1#", + "выбранных(е) карт(ы) до:", + "{C:attention}#2#", + }, + }, + c_fool={ + name="Дурак", + text={ + "Создает последнюю", + "карту {C:tarot}Таро{} или {C:planet}планеты{},", + "использованную в этой партии,", + "за исключением {s:0.8,C:tarot}Дурака{s:0.8}", + }, + }, + c_hanged_man={ + name="Висельник", + text={ + "Уничтожает до", + "{C:attention}#1#{} выбранных карт(ы)", + }, + }, + c_heirophant={ + name="Иерофант", + text={ + "Улучшает {C:attention}#1#", + "выбранных(е) карт(ы) до:", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="Отшельник", + text={ + "Удваивает деньги", + "{C:inactive}(макс. {C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="Верховная Жрица", + text={ + "Создает до {C:attention}#1#", + "случайных карт {C:planet}планет{}", + "{C:inactive}(должно быть место)", + }, + }, + c_judgement={ + name="Суд", + text={ + "Создает случайную", + "карту {C:attention}джокера{}", + "{C:inactive}(должно быть место)", + }, + }, + c_justice={ + name="Правосудие", + text={ + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="Влюбленные", + text={ + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#", + }, + }, + c_magician={ + name="Волшебник", + text={ + "Улучшает выбранные карты x{C:attention}#1#{}", + "до:", + "{C:attention}#2#", + }, + }, + c_moon={ + name="Луна", + text={ + "Преобразует до", + "{C:attention}#1#{} выбранных карт", + "в: {V:1}#2#{}", + }, + }, + c_star={ + name="Звезда", + text={ + "Преобразует до", + "{C:attention}#1#{} выбранных карт", + "в: {V:1}#2#{}", + }, + }, + c_strength={ + name="Сила", + text={ + "Увеличивает достоинство", + "до {C:attention}#1#{} выбранных", + "карт(ы) на {C:attention}1", + }, + }, + c_sun={ + name="Солнце", + text={ + "Преобразует до", + "{C:attention}#1#{} выбранных карт", + "в: {V:1}#2#{}", + }, + }, + c_temperance={ + name="Умеренность", + text={ + "Дает общую стоимость", + "продажи всех текущих", + "джокеров {C:inactive}(макс. {C:money}$#1#{C:inactive})", + "{C:inactive}(сейчас {C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="Башня", + text={ + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="Колесо Фортуны", + text={ + "Шанс {C:green}#1# из #2#{} добавить", + "{C:dark_edition}фольговый{}, {C:dark_edition}голографический{} или", + "{C:dark_edition}полихромный{} выпуск", + "к случайному {C:attention}джокеру", + }, + }, + c_world={ + name="Мир", + text={ + "Преобразует до", + "{C:attention}#1#{} выбранных карт", + "в: {V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="Антиматерия", + text={ + "{C:dark_edition}+1{} слот джокера", + }, + unlock={ + "Получить {C:voucher}«Пусто»{}", + "суммарно {C:attention}#1#{} раз(а)", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="Пусто", + text={ + "{C:inactive}Ничего не делает?", + }, + }, + v_clearance_sale={ + name="Распродажа", + text={ + "Все карты и наборы в", + "лавке со скидкой {C:attention}#1#%{}", + }, + }, + v_crystal_ball={ + name="Хрустальный шар", + text={ + "{C:attention}+1{} слот расходуемого", + }, + }, + v_directors_cut={ + name="Режиссерская версия", + text={ + "Переброс Босс-блайнда", + "{C:attention}1{} раз за анте,", + "{C:money}$#1#{} за ролл", + }, + }, + v_glow_up={ + name="Свечение", + text={ + "{C:dark_edition}Фольговые{}, {C:dark_edition}голографические{} и", + "{C:dark_edition}полихромные{} карты", + "появляются в {C:attention}#1# раз(а){} чаще", + }, + unlock={ + "Иметь минимум {C:attention}#1#", + "карт(ы) {C:attention}джокера{} с", + "{C:dark_edition}фольговым{}, {C:dark_edition}голографическим{} или", + "{C:dark_edition}полихромным{} выпуском", + }, + }, + v_grabber={ + name="Хапуга", + text={ + "Навсегда", + "дает {C:blue}+#1#{} руку", + "на каждый раунд", + }, + }, + v_hieroglyph={ + name="Иероглиф", + text={ + "{C:attention}-#1#{} от анте,", + "{C:blue}-#1#{} от руки", + "в каждом раунде", + }, + }, + v_hone={ + name="Заточка", + text={ + "{C:dark_edition}Фольговые{}, {C:dark_edition}голографические{} и", + "{C:dark_edition}полихромные{} карты", + "появляются в {C:attention}#1# раз(а){} чаще", + }, + }, + v_illusion={ + name="Иллюзия", + text={ + "{C:attention}Играемые карты{} в лавке", + "могут иметь {C:enhanced}улучшение{},", + "{C:dark_edition}выпуск{} и/или {C:attention}печать{}", + }, + unlock={ + "Купить суммарно", + "{C:attention}#1#{} играемых карт(ы)", + "в лавке", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="Ликвидация", + text={ + "Все карты и наборы в", + "лавке со скидкой {C:attention}#1#%{}", + }, + unlock={ + "Выкупить минимум", + "{C:attention}#1#{C:voucher} карт-ваучеров{}", + "в одной партии", + }, + }, + v_magic_trick={ + name="Фокус", + text={ + "{C:attention}Играемые карты{} можно", + "приобрести", + "в {C:attention}лавке", + }, + }, + v_money_tree={ + name="Денежное дерево", + text={ + "Поднимите лимит", + "процента в каждом раунде", + "до {C:money}#1#${}", + }, + unlock={ + "Набрать максимум", + "процентов за раунд в", + "{C:attention}#1#{} раундах подряд", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="Начо Тонг", + text={ + "Навсегда", + "дает {C:blue}+#1#{} руку", + "на каждый раунд", + }, + unlock={ + "Сыграть суммарно", + "{C:attention}#1#{} карт(ы)", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="Обсерватория", + text={ + "Карты {C:planet}планет{} в вашей", + "{C:attention}расходуемой{} зоне дают", + "{X:red,C:white} X#1# {} множ. за", + "соотв. {C:attention}покерную руку", + }, + unlock={ + "Использовать суммарно {C:attention}#1#", + "карт(ы) {C:planet}планет{} из любого", + "{C:planet}Небесного набора", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="Омут", + text={ + "{C:spectral}Спектральные{} карты могут", + "появляться в любых", + "{C:attention}наборах аркана", + }, + unlock={ + "Использовать суммарно {C:attention}#1#", + "карт(ы) {C:tarot}Таро{} из любого", + "{C:tarot}набора аркана", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="Избыток", + text={ + "{C:attention}+1{} слот карты", + "доступен в лавке", + }, + }, + v_overstock_plus={ + name="Избыток плюс", + text={ + "{C:attention}+1{} слот карты", + "доступен в лавке", + }, + unlock={ + "Потратить суммарно", + "{C:money}$#1#{} в лавке", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="Кисть для рисования", + text={ + "{C:attention}+#1#{} размер руки", + }, + }, + v_palette={ + name="Палитра", + text={ + "{C:attention}+#1#{} размер руки", + }, + unlock={ + "Уменьшите размер руки", + "до {C:attention}#1#{} карт", + }, + }, + v_petroglyph={ + name="Петроглиф", + text={ + "{C:attention}-#1#{} от анте,", + "{C:red}-#1#{} от сброса", + "в каждом раунде", + }, + unlock={ + "Достичь анте", + "уровня {E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="Торговец планетами", + text={ + "Карты {C:planet}планет{} появляются", + "в {C:attention}#1# раз(а){} чаще", + "в лавке", + }, + }, + v_planet_tycoon={ + name="Магнат планет", + text={ + "Карты {C:planet}планет{} появляются", + "в {C:attention}#1# раз(а){} чаще", + "в лавке", + }, + unlock={ + "Купить суммарно", + "{C:attention}#1#{C:planet} карт(ы) планет{}", + "в лавке", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="Рецикломантия", + text={ + "Навсегда", + "получите {C:red}+#1#{} к сбросу", + "в каждом раунде", + }, + unlock={ + "Сбросить суммарно", + "{C:attention}#1#{} карт(ы)", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="Изобилие перебросов", + text={ + "Перебросы стоят", + "на {C:money}$#1#{} меньше", + }, + unlock={ + "Перебросить лавку", + "суммарно {C:attention}#1#{} раз(а)", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="Излишек перебросов", + text={ + "Перебросы стоят", + "на {C:money}$#1#{} меньше", + }, + }, + v_retcon={ + name="Реткон", + text={ + "Переброс Босс-блайнда", + "{C:attention}неограниченное{} число раз,", + "по {C:money}$#1#{} за ролл", + }, + unlock={ + "Открыть", + "{C:attention}#1#{} блайнды", + }, + }, + v_seed_money={ + name="Подъемные", + text={ + "Поднимите лимит", + "процента в каждом раунде", + "до {C:money}#1#${}", + }, + }, + v_tarot_merchant={ + name="Торговец Таро", + text={ + "Карты {C:tarot}Таро{} появляются", + "в {C:attention}#1# раз(а){} чаще", + "в лавке", + }, + }, + v_tarot_tycoon={ + name="Магнат Таро", + text={ + "Карты {C:tarot}Таро{} появляются", + "в {C:attention}#1# раз(а){} чаще", + "в лавке", + }, + unlock={ + "Купить суммарно", + "{C:attention}#1#{C:tarot} карт(ы) Таро{}", + "в лавке", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="Телескоп", + text={ + "{C:attention}Небесные наборы{} всегда", + "содержат карту {C:planet}планеты{}", + "для вашей наиболее", + "играемой {C:attention}покерной руки", + }, + }, + v_wasteful={ + name="Транжира", + text={ + "Навсегда", + "получите {C:red}+#1#{} к сбросу", + "в каждом раунде", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="Набрать 100 000 000 шт. фишек за одну руку", + _1000k="Набрать 1 000 000 шт. фишек за одну руку", + _10k="Набрать 10 000 шт. фишек за одну руку", + ante_up="Достичь анте 4", + ante_upper="Достичь анте 8", + astronomy="Открыть каждую карту планеты", + big_hands="Собрать 80 или более карт в колоде", + card_discarder="Сбросить не менее 2500 карт", + card_player="Разыграть не менее 2500 карт", + cartomancy="Открыть каждую карту Таро", + clairvoyance="Открыть каждую спектральную карту", + completionist="Открыть 100% коллекции", + completionist_plus="Выиграть с каждой колодой на сложности Золотая ставка", + completionist_plus_plus="Получить золотую наклейку на каждом джокере", + extreme_couponer="Открыть каждый ваучер", + flushed="Сыграть флеш с 5 дикими картами", + heads_up="Выиграть партию", + high_stakes="Выиграть партию на сложности не ниже Золотой ставки", + legendary="Открыть легендарного джокера", + low_stakes="Выиграть партию на сложности не ниже Красной ставки", + mid_stakes="Выиграть партию на сложности не ниже Черной ставки", + nest_egg="Иметь $400 или больше за одну партию", + retrograde="Поднять любую покерную руку до 10 уровня", + roi="Купить 5 ваучеров до анте 4", + royale="Сыграть флеш-рояль", + rule_bender="Завершить любое испытание", + rule_breaker="Завершить каждое испытание", + shattered="Разбить 2 стеклянные карты за одну руку", + speedrunner="Выиграть партию за 12 или менее раундов", + tiny_hands="Сократить колоду до 20 или менее карт", + you_get_what_you_get="Выиграть партию без переброса лавки", + }, + achievement_names={ + _100000k="100 000К", + _1000k="1000К", + _10k="10К", + ante_up="Больше анте!", + ante_upper="Еще больше анте!", + astronomy="Астрономия", + big_hands="Огромные ручищи", + card_discarder="Сбрасывающий карты", + card_player="Разыгрывающий карты", + cartomancy="Картомантия", + clairvoyance="Ясновидение", + completionist="Все и сразу", + completionist_plus="Все и сразу+", + completionist_plus_plus="Все и сразу++", + extreme_couponer="Купономания", + flushed="Флеш", + heads_up="Один на один", + high_stakes="Высокие ставки", + legendary="Легенда", + low_stakes="Низкие ставки", + mid_stakes="Средние ставки", + nest_egg="Заначка", + retrograde="Ретроград", + roi="Окупаемость инвестиций", + royale="Рояль", + rule_bender="Изменяя правила", + rule_breaker="Нарушая правила", + shattered="Вдребезги", + speedrunner="Скороход", + tiny_hands="Крохотные ручки", + you_get_what_you_get="Что вышло, то вышло", + }, + blind_states={ + Current="Сейчас", + Defeated="Побежден", + Select="Выбрать", + Selected="Выбрано", + Skipped="Пропущено", + Upcoming="Следующее", + }, + challenge_names={ + c_blast_off_1="На взлет", + c_bram_poker_1="Брэм-покер", + c_city_1="15-минутный город", + c_cruelty_1="Жестокость", + c_double_nothing_1="Все или ничего", + c_five_card_1="Пять карт", + c_fragile_1="Хрупкое", + c_golden_needle_1="Золотая игла", + c_inflation_1="Инфляция", + c_jokerless_1="Без джокеров", + c_knife_1="На острие ножа", + c_luxury_1="Налог на роскошь", + c_mad_world_1="Безумный мир", + c_medusa_1="Медуза", + c_monolith_1="Монолит", + c_non_perishable_1="Не портится", + c_omelette_1="Омлет", + c_rich_1="Богатые становятся богаче", + c_typecast_1="Одно и то же", + c_xray_1="Рентгеновское зрение", + }, + collabs={ + Clubs={ + ["1"]="По умолчанию", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="По умолчанию", + ["2"]="DAVE THE DIVER", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="По умолчанию", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="Cult of the Lamb", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="По умолчанию", + ["2"]="Ведьмак", + ["3"]="Cyberpunk 2077", + ["4"]="Shovel Knight", + ["5"]="Don’t Starve", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="Вопросы и ответы", + b_and_use="И ИСПОЛЬЗОВАТЬ", + b_back="Назад", + b_blinds="Блайнды", + b_booster_packs="Бустерные наборы", + b_buy="КУПИТЬ", + b_cash_out="Обналичить", + b_challenges="Испытания", + b_collection="Коллекция", + b_collection_cap="КОЛЛЕКЦИЯ", + b_continue="Продолжить", + b_copy="Копия", + b_copy_seed="Копировать сид", + b_create_profile="Создать профиль", + b_credits="Титры", + b_current_profile="Текущий профиль", + b_customize_deck="Настраивать колоду", + b_deck="Колода", + b_decks="Колоды", + b_delete_profile="Удалить профиль", + b_discard="Сброс", + b_editions="Выпуски", + b_endless="Бесконечный режим", + b_enhanced_cards="Улучшенные карты", + b_full_deck="Полная колода", + b_high_contrast_cards="Высококонтрастные карты", + b_how_to_play="Как играть", + b_imagery="Изображения", + b_jokers="Джокеры", + b_load_profile="Загрузить профиль", + b_main_menu="Главное меню", + b_music="Музыка", + b_new_challenge="Начать новое испытание", + b_new_run="Новая партия", + b_next="Дальше", + b_next_round_1="Следующий", + b_next_round_2="Раунд", + b_open="ОТКРЫТЬ", + b_options="Параметры", + b_options_cap="ПАРАМЕТРЫ", + b_planet_cards="Карты планет", + b_play_cap="ИГРАТЬ", + b_play_hand="Играть руку", + b_playbalatro="Посетите playbalatro.com", + b_poker_hands="Покерные руки", + b_quit_cap="ВЫХОД", + b_redeem="ВЫКУПИТЬ", + b_reduced_motion="Ограниченная анимация", + b_remaining="Осталось", + b_reroll_boss="Переброс босса", + b_reset_profile="Сбросить профиль", + b_restrictions="Ограничения", + b_retry="Заново", + b_rules="Правила", + b_run_info_1="Партия", + b_run_info_2="Детали", + b_seals="Печати", + b_seed="Сид", + b_select="ВЫБРАТЬ", + b_sell="ПРОДАТЬ", + b_set_CRT="ЭЛТ", + b_set_CRT_bloom="Свечение ЭЛТ", + b_set_apply="Применить", + b_set_audio="Аудио", + b_set_crash_reports="Отчеты о сбоях", + b_set_game="Игра", + b_set_game_vol="Громкость игры", + b_set_gamespeed="Скорость игры", + b_set_graphics="Графика", + b_set_master_vol="Основная громкость", + b_set_monitor="Монитор вывода", + b_set_music_vol="Громкость музыки", + b_set_pixel_smoothing="Сглаживание пиксель-арта", + b_set_play_discard_pos="Положение кнопки «Игра/Сброс»", + b_set_rumble="Вибрация контроллера", + b_set_screenshake="Тряска экрана", + b_set_shadows="Тени", + b_set_vibration="Вибрация", + b_set_video="Видео", + b_set_windowmode="Оконный режим", + b_settings="Настройки", + b_skip="Пропуcк", + b_skip_blind="Пропустить блайнд", + b_skip_reward="Пропустить награду", + b_sort_hand="Сортировать руку", + b_sounds="Звуки", + b_spectral_cards="Спектральные карты", + b_stake="Ставка", + b_start_new_run="Новая партия", + b_stat_consumables="Расходуемое", + b_stat_jokers="Джокеры", + b_stat_planets="Планеты", + b_stat_spectrals="Спектральные", + b_stat_tarots="Таро", + b_stat_vouchers="Ваучеры", + b_stats="Статистика", + b_tags="Теги", + b_tarot_cards="Карты Таро", + b_unlock_all="Разблокировать все", + b_use="ИСПОЛЬЗОВАТЬ", + b_vouchers="Ваучеры", + b_wishlist="Список желаний в Steam", + k_aces="Тузы", + k_achievement="Достижение", + k_achievements_disabled="Достижения отключены", + k_active="активно", + k_active_ex="Активно!", + k_again_ex="Снова!", + k_all_hands="Все руки", + k_also_applied="Также применено", + k_ante="Анте", + k_ante_cap="АНТЕ", + k_arcana_pack="Набор аркана", + k_balanced="Сбалансировано", + k_banned_cards="Запрещенные карты", + k_banned_tags="Запрещенные теги", + k_base_cap="БАЗА", + k_base_cards="Базовые карты", + k_best_hand="Лучшая рука", + k_booster="Бустер", + k_buffoon_pack="Набор шута", + k_cap_consumables="РАСХОДУЕМОЕ", + k_card_stats="Статистика карт", + k_celestial_pack="Небесный набор", + k_challenge_mode="Режим испытания", + k_challenges="Испытания", + k_choose="Выбрать", + k_collection="Коллекция", + k_common="Обычная", + k_compatible="совместимо", + k_copied_ex="Скопировано!", + k_custom_rules="Особые правила", + k_daily_run="Ежедневная партия", + k_debuffed="Ослаблено", + k_deck="Колода", + k_deck_stake_wins="Выигрыш колоды", + k_defeated_by="Поражение от:", + k_demo_version_ex="Демоверсия!", + k_disabled_ex="Отключено!", + k_drank_ex="Принято!", + k_duplicated_ex="Дублировано!", + k_dwarf_planet="Карликовая планета", + k_eaten_ex="Съедено!", + k_edition="Выпуск", + k_effective="Действительно", + k_empty_caps="ПУСТО", + k_enter_name="Введите имя", + k_enter_seed="Введите сид", + k_enter_text="Введите текст", + k_eroded_ex="Разрушено!", + k_extinct_ex="Исчезло!", + k_face_cards="Карты с лицом", + k_game_modifiers="Модификаторы игры", + k_gold="Золото", + k_high_score_ex="Высокий балл!", + k_hud_discards="Сбросы", + k_hud_hands="Руки", + k_incompatible="несовместимо", + k_joker="Джокер", + k_joker_stickers="Наклейки джокера", + k_jokers_cap="ДЖОКЕРЫ", + k_legendary="Легендарная", + k_level_prefix="ур.", + k_level_up_ex="Уровень повышен!", + k_locked="Заблокировано", + k_lower_score="очки", + k_lvl="ур.", + k_melted_ex="Расплавлено!", + k_money="Деньги", + k_mult="Множ.", + k_no_other_jokers="Нет других джокеров!", + k_no_reward="Без награды", + k_no_room_ex="Нет места!", + k_no_space_ex="Нет пространства!", + k_none="Нет", + k_nope_ex="Нет!", + k_not_allowed_ex="Запрещено!", + k_not_discovered="Не открыто", + k_numbered_cards="Числовые карты", + k_or="или", + k_other="Другое", + k_page="Страница", + k_planet="Планета", + k_planet_q="Планета?", + k_playing_as="Игра за", + k_plus_joker="+1 джокер", + k_plus_planet="+1 Планета", + k_plus_spectral="+1 Спектральная", + k_plus_stone="+1 Камни", + k_plus_tarot="+1 Таро", + k_poker_hand="покерную руку", + k_profile="Профиль", + k_progress="Прогресс", + k_rank="Достоинство", + k_rare="Редкая", + k_redeemed_ex="Выкуплено!", + k_reroll="Переброс", + k_reset="Перезапуск", + k_reward="Награда", + k_round="Раунд", + k_safe_ex="Безопасно!", + k_saved_ex="Сохранено!", + k_seed="Сид", + k_seeded_run="Партия с сидом", + k_skipped_cap="ПРОПУЩЕНО", + k_spectral="Спектральная", + k_spectral_pack="Спектральный набор", + k_stake="Ставка", + k_stake_level="Уровень ставки", + k_standard_pack="Стандартный набор", + k_suit="Масть", + k_swapped_ex="Заменено!", + k_tarot="Таро", + k_trophies_disabled="Трофеи отключены", + k_trophy="Трофей", + k_uncommon="Необычная", + k_undisovered="Не открыто", + k_unknown="?????", + k_unlocked_ex="Разблокирована!", + k_upgrade_ex="Улучшение!", + k_val_up="Значение повышено!", + k_view="Просмотр", + k_voucher="Ваучер", + k_vouchers_cap="ВАУЧЕРЫ", + k_wins="Победы", + k_x_base="X база", + ml_bloom_opt={ + "Откл.", + "Вкл.", + }, + ml_buy_and_use_target={ + "КУПИТЬ", + "И ИСПОЛЬЗОВАТЬ", + }, + ml_buy_target={ + "КУПИТЬ", + }, + ml_card_stats={ + "Карта", + "Статистика", + }, + ml_controller_required={ + "Для игры требуется контроллер.", + "Подключите его, чтобы продолжить.", + }, + ml_crash_report_info={ + "Отчеты о сбоях будут отправлены разработчику,", + "чтобы помочь уменьшить проблемы в будущем.", + "Идентификационные или личные данные не отправляются.", + }, + ml_demo_thanks_message={ + "Добавляйте Balatro в список", + "желаний в Steam и подписывайтесь на", + "рассылку на playbalatro.com", + }, + ml_disabled_seed={ + "Все разблокировки и", + "открытия отключены", + }, + ml_edition_seal_enhancement_explanation={ + "У каждой игральной карты может быть по одному", + "улучшению, выпуску и печати", + }, + ml_eternal={ + "Вечный", + "Нельзя продать", + "или уничтожить", + }, + ml_gold_seal_desc={ + "Золотая печать", + "возвращается в руку", + "при разыгрывании", + }, + ml_offline_message={ + "Это устройство не в сети.", + "Возможно, текущее сохранение устарело.", + }, + ml_open_target={ + "ОТКРЫТЬ", + }, + ml_paste_seed={ + "Вставить", + "Сид", + }, + ml_play_discard_pos_opt={ + "Сброс/Игра", + "Игра/Сброс", + }, + ml_redeem_target={ + "ВЫКУПИТЬ", + }, + ml_sell_target={ + "ПРОДАТЬ", + }, + ml_shadow_opt={ + "Вкл.", + "Откл.", + }, + ml_smoothing_opt={ + "Откл.", + "Вкл.", + }, + ml_unlock_all_explanation={ + "ВНИМАНИЕ! Разблокировав полную коллекцию,", + "вы отключите достижения для этого профиля!", + }, + ml_unlock_all_trophies={ + "ВНИМАНИЕ! Разблокировав полную коллекцию,", + "отключит трофеи для этого профиля!", + }, + ml_vsync_opt={ + "Верт. синрх. вкл.", + "Верт. синрх. откл.", + }, + ml_windowmode_opt={ + "В окне", + "Полный экран", + "Без границ", + }, + ph_1_level="+1 уровень", + ph_4_7_of_clubs="четыре 7 треф", + ph_alert_debuff_confirm="Нажмите «Играть» снова, чтобы подтвердить", + ph_all_poker_hand="Все покерные руки", + ph_blind_reward="Награда: ", + ph_blind_score_at_least="Минимум очков", + ph_boss_disabled="Босс отключен!", + ph_choose_blind_1="Выберите ваш", + ph_choose_blind_2="следующий блайнд", + ph_click_confirm="Нажмите снова, чтобы подтвердить", + ph_deck_preview_effective="Действительный итог благодаря джокерам, блайндам и улучшениям карт", + ph_deck_preview_stones="Камни", + ph_defeat_the_boss="Победить Босс-блайнд", + ph_defeat_this_blind_1="Победите этот блайнд,", + ph_defeat_this_blind_2="чтобы открыть его", + ph_demo_thanks_1="Спасибо за игру", + ph_demo_thanks_2="В ДЕМО-ВЕРСИЮ BALATRO", + ph_display_stickers="Отображение наклеек Ставки во время Партии", + ph_game_over="ИГРА ОКОНЧЕНА", + ph_improve_run="Улучшите свою партию!", + ph_most_played="{наиболее часто сыгранная рука}", + ph_mr_bones="Спасены Костлявым", + ph_no_boss_active="босс не активен", + ph_no_vouchers="В этой партии не были выкуплены ваучеры", + ph_score_at_least="Минимум очков", + ph_score_cards_discarded="Сброшенные карты", + ph_score_cards_played="Сыгранные карты", + ph_score_cards_purchased="Купленные карты", + ph_score_furthest_ante="Анте", + ph_score_furthest_round="Раунд", + ph_score_hand="Лучшая рука", + ph_score_new_collection="Новые открытия", + ph_score_poker_hand="Наиболее часто сыгранная рука", + ph_score_times_rerolled="Количество перебросов", + ph_select_challenge="Выберите Испытание", + ph_sneak_peek="Беглый взгляд", + ph_stat_consumable="Количество использований карты", + ph_stat_joker="Всего завершено раундов с этой картой", + ph_stat_voucher="Количество выкупов ваучера", + ph_unscored_hand="Рука не принесет очки", + ph_up_ante_1="Повысить анте", + ph_up_ante_2="Поднять все блайнды", + ph_up_ante_3="Обновить блайнды", + ph_vouchers_redeemed="Ваучеры, выкупленные в этой партии", + ph_you_win="ВЫ ПОБЕДИЛИ!", + ph_you_win_demo="ВЫ ВЫИГРАЛИ В ДЕМО!", + }, + high_scores={ + boss_streak="Максимум боссов подряд", + collection="Коллекция", + current_streak="", + furthest_ante="Наивысшее анте", + furthest_round="Наивысший раунд", + hand="Лучшая рука", + most_money="Максимум денег", + poker_hand="Наиболее часто сыгранная рука", + win_streak="Лучшая серия побед", + }, + labels={ + blue_seal="Синяя печать", + common="Обычная", + eternal="Вечное", + foil="Фольговый", + gold_seal="Золотая печать", + holographic="Голографический", + legendary="Легендарная", + locked="Заблокировано", + negative="Негатив", + perishable="Портящийся", + pinned_left="Закреплено", + planet="Планета", + pluto_planet="Карликовая планета", + polychrome="Полихромный", + purple_seal="Фиолетовая печать", + rare="Редкая", + red_seal="Красная печать", + rental="Прокатный", + tarot="Таро", + uncommon="Необычная", + voucher="Ваучер", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5 карт одного достоинства", + }, + Flush={ + "5 карт одной масти", + }, + ["Flush Five"]={ + "5 карт с одинаковыми достоинством и мастью", + }, + ["Flush House"]={ + "Сет и пара со", + "всеми картами одной масти", + }, + ["Four of a Kind"]={ + "4 карты одного достоинства. Они могут", + "быть сыграны с 1 неподсчитанной картой", + }, + ["Full House"]={ + "Сет и пара", + }, + ["High Card"]={ + "Если сыгранная рука не является одной из вышеуказанных", + "рук, считается только карта с наибольшим достоинством", + }, + Pair={ + "2 карты одного достоинства. Они могут", + "быть сыграны с 3 неподсчитанными картами", + }, + ["Royal Flush"]={ + "5 карт в ряд {последовательные ранги} со", + "всеми картами одной масти", + }, + Straight={ + "5 карт по порядку {последовательных достоинств}", + }, + ["Straight Flush"]={ + "5 карт в ряд {последовательные ранги} со", + "всеми картами одной масти", + }, + ["Three of a Kind"]={ + "3 карты одного достоинства. Они могут", + "быть сыграны с 2 неподсчитанными картами", + }, + ["Two Pair"]={ + "2 пары карт разного достоинства, могут", + "быть сыграны с 1 неподсчитанной картой", + }, + }, + poker_hands={ + ["Five of a Kind"]="Пять одного вида", + Flush="Флеш", + ["Flush Five"]="Флеш-пять", + ["Flush House"]="Флеш-хаус", + ["Four of a Kind"]="Каре", + ["Full House"]="Фулл-хаус", + ["High Card"]="Старшая карта", + Pair="Пара", + ["Royal Flush"]="Флеш-рояль", + Straight="Стрит", + ["Straight Flush"]="Стрит-флеш", + ["Three of a Kind"]="Сет", + ["Two Pair"]="Две пары", + }, + quips={ + dq_1={ + "Ух! Надеюсь, у тебя", + "осталось пару козырей", + "в рукаве для", + "последнего испытания!", + }, + lq_1={ + "Может, нам", + "лучше поиграть", + "в пасьянс...", + }, + lq_10={ + "Вот так облом!", + }, + lq_2={ + "Какой неудачный", + "расклад!", + }, + lq_3={ + "Время", + "перетасовать карты и", + "попробовать снова!", + }, + lq_4={ + "Знаешь,", + "как говорится:", + "казино всегда в выигрыше.", + }, + lq_5={ + "Похоже, мы узнали,", + "кто здесь", + "настоящий джокер!", + }, + lq_6={ + "Ты что,", + "тоже блефовал?", + }, + lq_7={ + "Похоже,", + "мы в дураках!", + }, + lq_8={ + "Будь у меня руки,", + "я бы закрыл", + "ими глаза!", + }, + lq_9={ + "Я буквально", + "шут, а у тебя", + "какое оправдание?", + }, + wq_1={ + "Великолепно!", + }, + wq_2={ + "Отличная", + "работа!", + }, + wq_3={ + "Похоже, это", + "был не блеф!", + }, + wq_4={ + "Как жаль, что", + "фишки", + "виртуальные...", + }, + wq_5={ + "Похоже, я неплохо", + "тебя обучил!", + }, + wq_6={ + "Тебе удалось сыграть", + "несколько хороших партий!", + }, + wq_7={ + "Хорошо,", + "что я поставил", + "на тебя!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="Туз", + Jack="Валет", + King="Король", + Queen="Дама", + }, + suits_plural={ + Clubs="Трефы", + Diamonds="Бубны", + Hearts="Черви", + Spades="Пики", + }, + suits_singular={ + Clubs="Трефы", + Diamonds="Бубны", + Hearts="Черви", + Spades="Пики", + }, + tutorial={ + bb_1={ + "Выбор {C:attention}большого блайнда", + "принесет немного денег", + }, + bb_2={ + "Или же выберите {C:attention}пропустить его,", + "чтобы получить {C:attention}тег{}! Каждый", + "{C:attention}тег{} обладает уникальным эффектом", + }, + bb_3={ + "Но следите за", + "{C:attention}Босс-блайндом{}. У него", + "есть способность, вокруг", + "которой нужно строить тактику.", + }, + bb_4={ + "Если побьете его, то", + "{C:attention}анте{} поднимется и все", + "{C:attention}блайнды{} станут сложнее", + }, + bb_5={ + "Побейте {C:attention}анте{} #1#, чтобы выиграть.", + "Выберите свой путь!", + }, + fh_1={ + "Фишки зарабатываются путем", + "игры {C:attention}покерных рук", + }, + fh_2={ + "Каждая {C:attention}покерная рука{} приносит", + "базовое количество {C:blue}фишек,", + "умноженное на некий {C:red}множ. (множитель)", + }, + fh_3={ + "Просмотреть свои {C:attention}покерные руки", + "вы можете в зоне {C:attention}«Сведения о партии»{} —", + "наряду с другой информацией", + "о вашей текущей партии", + }, + fh_4={ + "Карты также", + "зарабатывают {C:blue}фишки{},", + "наведите курсор, чтобы посмотреть!", + }, + fh_4_touch={ + "Карты также принесут", + "вам {C:blue}фишки{},", + "нажмите и удерживайте, чтобы узнать больше!", + }, + fh_5={ + "Теперь выберите до", + "{C:attention}5{} карт, чтобы сыграть,", + "и нажмите {C:blue}«Играть руку»", + }, + fh_5_touch={ + "Теперь коснитесь до", + "{C:attention}5{} карт, чтобы сыграть,", + "и нажмите {C:blue}«Играть руку»", + }, + fh_6={ + "Можно также {C:red}сбросить{}", + "до {C:attention}5{} выбранных карт,", + "чтобы попытаться сделать", + "руки еще сильнее. Попробуйте!", + }, + fh_7={ + "Осторожно! У вас", + "ограниченное число {C:blue}рук", + "и {C:red}сбросов{} на раунд", + }, + fh_8={ + "Заработайте {C:attention}300 фишек{}, прежде", + "чем у вас закончатся {C:blue}руки,", + "чтобы выиграть в этом раунде.", + "Удачи!", + }, + s_1={ + "Замечательно! Теперь, когда", + "у вас {E:1}полно{} {C:money}денег{},", + "вы можете купить новые", + "карты в {C:attention}лавке", + }, + s_10={ + "{C:attention}Ваучеры{} пополняются", + "после победы над", + "{C:attention}Босс-блайндом{}.", + }, + s_11={ + "Также проверяйте оба", + "{C:booster}бустерных набора{} в", + "каждой лавке. В них", + "полно полезностей!", + }, + s_12={ + "Перейдем к", + "{C:attention}следующему раунду{}.", + }, + s_2={ + "Попробуйте купить этого", + "симпатичного Дьявола", + }, + s_2_touch={ + "Попробуйте купить этого", + "симпатичного парня!", + "Перетащите его из магазина", + "в область {C:attention}КУПИТЬ{}", + }, + s_3={ + "Это один из {C:attention}#1#", + "{C:attention}джокеров{}, которых вы можете добавить", + "в партию. Каждый {C:attention}джокер", + "делает что-то особенное", + }, + s_4={ + "Этот добавляет {C:red}+4 множ.{} к", + "каждой руке, которую вы играете!", + }, + s_5={ + "Внимательно выбирайте. Можно", + "держать только {C:attention}5 карт джокеров{}", + "одновременно", + }, + s_6={ + "Теперь купите другую", + "карту в {C:attention}лавке", + }, + s_7={ + "Эта карта {C:tarot}Таро{} —", + "{C:attention}расходуемая{}. Она", + "улучшит карты, которые вы", + "играете! Придержите ее.", + }, + s_8={ + "У вас может быть до", + "{C:attention}2 расходуемых{} карт", + "одновременно", + }, + s_9={ + "Если накопите достаточно,", + "сможете купить {C:attention}ваучер{}.", + "{C:attention}Ваучеры{} пассивно", + "улучшают вашу партию!", + }, + sb_1={ + "Привет! Меня зовут", + "{C:attention}Джимбо{}, я здесь, чтобы помочь", + "вам научиться играть!", + }, + sb_2={ + "Ваша цель — зарабатывать", + "{C:blue}фишки{}, чтобы побить", + "{C:attention}блайнд противника", + }, + sb_3={ + "Это {C:blue}малый блайнд{},", + "и вам нужно всего", + "{C:attention}300 фишек{}, чтобы побить его.", + }, + sb_4={ + "Выберите {C:blue}малый блайнд,", + "чтобы начать раунд!", + }, + sh_1={ + "Когда получите больше карт,", + "не забудьте, что можно менять их", + "порядок. {C:attention}Джокеры{} активируются", + "в порядке слева направо", + }, + sh_2={ + "Также не забудьте", + "{C:attention}ИСПОЛЬЗОВАТЬ{} расходуемое!", + }, + sh_3={ + "Выберите до {C:attention}2{} карт", + "в руке и нажмите", + "{C:attention}«ИСПОЛЬЗОВАТЬ»{} на карте {C:tarot}Таро{},", + "чтобы улучшить их!", + }, + sh_3_touch={ + "Выберите до {C:attention}2{} карт", + "в руке и перетащите", + "карту {C:tarot}Таро{} в область {C:attention}ИСПОЛЬЗОВАТЬ{},", + "чтобы усилить!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# Руки", + a_handsize="+#1# размер руки", + a_handsize_minus="-#1# размер руки", + a_mult="+#1# множ.", + a_mult_minus="-#1# множ.", + a_remaining="#1# осталось", + a_sold_tally="#1#/#2# продано", + a_xmult="X#1# множ.", + a_xmult_minus="-X#1# множ.", + ante_x_voucher="ВАУЧЕР #1# АНТЕ", + challenges_completed="Завершено #1#/#2# испытаний", + completed="Завершено: #1#/#2#", + deck_preview_wheel_plural="Числа могут быть меньшими из-за #1# карт, вытянутых лицом вниз", + deck_preview_wheel_singular="Числа могут быть меньшими из-за #1# карты, вытянутой лицом вниз", + interest="#1# процент за каждые $#2# (#3# макс.)", + loyalty_active="Активно!", + loyalty_inactive="#1# осталось", + ml_foil_desc={ + "Фольговый", + "+#1# шт. фишек", + }, + ml_holo_desc={ + "Голографический", + "+#1# множ.", + }, + ml_negative_consumable_desc={ + "Негативный", + "+#1# слот расходуемого", + }, + ml_negative_desc={ + "Негатив", + "+#1# слот джокера", + }, + ml_polychrome_desc={ + "Полихромный", + "X#1# множ.", + }, + remaining_discard_money="Осталось сбросов ($#1# каждый)", + remaining_hand_money="Осталось рук ($#1# каждая)", + unlocked="Разблокировано: #1#/#2#", + }, + v_text={ + ch_c_all_eternal={ + "Все джокеры в лавке {C:eternal}вечные{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}Фишки{} не могут превысить текущее количество {C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}Ежедневное испытание!", + }, + ch_c_debuff_played_cards={ + "Все {C:attention}сыгранные{} карты становятся {C:attention}ослабленными{} после подсчета", + }, + ch_c_discard_cost={ + "Каждый сброс стоит {C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "{C:green}1 из #1#{} карт разыгрываются рубашкой вверх", + }, + ch_c_inflation={ + "Постоянное повышение цен на {C:money}$1{} при каждой покупке", + }, + ch_c_minus_hand_size_per_X_dollar={ + "Держите в руке {C:red}-1{} карты(у) за каждый(е): {C:money}$#1#{}", + }, + ch_c_no_extra_hand_money={ + "Дополнительные {C:blue}руки{} больше не приносят деньги", + }, + ch_c_no_interest={ + "В конце раунда не заработаете {C:attention}процентов{}", + }, + ch_c_no_reward={ + "Все {C:attention}блайнды{} не дают денег в награду", + }, + ch_c_no_reward_specific={ + "{C:attention}#1# блайнда(ов){} не дают денег в награду", + }, + ch_c_no_shop_jokers={ + "Джокеры больше не появляются в {C:attention}лавке", + }, + ch_c_none={ + "{C:inactive}Нет", + }, + ch_c_set_eternal_ante={ + "Когда босс анте {C:attention}#1#{} побежден, все джокеры становятся {C:attention}вечными", + }, + ch_c_set_joker_slots_ante={ + "Когда босс анте {C:attention}#1#{} побежден, слоты джокера становятся: {C:attention}0", + }, + ch_c_set_seed={ + "1 попытка с сидом: {C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "Слота(ов) расходуемого: {C:attention}#1#{}", + }, + ch_m_discards={ + "Сбросов за раунд: {C:red}#1#{}", + }, + ch_m_dollars={ + "Начинайте с {C:money}$#1#", + }, + ch_m_hand_size={ + "{C:attention}#1#{} размер руки", + }, + ch_m_hands={ + "Рук за раунд: {C:blue}#1#{} ", + }, + ch_m_joker_slots={ + "Слота(ов) джокера: {C:attention}#1#{}", + }, + ch_m_none={ + "{C:inactive}Нет", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/zh_CN.lua b/src/localization/zh_CN.lua new file mode 100644 index 0000000..d0e954c --- /dev/null +++ b/src/localization/zh_CN.lua @@ -0,0 +1,4305 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="废弃牌组", + text={ + "开局时", + "玩家牌组中", + "没有{C:attention}人头牌", + }, + }, + b_anaglyph={ + name="浮雕牌组", + text={ + "每次击败{C:attention}Boss盲注{}后", + "获得一个{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="黑色牌组", + text={ + "小丑牌槽位{C:attention}+#1#{}", + "", + "每回合", + "出牌次数{C:blue}-#2#{}", + }, + }, + b_blue={ + name="蓝色牌组", + text={ + "每回合", + "{C:blue}+#1#{}次出牌", + }, + }, + b_challenge={ + name="挑战牌组", + text={ + "", + }, + }, + b_checkered={ + name="方格牌组", + text={ + "开局时", + "牌组中有{C:attention}26{C:spades}张黑桃{}和", + "{C:attention}26{C:hearts}张红桃{}", + }, + }, + b_erratic={ + name="古怪牌组", + text={ + "牌组中所有牌的", + "{C:attention}点数{}和{C:attention}花色{}", + "都是随机的", + }, + }, + b_ghost={ + name="幽灵牌组", + text={ + "商店中可能", + "出现{C:spectral}幻灵牌{}", + "初始带有{C:spectral,T:c_hex}妖法{}牌", + }, + }, + b_green={ + name="绿色牌组", + text={ + "每回合结束时:", + "每剩一次{C:blue}出牌次数,获得{C:money}$#1#{s:0.85}", + "每剩一次{C:red}弃牌次数,获得{C:money}$#2#{s:0.85}", + "不赚取任何{C:attention}利息", + }, + }, + b_magic={ + name="魔法牌组", + text={ + "开局时拥有", + "{C:tarot,T:v_crystal_ball}#1#{}优惠券", + "和{C:attention}2{}张{C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="星云牌组", + text={ + "开局时拥有", + "{C:planet,T:v_telescope}#1#{}优惠券", + "消耗牌槽位{C:red}#2#{}", + }, + }, + b_painted={ + name="彩绘牌组", + text={ + "手牌上限{C:attention}+#1#{}", + "小丑牌槽位{C:red}#2#{}", + }, + }, + b_plasma={ + name="等离子牌组", + text={ + "计算出牌分数时", + "平衡{C:blue}筹码{}和{C:red}倍率{}", + "盲注要求分数{C:red}X#1#{}", + }, + }, + b_red={ + name="红色牌组", + text={ + "每回合", + "{C:red}+#1#{}次弃牌", + }, + }, + b_yellow={ + name="黄色牌组", + text={ + "开局时", + "额外获得{C:money}$#1#", + }, + }, + b_zodiac={ + name="黄道牌组", + text={ + "开局时即拥有", + "{C:tarot,T:v_tarot_merchant}#1#{}、", + "{C:planet,T:v_planet_merchant}#2#{}、", + "和{C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="手臂", + text={ + "降低打出的", + "牌型等级", + }, + }, + bl_big={ + name="大盲注", + text={ + }, + }, + bl_club={ + name="梅花", + text={ + "所有梅花牌", + "都被削弱", + }, + }, + bl_eye={ + name="眼睛", + text={ + "本回合中不可", + "打出重复牌型", + }, + }, + bl_final_acorn={ + name="琥珀之实", + text={ + "翻转并洗乱", + "所有小丑牌", + }, + }, + bl_final_bell={ + name="蔚蓝之铃", + text={ + "迫使 1 张牌", + "总是被选中", + }, + }, + bl_final_heart={ + name="绯红之心", + text={ + "每次出牌", + "使随机一张小丑牌失效", + }, + }, + bl_final_leaf={ + name="翠绿之叶", + text={ + "所有卡牌都被削弱", + "直到售出1张小丑牌", + }, + }, + bl_final_vessel={ + name="靛紫之杯", + text={ + "超大盲注", + }, + }, + bl_fish={ + name="鱼", + text={ + "出牌后自动抽取的牌", + "都是背面朝上", + }, + }, + bl_flint={ + name="燧石", + text={ + "基础筹码和", + "倍率减半", + }, + }, + bl_goad={ + name="挑衅", + text={ + "所有黑桃牌", + "都被削弱", + }, + }, + bl_head={ + name="头部", + text={ + "所有红桃牌", + "都被削弱", + }, + }, + bl_hook={ + name="钩子", + text={ + "每次出牌", + "随机弃掉2张手牌", + }, + }, + bl_house={ + name="房屋", + text={ + "第一次的手牌", + "以背面朝上方式抽取", + }, + }, + bl_manacle={ + name="镣铐", + text={ + "手牌上限-1", + }, + }, + bl_mark={ + name="标记", + text={ + "所有人头牌都是", + "以背面朝上的方式抽取", + }, + }, + bl_mouth={ + name="嘴巴", + text={ + "本回合只能打出", + "1种牌型", + }, + }, + bl_needle={ + name="针", + text={ + "本回合只能出一次牌", + }, + }, + bl_ox={ + name="公牛", + text={ + "打出#1#牌型时", + "资金归$0", + }, + }, + bl_pillar={ + name="支柱", + text={ + "在这一底注中", + "打出过的牌都被削弱", + }, + }, + bl_plant={ + name="植物", + text={ + "所有人头牌", + "都被削弱", + }, + }, + bl_psychic={ + name="灵媒", + text={ + "必须出 5 张牌", + }, + }, + bl_serpent={ + name="巨蟒", + text={ + "出牌或弃牌后", + "总是抽 3 张牌", + }, + }, + bl_small={ + name="小盲注", + text={ + }, + }, + bl_tooth={ + name="牙齿", + text={ + "每出一张牌", + "损失$1", + }, + }, + bl_wall={ + name="围墙", + text={ + "特大盲注", + }, + }, + bl_water={ + name="水", + text={ + "初始弃牌", + "次数为0", + }, + }, + bl_wheel={ + name="车轮", + text={ + "/7几率,抽到的牌", + "会是背面朝上", + }, + }, + bl_window={ + name="窗口", + text={ + "所有方片牌", + "都被削弱", + }, + }, + }, + Edition={ + e_base={ + name="基础", + text={ + "无额外效果", + }, + }, + e_foil={ + name="闪箔", + text={ + "{C:chips}+#1#{}筹码", + }, + }, + e_holo={ + name="镭射", + text={ + "{C:mult}+#1#{}倍率", + }, + }, + e_negative={ + name="负片", + text={ + "{C:dark_edition}+#1#{}个小丑牌槽位", + }, + }, + e_negative_consumable={ + name="负片", + text={ + "{C:dark_edition}+#1#{}个消耗牌槽位", + }, + }, + e_polychrome={ + name="多彩", + text={ + "{X:mult,C:white}X#1#{}倍率", + }, + }, + }, + Enhanced={ + m_bonus={ + name="奖励牌", + text={ + }, + }, + m_glass={ + name="玻璃牌", + text={ + "{X:mult,C:white}X#1#{}倍率", + "有{C:green}#2#/#3#{}几率", + "摧毁此牌", + }, + }, + m_gold={ + name="黄金牌", + text={ + "如果这张卡牌", + "在回合结束时还在手牌中", + "你获得{C:money}$#1#{}", + }, + }, + m_lucky={ + name="幸运牌", + text={ + "{C:green}#1#/#3#{}几率", + "{C:mult}+#2#{}倍率", + "{C:green}#1#/#5#{}几率", + "获得{C:money}$#4#", + }, + }, + m_mult={ + name="倍率牌", + text={ + "{C:mult}+#1#{}倍率", + }, + }, + m_steel={ + name="钢铁牌", + text={ + "这张牌被", + "留在手牌中时", + "将给予{X:mult,C:white} X#1# {}倍率", + }, + }, + m_stone={ + name="石头牌", + text={ + "{C:chips}+#1#{}筹码", + "无点数无花色", + }, + }, + m_wild={ + name="万能牌", + text={ + "可以视作", + "任何花色", + }, + }, + }, + Joker={ + j_8_ball={ + name="八号球", + text={ + "打出的每一张{C:attention}8{}", + "有{C:green}#1#/#2#{}几率在计分时", + "生成一张{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)", + }, + }, + j_abstract={ + name="抽象小丑", + text={ + "每有一张{C:attention}小丑牌{}", + "{C:mult}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#2#{C:inactive}倍率)", + }, + }, + j_acrobat={ + name="杂技演员", + text={ + "每回合的最后一次", + "{C:attention}出牌{}时,{X:red,C:white} X#1# {}倍率", + }, + unlock={ + "打出{C:attention,E:1}#1#{}次牌", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="古老小丑", + text={ + "打出的{V:1}#2#{}牌", + "在计分时", + "会给予{X:mult,C:white} X#1# {}倍率", + "{s:0.8}回合结束时改变需求花色", + }, + }, + j_arrowhead={ + name="箭头", + text={ + "打出的", + "{C:spades}黑桃{}花色牌", + "在计分时给予{C:chips}+#1#{}筹码", + }, + unlock={ + "在你的牌组中", + "拥有至少{E:1,C:attention}#1#张", + "带有{E:1,C:attention}#2#花色的卡牌", + }, + }, + j_astronomer={ + name="天文学家", + text={ + "所有{C:planet}星球牌{}", + "和{C:planet}天体补充包{}", + "在商店内都{C:attention}免费", + }, + unlock={ + "发现所有", + "{E:1,C:planet}星球牌{}", + }, + }, + j_banner={ + name="旗帜", + text={ + "每一个剩余的", + "{C:attention}弃牌{}次数", + "{C:chips}+#1#{}筹码", + }, + }, + j_baron={ + name="男爵", + text={ + "留在手牌中的", + "每一张{C:attention}K{}", + "会给予{X:mult,C:white} X#1# {}倍率", + }, + }, + j_baseball={ + name="棒球卡", + text={ + "每张{C:green}罕见{}小丑牌", + "会给予{X:mult,C:white} X#1# {}倍率", + }, + }, + j_blackboard={ + name="黑板", + text={ + "如果留在手牌中的", + "所有牌都是{C:spades}#2#{}或{C:clubs}#3#{}", + "则{X:red,C:white} X#1# {}倍率", + }, + }, + j_bloodstone={ + name="血石", + text={ + "打出的", + "{C:hearts}红桃{}花色牌", + "在计分时有{c:green}#1#/#2#{}几率", + "给予{X:mult,C:white}X#3#{}倍率", + }, + unlock={ + "在你的牌组中", + "拥有至少{E:1,C:attention}#1#张", + "带有{E:1,C:attention}#2#花色的卡牌", + }, + }, + j_blue_joker={ + name="蓝色小丑", + text={ + "每张{C:attention}牌组{}内剩余", + "的卡牌,{C:chips}+#1#{}筹码", + "{C:inactive}(当前为{C:chips}+#2#{C:inactive}筹码)", + }, + }, + j_blueprint={ + name="蓝图", + text={ + "复制", + "右侧{C:attention}小丑牌{}的能力", + }, + unlock={ + "赢一局", + }, + }, + j_bootstraps={ + name="提靴带", + text={ + "每拥有{C:money}$#2#{}", + "{C:mult}+#1#{}倍率", + "{C:inactive}(当前为{C:mult}+#3#{C:inactive}倍率)", + }, + unlock={ + "在你的牌组中拥有至少", + "{E:1,C:attention}#1#{}张{C:dark_edition}多彩{}小丑", + }, + }, + j_brainstorm={ + name="头脑风暴", + text={ + "复制最左边的", + "{C:attention}小丑牌的能力", + }, + unlock={ + "弃掉一手", + "{E:1,C:attention}皇家同花顺", + }, + }, + j_bull={ + name="斗牛", + text={ + "每拥有{C:money}$1{}", + "{C:chips}+#1#{}筹码", + "{C:inactive}(当前为{C:chips}+#2#{C:inactive}筹码)", + }, + }, + j_burglar={ + name="窃贼", + text={ + "选择{C:attention}盲注{}后", + "出牌次数{C:red}+#1#{},并", + "{C:attention}失去所有弃牌次数", + }, + }, + j_burnt={ + name="烧焦小丑", + text={ + "升级每回合", + "第一次{C:attention}被弃掉的", + "牌型的等级", + }, + unlock={ + "售出所有", + "{E:1,C:attention}+#1#{}张卡牌", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="名片", + text={ + "打出的{C:attention}人头牌{}在计分时", + "有{C:green}#1#/#2#{}的几率", + "获得{C:money}$2{}", + }, + }, + j_caino={ + name="卡尼奥", + text={ + "每当一张{C:attention}人头牌{}", + "被摧毁时", + "这张小丑牌获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white} X#2#{C:inactive}倍率)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="篝火", + text={ + "每{C:attention}售出{}一张牌", + "这张小丑牌获得{X:mult,C:white}X#1#{}倍率", + "{C:attention}Boss盲注{}被击败时重置倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)", + }, + }, + j_card_sharp={ + name="老千小丑", + text={ + "如果打出的{C:attention}牌型{}已经", + "在本回合打出过", + "则{X:mult,C:white}X#1#{}倍率", + }, + }, + j_cartomancer={ + name="卡牌术士", + text={ + "在选择{C:attention}盲注{}时", + "生成一张{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)", + }, + unlock={ + "发现每张", + "{E:1,C:tarot}塔罗牌{}", + }, + }, + j_castle={ + name="城堡", + text={ + "每弃掉一张{V:1}#2#{}牌", + "这张小丑牌获得{C:chips}+#1#{}筹码", + "每个回合花色都会变", + "{C:inactive}(当前为{C:chips}+#3#{C:inactive}筹码)", + }, + }, + j_cavendish={ + name="卡文迪什", + text={ + "{X:mult,C:white}X#1#{}倍率", + "回合结束时", + "有{C:green}#2#/#3#{}的几率", + "摧毁此牌", + }, + }, + j_ceremonial={ + name="仪式匕首", + text={ + "在选择{C:attention}盲注{}时", + "摧毁右侧的小丑牌", + "并将其售价的{C:attention}两倍", + "永久添加至这张牌的{C:attention}倍率", + "{C:inactive}(当前为{C:mult}+#1#{C:inactive}倍)", + }, + }, + j_certificate={ + name="证书", + text={ + "回合开始时", + "随机添加一张", + "带随机{C:attention}蜡封{}的{C:attention}牌", + "到手牌中", + }, + unlock={ + "拥有一张", + "带{C:attention,E:1}金色蜡封{}的", + "黄金牌", + }, + }, + j_chaos={ + name="混沌小丑", + text={ + "每次商店", + "{C:green}#1#{}次免费重掷", + }, + }, + j_chicot={ + name="希科", + text={ + "所有{C:attention}Boss盲注", + "限制条件消失", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="聪敏小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{C:chips}+#1#{}筹码", + }, + }, + j_cloud_9={ + name="9霄云外", + text={ + "每个回合结束时", + "你{C:attention}完整牌组{}内的每张{C:attention}9{}", + "使你获得{C:money}$#1#{}", + "{C:inactive}(当前{C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="星座", + text={ + "每使用一张{C:planet}星球牌{}", + "这张小丑牌获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)", + }, + }, + j_crafty={ + name="精明小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{C:chips}+#1#{}筹码", + }, + }, + j_crazy={ + name="狂野小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#{}", + "{C:red}+#1#{}倍率", + }, + }, + j_credit_card={ + name="信用卡", + text={ + "可以负债", + "最多{C:red}-$#1#{}", + }, + }, + j_delayed_grat={ + name="延迟满足", + text={ + "如果在回合结束时", + "没有使用弃牌,则每把{C:attention}弃牌{}", + "获得{C:money}$#1#{}", + }, + }, + j_devious={ + name="阴险小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{C:chips}+#1#{}筹码", + }, + }, + j_diet_cola={ + name="零糖可乐", + text={ + "售出这牌就可以", + "创建一个免费的", + "{C:attention}#1#", + }, + }, + j_dna={ + name="DNA", + text={ + "如果回合的{C:attention}第一次出牌{}", + "只有{C:attention}1{}张牌,则将其", + "永久复制到牌组,并将", + "复制牌放到{C:attention}手牌中", + }, + }, + j_drivers_license={ + name="驾驶执照", + text={ + "如果牌组中至少有", + "{C:attention}16张增强卡牌,", + "则{X:mult,C:white} X#1# {}倍率", + "{C:inactive}(当前{C:attention}#2#{C:inactive})", + }, + unlock={ + "增强牌组里", + "{E:1,C:attention}#1#{}张卡牌", + }, + }, + j_droll={ + name="滑稽小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#{}", + "{C:red}+#1#{}倍率", + }, + }, + j_drunkard={ + name="醉汉", + text={ + "每回合", + "弃牌次数{C:red}+#1#{}", + }, + }, + j_duo={ + name="二重奏", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率", + }, + unlock={ + "赢一局", + "且不打出", + "{E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="黄昏", + text={ + "每回合的", + "{C:attention}最后一次出牌{}时", + "所有打出的牌会被触发两次", + }, + }, + j_egg={ + name="鸡蛋", + text={ + "在回合结束时", + "本卡的{c:attention}出售价值", + "增加{c:money}$#1#", + }, + }, + j_erosion={ + name="侵蚀", + text={ + "在你的牌组中", + "每比完整的{C:attention}#3#{}张牌少一张", + "就获得{C:red}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#2#{C:inactive}倍率)", + }, + }, + j_even_steven={ + name="偶数史蒂文", + text={ + "打出的点数为", + "{C:attention}偶数{}的牌", + "在计分时给予{C:mult}+#1#{}倍率", + "{C:inactive}(10、8、6、4、2)", + }, + }, + j_faceless={ + name="无面小丑", + text={ + "如果同时弃掉", + "{C:attention}#2#{}张或更多张", + "{C:attention}人头牌{}", + "获得{C:money}$#1#{}", + }, + }, + j_family={ + name="一家人", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率", + }, + unlock={ + "赢一局", + "且不打出", + "{E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="斐波那契", + text={ + "打出的每一张", + "{C:attention}A{}、{C:attention}2{}、{C:attention}3{}、{C:attention}5{}、{C:attention}8{}", + "在计分时给予{C:mult}+#1#{}倍率", + }, + }, + j_flash={ + name="闪示卡", + text={ + "在商店中每{C:attention}重掷{}一次", + "这张小丑牌获得{C:mult}+#1#{}倍率", + "{C:inactive}(当前为{C:mult}+#2#{C:inactive}倍率)", + }, + }, + j_flower_pot={ + name="花盆", + text={ + "如果打出的牌型中,包含", + "{C:diamonds}方片{}、{C:clubs}梅花{}、", + "{C:hearts}红桃{}、{C:spades}黑桃{}牌各一张,", + "则{X:mult,C:white} X#1# {}倍率", + }, + unlock={ + "达到底注", + "等级{E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="占卜师", + text={ + "本赛局内每使用过一张{C:purple}塔罗牌{}", + "这张小丑获得{C:red}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="四指", + text={ + "所有{C:attention}同花{}和", + "{C:attention}顺子{}都可以", + "由{C:attention}4{}张牌组成", + }, + }, + j_gift={ + name="礼品卡", + text={ + "在每回合结束时", + "使拥有的每张{C:attention}小丑牌{}", + "和{C:attention}消耗牌{}", + "{C:attention}售价{}增加{C:money}$#1#{}", + }, + }, + j_glass={ + name="玻璃小丑", + text={ + "每摧毁一张", + "{C:attention}玻璃牌", + "这张小丑获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white} X#2#{C:inactive}倍率)", + }, + unlock={ + "在你的牌组中", + "拥有{E:1,C:attention}#1#张", + "{E:1,C:attention}#2#{}", + }, + }, + j_gluttenous_joker={ + name="暴食小丑", + text={ + "打出的", + "{C:clubs}#2#{}花色牌", + "在计分时给予{C:mult}+#1#{}倍率", + }, + }, + j_golden={ + name="黄金小丑", + text={ + "在回合结束时", + "获得{C:money}$#1#{}", + }, + }, + j_greedy_joker={ + name="贪婪小丑", + text={ + "打出的", + "{C:diamonds}#2#{}花色牌", + "在计分时给予{C:mult}+#1#{}倍率", + }, + }, + j_green_joker={ + name="绿色小丑", + text={ + "每次出牌,这张小丑牌{C:mult}+#1#{}倍率", + "每次弃牌,这张小丑牌{C:mult}-#2#{}倍率", + "{C:inactive}(当前为{C:mult}+#3#{C:inactive}倍)", + }, + }, + j_gros_michel={ + name="大麦克香蕉", + text={ + "{C:mult}+#1#{}倍率", + "回合结束时", + "有{C:green}#2#/#3#{}的几率", + "摧毁此牌", + }, + }, + j_hack={ + name="烂脱口秀演员", + text={ + "重新触发", + "所有打出的", + "{C:attention}2{}、{C:attention}3{}、{C:attention}4{}和{C:attention}5{}", + }, + }, + j_half={ + name="半张小丑", + text={ + "如果打出的牌", + "少于等于{C:attention}#2#{}张", + "{C:red}+#1#{}倍率", + }, + }, + j_hallucination={ + name="幻觉", + text={ + "打开任一{C:attention}补充包{}时", + "有{C:green}#1#/#2#{}几率", + "生成一张{C:attention}塔罗牌{}", + "{C:inactive}(必须有空位)", + }, + }, + j_hanging_chad={ + name="未断选票", + text={ + "打出的牌中", + "{C:attention}第一张{}计分牌", + "额外触发{C:attention}#1#{}次", + }, + unlock={ + "用{E:1,C:attention}#1#", + "打赢Boss盲注", + }, + }, + j_hiker={ + name="徒步者", + text={ + "打出的每一张牌", + "在{c:attention}计分{}时", + "会永久获得{C:chips}+#1#{}筹码", + }, + }, + j_hit_the_road={ + name="上路吧杰克", + text={ + "本回合中,每弃掉一张", + "{C:attention}J{}牌", + "这张小丑牌获得{X:mult,C:white}X#1# {}倍率", + "{C:inactive}(当前为{X:mult,C:white} X#2#{C:inactive}倍率)", + }, + unlock={ + "一次弃掉", + "{E:1,C:attention}5张{}{E:1,C:attention}J", + }, + }, + j_hologram={ + name="全息影像", + text={ + "每添加一张{C:attention}卡牌{}", + "到你的牌组中,", + "这张小丑牌获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)", + }, + }, + j_ice_cream={ + name="冰淇淋", + text={ + "{C:chips}+#1#{}筹码", + "每次出牌后", + "{C:chips}-#2#{}筹码", + }, + }, + j_idol={ + name="偶像", + text={ + "每张打出的{V:1}#3#{}{C:attention}#2#", + "在计分时", + "给予{X:mult,C:white} X#1# {}倍率", + "{s:0.8}每回合卡牌都会变动", + }, + unlock={ + "在一次出牌中", + "获得至少", + "{E:1,C:attention}#1#{}筹码", + }, + }, + j_invisible={ + name="隐形小丑", + text={ + "经过{C:attention}#1#{}个回合后", + "售出此卡牌可以", + "随机{C:attention}复制{}一张小丑牌", + "{C:inactive}(当前为{C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "赢一局", + "且从未拥有超过", + "{E:1,C:attention}4张小丑牌{}", + }, + }, + j_joker={ + name="小丑", + text={ + "{C:red,s:1.1}+#1#{}倍率", + }, + }, + j_jolly={ + name="开心小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#{}", + "{C:red}+#1#{}倍率", + }, + }, + j_juggler={ + name="杂耍师", + text={ + "手牌上限{C:attention}+#1#{}", + }, + }, + j_loyalty_card={ + name="积分卡", + text={ + "每第{C:attention}#2#{}次出牌时", + "给予{X:red,C:white} X#1# {}倍率", + "{C:inactive}(#3#)", + }, + }, + j_luchador={ + name="摔跤手", + text={ + "售出这张小丑牌", + "会消除当前回合中", + "{C:attention}Boss盲注{}的限制条件", + }, + }, + j_lucky_cat={ + name="招财猫", + text={ + "每次{C:green}成功{}触发", + "一张{C:attention}幸运牌{}时", + "这张小丑牌获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)", + }, + }, + j_lusty_joker={ + name="色欲小丑", + text={ + "打出的", + "{C:hearts}#2#{}花色牌", + "在计分时给予{C:mult}+#1#{}倍率", + }, + }, + j_mad={ + name="疯狂小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#{}", + "{C:red}+#1#{}倍率", + }, + }, + j_madness={ + name="疯狂", + text={ + "在{C:attention}小盲注{}或{C:attention}大盲注{}被选中时", + "这张小丑牌获得{X:mult,C:white}X#1#{}倍率", + "然后随机{C:attention}摧毁{}一张小丑牌", + "{C:inactive}(当前为{X:mult,C:white}X#2#{}倍率)", + }, + }, + j_mail={ + name="邮件回扣", + text={ + "每弃掉一张{C:attention}#2#{}", + "即可获得{C:money}$#1#{}", + "每个回合点数都会变", + }, + }, + j_marble={ + name="大理石小丑", + text={ + "选择{C:attention}盲注{}后", + "牌组中会添加", + "一张{C:attention}石头{}牌", + }, + }, + j_matador={ + name="斗牛士", + text={ + "如果出牌触发了", + "{C:attention}Boss盲注{}的限制条件", + "获得{C:money}$#1#{}", + }, + unlock={ + "不使用弃牌且", + "只用{E:1,C:attention}一次出牌{}", + "打赢Boss盲注", + }, + }, + j_merry_andy={ + name="快乐安迪", + text={ + "每回合", + "弃牌次数{C:red}+#1#{}", + "手牌上限{C:red}#2#{}", + }, + unlock={ + "在{E:1,C:attention}#1#{}回合", + "或更少回合内赢得一局", + }, + }, + j_midas_mask={ + name="迈达斯面具", + text={ + "打出的所有{C:attention}人头牌{}", + "在计分时", + "变为{C:attention}黄金牌{}", + }, + }, + j_mime={ + name="哑剧演员", + text={ + "重新触发所有", + "{C:attention}留在手牌中的", + "{C:attention}牌{}的能力", + }, + }, + j_misprint={ + name="印错小丑", + text={ + "", + }, + }, + j_mr_bones={ + name="骷髅先生", + text={ + "如果最终得到的", + "筹码至少是", + "所需筹码的{C:attention}25%", + "则不会死亡", + "{S:1.1,C:red,E:2}自毁{}", + }, + unlock={ + "输掉{C:attention,E:1}#1#{}局游戏", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="神秘之峰", + text={ + "当剩余{C:attention}#2#{}次", + "弃牌次数", + "{C:mult}+#1#{}倍率", + }, + }, + j_obelisk={ + name="方尖石塔", + text={ + "连续打出不是你", + "最常用的{C:attention}牌型{}时", + "这张小丑牌获得{X:mult,C:white}X#1#{}倍率", + "失败将会重置倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)", + }, + }, + j_odd_todd={ + name="奇数托德", + text={ + "打出的点数为", + "{C:attention}奇数{}的牌", + "在计分时给予{C:chips}+#1#{}筹码", + "{C:inactive}(A、9、7、5、3)", + }, + }, + j_onyx_agate={ + name="缟玛瑙", + text={ + "打出的", + "{C:clubs}梅花{}花色牌", + "在计分时给予{C:mult}+#1#{}倍率", + }, + unlock={ + "在你的牌组中", + "拥有至少{E:1,C:attention}#1#张", + "带有{E:1,C:attention}#2#花色的卡牌", + }, + }, + j_oops={ + name="六六大顺", + text={ + "将所有以{C:attention}数字标注{}出的", + "{C:green,E:1,S:1.1}几率{}翻倍", + "{C:inactive}(例如:{C:green}1/3{C:inactive}几率 -> {C:green}2/3{C:inactive}几率)", + }, + unlock={ + "在一次出牌中", + "获得至少", + "{E:1,C:attention}#1#{}筹码", + }, + }, + j_order={ + name="秩序", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率", + }, + unlock={ + "赢一局", + "且不打出", + "{E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="幻视", + text={ + "所有卡牌", + "均视为", + "{C:attention}人头牌{}", + }, + }, + j_perkeo={ + name="帕奇欧", + text={ + "在离开商店时", + "随机复制{C:attention}1{}张", + "拥有的{C:attention}消耗牌{}", + "并给那张牌{C:dark_edition}负片{}效果", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="照片", + text={ + "打出的第一张{C:attention}人头牌{}", + "在计分时", + "会给予{X:mult,C:white} X#1# {}倍率", + }, + }, + j_popcorn={ + name="爆米花", + text={ + "{C:mult}+#1#{}倍率", + "每回合结束时", + "{C:mult}-#2#{}倍率", + }, + }, + j_raised_fist={ + name="致胜之拳", + text={ + "将留在手牌中点数{C:attention}最小{}牌", + "点数的{C:attention}两倍{}", + "加到倍率上", + }, + }, + j_ramen={ + name="拉面", + text={ + "{X:mult,C:white}X#1#{}倍率", + "每{C:attention}弃掉一张牌{}", + "失去{X:mult,C:white}X#2#{}倍率", + }, + }, + j_red_card={ + name="红牌", + text={ + "当跳过任一{C:attention}补充包{}时", + "这张小丑牌获得{C:red}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#2#{C:inactive}倍率)", + }, + }, + j_reserved_parking={ + name="私人车位", + text={ + "留在手牌中的", + "每一张{C:attention}人头牌{}", + "有{C:green}#2#/#3#{}几率", + "给予{C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="搭乘巴士", + text={ + "连续打出没有", + "计分{C:attention}人头牌{}的牌时", + "这张小丑牌获得{C:mult}+#1#{}倍率", + "失败将会重置倍率", + "{C:inactive}(当前为{C:mult}+#2#{C:inactive}倍率)", + }, + }, + j_riff_raff={ + name="乌合之众", + text={ + "在选择{C:attention}盲注{}时", + "生成{C:attention}#1#张{C:blue}普通{C:attention}小丑牌", + "{C:inactive}(必须有空间)", + }, + }, + j_ring_master={ + name="马戏团长", + text={ + "{C:attention}小丑牌{}、{C:tarot}塔罗牌{}、{C:planet}星球牌{}", + "和{C:planet}幻灵牌{}可以同时", + "出现复数张", + }, + unlock={ + "达到底注", + "等级{E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="火箭", + text={ + "每个回合结束时你获得{C:money}$#1#{}", + "击败{C:attention}Boss盲注{}", + "会使这一金额增加{C:money}$#2#{}", + }, + }, + j_rough_gem={ + name="璞玉", + text={ + "打出的", + "{C:diamonds}方块{}花色牌", + "在计分时给予{C:money}$#1#{}", + }, + unlock={ + "在你的牌组中", + "拥有至少{E:1,C:attention}#1#张", + "带有{E:1,C:attention}#2#花色的卡牌", + }, + }, + j_runner={ + name="跑步选手", + text={ + "如果打出的牌中包含", + "{C:attention}顺子{}", + "这张小丑获得{C:chips}+#2#{}筹码", + "{C:inactive}(当前为{C:chips}+#1#{C:inactive}筹码)", + }, + }, + j_satellite={ + name="卫星", + text={ + "本赛局每使用过一种", + "{C:planet}星球牌{},每回合结束时", + "可得到{C:money}$#1#{}", + "{C:inactive}(当前{C:money}$#2#{C:inactive})", + }, + unlock={ + "有{E:1,C:money}$#1#", + "或更多", + }, + }, + j_scary_face={ + name="恐怖面孔", + text={ + "打出的{C:attention}人头牌{}", + "在计分时", + "给予{C:chips}+#1#{}筹码", + }, + }, + j_scholar={ + name="学者", + text={ + "打出的{C:attention}A{}牌", + "在计分时给予", + "{C:mult}+#1#{}倍率", + "和{C:chips}+#2#{}筹码", + }, + }, + j_seance={ + name="通灵", + text={ + "如果{C:attention}牌型{}为", + "{C:attention}#1#{},随机生成", + "一张{C:spectral}幻灵牌{}", + "{C:inactive}(必须有空位)", + }, + }, + j_seeing_double={ + name="重影", + text={ + "如果打出的牌中,包含", + "一张计分的{C:clubs}梅花{}牌和", + "一张计分的任何其他{C:attention}花色{}牌", + "则{X:mult,C:white} X#1# {}倍率", + }, + unlock={ + "打出一手", + "包含", + "{E:1,C:attention}#1#的牌", + }, + }, + j_selzer={ + name="苏打水", + text={ + "在接下来的{C:attention}#1#{}次出牌中", + "重新触发所有", + "打出的卡牌", + }, + }, + j_shoot_the_moon={ + name="射月", + text={ + "留在手牌中的", + "每一张{C:attention}Q", + "给予{C:mult}+#1#{}倍率", + }, + unlock={ + "在单个回合中", + "打出牌组里的", + "所有{E:1,C:attention}红桃", + }, + }, + j_shortcut={ + name="捷径", + text={ + "让{C:attention}顺子{}可以", + "相隔{C:attention}1个点数{}组成", + "{C:inactive}(例如:{C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="第六感", + text={ + "如果回合的{C:attention}第一次出牌{}", + "是一张单独的{C:attention}6{}", + "则将其销毁并生成一张{C:spectral}幻灵牌{}", + "{C:inactive}(必须有空位)", + }, + }, + j_sly={ + name="奸诈小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{C:chips}+#1#{}筹码", + }, + }, + j_smeared={ + name="模糊小丑", + text={ + "{C:hearts}红桃{}和{C:diamonds}方片", + "视作同一花色,", + "{C:spades}黑桃{}和{C:clubs}梅花", + "也视作同一花色", + }, + unlock={ + "在你的牌组中", + "至少拥有{C:attention}#1#", + "{E:1,C:attention}#2#{}", + }, + }, + j_smiley={ + name="微笑表情", + text={ + "打出的{C:attention}人头牌{}", + "在计分时", + "给予{C:mult}+#1#{}倍率", + }, + }, + j_sock_and_buskin={ + name="喜与悲", + text={ + "重新触发所有", + "打出的{C:attention}人头牌{}", + }, + unlock={ + "打出总共", + "{C:attention,E:1}#1#{}张人头牌", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="太空小丑", + text={ + "有{C:green}#1#/#2#{}的", + "几率升级", + "打出的{C:attention}牌型等级{}", + }, + }, + j_splash={ + name="飞溅", + text={ + "每张{C:attention}打出的牌", + "都可以计分", + }, + }, + j_square={ + name="方形小丑", + text={ + "如果打出的牌", + "正好是{C:attention}4{}张牌", + "这张小丑牌获得{C:chips}+#2#{}筹码", + "{C:inactive}(当前为{C:chips}+#1#{C:inactive}筹码)", + }, + }, + j_steel_joker={ + name="钢铁小丑", + text={ + "{C:attention}完整牌组{}内每有一张", + "{C:attention}钢铁牌{}", + "给予{X:mult,C:white} X#1# {}倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)", + }, + }, + j_stencil={ + name="模具小丑", + text={ + "每个空的{C:attention}小丑牌{}槽位", + "获得{X:red,C:white} X1{}倍率", + "{s:0.8}模具小丑算作空位", + "(当前为{X:red,C:white} X#1# {C:inactive})", + }, + }, + j_stone={ + name="石头小丑", + text={ + "{C:attention}完整牌组{}内每有一张", + "{C:attention}石头牌", + "{C:chips}+#1#{}筹码", + "{C:inactive}(当前为{C:chips}+#2#{C:inactive}筹码)", + }, + }, + j_stuntman={ + name="特技演员", + text={ + "{C:chips}+#1#{}筹码", + "手牌上限{C:attention}-#2#{}", + }, + unlock={ + "在一次出牌中", + "获得至少", + "{E:1,C:attention}#1#{}筹码", + }, + }, + j_supernova={ + name="超新星", + text={ + "将{C:attention}牌型{}在本赛局内", + "被{C:attention}打出过{}的次数", + "添加至倍率", + }, + }, + j_superposition={ + name="叠加态", + text={ + "如果打出的牌中包含", + "一张{C:attention}A{}和一个{C:attention}顺子{}", + "生成一张{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)", + }, + }, + j_swashbuckler={ + name="侠盗", + text={ + "将拥有的所有其他", + "{C:attention}小丑牌{}的总售价", + "添加至倍率", + "{C:inactive}(当前为{C:mult}+#1#{C:inactive}倍率)", + }, + unlock={ + "总共卖出", + "{C:attention,E:1}#1#{}张小丑牌", + "{C:inactive}(#2#)张", + }, + }, + j_throwback={ + name="回溯", + text={ + "本赛局内每跳过一次", + "{C:attention}盲注{},获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white} X#2# {C:inactive}倍率)", + }, + unlock={ + "从主菜单中选择继续", + "游玩已保存的局", + }, + }, + j_ticket={ + name="黄金门票", + text={ + "打出的{C:attention}黃金牌{}", + "在计分时获得{C:money}$#1#{}", + }, + unlock={ + "打出一手五张", + "只包含", + "{C:attention,E:1}黃金牌{}的牌", + }, + }, + j_to_the_moon={ + name="冲向月球", + text={ + "回合结束时", + "每拥有{C:money}$5{}", + "可以额外获得{C:money}$#1#{}的{C:attention}利息{}", + }, + }, + j_todo_list={ + name="待办清单", + text={ + "如果{C:attention}出牌牌型{}为{C:attention}#2#{}", + "获得{C:money}$#1#{}", + "每回合结束时", + "牌型都会改变", + }, + }, + j_trading={ + name="交易卡", + text={ + "如果每回合的{C:attention}第一次弃牌{}", + "只有{C:attention}1{}张牌,则将其", + "摧毁并获得{C:money}$#1#", + }, + }, + j_tribe={ + name="部落", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率", + }, + unlock={ + "赢一局", + "且不打出", + "{E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="特里布莱", + text={ + "打出的{C:attention}K{}和{C:attention}Q", + "在计分时", + "给予{X:mult,C:white}X#1#{}倍率", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="三重奏", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率", + }, + unlock={ + "赢一局", + "且不打出", + "{E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="游吟诗人", + text={ + "{C:attention}+#1#{}手牌上限", + "每回合出牌次数{C:blue}-#2#{}", + }, + unlock={ + "连续赢得{C:attention,E:1}#1#{}回合", + "且每回合只使用", + "一次出牌次数", + }, + }, + j_trousers={ + name="备用裤子", + text={ + "如果打出的牌中包含", + "{C:attention}#2#", + "则这张小丑牌获得{C:mult}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#3#{C:inactive}倍率)", + }, + }, + j_turtle_bean={ + name="黑龟豆", + text={ + "手牌上限{C:attention}+#1#{}", + "每回合结束时减{C:red}#2#{}", + }, + }, + j_vagabond={ + name="流浪者", + text={ + "如果在出牌时", + "资金少于等于{C:money}$#1#{}", + "则获得一张{C:purple}塔罗牌{}", + }, + }, + j_vampire={ + name="吸血鬼", + text={ + "每打出一张计分的{C:attention}增强卡牌{}", + "这张小丑牌获得{X:mult,C:white}X#1#{}倍率", + "并移除卡牌的{C:attention}增强效果", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)", + }, + }, + j_walkie_talkie={ + name="对讲机", + text={ + "打出的每张{C:attention}10{}和{C:attention}4", + "在计分时获得{C:chips}+#1#{}筹码", + "以及{C:mult}+#2#{}倍率", + }, + }, + j_wee={ + name="小小丑", + text={ + "每有一张打出的{C:attention}2{}计分时", + "这张小丑牌获得", + "{C:chips}+#2#{}筹码", + "{C:inactive}(当前为{C:chips}+#1#{C:inactive}筹码)", + }, + unlock={ + "在{E:1,C:attention}#1#{}回合", + "或更少回合内赢得一局", + }, + }, + j_wily={ + name="狡猾小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#", + "{C:chips}+#1#{}筹码", + }, + }, + j_wrathful_joker={ + name="愤怒小丑", + text={ + "打出的", + "{C:spades}#2#{}花色牌", + "在计分时给予{C:mult}+#1#{}倍率", + }, + }, + j_yorick={ + name="约里克", + text={ + "每弃掉{C:attention}#2#{C:inactive}[#3#]{}张牌", + "这张小丑牌获得{X:mult,C:white} X#1# {}倍率", + "{C:inactive}(当前为{X:mult,C:white} X#4# {C:inactive}倍率)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="古怪小丑", + text={ + "如果打出的牌中", + "包含{C:attention}#2#{}", + "{C:red}+#1#{}倍率", + }, + }, + }, + Other={ + black_sticker={ + name="黑标贴", + text={ + "使用这张小丑牌", + "在{C:attention}黑注", + "难度下获胜", + }, + }, + blue_seal={ + name="蓝色蜡封", + text={ + "如果在回合结束时", + "这张牌还{C:attention}留在{}手牌中", + "会生成最后一手牌型的{C:planet}星球牌{}", + "{C:inactive}(必须有空位)", + }, + }, + blue_sticker={ + name="蓝标贴", + text={ + "使用这张小丑牌", + "在{C:attention}蓝注", + "难度下获胜", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{}筹码", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{}额外筹码", + }, + }, + challenge_locked={ + name="未解锁", + text={ + "用至少#1#个不同牌组", + "赢得一场比赛以解锁", + "挑战模式", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="被削弱", + text={ + "所有能力", + "都不起效", + }, + }, + debuffed_playing_card={ + name="被削弱", + text={ + "计分时不获得筹码,", + "不能触发任何", + "功能和效果", + }, + }, + deck_locked_discover={ + name="锁定", + text={ + "在收藏中", + "发现至少", + "{C:attention}#1#{}个项目", + }, + }, + deck_locked_stake={ + name="锁定", + text={ + "在{V:1}#1#{}或以上", + "难度以任一牌组", + "赢得一局", + }, + }, + deck_locked_win={ + name="锁定", + text={ + "在任一难度下", + "以{C:attention}#1#{}", + "赢得一局", + }, + }, + demo_locked={ + name="锁定", + text={ + "本试玩版", + "暂不可用", + }, + }, + demo_shop_locked={ + name="锁定", + text={ + "{C:attention}金宝的", + "个人卡牌收藏。", + "可在完整版", + "{E:1,C:red}Balatro中找到", + }, + }, + eternal={ + name="永恒卡", + text={ + "不能出售", + "或被摧毁", + }, + }, + gold_seal={ + name="金色蜡封", + text={ + "这张牌被打出", + "并计分时", + "获得{C:money}$3{}", + }, + }, + gold_sticker={ + name="金色标贴", + text={ + "使用这张小丑牌", + "在{C:attention}金注", + "难度下获胜", + }, + }, + green_sticker={ + name="绿标贴", + text={ + "使用这张小丑牌", + "在{C:attention}绿注", + "难度下获胜", + }, + }, + joker_locked_legendary={ + name="锁定", + text={ + "通过{C:spectral}灵魂{}牌", + "发现这张小丑牌", + }, + }, + locked={ + name="锁定", + text={ + }, + }, + orange_sticker={ + name="橙标贴", + text={ + "使用这张小丑牌", + "在{C:attention}橙注", + "难度下获胜", + }, + }, + p_arcana_jumbo={ + name="巨型秘术包", + text={ + "从最多{C:attention}#2#张{C:tarot}塔罗牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_arcana_mega={ + name="超级秘术包", + text={ + "从最多{C:attention}#2#张{C:tarot}塔罗牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_arcana_normal={ + name="秘术包", + text={ + "从最多{C:attention}#2#张{C:tarot}塔罗牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_buffoon_jumbo={ + name="巨型小丑包", + text={ + "从最多{C:attention}#2#张{C:joker}小丑牌{}中", + "选择{C:attention}#1#{}张", + }, + }, + p_buffoon_mega={ + name="超级小丑包", + text={ + "从最多{C:attention}#2#张{C:joker}小丑牌{}中", + "选择{C:attention}#1#{}张", + }, + }, + p_buffoon_normal={ + name="小丑包", + text={ + "从最多{C:attention}#2#张{C:joker}小丑牌{}中", + "选择{C:attention}#1#{}张", + }, + }, + p_celestial_jumbo={ + name="巨型天体包", + text={ + "从最多{C:attention}#2#张{C:planet}星球牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_celestial_mega={ + name="超级天体包", + text={ + "从最多{C:attention}#2#张{C:planet}星球牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_celestial_normal={ + name="天体包", + text={ + "从最多{C:attention}#2#张{C:planet}星球牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_spectral_jumbo={ + name="巨型幻灵包", + text={ + "从最多{C:attention}#2#张{C:spectral}幻灵牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_spectral_mega={ + name="超级幻灵包", + text={ + "从最多{C:attention}#2#张{C:spectral}幻灵牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_spectral_normal={ + name="幻灵包", + text={ + "从最多{C:attention}#2#张{C:spectral}幻灵牌{}中", + "选择{C:attention}#1#{}张", + "即选即用", + }, + }, + p_standard_jumbo={ + name="巨型标准包", + text={ + "从最多{C:attention}#2#张{C:attention}游戏牌{}中", + "选择{C:attention}#1#{}张", + "添加到你的牌组", + }, + }, + p_standard_mega={ + name="超级标准包", + text={ + "从最多{C:attention}#2#张{C:attention}游戏牌{}中", + "选择{C:attention}#1#{}张", + "添加到你的牌组", + }, + }, + p_standard_normal={ + name="标准包", + text={ + "从最多{C:attention}#2#张{C:attention}游戏牌{}中", + "选择{C:attention}#1#{}张", + "添加到你的牌组", + }, + }, + perishable={ + name="易腐", + text={ + "经过{C:attention}#1#{}回合后", + "会被削弱", + "{C:inactive}(剩余{C:attention}#2#{C:inactive}回合)", + }, + }, + pinned_left={ + name="固定", + text={ + "这张小丑牌", + "固定在", + "最左侧", + }, + }, + playing_card={ + text={ + "{V:1}#2#{C:light_black}#1#", + }, + }, + purple_seal={ + name="紫色蜡封", + text={ + "被{C:attention}弃掉{}时", + "生成一张{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)", + }, + }, + purple_sticker={ + name="紫标贴", + text={ + "使用这张小丑牌", + "在{C:attention}紫注", + "难度下获胜", + }, + }, + red_seal={ + name="红色蜡封", + text={ + "重新触发", + "此卡牌{C:attention}1{}次", + }, + }, + red_sticker={ + name="红标贴", + text={ + "使用这张小丑牌", + "在{C:attention}红注", + "难度下获胜", + }, + }, + remove_negative={ + name="n", + text={ + "{C:inactive,s:0.9}(移除复制牌的{C:dark_edition,s:0.9}负片{C:inactive,s:0.9})", + }, + }, + rental={ + name="租用", + text={ + "售价为$1,在回合", + "结束时失去{C:money}$#1#{}", + }, + }, + undiscovered_booster={ + name="未发现", + text={ + "在非预设局", + "中打开此包", + "以了解其效果", + }, + }, + undiscovered_edition={ + name="未发现", + text={ + "在非预设局", + "中找到此版本", + "以了解其效果", + }, + }, + undiscovered_joker={ + name="未发现", + text={ + "在非预设局", + "中购买或", + "使用此牌", + "以了解其效果", + }, + }, + undiscovered_planet={ + name="未发现", + text={ + "在非预设局", + "中购买或", + "使用此牌", + "以了解其效果", + }, + }, + undiscovered_spectral={ + name="未发现", + text={ + "在非预设局", + "中购买或", + "使用此牌", + "以了解其效果", + }, + }, + undiscovered_tag={ + name="未发现", + text={ + "在非预设局", + "中使用此标签", + "以了解其效果", + }, + }, + undiscovered_tarot={ + name="未发现", + text={ + "在非预设局", + "中购买或", + "使用此牌", + "以了解其效果", + }, + }, + undiscovered_voucher={ + name="未发现", + text={ + "在非预设局", + "中兑换并使用", + "此优惠券", + "以了解其效果", + }, + }, + white_sticker={ + name="白标贴", + text={ + "使用这张小丑牌", + "在{C:attention}白注", + "难度下获胜", + }, + }, + wip_locked={ + name="锁定", + text={ + "正在", + "制作中", + }, + }, + }, + Planet={ + c_ceres={ + name="谷神星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_earth={ + name="地球", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_eris={ + name="阋神星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_jupiter={ + name="木星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_mars={ + name="火星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_mercury={ + name="水星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_neptune={ + name="海王星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_planet_x={ + name="X行星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_pluto={ + name="冥王星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_saturn={ + name="土星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_uranus={ + name="天王星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + c_venus={ + name="金星", + text={ + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}", + "升级{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码", + }, + }, + }, + Spectral={ + c_ankh={ + name="生命十字章", + text={ + "随机复制一张", + "{C:attention}小丑牌{},摧毁", + "其他小丑牌", + }, + }, + c_aura={ + name="光环", + text={ + "选定{C:attention}1{}张手牌,为其添加", + "{C:dark_edition}闪箔卡{}、{C:dark_edition}镭射卡{}、或{C:dark_edition}多彩卡{}", + "效果中的一种", + }, + }, + c_black_hole={ + name="黑洞", + text={ + "所有{C:legendary,E:1}牌型", + "提升{C:attention}1{}级", + }, + }, + c_cryptid={ + name="神秘生物", + text={ + "选定手牌中的{C:attention}1{}张牌", + "生成{C:attention}#1#{}张其复制牌", + }, + }, + c_deja_vu={ + name="既视感", + text={ + "给你手牌中的", + "{C:attention}1{}张所选卡牌", + "加上{C:red}红色蜡封{}", + }, + }, + c_ectoplasm={ + name="灵质", + text={ + "添加{C:dark_edition}负片{}效果到", + "一张随机的{C:attention}小丑牌", + "手牌上限{C:red}-#1#{}", + }, + }, + c_familiar={ + name="使魔", + text={ + "随机摧毁{C:attention}1{}张手牌", + "并添加{C:attention}#1#{}张", + "随机{C:attention}增强的人头牌{}", + "到手牌中", + }, + }, + c_grim={ + name="严峻", + text={ + "随机摧毁{C:attention}1{}张手牌", + "并添加{C:attention}#1#{}张", + "随机{C:attention}增强的A{}", + "到手牌中", + }, + }, + c_hex={ + name="妖法", + text={ + "随机为一张{C:attention}小丑牌{}添加", + "{C:attention}多彩{},摧毁", + "其他小丑牌", + }, + }, + c_immolate={ + name="火祭", + text={ + "随机摧毁", + "{C:attention}#1#{}张手牌", + "获得{C:money}$#2#", + }, + }, + c_incantation={ + name="咒语", + text={ + "随机摧毁{C:attention}1{}张手牌", + "并添加{C:attention}#1#{}张", + "随机{C:attention}增强的数字牌{}", + "到手牌中", + }, + }, + c_medium={ + name="灵媒", + text={ + "给你手牌中的", + "{C:attention}1{}张所选卡牌", + "加上{C:purple}紫色蜡封{}", + }, + }, + c_ouija={ + name="占卜", + text={ + "将手中所有", + "手持牌转换为同一个", + "随机{C:attention}点数", + "手牌上限{C:red}-1{}", + }, + }, + c_sigil={ + name="符印", + text={ + "将手中所有", + "卡牌转换为同一种", + "随机{C:attention}花色", + }, + }, + c_soul={ + name="灵魂", + text={ + "生成一张", + "{C:legendary,E:1}传奇{}小丑牌", + "{C:inactive}(必须有空位)", + }, + }, + c_talisman={ + name="护身符", + text={ + "将{C:attention}金色蜡封{}添加到", + "{C:attention}1{}张选定的", + "手牌中", + }, + }, + c_trance={ + name="入迷", + text={ + "给你手牌中的", + "{C:attention}1{}张所选卡牌", + "加上{C:blue}蓝色蜡封{}", + }, + }, + c_wraith={ + name="幽灵", + text={ + "生成一张随机的", + "{C:red}稀有{C:attention}小丑牌{}", + "将资金变为{C:money}$0", + }, + }, + }, + Stake={ + stake_black={ + name="黑注", + text={ + "商店可能会出现{C:attention}永恒{}小丑牌", + "{C:inactive,s:0.8}(无法卖出或摧毁)", + "{s:0.8}之前所有赌注也都起效", + }, + }, + stake_blue={ + name="蓝注", + text={ + "弃牌次数{C:red}-1{}", + "{s:0.8}之前所有赌注也都起效", + }, + }, + stake_gold={ + name="金注", + text={ + "商店可能会出现{C:attention}租用{}小丑牌", + "{C:inactive,s:0.8}(售价为$1,每回合花费{C:money,s:0.8}$3{C:inactive,s:0.8})", + "{s:0.8}之前所有赌注也都起效", + }, + }, + stake_green={ + name="绿注", + text={ + "{C:attention}底注{}提升时", + "过关需求分数的增速更快", + "{s:0.8}之前所有赌注也都起效", + }, + }, + stake_orange={ + name="橙注", + text={ + "商店可能会出现{C:attention}易腐{}小丑牌", + "{C:inactive,s:0.8}(经过5回合后被削弱)", + "{s:0.8}之前所有赌注也都起效", + }, + }, + stake_purple={ + name="紫注", + text={ + "{C:attention}底注{}提升时", + "过关需求分数的增速更快", + "{s:0.8}之前所有赌注也都起效", + }, + }, + stake_red={ + name="红注", + text={ + "{C:attention}小盲注{}", + "没有奖励金", + "{s:0.8}之前所有赌注也都起效", + }, + }, + stake_white={ + name="白注", + text={ + "基础难度", + }, + }, + }, + Tag={ + tag_boss={ + name="Boss标签", + text={ + "重掷", + "{C:attention}Boss盲注", + }, + }, + tag_buffoon={ + name="小丑标签", + text={ + "获得一个免费的", + "{C:attention}超级小丑包", + }, + }, + tag_charm={ + name="吊饰标签", + text={ + "获得一个免费的", + "{C:tarot}超级秘术包", + }, + }, + tag_coupon={ + name="代金券标签", + text={ + "下一家店内的", + "初始卡牌和补充包", + "均为免费", + }, + }, + tag_d_six={ + name="D6标签", + text={ + "下一个商店的", + "重掷起价为{C:money}$0", + }, + }, + tag_double={ + name="双倍标签", + text={ + "下一次选定的{C:attention}标签{}", + "会额外获得一个复制品", + "{s:0.8,C:attention}双倍标签{s:0.8}除外", + }, + }, + tag_economy={ + name="经济标签", + text={ + "资金翻倍", + "{C:inactive}(最高{C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="空灵标签", + text={ + "获得一个免费的", + "{C:spectral}幻灵包", + }, + }, + tag_foil={ + name="闪箔标签", + text={ + "商店里的下一张", + "基础版本小丑牌", + "将会免费且变为{C:dark_edition}闪箔", + }, + }, + tag_garbage={ + name="垃圾标签", + text={ + "本赛局每一次", + "未使用的{C:red}弃牌{}得到{C:money}$#1#{}", + "{C:inactive}(将得到{C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="顺手标签", + text={ + "本赛局每打出过一次{C:blue}手牌{}", + "获得{C:money}$#1#{}", + "{C:inactive}(将得到{C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="镭射标签", + text={ + "商店里的下一张", + "基础版本小丑牌", + "将会免费且变为{C:dark_edition}镭射", + }, + }, + tag_investment={ + name="投资标签", + text={ + "击败", + "Boss盲注后", + "获得{C:money}$#1#", + }, + }, + tag_juggle={ + name="杂耍标签", + text={ + "下一回合", + "{C:attention}+#1#{}手牌上限", + }, + }, + tag_meteor={ + name="流星标签", + text={ + "获得一个免费的", + "{C:planet}超级天体包", + }, + }, + tag_negative={ + name="负片标签", + text={ + "商店里的下一张", + "基础版本小丑牌", + "将会免费且变为{C:dark_edition}负片", + }, + }, + tag_orbital={ + name="轨道标签", + text={ + "升级{C:attention}#1#", + "{C:attention}#2#个等级", + }, + }, + tag_polychrome={ + name="多彩标签", + text={ + "商店里的下一张", + "基础版本小丑牌", + "将会免费且变为{C:dark_edition}多彩", + }, + }, + tag_rare={ + name="稀有标签", + text={ + "商店会有一张免费的", + "{C:red}稀有小丑牌", + }, + }, + tag_skip={ + name="速度标签", + text={ + "本赛局中每跳过", + "一次盲注,可获得{C:money}$#1#{}", + "{C:inactive}(将获得{C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="标准标签", + text={ + "获得一个免费的", + "{C:attention}超级标准包", + }, + }, + tag_top_up={ + name="充值标签", + text={ + "生成最多{C:attention}#1#张", + "{C:blue}普通{}小丑牌", + "{C:inactive}(必须有空位)", + }, + }, + tag_uncommon={ + name="罕见标签", + text={ + "商店会有一张免费的", + "{C:green}罕见小丑牌", + }, + }, + tag_voucher={ + name="优惠券标签", + text={ + "添加一张{C:voucher}优惠券", + "到下一个商店", + }, + }, + }, + Tarot={ + c_chariot={ + name="战车", + text={ + "增强{C:attention}#1#{}张", + "选定卡牌成为", + "{C:attention}#2#", + }, + }, + c_death={ + name="死神", + text={ + "选定{C:attention}#1#{}张卡牌,", + "将{C:attention}靠左{}的那张牌", + "变成{C:attention}靠右{}的那张牌", + "{C:inactive}(你可以拖动来改变位置)", + }, + }, + c_devil={ + name="恶魔", + text={ + "增强{C:attention}#1#{}张", + "选定卡牌成为", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="皇帝", + text={ + "生成最多{C:attention}#1#张", + "随机{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)", + }, + }, + c_empress={ + name="皇后", + text={ + "增强{C:attention}#1#张", + "选定卡牌成为", + "{C:attention}#2#", + }, + }, + c_fool={ + name="愚者", + text={ + "生成本赛局中", + "上一次使用的", + "{C:tarot}塔罗牌{}或{C:planet}星球牌{}", + "不包括{s:0.8,C:tarot}愚者{s:0.8}", + }, + }, + c_hanged_man={ + name="倒吊人", + text={ + "摧毁最多{C:attention}#1#{}张", + "选定卡牌", + }, + }, + c_heirophant={ + name="教皇", + text={ + "增强{C:attention}#1#张", + "选定卡牌成为", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="隐者", + text={ + "资金加倍", + "{C:inactive}(最高{C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="女祭司", + text={ + "生成最多{C:attention}#1#张", + "张随机{C:planet}星球牌{}", + "{C:inactive}(必须有空位)", + }, + }, + c_judgement={ + name="审判", + text={ + "生成一张随机的", + "{C:attention}{}小丑牌", + "{C:inactive}(必须有空位)", + }, + }, + c_justice={ + name="正义", + text={ + "增强{C:attention}#1#{}张", + "选定卡牌成为", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="恋人", + text={ + "增强{C:attention}#1#{}张", + "选定卡牌成为", + "{C:attention}#2#", + }, + }, + c_magician={ + name="魔术师", + text={ + "增强{C:attention}#1#{}张", + "选定卡牌成为", + "{C:attention}#2#", + }, + }, + c_moon={ + name="月亮", + text={ + "将最多{C:attention}#1#{}张", + "选定卡牌", + "转换为{V:1}#2#{}", + }, + }, + c_star={ + name="星星", + text={ + "将最多{C:attention}#1#{}张", + "选定卡牌", + "转换为{V:1}#2#{}", + }, + }, + c_strength={ + name="力量", + text={ + "将最多{C:attention}#1#{}张", + "选定卡牌", + "点数提高{C:attention}1", + }, + }, + c_sun={ + name="太阳", + text={ + "将最多{C:attention}#1#{}张", + "选定卡牌", + "转换为{V:1}#2#{}", + }, + }, + c_temperance={ + name="节制", + text={ + "获得拥有的小丑牌", + "售出价格总和的", + "资金{C:inactive}(最高{C:money}$#1#{C:inactive})", + "{C:inactive}(当前{C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="塔", + text={ + "增强{C:attention}#1#{}张", + "选定卡牌成为", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="命运之轮", + text={ + "有{C:green}#1#/#2#{}几率", + "给一张随机{C:attention}小丑牌", + "添加{C:dark_edition}闪箔{}、{C:dark_edition}镭射{}", + "或{C:dark_edition}多彩{}版本", + }, + }, + c_world={ + name="世界", + text={ + "将最多{C:attention}#1#{}张", + "选定卡牌", + "转换为{V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="反物质", + text={ + "小丑牌槽位{C:dark_edition}+1{}", + }, + unlock={ + "兑换{C:voucher}空白{}优惠券", + "总计{C:attention}#1#{}次", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="空白", + text={ + "{C:inactive}什么都没有?", + }, + }, + v_clearance_sale={ + name="清仓特卖", + text={ + "所有卡牌、补充包和优惠券", + "在店内均可享受{C:attention}#1#%{}折扣", + }, + }, + v_crystal_ball={ + name="水晶球", + text={ + "消耗牌槽位{C:attention}+1{}", + }, + }, + v_directors_cut={ + name="导演剪辑版", + text={ + "可以重掷Boss盲注", + "每个底注限重掷{C:attention}1{}次", + "每次花费{C:money}$#1#{}", + }, + }, + v_glow_up={ + name="焕彩", + text={ + "{C:dark_edition}闪箔卡{}、{C:dark_edition}镭射卡{}和", + "{C:dark_edition}多彩卡{}", + "出现频率{C:attention}X#1#{}", + }, + unlock={ + "同时拥有至少{C:attention}#1#张", + "{C:dark_edition}闪箔卡{}、{C:dark_edition}镭射卡{}、或", + "{C:dark_edition}多彩卡{}版本的{C:attention}小丑牌{}", + }, + }, + v_grabber={ + name="抓手", + text={ + "每回合", + "出牌次数", + "永久{C:blue}+#1#{}", + }, + }, + v_hieroglyph={ + name="象形文字", + text={ + "底注{C:attention}-#1#{}", + "每回合", + "出牌次数{C:blue}-#1#{}", + }, + }, + v_hone={ + name="打磨", + text={ + "{C:dark_edition}闪箔卡{}、{C:dark_edition}镭射卡{}和", + "{C:dark_edition}多彩卡{}", + "出现频率{C:attention}X#1#{}", + }, + }, + v_illusion={ + name="幻象", + text={ + "商店内的{C:attention}游戏牌{}", + "可以是{C:enhanced}增强卡牌{}、", + "{C:dark_edition}不同版本{}、和/或{C:attention}蜡封{}", + }, + unlock={ + "在商店", + "购买总计", + "{C:attention}#1#{}张游戏牌", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="清算", + text={ + "所有卡牌、补充包和优惠券", + "在店内均可享受{C:attention}#1#%{}折扣", + }, + unlock={ + "在一场赛局中", + "至少兑换", + "{C:attention}#1#{C:voucher}张优惠券{}", + }, + }, + v_magic_trick={ + name="魔术", + text={ + "{C:attention}商店{}里面", + "有{C:attention}游戏牌{}", + "可供选购", + }, + }, + v_money_tree={ + name="摇钱树", + text={ + "每回合", + "可获得利息的上限", + "提高到{C:money}$#1#{}", + }, + unlock={ + "连续{C:attention}#1#{}回合", + "在计算收益时", + "获得的利息到达上限", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="玉米片夹", + text={ + "每回合", + "出牌次数", + "永久{C:blue}+#1#{}", + }, + unlock={ + "打出总共", + "{C:attention}#1#{}张卡牌", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="天文台", + text={ + "在您{C:attention}消耗牌栏位{}中", + "的{C:planet}星球牌{}", + "会使这一特定{C:attention}牌型", + "给予{X:red,C:white}X#1#{}倍率", + }, + unlock={ + "从任何{C:planet}天体包中", + "总共使用{C:attention}#1#张", + "{C:planet}星球牌{}", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="预兆球", + text={ + "{C:spectral}幻灵牌{}可能", + "会在任何", + "{C:attention}秘术包中出现", + }, + unlock={ + "从任何{C:tarot}秘术包中", + "总共使用{C:attention}#1#张", + "{C:tarot}塔罗牌{}", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="库存过剩", + text={ + "商店內", + "卡牌槽位{C:attention}+1{}", + }, + }, + v_overstock_plus={ + name="库存过剩加强版", + text={ + "商店内", + "卡牌槽位{C:attention}+1{}", + }, + unlock={ + "在商店内总共花费", + "{C:money}$#1#{}", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="油漆刷", + text={ + "手牌上限{C:attention}+#1#{}", + }, + }, + v_palette={ + name="调色板", + text={ + "手牌上限{C:attention}+#1#{}", + }, + unlock={ + "手牌上限减少", + "至{C:attention}#1#{}张", + }, + }, + v_petroglyph={ + name="岩画", + text={ + "底注{C:attention}-#1#{}", + "每回合", + "弃牌次数{C:red}-#1#{}", + }, + unlock={ + "达到底注", + "等级{E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="星球牌商人", + text={ + "商店内", + "{C:planet}星球牌{}", + "出现频率{C:attention}X#1#{}", + }, + }, + v_planet_tycoon={ + name="星球大亨", + text={ + "商店内", + "{C:tarot}星球牌{}", + "出现频率{C:attention}X#1#{}", + }, + unlock={ + "在商店", + "购买总计", + "{C:attention}#1#{}张{C:planet}星球牌{}", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="回收魔法", + text={ + "每回合", + "弃牌次数", + "永久{C:blue}+#1#{}", + }, + unlock={ + "弃掉总共", + "{C:attention}#1#{}张卡牌", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="重掷加強版", + text={ + "重掷费用", + "减少{C:money}$#1#{}", + }, + unlock={ + "重掷商店", + "总共{C:attention}#1#{}次", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="多次重掷", + text={ + "重掷费用", + "减少{C:money}$#1#{}", + }, + }, + v_retcon={ + name="重构", + text={ + "重掷Boss盲注", + "{C:attention}不限{}次数", + "每次重掷花费{C:money}$#1#{}", + }, + unlock={ + "发现", + "{C:attention}#1#{}盲注", + }, + }, + v_seed_money={ + name="种子基金", + text={ + "每回合", + "可获得利息的上限", + "提高到{C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="塔罗牌商人", + text={ + "商店内", + "{C:tarot}塔罗牌{}", + "出现频率{C:attention}X#1#{}", + }, + }, + v_tarot_tycoon={ + name="塔罗大亨", + text={ + "商店内", + "{C:tarot}塔罗牌{}", + "出现频率{C:attention}X#1#{}", + }, + unlock={ + "在商店", + "购买总计", + "{C:attention}#1#张{C:tarot}塔罗牌{}", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="望远镜", + text={ + "{C:attention}天体包中的", + "{C:planet}星球牌{}{}始终有", + "你最常用的", + "的{C:attention}牌型", + }, + }, + v_wasteful={ + name="常弃常新", + text={ + "每回合", + "弃牌次数", + "永久{C:blue}+#1#{}", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="单次出牌获得1亿筹码", + _1000k="单次出牌获得100万筹码", + _10k="单次出牌获得1万筹码", + ante_up="达到底注4阶段", + ante_upper="达到底注8阶段", + astronomy="发现所有星球牌", + big_hands="牌组中拥有80张或以上的卡牌", + card_discarder="弃掉至少2500张牌", + card_player="打出至少2500张牌", + cartomancy="发现所有塔罗牌", + clairvoyance="发现所有幻灵牌", + completionist="发现100%的收藏道具", + completionist_plus="赢得胜利且每个牌组都在金注难度", + completionist_plus_plus="每张小丑牌都获得一个金色标贴", + extreme_couponer="发现所有优惠券", + flushed="用5张万能牌打出一次同花", + heads_up="赢一局", + high_stakes="在至少金注难度下赢一局", + legendary="发现一张传奇小丑牌", + low_stakes="在至少红注难度下赢一局", + mid_stakes="在至少黑注难度下赢一局", + nest_egg="单局中拥有 $400 或以上", + retrograde="让任一牌型升至第10级", + roi="在底注4阶段时购买5张优惠券", + royale="打出一次皇家同花顺", + rule_bender="完成任一挑战局", + rule_breaker="完成每一场挑战局", + shattered="单次出牌打碎2张玻璃牌", + speedrunner="在12回合内赢得一局", + tiny_hands="将你的牌组减少到20张或更少", + you_get_what_you_get="赢下一局且没有在商店中重掷", + }, + achievement_names={ + _100000k="1亿", + _1000k="100万", + _10k="1万", + ante_up="底注上升!", + ante_upper="底注再上升!", + astronomy="天文", + big_hands="大手", + card_discarder="弃牌能手", + card_player="玩牌能手", + cartomancy="纸牌卜卦", + clairvoyance="未卜先知", + completionist="完美主义者", + completionist_plus="完美主义者+", + completionist_plus_plus="完美主义者++", + extreme_couponer="优惠券重度使用者", + flushed="同花", + heads_up="注意", + high_stakes="高赌注", + legendary="传奇", + low_stakes="低赌注", + mid_stakes="中赌注", + nest_egg="储备金", + retrograde="逆行", + roi="投资回报率", + royale="皇家", + rule_bender="规则篡改者", + rule_breaker="规则破坏者", + shattered="破碎", + speedrunner="速通大神", + tiny_hands="小手", + you_get_what_you_get="种瓜得瓜", + }, + blind_states={ + Current="当前", + Defeated="已被击败", + Select="选择", + Selected="已选择", + Skipped="跳过", + Upcoming="下一回合", + }, + challenge_names={ + c_blast_off_1="点火升空", + c_bram_poker_1="布莱姆·扑克", + c_city_1="15分钟都市", + c_cruelty_1="残酷", + c_double_nothing_1="孤注一掷", + c_five_card_1="五连抽", + c_fragile_1="易碎品", + c_golden_needle_1="金针", + c_inflation_1="通货膨胀", + c_jokerless_1="无小丑", + c_knife_1="刀锋之上", + c_luxury_1="奢侈税", + c_mad_world_1="疯狂世界", + c_medusa_1="美杜莎", + c_monolith_1="巨石", + c_non_perishable_1="不腐之物", + c_omelette_1="煎蛋卷", + c_rich_1="富者愈富", + c_typecast_1="角色固化", + c_xray_1="X光视界", + }, + collabs={ + Clubs={ + ["1"]="默认", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="药剂工艺", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="默认", + ["2"]="潜水员戴夫", + ["3"]="星露谷物语", + ["4"]="挺进地牢", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="默认", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="咩咩启示录", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="默认", + ["2"]="巫师", + ["3"]="赛博朋克 2077", + ["4"]="Shovel Knight", + ["5"]="饥荒", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="常见问题", + b_and_use="&使用", + b_back="返回", + b_blinds="盲注", + b_booster_packs="补充包", + b_buy="购买", + b_cash_out="提现", + b_challenges="挑战", + b_collection="收藏", + b_collection_cap="收藏", + b_continue="继续", + b_copy="复制", + b_copy_seed="复制种子", + b_create_profile="创建配置", + b_credits="制作人员", + b_current_profile="当前配置", + b_customize_deck="定制牌组", + b_deck="牌组", + b_decks="牌组", + b_delete_profile="删除配置", + b_discard="弃牌", + b_editions="版本", + b_endless="无尽模式", + b_enhanced_cards="增强卡牌", + b_full_deck="完整牌组", + b_high_contrast_cards="高对比度卡牌", + b_how_to_play="怎么玩", + b_imagery="图像", + b_jokers="小丑", + b_load_profile="加载配置", + b_main_menu="主菜单", + b_music="音乐", + b_new_challenge="开始新挑战", + b_new_run="新一局", + b_next="下一个", + b_next_round_1="下一个", + b_next_round_2="回合", + b_open="打开", + b_options="选项", + b_options_cap="选项", + b_planet_cards="星球牌", + b_play_cap="开始游戏", + b_play_hand="出牌", + b_playbalatro="访问 playbalatro.com", + b_poker_hands="牌型", + b_quit_cap="退出", + b_redeem="兑换", + b_reduced_motion="减少动态效果", + b_remaining="剩余", + b_reroll_boss="重掷Boss盲注", + b_reset_profile="重设配置", + b_restrictions="限制条件", + b_retry="重試", + b_rules="规则", + b_run_info_1="比赛", + b_run_info_2="信息", + b_seals="蜡封", + b_seed="种子", + b_select="选择", + b_sell="售出", + b_set_CRT="CRT", + b_set_CRT_bloom="模拟CRT荧光效果", + b_set_apply="应用", + b_set_audio="音频", + b_set_crash_reports="崩溃报告", + b_set_game="游戏", + b_set_game_vol="游戏音量", + b_set_gamespeed="游戏速度", + b_set_graphics="图形", + b_set_master_vol="主音量", + b_set_monitor="显示监视器", + b_set_music_vol="音乐音量", + b_set_pixel_smoothing="像素画平滑", + b_set_play_discard_pos="出牌/弃牌按钮位置", + b_set_rumble="控制器震动", + b_set_screenshake="屏幕震动", + b_set_shadows="阴影", + b_set_vibration="震动", + b_set_video="视频", + b_set_windowmode="窗口模式", + b_settings="设置", + b_skip="跳过", + b_skip_blind="跳过盲注", + b_skip_reward="跳过奖励", + b_sort_hand="理牌", + b_sounds="声音", + b_spectral_cards="幻灵牌", + b_stake="赌注", + b_start_new_run="开始新的一局", + b_stat_consumables="消耗牌", + b_stat_jokers="小丑", + b_stat_planets="星球牌", + b_stat_spectrals="幻灵牌", + b_stat_tarots="塔罗牌", + b_stat_vouchers="优惠券", + b_stats="统计数据", + b_tags="标签", + b_tarot_cards="塔罗牌", + b_unlock_all="解锁全部", + b_use="使用", + b_vouchers="优惠券", + b_wishlist="在Steam上加入愿望单", + k_aces="A", + k_achievement="成就", + k_achievements_disabled="未开启成就", + k_active="已激活", + k_active_ex="激活!", + k_again_ex="再来一次!", + k_all_hands="全部出牌", + k_also_applied="同样起效", + k_ante="底注", + k_ante_cap="底注", + k_arcana_pack="秘术包", + k_balanced="平衡", + k_banned_cards="禁用卡", + k_banned_tags="禁用标签", + k_base_cap="基础", + k_base_cards="基础卡牌", + k_best_hand="最佳出牌", + k_booster="补充包", + k_buffoon_pack="小丑包", + k_cap_consumables="消耗牌", + k_card_stats="卡牌属性", + k_celestial_pack="天体包", + k_challenge_mode="挑战模式", + k_challenges="挑战", + k_choose="选择", + k_collection="收藏", + k_common="普通", + k_compatible="兼容", + k_copied_ex="已复制!", + k_custom_rules="自定义规则", + k_daily_run="每日挑战", + k_debuffed="被削弱", + k_deck="牌组", + k_deck_stake_wins="牌组赌注完成度", + k_defeated_by="负于", + k_demo_version_ex="试玩版!", + k_disabled_ex="已失效!", + k_drank_ex="喝光了!", + k_duplicated_ex="复制!", + k_dwarf_planet="矮行星", + k_eaten_ex="吃完了!", + k_edition="版本", + k_effective="有效", + k_empty_caps="空", + k_enter_name="输入名字", + k_enter_seed="输入种子", + k_enter_text="输入文本", + k_eroded_ex="已腐蚀!", + k_extinct_ex="已灭绝!", + k_face_cards="人头牌", + k_game_modifiers="游戏规则变化", + k_gold="金色", + k_high_score_ex="高分!", + k_hud_discards="弃牌", + k_hud_hands="出牌", + k_incompatible="不兼容", + k_joker="小丑", + k_joker_stickers="小丑贴纸", + k_jokers_cap="小丑", + k_legendary="传奇", + k_level_prefix="等级", + k_level_up_ex="提升等级!", + k_locked="锁定", + k_lower_score="分数", + k_lvl="等级", + k_melted_ex="融化了!", + k_money="资金", + k_mult="倍率", + k_no_other_jokers="没有其他小丑牌!", + k_no_reward="无奖励", + k_no_room_ex="没有空间!", + k_no_space_ex="没有空间!", + k_none="无", + k_nope_ex="没有!", + k_not_allowed_ex="不允许!", + k_not_discovered="未发现", + k_numbered_cards="数字牌", + k_or="或", + k_other="其他", + k_page="页", + k_planet="星球牌", + k_planet_q="星球?", + k_playing_as="使用", + k_plus_joker="+1小丑", + k_plus_planet="+1星球牌", + k_plus_spectral="+1幻灵牌", + k_plus_stone="+1石头牌", + k_plus_tarot="+1塔罗牌", + k_poker_hand="牌型", + k_profile="配置", + k_progress="进度", + k_rank="点数", + k_rare="稀有", + k_redeemed_ex="兑换!", + k_reroll="重掷", + k_reset="重置", + k_reward="奖励", + k_round="回合", + k_safe_ex="安全!", + k_saved_ex="被救了!", + k_seed="种子", + k_seeded_run="预设局", + k_skipped_cap="跳过", + k_spectral="幻灵", + k_spectral_pack="幻灵包", + k_stake="赌注", + k_stake_level="赌注等级", + k_standard_pack="标准包", + k_suit="花色", + k_swapped_ex="已交换!", + k_tarot="塔罗牌", + k_trophies_disabled="奖杯被禁用", + k_trophy="奖杯", + k_uncommon="罕见", + k_undisovered="未发现", + k_unknown="?????", + k_unlocked_ex="已解锁!", + k_upgrade_ex="升级!", + k_val_up="价值提升!", + k_view="查看", + k_voucher="优惠券", + k_vouchers_cap="优惠券", + k_wins="获胜数", + k_x_base="X 基础", + ml_bloom_opt={ + "关闭", + "开启", + }, + ml_buy_and_use_target={ + "购买", + "&使用", + }, + ml_buy_target={ + "购买", + }, + ml_card_stats={ + "卡牌", + "统计数据", + }, + ml_controller_required={ + "玩本游戏需要一个游戏手柄。", + "请连接一个手柄以继续。", + }, + ml_crash_report_info={ + "崩溃报告将发送给开发人员", + "用以减少今后出现问题。", + "不会发送身份信息或个人信息。", + }, + ml_demo_thanks_message={ + "请考虑将Balatro列入", + "Steam愿望单并注册", + "playbalatro.com上的时事通讯", + }, + ml_disabled_seed={ + "所有解锁和", + "发现均被禁用", + }, + ml_edition_seal_enhancement_explanation={ + "每张游戏牌可能会有", + "增强、不同版本和蜡封", + }, + ml_eternal={ + "永恒卡", + "不能出售", + "或被摧毁", + }, + ml_gold_seal_desc={ + "黄金蜡封", + "若打出", + "返回手牌", + }, + ml_offline_message={ + "此设备离线了。", + "当前的存档可能不是最新的。", + }, + ml_open_target={ + "打开", + }, + ml_paste_seed={ + "粘贴", + "种子", + }, + ml_play_discard_pos_opt={ + "弃牌/出牌", + "出牌/弃牌", + }, + ml_redeem_target={ + "兑换", + }, + ml_sell_target={ + "售出", + }, + ml_shadow_opt={ + "开启", + "关闭", + }, + ml_smoothing_opt={ + "关闭", + "开启", + }, + ml_unlock_all_explanation={ + "警告!解锁全部收藏道具", + "会禁用此存档配置的成就!", + }, + ml_unlock_all_trophies={ + "警告!解锁全部收藏道具", + "会禁用此存档配置的奖杯!", + }, + ml_vsync_opt={ + "垂直同步开启", + "垂直同步关闭", + }, + ml_windowmode_opt={ + "窗口模式", + "全屏模式", + "无边框模式", + }, + ph_1_level="+1级", + ph_4_7_of_clubs="四张梅花7", + ph_alert_debuff_confirm="再次按下”出牌“确认", + ph_all_poker_hand="所有牌型", + ph_blind_reward="奖励:", + ph_blind_score_at_least="至少得分", + ph_boss_disabled="Boss限制条件失效!", + ph_choose_blind_1="选择你的", + ph_choose_blind_2="下一个盲注", + ph_click_confirm="再次点击确认", + ph_deck_preview_effective="因小丑、盲注和卡牌强化而产生的有效总数", + ph_deck_preview_stones="石头", + ph_defeat_the_boss="打赢Boss盲注", + ph_defeat_this_blind_1="打败盲注", + ph_defeat_this_blind_2="以发现它", + ph_demo_thanks_1="感谢游玩", + ph_demo_thanks_2="BALATRO 演示版", + ph_display_stickers="在一局比赛中展示赌注贴纸", + ph_game_over="游戏结束", + ph_improve_run="来变强吧!", + ph_most_played="{最常出的牌型}", + ph_mr_bones="被骷髅先生救了", + ph_no_boss_active="无活跃boss", + ph_no_vouchers="本赛局并未兑换任何优惠券", + ph_score_at_least="至少得分", + ph_score_cards_discarded="已弃掉卡牌", + ph_score_cards_played="已使用卡牌", + ph_score_cards_purchased="已购买卡牌", + ph_score_furthest_ante="底注", + ph_score_furthest_round="回合", + ph_score_hand="最佳出牌", + ph_score_new_collection="新发现", + ph_score_poker_hand="最常用牌型", + ph_score_times_rerolled="重掷次数", + ph_select_challenge="选择一项挑战", + ph_sneak_peek="抢先看", + ph_stat_consumable="这张卡的使用次数", + ph_stat_joker="使用此卡完成的总回合数", + ph_stat_voucher="兑换此优惠券的次数", + ph_unscored_hand="出牌将不会得分", + ph_up_ante_1="提高底注", + ph_up_ante_2="加注所有盲注", + ph_up_ante_3="刷新盲注", + ph_vouchers_redeemed="本赛局兑换的优惠券", + ph_you_win="你赢了!", + ph_you_win_demo="你赢下了试玩版!", + }, + high_scores={ + boss_streak="最多连续击败Boss", + collection="收藏", + current_streak="", + furthest_ante="最高底注", + furthest_round="最高回合", + hand="最佳出牌", + most_money="最多资金", + poker_hand="最常用的牌型", + win_streak="最佳连胜纪录", + }, + labels={ + blue_seal="蓝色蜡封", + common="普通", + eternal="永恒卡", + foil="闪箔", + gold_seal="金色蜡封", + holographic="镭射", + legendary="传奇", + locked="未解锁", + negative="负片", + perishable="易腐", + pinned_left="固定", + planet="星球牌", + pluto_planet="矮行星", + polychrome="多彩", + purple_seal="紫色蜡封", + rare="稀有", + red_seal="红色蜡封", + rental="租用", + tarot="塔罗牌", + uncommon="罕见", + voucher="优惠券", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5张相同点数的牌", + }, + Flush={ + "5张牌花色相同", + }, + ["Flush Five"]={ + "5张相同点数和相同花色的牌", + }, + ["Flush House"]={ + "三条及对子,且", + "花色相同", + }, + ["Four of a Kind"]={ + "4张相同点数的牌,可以与另外", + "一张不计分的牌一同打出", + }, + ["Full House"]={ + "三条及对子", + }, + ["High Card"]={ + "如果打出的牌不是以上任何一种", + "那么只有点数最高的牌会计分", + }, + Pair={ + "两张点数相同的牌,可以与另外", + "最多3张不计分的牌一同打出", + }, + ["Royal Flush"]={ + "连续5张牌(点数连续),且", + "花色相同", + }, + Straight={ + "连续5张牌(点数连续)", + }, + ["Straight Flush"]={ + "连续5张牌(点数连续),且", + "花色相同", + }, + ["Three of a Kind"]={ + "3张点数相同的牌,可以与另外", + "最多2张不计分的牌一同打出", + }, + ["Two Pair"]={ + "两对不同点数的牌,可以与另外", + "一张不计分的牌一同打出", + }, + }, + poker_hands={ + ["Five of a Kind"]="五条", + Flush="同花", + ["Flush Five"]="同花五条", + ["Flush House"]="同花葫芦", + ["Four of a Kind"]="四条", + ["Full House"]="葫芦", + ["High Card"]="高牌", + Pair="对子", + ["Royal Flush"]="皇家同花顺", + Straight="顺子", + ["Straight Flush"]="同花顺", + ["Three of a Kind"]="三条", + ["Two Pair"]="两对", + }, + quips={ + dq_1={ + "哎哟!我希望你", + "肚子里还有", + "别的招式来", + "应对这场最终挑战!", + }, + lq_1={ + "可能消消乐", + "才更适合", + "我们的节奏……", + }, + lq_10={ + "真是太惨了!", + }, + lq_2={ + "我们的牌打得", + "相当潦草!", + }, + lq_3={ + "我们是时候", + "撤出", + "重来了!", + }, + lq_4={ + "你也知道", + "老话怎么说的,", + "你可能小赚,但庄家永远不亏!", + }, + lq_5={ + "看来我们", + "找到了谁才是", + "真正的小丑!", + }, + lq_6={ + "哦不,你刚刚是", + "真的在吹牛?", + }, + lq_7={ + "看来我们才是", + "那个出洋相的!", + }, + lq_8={ + "如果我有手的话", + "我肯定会", + "捂上双眼!", + }, + lq_9={ + "我真是个", + "傻瓜,你的借口", + "又是什么?", + }, + wq_1={ + "你太棒了!", + }, + wq_2={ + "你表现得", + "相当不错!", + }, + wq_3={ + "看起来你", + "是有真本事的!", + }, + wq_4={ + "这些筹码", + "都是虚拟的", + "真是太可惜了……", + }, + wq_5={ + "看来我把你", + "教的不错啊!", + }, + wq_6={ + "你有几局", + "非常精彩啊!", + }, + wq_7={ + "幸好", + "我没有", + "赌你会输", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="A", + Jack="J", + King="K", + Queen="Q", + }, + suits_plural={ + Clubs="梅花", + Diamonds="方片", + Hearts="红桃", + Spades="黑桃", + }, + suits_singular={ + Clubs="梅花", + Diamonds="方片", + Hearts="红桃", + Spades="黑桃", + }, + tutorial={ + bb_1={ + "选择{C:attention}大盲注", + "可以赚到一点钱", + }, + bb_2={ + "也可以选择{C:attention}跳过", + "来获得一个{C:attention}标签{}!", + "每个{C:attention}标签{}都有独特的效果", + }, + bb_3={ + "但要注意", + "{C:attention}Boss盲注{}。 每个Boss盲注", + "都有着限制条件", + "您必须要有策略来应对。", + }, + bb_4={ + "如果你战胜了它,那么", + "{C:attention}底注{}就会提升,然后", + "所有{C:attention}盲注{}都会变得更难", + }, + bb_5={ + "通关{C:attention}底注{}#1#就可以获得胜利。", + "那么,来选择你的路线吧!", + }, + fh_1={ + "你赚取筹码的方式是靠", + "打出{C:attention}牌型", + }, + fh_2={ + "每一种{C:attention}牌型{}都可以获得", + "一定量的基础{C:blue}筹码", + "再乘上相应的{C:red}倍率", + }, + fh_3={ + "你可以在{C:attention}比赛信息{}这里", + "查看你的{C:attention}牌型", + "同时也可以看到关于当前", + "这局游戏的一些其他信息", + }, + fh_4={ + "卡牌也可以帮你", + "赚到一些{C:blue}筹码{},", + "悬停到牌上来查看!", + }, + fh_4_touch={ + "卡牌也可以帮你", + "赚到一些{C:blue}筹码{},", + "按住来查看!", + }, + fh_5={ + "现在选择最多", + "{C:attention}5{}张牌", + "并按下{C:blue}“出牌”", + }, + fh_5_touch={ + "现在轻按最多", + "{C:attention}5{}张要出的牌", + "并按下{C:blue}“出牌”", + }, + fh_6={ + "你也可以选择{C:red}“弃牌”{},最多", + "可弃掉{C:attention}5{}张选定卡牌", + "以求能够组成更强的牌型。", + "试试吧!", + }, + fh_7={ + "小心!每回合你的", + "{C:blue}出牌{}和{C:red}弃牌{}次数", + "都是有限的", + }, + fh_8={ + "在使用完所有{C:blue}出牌{}次数前,", + "赚取{C:attention}300筹码{},", + "来赢得此回合。", + "祝你好运!", + }, + s_1={ + "干得漂亮!现在", + "你有一些{C:money}资金{}了,", + "可以从{C:attention}商店{}里", + "买一些新的卡牌", + }, + s_10={ + "只要你打败", + "{C:attention}Boss盲注{},", + "{C:attention}优惠券{}就会补货上架。", + }, + s_11={ + "然后来看看这两个", + "所有商店都会有的", + "{C:booster}补充包{},里面可是", + "有很多好东西的!", + }, + s_12={ + "让我们继续", + "{C:attention}下一回合{}吧。", + }, + s_2={ + "试试买下这张", + "超酷的小丑牌", + }, + s_2_touch={ + "试试买下这张", + "超酷的小丑牌!", + "把它从商店", + "拖动到{C:attention}“购买”{}区域", + }, + s_3={ + "这是游戏中{C:attention}#1#张", + "{C:attention}小丑牌{}中的一张。", + "每张{C:attention}小丑牌都有", + "不同的效果", + }, + s_4={ + "比如这张可以让你每次", + "打出的牌获得{C:red}+4倍率{}", + }, + s_5={ + "挑着点儿啊,", + "因为你同时只能携带", + "{C:attention}5张小丑牌{}", + }, + s_6={ + "现在,从{C:attention}店内", + "购买另一张卡牌。", + }, + s_7={ + "这张{C:tarot}塔罗牌{}是一种", + "{C:attention}消耗牌{}。它可以", + "增强你要打出的卡牌!", + "好好留着这张牌", + }, + s_8={ + "您可以同时", + "携带最多", + "{C:attention}2张消耗牌{}", + }, + s_9={ + "如果你攒够了钱,", + "还可以购买{C:attention}优惠券{}。", + "{C:attention}优惠券{}是在一局游戏里", + "被动强化你的物品!", + }, + sb_1={ + "你好呀!我叫", + "{C:attention}金宝{},我是来帮你的", + "让我带你了解游玩的方法!", + }, + sb_2={ + "你的目标是赚取", + "{C:blue}筹码{}以击败", + "敌方的{C:attention}盲注", + }, + sb_3={ + "这是{C:blue}小盲注{},", + "你只需要获得", + "{C:attention}300筹码{}就可击败它。", + }, + sb_4={ + "选择{C:blue}小盲注", + "来开始回合!", + }, + sh_1={ + "当你得到更多的卡牌时,", + "请记住你可以重新整理排序。", + "{C:attention}小丑牌{}的触发顺序是", + "从左至右", + }, + sh_2={ + "还有别忘了", + "{C:attention}使用{}消耗牌!", + }, + sh_3={ + "最多选择手牌中的{C:attention}2{}张", + "然后按下{C:attention}“使用”{},", + "就可以打出{C:tarot}塔罗牌{}", + "施加增强效果!", + }, + sh_3_touch={ + "选择手牌中的最多{C:attention}2{}张卡牌", + "然后拖动", + "{C:tarot}塔罗牌{}到{C:attention}“使用”{}", + "区域来施加增强效果!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="出牌次数+#1#", + a_handsize="手牌上限+#1#", + a_handsize_minus="-#1#手牌上限", + a_mult="+#1#倍率", + a_mult_minus="-#1#倍率", + a_remaining="剩余#1#", + a_sold_tally="#1#/#2#售出", + a_xmult="X#1#倍率", + a_xmult_minus="-X#1#倍率", + ante_x_voucher="底注#1#优惠券", + challenges_completed="已完成#1#/#2#挑战", + completed="#1#/#2#已完成", + deck_preview_wheel_plural="由于抽出的#1#牌面朝下,数字可能较低", + deck_preview_wheel_singular="由于抽出的#1#牌面朝下,数字可能较低", + interest="每$#2#获得#1#利息(最高 #3#)", + loyalty_active="激活!", + loyalty_inactive="#1#次后激活", + ml_foil_desc={ + "闪箔", + "+#1#筹码", + }, + ml_holo_desc={ + "镭射", + "+#1#倍率", + }, + ml_negative_consumable_desc={ + "负片", + "+#1#消耗牌槽位", + }, + ml_negative_desc={ + "负片", + "+#1#小丑牌槽位", + }, + ml_polychrome_desc={ + "多彩", + "X#1#倍率", + }, + remaining_discard_money="剩余弃牌次数(每次$#1#)", + remaining_hand_money="剩余出牌次数(每次$#1#)", + unlocked="#1#/#2#已解锁", + }, + v_text={ + ch_c_all_eternal={ + "所有小丑牌都是{C:eternal}永恒卡{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}筹码{}不能超过当前{C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}每日挑战!", + }, + ch_c_debuff_played_cards={ + "所有{C:attention}打出{}的牌在计分后都会{C:attention}被削弱", + }, + ch_c_discard_cost={ + "每次弃牌花费{C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "{C:green}1/#1#{}的卡牌在抽取时背面朝上", + }, + ch_c_inflation={ + "每次购买后所有物价永久上涨{C:money}$1{}", + }, + ch_c_minus_hand_size_per_X_dollar={ + "你每拥有{C:money}$#1#{},可持有的手牌数量{C:red}-1{}", + }, + ch_c_no_extra_hand_money={ + "额外的{C:blue}出牌次数{}不再赚取资金", + }, + ch_c_no_interest={ + "回合结束时不赚取{C:attention}利息{}", + }, + ch_c_no_reward={ + "所有{C:attention}盲注{}均无奖励金", + }, + ch_c_no_reward_specific={ + "{C:attention}#1#盲注{}均无奖励金", + }, + ch_c_no_shop_jokers={ + "小丑牌不再出现在{C:attention}商店{}中", + }, + ch_c_none={ + "{C:inactive}无", + }, + ch_c_set_eternal_ante={ + "当底注{C:attention}#1#{}的Boss盲注被击败时,所有小丑牌变为{C:attention}永恒卡", + }, + ch_c_set_joker_slots_ante={ + "当底注{C:attention}#1#{}的Boss盲注被击败时,将小丑牌槽位设置为{C:attention}0", + }, + ch_c_set_seed={ + "使用固定种子进行1次性的挑战:{C:inactive}{Hidden}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{}消耗牌槽位", + }, + ch_m_discards={ + "每回合{C:red}#1#{}次弃牌", + }, + ch_m_dollars={ + "初始拥有{C:money}$#1#", + }, + ch_m_hand_size={ + "{C:attention}#1#{}手牌上限", + }, + ch_m_hands={ + "每回合{C:blue}#1#{}次出牌", + }, + ch_m_joker_slots={ + "{C:attention}#1#{}小丑牌槽位", + }, + ch_m_none={ + "{C:inactive}无", + }, + }, + }, +} \ No newline at end of file diff --git a/src/localization/zh_TW.lua b/src/localization/zh_TW.lua new file mode 100644 index 0000000..8a121ec --- /dev/null +++ b/src/localization/zh_TW.lua @@ -0,0 +1,4317 @@ +return { + descriptions={ + Back={ + b_abandoned={ + name="拋棄牌組", + text={ + "開局時", + "玩家牌組中", + "沒有{C:attention}人頭牌", + }, + }, + b_anaglyph={ + name="浮雕牌組", + text={ + "每次擊敗", + "{C:attention}Boss盲注{}後,獲得一個", + "{C:attention,T:tag_double}#1#", + }, + }, + b_black={ + name="黑色牌組", + text={ + "每一回合", + "", + "{C:attention}+#1#{}小丑牌欄位", + "{C:blue}-#2#{}出牌次數", + }, + }, + b_blue={ + name="藍色牌組", + text={ + "每一回合", + "{C:blue}+#1#{}次出牌", + }, + }, + b_challenge={ + name="挑戰牌組", + text={ + "", + }, + }, + b_checkered={ + name="方格牌組", + text={ + "開局時牌組為", + "{C:attention}26張{C:spades}黑桃{}和", + "{C:attention}26張{C:hearts}紅心{}", + }, + }, + b_erratic={ + name="不穩定牌組", + text={ + "牌組中所有", + "{C:attention}點數{}和{C:attention}花色", + "均為隨機設定", + }, + }, + b_ghost={ + name="幽靈牌組", + text={ + "商店內可能會有", + "{C:spectral}幻靈牌{}", + "開始時擁有{C:spectral,T:c_hex}妖術{}卡", + }, + }, + b_green={ + name="綠色牌組", + text={ + "每一回合結束時:", + "每剩一次{C:blue}出牌次數,獲得{C:money}$#1#{s:0.85}", + "每剩一次{C:red}棄牌次數,獲得{C:money}$#2#{s:0.85}", + "不獲得任何{C:attention}利息", + }, + }, + b_magic={ + name="魔術牌組", + text={ + "開局時得到", + "{C:tarot,T:v_crystal_ball}#1#{}禮券", + "和{C:attention}2張{}", + "{C:tarot,T:c_fool}#2#", + }, + }, + b_nebula={ + name="星雲牌組", + text={ + "開局時得到", + "{C:planet,T:v_telescope}#1#{}禮券", + "", + "及{C:red}#2#{}消耗牌欄位", + }, + }, + b_painted={ + name="彩繪牌組", + text={ + "{C:attention}+#1#{}手牌數量", + "{C:red}#2#{}小丑牌欄位", + }, + }, + b_plasma={ + name="等離子牌組", + text={ + "在計算局數分數時", + "平均{C:blue}籌碼{}", + "和{C:red}倍數{}", + "盲注要求分數{C:red}X#1#{}", + }, + }, + b_red={ + name="紅色牌組", + text={ + "每一回合", + "{C:red}+#1#{}次棄牌", + }, + }, + b_yellow={ + name="黃色牌組", + text={ + "開始時", + "額外獲得{C:money}$#1#", + }, + }, + b_zodiac={ + name="星座牌組", + text={ + "開局時即擁有", + "{C:tarot,T:v_tarot_merchant}#1#{}、", + "{C:planet,T:v_planet_merchant}#2#{}", + "和{C:attention,T:v_overstock_norm}#3#", + }, + }, + }, + Blind={ + bl_arm={ + name="手臂", + text={ + "降低玩的這局", + "出牌的牌型等級", + }, + }, + bl_big={ + name="大盲注", + text={ + }, + }, + bl_club={ + name="梅花", + text={ + "所有梅花牌卡", + "都不計分", + }, + }, + bl_eye={ + name="眼睛", + text={ + "本回合不能打出", + "重複的手牌類型", + }, + }, + bl_final_acorn={ + name="琥珀橡果", + text={ + "所有小丑牌都面朝下", + "和牌位亂調", + }, + }, + bl_final_bell={ + name="蔚藍鐘", + text={ + "有一張牌會一直", + "被強制選定", + }, + }, + bl_final_heart={ + name="緋紅之心", + text={ + "每次出牌", + "任一小丑牌功能失效", + }, + }, + bl_final_leaf={ + name="翠綠樹葉", + text={ + "所有牌卡都不計分", + "直到賣出1張小丑牌", + }, + }, + bl_final_vessel={ + name="紫羅蘭花器", + text={ + "非常大盲注", + }, + }, + bl_fish={ + name="魚", + text={ + "在第一次出牌後", + "抽的牌都是面朝下抽出", + }, + }, + bl_flint={ + name="燧石", + text={ + "基本籌碼和", + "倍數都減半", + }, + }, + bl_goad={ + name="鞭策", + text={ + "所有的黑桃牌卡", + "都不計分", + }, + }, + bl_head={ + name="頭顱", + text={ + "所有紅心牌卡", + "都不計分", + }, + }, + bl_hook={ + name="鉤子", + text={ + "每次出牌", + "隨機丟棄2張手牌", + }, + }, + bl_house={ + name="房子", + text={ + "第一次的手牌", + "以背面朝上方式抽取", + }, + }, + bl_manacle={ + name="手銬", + text={ + "手牌數量-1", + }, + }, + bl_mark={ + name="標記", + text={ + "所有人頭牌", + "面朝下抽出", + }, + }, + bl_mouth={ + name="嘴巴", + text={ + "本回合只能打出", + "一種手牌類型", + }, + }, + bl_needle={ + name="細針", + text={ + "此回合只能進行一次出牌", + }, + }, + bl_ox={ + name="公牛", + text={ + "打出#1#牌型時,", + "設定金額至$0", + }, + }, + bl_pillar={ + name="支柱", + text={ + "於本次底注中", + "打過的牌都不計分", + }, + }, + bl_plant={ + name="星球", + text={ + "所有人頭牌", + "都不計分", + }, + }, + bl_psychic={ + name="靈媒", + text={ + "必須出5張牌", + }, + }, + bl_serpent={ + name="蛇", + text={ + "每次出牌或棄牌後,", + "都只抽出3張牌", + }, + }, + bl_small={ + name="小盲注", + text={ + }, + }, + bl_tooth={ + name="尖齒", + text={ + "每出一張牌", + "損失$1", + }, + }, + bl_wall={ + name="高牆", + text={ + "特大盲注", + }, + }, + bl_water={ + name="清水", + text={ + "此回合開始於", + "0 次棄牌次數", + }, + }, + bl_wheel={ + name="巨輪", + text={ + " 7機率一張牌", + "以面朝下方式抽出", + }, + }, + bl_window={ + name="窗戶", + text={ + "所有方塊牌卡", + "都不計分", + }, + }, + }, + Edition={ + e_base={ + name="基本", + text={ + "無額外效果", + }, + }, + e_foil={ + name="銀箔", + text={ + "{C:chips}+#1#{}籌碼", + }, + }, + e_holo={ + name="全像攝影", + text={ + "{C:mult}+#1#{}倍數", + }, + }, + e_negative={ + name="負片", + text={ + "{C:dark_edition}+#1#{}小丑牌欄位", + }, + }, + e_negative_consumable={ + name="負片", + text={ + "{C:dark_edition}+#1#{}消耗牌欄位", + }, + }, + e_polychrome={ + name="彩色", + text={ + "{X:mult,C:white}X#1#{}倍數", + }, + }, + }, + Enhanced={ + m_bonus={ + name="獎勵牌", + text={ + }, + }, + m_glass={ + name="玻璃牌", + text={ + "{X:mult,C:white}X#1#{}倍數,", + "擁有{C:green}#2#/#3#{}的機率", + "摧毀牌卡", + }, + }, + m_gold={ + name="黃金牌", + text={ + "在這回合結束時", + "如果這張牌卡還在手上,", + "金錢{C:money}$#1#{}", + }, + }, + m_lucky={ + name="幸運牌", + text={ + "{C:green}#1#/#3#{}的機率", + "{C:mult}+#2#{}倍數", + "{C:green}#1#/#5#{}的機率", + "獲得{C:money}$#4#", + }, + }, + m_mult={ + name="倍數牌", + text={ + "{C:mult}+#1#{}倍數", + }, + }, + m_steel={ + name="鋼鐵牌", + text={ + "當這張牌卡", + "在手上時", + "{X:mult,C:white}X#1#{}倍數", + }, + }, + m_stone={ + name="石頭牌", + text={ + "{C:chips}+#1#{}籌碼", + "無點數或花色", + }, + }, + m_wild={ + name="萬能牌", + text={ + "可以用在", + "任何花色", + }, + }, + }, + Joker={ + j_8_ball={ + name="八號球", + text={ + "每次打出{C:attention}8{}時,", + "若得分,則有{C:green}#1#/#2#{}機率", + "產生一張{C:tarot}塔羅{}牌", + "{C:inactive}(必須有空位)", + }, + }, + j_abstract={ + name="抽象小丑", + text={ + "每張{C:attention}小丑牌{}", + "{C:mult}+#1#{}倍數", + "{C:inactive}(目前為{C:red}+#2#{C:inactive}倍)", + }, + }, + j_acrobat={ + name="雜技演員", + text={ + "每回合{C:attention}最後一次{C:attention}出牌{}", + "可得到{X:red,C:white}X#1#{}倍數", + }, + unlock={ + "出牌{C:attention,E:1}#1#{}次", + "{C:inactive}(#2#)", + }, + }, + j_ancient={ + name="古代小丑", + text={ + "每次打出", + "{V:1}#2#{}花色的牌,", + "得分時獲得{X:mult,C:white}X#1#{}倍數", + "{s:0.8}花色於每回合結束時變更", + }, + }, + j_arrowhead={ + name="石箭頭", + text={ + "只要每次打出", + "{C:spades}黑桃{}花色牌,", + "得分時{C:chips}+#1#{}籌碼", + }, + unlock={ + "牌組中至少要有", + "{E:1,C:attention}#1#張{E:1,C:attention}#2#{}", + "花色的牌", + }, + }, + j_astronomer={ + name="天文學家", + text={ + "商店裡的{C:planet}行星牌{}", + "以及{C:planet}天外禮包{}", + "全部{C:attention}免費", + }, + unlock={ + "發現每張", + "{E:1,C:planet}行星牌{}", + }, + }, + j_banner={ + name="旗幟", + text={ + "每一個剩餘的", + "{C:attention}棄牌{}次數可獲得", + "{C:chips}+#1#{}籌碼", + }, + }, + j_baron={ + name="男爵", + text={ + "手牌中,每", + "持有一張{C:attention}K{},", + "給予{X:mult,C:white}X#1#{}倍數", + }, + }, + j_baseball={ + name="棒球牌", + text={ + "每張擁有的{C:green}罕見{}小丑牌", + "給予{X:mult,C:white}X#1#{}倍數", + }, + }, + j_blackboard={ + name="黑板小丑", + text={ + "如果手牌中未打出的牌", + "都是{C:spades}#2#{}或{C:clubs}#3#{},", + "倍數{X:red,C:white}X#1#{}", + }, + }, + j_bloodstone={ + name="血石", + text={ + "每次打出的", + "{C:hearts}紅心{}花色牌", + "有{C:green}#1#/#2#{}的機率", + "獲得{X:mult,C:white}X#3#{}倍數", + }, + unlock={ + "牌組中至少要有", + "{E:1,C:attention}#1#張{E:1,C:attention}#2#{}", + "花色的牌", + }, + }, + j_blue_joker={ + name="藍色小丑", + text={ + "每張在{C:attention}牌組{}剩下的牌", + "可{C:chips}+#1#{}籌碼", + "{C:inactive}(目前為{C:chips}+#2#{C:inactive}籌碼)", + }, + }, + j_blueprint={ + name="藍圖小丑", + text={ + "複製", + "右邊{C:attention}小丑牌{}的能力", + }, + unlock={ + "贏得比賽", + }, + }, + j_bootstraps={ + name="拔靴帶", + text={ + "每持有{C:money}$#2#{}", + "倍數{C:mult}+#1#{}", + "{C:inactive}(目前{C:mult}+#3#{C:inactive}倍)", + }, + unlock={ + "至少擁有{E:1,C:attention}#1#{}張", + "{C:dark_edition}彩色{}小丑", + }, + }, + j_brainstorm={ + name="腦力激盪", + text={ + "複製", + "最左邊{C:attention}小丑牌的能力", + }, + unlock={ + "丟棄", + "{E:1,C:attention}皇家同花順", + }, + }, + j_bull={ + name="鬥牛", + text={ + "每持有{C:money}$1{},", + "籌碼{C:chips}+#1#{}張", + "{C:inactive}(目前{C:chips}+#2#{C:inactive}張籌碼)", + }, + }, + j_burglar={ + name="竊賊小丑", + text={ + "選擇{C:attention}盲注{}後,", + "{C:blue}+#1#{}出牌次數並", + "{C:attention}失去所有棄牌次數", + }, + }, + j_burnt={ + name="累爆小丑", + text={ + "升級", + "每回合中", + "第一次{C:attention}棄牌的牌型", + }, + unlock={ + "共賣出", + "{E:1,C:attention}#1#{}張牌", + "{C:inactive}(#2#)", + }, + }, + j_business={ + name="名片", + text={ + "打出的{C:attention}人頭牌{}有", + "{C:green}#1#/#2#{}的機率", + "在得分時獲得{C:money}$2{}", + }, + }, + j_caino={ + name="白臉小丑", + text={ + "每有一張{C:attention}人頭{}牌", + "被銷毀,此小丑獲得", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_campfire={ + name="營火", + text={ + "每{C:attention}賣出{}一張牌卡", + "此小丑獲得{X:mult,C:white}X#1#{}倍數,", + "每戰勝{C:attention}Boss盲注{}時重置", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + }, + j_card_sharp={ + name="老千小丑", + text={ + "當這一{C:attention}牌型{}", + "已經在這回合出過時,", + "倍數{X:mult,C:white}X#1#{}", + }, + }, + j_cartomancer={ + name="卜卦小丑", + text={ + "在選了{C:attention}盲注{}後", + "產生一張{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)", + }, + unlock={ + "發現每張", + "{E:1,C:tarot}塔羅牌{}", + }, + }, + j_castle={ + name="城堡", + text={ + "每次丟棄{V:1}#2#{}花色牌,", + "此小丑牌獲得{C:chips}+#1#{}籌碼", + "每回合花色都會變更", + "{C:inactive}(目前為{C:chips}+#3#{C:inactive}籌碼)", + }, + }, + j_cavendish={ + name="華蕉", + text={ + "倍數{X:mult,C:white}X#1#{},", + "每回合結束時", + "有{C:green}#2#/#3#{}的機率", + "此牌會被摧毀", + }, + }, + j_ceremonial={ + name="恐佈匕首", + text={ + "每次{C:attention}盲注{}選擇後,", + "摧毀右邊的小丑牌", + "並永久增加其賣出價", + "的{C:attention}兩倍{}至目前{C:red}倍數", + "{C:inactive}(目前為{C:mult}+#1#{C:inactive}倍)", + }, + }, + j_certificate={ + name="證書", + text={ + "每回合開始時", + "隨機增加一張", + "帶有隨機{C:attention}封蠟章{}的", + "牌到手牌中", + }, + unlock={ + "擁有一張", + "帶有{C:attention,E:1}金色封蠟章", + "的黃金牌", + }, + }, + j_chaos={ + name="慌亂小丑", + text={ + "每回合在商店可", + "{C:green}免費{}重摋{C:attention}#1#{}次", + }, + }, + j_chicot={ + name="奇科特", + text={ + "每個{C:attention}Boss盲注", + "限制條件消失", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_clever={ + name="機靈小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼", + }, + }, + j_cloud_9={ + name="9霄雲外", + text={ + "每張牌組內的數字{C:attention}9{}", + "在每回合結束時", + "獲得{C:money}$#1#{}", + "{C:inactive}(目前{C:money}$#2#{}{C:inactive})", + }, + }, + j_constellation={ + name="星空小丑", + text={ + "每使用一張{C:planet}行星{}牌,", + "這個小丑獲得", + "{X:mult,C:white} X#1# {}倍數", + "{C:inactive}(目前{X:mult,C:white} X#2# {C:inactive}倍)", + }, + }, + j_crafty={ + name="鬼靈精小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼", + }, + }, + j_crazy={ + name="瘋狂小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}", + }, + }, + j_credit_card={ + name="信用卡", + text={ + "最多可負債", + "至{C:red}$#1#{}", + }, + }, + j_delayed_grat={ + name="最後獎賞", + text={ + "如果在本回合未使用棄牌,", + "每一個{C:attention}棄牌數{}", + "獲得{C:money}$#1#{}", + }, + }, + j_devious={ + name="心機小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼", + }, + }, + j_diet_cola={ + name="低卡可樂", + text={ + "賣出這張牌卡以", + "建立一個免費", + "{C:attention}#1#", + }, + }, + j_dna={ + name="DNA", + text={ + "如果一回合的{C:attention}第一次出牌{}", + "只有出{C:attention}1{}張牌", + "將永久複製{C:attention}那張牌{}到牌組", + "並放到{C:attention}手牌{}", + }, + }, + j_drivers_license={ + name="駕照", + text={ + "如果牌組中至少有", + "{C:attention}16{}張加強牌", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{C:attention}#2#{C:inactive})", + }, + unlock={ + "在你的牌組中", + "加強{E:1,C:attention}#1#{}張牌", + }, + }, + j_droll={ + name="古怪小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}", + }, + }, + j_drunkard={ + name="喝掛小丑", + text={ + "每一回合", + "{C:red}+#1#{}次棄牌", + }, + }, + j_duo={ + name="二重奏", + text={ + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數", + }, + unlock={ + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#", + }, + }, + j_dusk={ + name="夕陽卡", + text={ + "在{C:attention}最後{}", + "{C:attention}一次出牌{}時,", + "該手牌會被觸發兩次", + }, + }, + j_egg={ + name="蛋頭小丑", + text={ + "在回合結束時", + "本卡的{C:attention}出售價值", + "增加{C:money}$#1#", + }, + }, + j_erosion={ + name="侵蝕", + text={ + "在你的牌組中", + "每張小於{C:attention}#3#{}的牌", + "均可獲得{C:red}+#1#{}倍數", + "{C:inactive}(目前為{C:red}+#2#{C:inactive}倍)", + }, + }, + j_even_steven={ + name="互不相欠", + text={ + "每打出一張計分的", + "{C:attention}偶數{}點的牌,", + "得分時,{C:mult}+#1#{}倍數", + "{C:inactive}(10、8、6、4、2)", + }, + }, + j_faceless={ + name="無臉小丑", + text={ + "如果同時捨棄", + "{C:attention}#2#{}張或更多張", + "{C:attention}人頭牌{}", + "獲得{C:money}$#1#{}", + }, + }, + j_family={ + name="鐵支", + text={ + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數", + }, + unlock={ + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#", + }, + }, + j_fibonacci={ + name="黃金分割數", + text={ + "每次打出{C:attention}A{}、", + "{C:attention}2{}、{C:attention}3{}、{C:attention}5{}、或{C:attention}8{}時,", + "得分時{C:mult}+#1#{}倍數", + }, + }, + j_flash={ + name="閃卡", + text={ + "每次商店{C:attention}重摋{}", + "此小丑獲得{C:mult}+#1#{}倍數", + "{C:inactive}(目前{C:mult}+#2#{C:inactive} 倍)", + }, + }, + j_flower_pot={ + name="盆栽", + text={ + "若牌型包含有", + "一張{C:diamonds}方塊{}、{C:clubs}梅花{}、", + "{C:hearts}紅心{}和{C:spades}黑桃{}牌,", + "則倍數{X:mult,C:white}X#1#{}", + }, + unlock={ + "達到底注", + "級別{E:1,C:attention}#1#", + }, + }, + j_fortune_teller={ + name="占卜師小丑", + text={ + "本賽局每使用一張{C:purple}塔羅牌{}時", + "倍數{C:red}+#1#{}", + "{C:inactive}(目前為{C:red}+#2#{C:inactive})", + }, + }, + j_four_fingers={ + name="四張牌", + text={ + "所有{C:attention}同花{}和", + "{C:attention}順子{}可以", + "只用{C:attention}4{}張牌湊成", + }, + }, + j_gift={ + name="禮物卡", + text={ + "在每回合結束時", + "每張擁有的{C:attention}小丑牌{}", + "及{C:attention}消耗卡{}", + "{C:attention}售價{}加{C:money}$#1#{}", + }, + }, + j_glass={ + name="玻璃小丑", + text={ + "每有一張{C:attention}玻璃牌", + "被銷毀,此小丑獲得", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + unlock={ + "牌組中至少", + "要有{E:1,C:attention}#1#張", + "{E:1,C:attention}#2#", + }, + }, + j_gluttenous_joker={ + name="貪吃小丑", + text={ + "每打出一張", + "{C:clubs}#2#{}花色的牌,", + "倍數{C:red}+#1#{}", + }, + }, + j_golden={ + name="黃金小丑", + text={ + "於每一回合結束時", + "獲得{C:money}$#1#{}", + }, + }, + j_greedy_joker={ + name="貪心小丑", + text={ + "每打出一張", + "{C:diamonds}#2#{}花色的牌,", + "倍數{C:red}+#1#{}", + }, + }, + j_green_joker={ + name="綠色小丑", + text={ + "每次出牌,{C:mult}+#1#{}倍數", + "每次棄牌,{C:mult}-#2#{}倍數", + "{C:inactive}(目前為{C:mult}+#3#{C:inactive}倍)", + }, + }, + j_gros_michel={ + name="大麥克香蕉", + text={ + "倍數{C:mult}+#1#{},", + "每回合結束時", + "有{C:green}#2#/#3#{}的機率", + "此牌會被銷毀", + }, + }, + j_hack={ + name="爛脫口秀演員", + text={ + "重新觸發", + "所有打出的", + "{C:attention}2{}、{C:attention}3{}、{C:attention}4{}、或{C:attention}5{}", + }, + }, + j_half={ + name="半個小丑", + text={ + "如果打出", + "不超過{C:attention}#2#{}張牌,", + "倍數{C:red}+#1#{}", + }, + }, + j_hallucination={ + name="產生幻覺", + text={ + "當開啟任一{C:attention}擴充包{}時,", + "有{C:green}#1#/#2#{}的機會", + "產生一張{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)", + }, + }, + j_hanging_chad={ + name="懸孔票", + text={ + "重新觸發得分中", + "{C:attention}最先{}打出的牌", + "額外{C:attention}#1#{}次", + }, + unlock={ + "贏得Boss盲注", + "使用的是{E:1,C:attention}#1#", + }, + }, + j_hiker={ + name="登山小丑", + text={ + "每張打出的", + "{C:attention}計分牌{}可永久", + "獲得{C:chips}+#1#{}籌碼", + }, + }, + j_hit_the_road={ + name="一路暢通", + text={ + "本回合每有一張{C:attention}J{}", + "被棄牌,此小丑獲得", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + unlock={ + "同時將", + "{E:1,C:attention}5張J{}", + "全部棄掉", + }, + }, + j_hologram={ + name="全像", + text={ + "{C:attention}遊戲牌{}追加到牌組時,", + "此小丑獲得", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + }, + j_ice_cream={ + name="冰淇淋", + text={ + "{C:chips}+#1#{}籌碼,", + "每次出牌", + "{C:chips}-#2#{}籌碼", + }, + }, + j_idol={ + name="偶像小丑", + text={ + "打出每張{V:1}#3#{}花色的", + "{C:attention}#2#{}在得分時", + "{X:mult,C:white}X#1#{}倍數", + "{s:0.8}每個回合牌都會變", + }, + unlock={ + "在一次出牌中", + "得到至少", + "{E:1,C:attention}#1#{}籌碼", + }, + }, + j_invisible={ + name="隱形小丑", + text={ + "在{C:attention}#1#{}回合後,", + "賣出這張牌卡以", + "{C:attention}複製{}隨機一張小丑牌", + "{C:inactive}(目前為{C:attention}#2#{C:inactive}/#1#)", + }, + unlock={ + "拿到不超過{E:1,C:attention}4張小丑牌{}", + "的情況", + "贏得比賽", + }, + }, + j_joker={ + name="小丑", + text={ + "倍數{C:red,s:1.1}+#1#{}", + }, + }, + j_jolly={ + name="開心小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}", + }, + }, + j_juggler={ + name="雜耍小丑", + text={ + "{C:attention}+#1#{}手牌數量", + }, + }, + j_loyalty_card={ + name="積分卡", + text={ + "每出牌{C:attention}#2#{}次", + "獲得一次倍數{X:red,C:white}X#1#{}", + "{C:inactive}#3#次", + }, + }, + j_luchador={ + name="鬥士", + text={ + "賣出這張牌卡以", + "消除目前的", + "{C:attention}Boss盲注{}限制功能", + }, + }, + j_lucky_cat={ + name="幸運貓", + text={ + "{C:attention}幸運{}牌", + "{C:green}成功{}觸發時,", + "此小丑牌獲得{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + }, + j_lusty_joker={ + name="好色小丑", + text={ + "每打出一張", + "{C:hearts}#2#{}花色的牌,", + "倍數{C:red}+#1#{}", + }, + }, + j_mad={ + name="生氣小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}", + }, + }, + j_madness={ + name="瘋狂小丑", + text={ + "選擇{C:attention}小盲注{}或{C:attention}大盲注{}時", + "獲得{X:mult,C:white}X#1#{}倍數", + "並{C:attention}銷毀{}一個隨機小丑", + "{C:inactive}(目前{X:mult,C:white}X#2#{C:inactive}倍)", + }, + }, + j_mail={ + name="郵件", + text={ + "每棄掉一張{C:attention}#2#{},", + "獲得{C:money}$#1#{},", + "每回合數字都會變更", + }, + }, + j_marble={ + name="大理石小丑", + text={ + "每次選完{C:attention}盲注{},", + "增加1張{C:attention}石頭牌{}", + "到牌組中", + }, + }, + j_matador={ + name="鬥牛小丑", + text={ + "如果打出的牌觸發", + "{C:attention}Boss盲注{}的限制條件,", + "獲得{C:money}$#1#{}", + }, + unlock={ + "在{E:1,C:attention}一手之內", + "且不使用棄牌次數", + "戰勝Boss盲注", + }, + }, + j_merry_andy={ + name="快樂小丑", + text={ + "每一回合", + "{C:red}+#1#{}次棄牌,", + "{C:red}#2#{}手牌數量", + }, + unlock={ + "在{E:1,C:attention}#1#回合或", + "或更少的回合數下勝出", + }, + }, + j_midas_mask={ + name="邁達斯面具", + text={ + "打出的全部{C:attention}人頭牌{}", + "在得分時", + "變為{C:attention}金色{}牌", + }, + }, + j_mime={ + name="默劇小丑", + text={ + "重新觸發", + "所有手中{C:attention}持有的", + "{C:attention}手牌{}的能力", + }, + }, + j_misprint={ + name="印錯小丑", + text={ + "", + }, + }, + j_mr_bones={ + name="骷髏頭", + text={ + "若得分時,獲得", + "所需籌碼的", + "{C:attention}25%{}或以上,", + "可避免死亡", + "{S:1.1,C:red,E:2}自我毀滅{}", + }, + unlock={ + "輸掉{C:attention,E:1}#1#{}場比賽", + "{C:inactive}(#2#)", + }, + }, + j_mystic_summit={ + name="神秘之峰", + text={ + "當剩下{C:attention}#2#{}次", + "棄牌數時,", + "倍數{C:mult}+#1#{}", + }, + }, + j_obelisk={ + name="方尖碑", + text={ + "不打出最常使用的{C:attention}牌型,", + "{C:attention}連續{}打出每次出牌,", + "此小丑獲得", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + }, + j_odd_todd={ + name="古怪托德", + text={ + "每打出一張計分的", + "{C:attention}奇數{}點的牌,", + "得分時,{C:chips}+#1#{}籌碼", + "{C:inactive}(A、9、7、5、3)", + }, + }, + j_onyx_agate={ + name="黑瑪瑙", + text={ + "只要每次打出", + "{C:clubs}梅花{}花色牌,", + "得分時,{C:mult}+#1#{}倍數", + }, + unlock={ + "牌組中至少要有", + "{E:1,C:attention}#1#張{E:1,C:attention}#2#{}", + "花色的牌", + }, + }, + j_oops={ + name="六六大順", + text={ + "所有{C:attention}機率牌{}的", + "{C:green,E:1,S:1.1}機率加倍", + "{C:inactive}(例:{C:green}1/3{C:inactive} -> {C:green}2/3{C:inactive})", + }, + unlock={ + "在一次出牌中", + "得到至少", + "{E:1,C:attention}#1#{}籌碼", + }, + }, + j_order={ + name="順子", + text={ + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數", + }, + unlock={ + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#", + }, + }, + j_pareidolia={ + name="迷幻錯覺", + text={ + "所有牌", + "一律會被視為", + "{C:attention}人頭牌{}", + }, + }, + j_perkeo={ + name="佩爾基", + text={ + "在結束商店後", + "隨機複製{C:attention}1{}張", + "擁有的{C:attention}消耗牌{}", + "並給那張牌{C:dark_edition}負片{}效果", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_photograph={ + name="攝影", + text={ + "得分時,第一張", + "打出的{C:attention}人頭牌{}", + "獲得{X:mult,C:white}X#1#{}倍數", + }, + }, + j_popcorn={ + name="爆米花", + text={ + "{C:mult}+#1#{}倍數,", + "每結束一回合", + "{C:mult}-#2#{}倍數", + }, + }, + j_raised_fist={ + name="致勝之拳", + text={ + "按照手中點數{C:attention}最低{}", + "的牌,向倍數追加", + "其點數的{C:attention}兩倍{}", + }, + }, + j_ramen={ + name="拉麵", + text={ + "擁有{X:mult,C:white}X#1#{}倍數", + "每{C:attention}丟棄一張牌{},", + "失去{X:mult,C:white}X#2#{}倍數", + }, + }, + j_red_card={ + name="紅牌", + text={ + "任意{C:attention}擴充包{}被略過時", + "此小丑獲得", + "{C:red}+#1#{}倍數", + "{C:inactive}(目前為{C:red}+#2#{C:inactive}倍)", + }, + }, + j_reserved_parking={ + name="私人車位", + text={ + "手牌中", + "每張持有的{C:attention}人頭牌{}", + "有{C:green}#2#/#3#{}的機率", + "給予{C:money}$#1#{}", + }, + }, + j_ride_the_bus={ + name="公車卡", + text={ + "每{C:attention}連續{}打出一手", + "未得分的{C:attention}人頭{}牌手牌,", + "這個小丑可獲得", + "{C:mult}+#1#{}倍數", + "{C:inactive}(目前{C:mult}+#2#{C:inactive}倍)", + }, + }, + j_riff_raff={ + name="即興演出", + text={ + "每當選擇{C:attention}盲注{}時", + "其會產生{C:attention}#1#張{C:blue}一般{C:attention}小丑牌", + "{C:inactive}(必須有空位)", + }, + }, + j_ring_master={ + name="馬戲王小丑", + text={ + "{C:attention}小丑牌{}、{C:tarot}塔羅牌{}、{C:planet}行星牌{}和", + "{C:spectral}幻靈牌{}會在商店出現", + "多次", + }, + unlock={ + "達到底注", + "級別{E:1,C:attention}#1#", + }, + }, + j_rocket={ + name="火箭", + text={ + "於回合結束時獲得{C:money}$#1#{}", + "{C:attention}Boss盲註{}", + "被擊敗時獎金提升{C:money}$#2#{}", + }, + }, + j_rough_gem={ + name="原礦", + text={ + "只要每次打出", + "{C:diamonds}方塊{}花色牌,", + "得分時{C:money}$#1#{}", + }, + unlock={ + "牌組中至少要有", + "{E:1,C:attention}#1#張{E:1,C:attention}#2#{}", + "花色的牌", + }, + }, + j_runner={ + name="跑者小丑", + text={ + "每次打出{C:attention}順子{}", + "就會獲得", + "{C:chips}+#2#{}籌碼", + "{C:inactive}(目前{C:chips}+#1#{C:inactive}籌碼)", + }, + }, + j_satellite={ + name="衛星", + text={ + "本賽局每使用一張", + "{C:planet}行星牌{},每回合結束時", + "可得到{C:money}$#1#{}", + "{C:inactive}(目前為{C:money}$#2#{C:inactive})", + }, + unlock={ + "得到{E:1,C:money}$#1#", + "或更多", + }, + }, + j_scary_face={ + name="駭人的臉", + text={ + "打出{C:attention}人頭牌{}時,", + "得分時", + "{C:chips}+#1#{}籌碼", + }, + }, + j_scholar={ + name="學者小丑", + text={ + "每打出一張{C:attention}A{},", + "得分時,", + "{C:chips}+#2#{}籌碼、", + "{C:mult}+#1#{}倍數", + }, + }, + j_seance={ + name="亡靈之約", + text={ + "如果{C:attention}手牌{}為{C:attention}#1#{}", + "即產生一張", + "隨機的{C:spectral}幻靈牌{}", + "{C:inactive}(必須有空位)", + }, + }, + j_seeing_double={ + name="幻視", + text={ + "如果出牌中有計分的牌", + "包含{C:clubs}梅花{}和", + "其他任意{C:attention}花色{},", + "{X:mult,C:white}X#1#{}倍數", + }, + unlock={ + "在一次出牌中", + "打出的牌包含", + "{E:1,C:attention}#1#", + }, + }, + j_selzer={ + name="氣泡水", + text={ + "未來{C:attention}#1#{}次出牌", + "重新觸發所有", + "打出的牌", + }, + }, + j_shoot_the_moon={ + name="射月亮", + text={ + "手牌中,每", + "持有一張{C:attention}Q{},", + "給予{C:mult}+#1#{}倍數", + }, + unlock={ + "在一個回合中", + "打出牌組中", + "所有{E:1,C:attention}紅心", + }, + }, + j_shortcut={ + name="捷徑", + text={ + "允許{C:attention}順子{}可跨", + "{C:attention}1點達成", + "{C:inactive}(如:{C:attention}10 8 6 5 3{C:inactive})", + }, + }, + j_sixth_sense={ + name="第六感", + text={ + "如果回合第一次出牌為", + "單張數字{C:attention}6{},將銷毀那張牌並且", + "產生一張隨機的{C:spectral}幻靈牌{}", + "{C:inactive}(必須有空位)", + }, + }, + j_sly={ + name="狡詐小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼", + }, + }, + j_smeared={ + name="歪臉小丑", + text={ + "{C:hearts}紅心{}和{C:diamonds}方塊", + "視為相同花色,", + "{C:spades}黑桃{}和{C:clubs}梅花", + "視為相同花色", + }, + unlock={ + "牌組中至少", + "要有{C:attention}#1#張", + "{E:1,C:attention}#2#{}", + }, + }, + j_smiley={ + name="笑臉", + text={ + "得分時,", + "打出的{C:attention}人頭牌{}", + "給予{C:mult}+#1#{}倍數", + }, + }, + j_sock_and_buskin={ + name="悲與喜", + text={ + "重新觸發全部", + "打出的{C:attention}人頭牌{}", + }, + unlock={ + "總共打出", + "{C:attention,E:1}#1#{}張人頭牌", + "{C:inactive}(#2#)", + }, + }, + j_space={ + name="太空小丑", + text={ + "每次出牌", + "有{C:green}#1#/#2#{}的機率", + "升級{C:attention}牌型等級{}", + }, + }, + j_splash={ + name="水花噴濺", + text={ + "每張{C:attention}打出的牌", + "都會計分", + }, + }, + j_square={ + name="方塊小丑", + text={ + "若打出牌型", + "恰好為{C:attention}4{}張牌,", + "此小丑獲得{C:chips}+#2#{}張籌碼", + "{C:inactive}(目前為{C:chips}#1#{C:inactive}張籌碼)", + }, + }, + j_steel_joker={ + name="鋼鐵小丑", + text={ + "在你的{C:attention}牌組中{C:attention}", + "每張鋼鐵牌", + "均可獲得{X:mult,C:white} X#1# {}倍數", + "{C:inactive}(目前為{X:mult,C:white} X#2# {C:inactive}倍)", + }, + }, + j_stencil={ + name="模具小丑", + text={ + "每個空的{C:attention}小丑牌{}欄位", + "獲得{X:red,C:white}X#1#{}倍數。", + "包含{s:0.8}模具小丑", + "{C:inactive}(目前為{X:red,C:white}X#1#{C:inactive})", + }, + }, + j_stone={ + name="石頭小丑", + text={ + "完整{C:attention}牌組中", + "每有一張{C:attention}石頭牌,", + "給予{C:chips}+#1#{}張籌碼", + "{C:inactive}(目前{C:chips}+#2#{C:inactive}張籌碼)", + }, + }, + j_stuntman={ + name="特技演員", + text={ + "{C:chips}+#1#{}籌碼", + "{C:attention}-#2#{}手牌數量", + }, + unlock={ + "在一次出牌中", + "得到至少", + "{E:1,C:attention}#1#{}籌碼", + }, + }, + j_supernova={ + name="超新星", + text={ + "向倍數追加本次比賽中", + "打出的{C:attention}牌型{}手數相等的", + "數值", + }, + }, + j_superposition={ + name="完美位置", + text={ + "如果計分手牌包含", + "一張{C:attention}A{}及{C:attention}順子{}", + "即產生一張{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)", + }, + }, + j_swashbuckler={ + name="盜賊小丑", + text={ + "根據持有的其他", + "{C:attention}小丑{},", + "追加其全體賣出價格至倍數", + "{C:inactive}(目前{C:mult}+#1#{C:inactive}倍)", + }, + unlock={ + "賣出總共", + "{C:attention,E:1}#1#{}張小丑牌", + "{C:inactive}(#2#)張", + }, + }, + j_throwback={ + name="復古小丑", + text={ + "此比賽中每跳過一次", + "{C:attention}盲注{},{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + unlock={ + "從主選單", + "繼續玩已儲存的比賽", + }, + }, + j_ticket={ + name="黃金門票", + text={ + "若打出{C:money}黃金牌{},", + "得分時,{C:money}$#1#{}", + }, + unlock={ + "打出5張手牌,", + "其中只包含 ", + "{C:attention,E:1}黃金牌{}", + }, + }, + j_to_the_moon={ + name="登月", + text={ + "每回合結束時,", + "每擁有{C:money}$5{},", + "皆可獲得額外{C:money}$#1#{}利息", + }, + }, + j_todo_list={ + name="待辦事項", + text={ + "若{C:attention}牌型{}為{C:attention}#2#{}", + "則在回合結束時,", + "贏得{C:money}$#1#{},", + "隨後牌型變更", + }, + }, + j_trading={ + name="交換卡", + text={ + "每回合的{C:attention}第一次棄牌{}", + "如果只有棄{C:attention}1{}張牌", + "摧毀那張牌並獲得{C:money}$#1#", + }, + }, + j_tribe={ + name="同花", + text={ + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數", + }, + unlock={ + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#", + }, + }, + j_triboulet={ + name="弄臣小丑", + text={ + "打出的{C:attention}K{}和{C:attention}Q", + "各自獲得", + "{X:mult,C:white}X#1#{}倍數", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_trio={ + name="三重奏", + text={ + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數", + }, + unlock={ + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#", + }, + }, + j_troubadour={ + name="吟遊詩人", + text={ + "{C:attention}+#1#{}手牌數量,", + "每回合{C:blue}-#2#{}次出牌次數", + }, + unlock={ + "透過只打出", + "一次手牌", + "連勝{C:attention,E:1}#1#{}回合", + }, + }, + j_trousers={ + name="備用長褲", + text={ + "如果打出的牌包含", + "{C:attention}#2#", + "{C:inactive}", + "此小丑獲得{C:mult}+#1#{}倍數(目前{C:red}+#3#{C:inactive}倍)", + }, + }, + j_turtle_bean={ + name="烏龜豆", + text={ + "手牌數量{C:attention}+#1#{}", + "每一回合", + "減少{C:red}#2#{}", + }, + }, + j_vagabond={ + name="流浪者", + text={ + "若在出牌時當下", + "擁有{C:money}$#1#{}或更少的金錢", + "產生一張{C:purple}塔羅牌{}", + }, + }, + j_vampire={ + name="吸血鬼小丑", + text={ + "本回合每打出一張得分的{C:attention}加強牌{},", + "此小丑獲得{X:mult,C:white}X#1#{}倍數,", + "移除牌的{C:attention}加強", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)", + }, + }, + j_walkie_talkie={ + name="對講機", + text={ + "每打出數字{C:attention}10{}或{C:attention}4,", + "得分時給予{C:chips}+#1#{}籌碼及", + "{C:mult}+#2#{}倍數", + }, + }, + j_wee={ + name="小小丑", + text={ + "每打出一張數字{C:attention}2{}並得分時", + "這張小丑牌", + "永久獲得{C:chips}+#2#{}籌碼", + "{C:inactive}(目前為{C:chips}+#1#{C:inactive}籌碼)", + }, + unlock={ + "在{E:1,C:attention}#1#回合或", + "或更少的回合數下勝出", + }, + }, + j_wily={ + name="狡猾小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼", + }, + }, + j_wrathful_joker={ + name="憤怒小丑", + text={ + "每打出一張", + "{C:spades}#2#{}花色的牌,", + "倍數{C:red}+#1#{}", + }, + }, + j_yorick={ + name="約里克", + text={ + "每捨棄一張{C:attention}#2#{C:inactive} [#3#]{}牌,", + "這個小丑獲得", + "{X:mult,C:white} X#1# {}倍數", + "{C:inactive}(目前{X:mult,C:white} X#4# {C:inactive}倍)", + }, + unlock={ + "{E:1,s:1.3}?????", + }, + }, + j_zany={ + name="滑稽小丑", + text={ + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}", + }, + }, + }, + Other={ + black_sticker={ + name="黑色貼紙", + text={ + "使用這張小丑牌", + "贏得{C:attention}黑色", + "{C:attention}賭注{}難度", + }, + }, + blue_seal={ + name="藍色封蠟章", + text={ + "若{C:attention}持於{}手中,產生回合中", + "最後打出{C:attention}牌型{}的", + "{C:planet}行星{}牌", + "{C:inactive}(必須有空位)", + }, + }, + blue_sticker={ + name="藍色貼紙", + text={ + "使用這張小丑牌", + "贏得{C:attention}藍色", + "{C:attention}賭注{}難度", + }, + }, + card_chips={ + text={ + "{C:chips}+#1#{}籌碼", + }, + }, + card_extra_chips={ + text={ + "{C:chips}+#1#{}額外籌碼", + }, + }, + challenge_locked={ + name="已鎖定", + text={ + "用至少#1#個不同牌組", + "贏得一場比賽以解鎖", + "挑戰模式", + "{C:attention,s:2}#2#/#1#", + }, + }, + debuffed_default={ + name="遭減益", + text={ + "所有能力", + "失效", + }, + }, + debuffed_playing_card={ + name="遭減益", + text={ + "得分無籌碼,", + "不能觸發任何", + "功能或效果", + }, + }, + deck_locked_discover={ + name="已鎖定", + text={ + "在收藏中", + "發現至少", + "{C:attention}#1#{}個項目", + }, + }, + deck_locked_stake={ + name="已鎖定", + text={ + "用任一牌組贏得比賽,", + "至少需為", + "{V:1}#1#{}難度", + }, + }, + deck_locked_win={ + name="已鎖定", + text={ + "在任一難度下", + "使用{C:attention}#1#{}", + "贏得一場比賽", + }, + }, + demo_locked={ + name="已鎖定", + text={ + "本試玩版", + "暫不適用", + }, + }, + demo_shop_locked={ + name="已鎖定", + text={ + "{C:attention}金寶的", + "個人收藏牌卡。", + "將於正式版的", + "{E:1,C:red}Balatro可供使用", + }, + }, + eternal={ + name="永恆", + text={ + "不能賣出", + "或催毀", + }, + }, + gold_seal={ + name="金色封蠟章", + text={ + "打出這張牌", + "且此牌計分,", + "獲得{C:money}$3{}", + }, + }, + gold_sticker={ + name="金色貼紙", + text={ + "使用這張小丑牌", + "贏得{C:attention}金色", + "{C:attention}賭注{}難度", + }, + }, + green_sticker={ + name="綠色貼紙", + text={ + "使用這張小丑牌", + "贏得{C:attention}綠色", + "{C:attention}賭注{}難度", + }, + }, + joker_locked_legendary={ + name="已鎖定", + text={ + "透過{C:spectral}靈魂{}牌", + "找到這張小丑牌", + }, + }, + locked={ + name="已鎖定", + text={ + }, + }, + orange_sticker={ + name="橘色貼紙", + text={ + "使用這張小丑牌", + "贏得{C:attention}橘色", + "{C:attention}賭注{}難度", + }, + }, + p_arcana_jumbo={ + name="特大奧秘禮包", + text={ + "從最多{C:attention}#2#張{C:tarot}塔羅牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_arcana_mega={ + name="超級奧秘禮包", + text={ + "從最多{C:attention}#2#張{C:tarot}塔羅牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_arcana_normal={ + name="奧秘禮包", + text={ + "從最多{C:attention}#2#張{C:tarot}塔羅牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_buffoon_jumbo={ + name="特大丑角禮包", + text={ + "從最多{C:attention}#2#張{C:joker}小丑牌{}中", + "選擇{C:attention}#1#{}張", + }, + }, + p_buffoon_mega={ + name="超級丑角禮包", + text={ + "從最多{C:attention}#2#張{C:joker}小丑牌{}中", + "選擇{C:attention}#1#{}張", + }, + }, + p_buffoon_normal={ + name="丑角禮包", + text={ + "從最多{C:attention}#2#張{C:joker}小丑牌{}中", + "選擇{C:attention}#1#{}張", + }, + }, + p_celestial_jumbo={ + name="超大天外禮包", + text={ + "從最多{C:attention}#2#張{C:planet}行星牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_celestial_mega={ + name="超級天外禮包", + text={ + "從最多{C:attention}#2#張{C:planet}行星牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_celestial_normal={ + name="天外禮包", + text={ + "從最多{C:attention}#2#張{C:planet}行星牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_spectral_jumbo={ + name="特大幻靈禮包", + text={ + "從最多{C:attention}#2#張{C:spectral}幻靈牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_spectral_mega={ + name="超級幻靈禮包", + text={ + "從最多{C:attention}#2#張{C:spectral}幻靈牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_spectral_normal={ + name="幻靈禮包", + text={ + "從最多{C:attention}#2#張{C:spectral}幻靈牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用", + }, + }, + p_standard_jumbo={ + name="特大標準禮包", + text={ + "從最多{C:attention}#2#張{C:attention}遊戲牌{}中", + "選擇{C:attention}#1#{}張", + "到你的牌組", + }, + }, + p_standard_mega={ + name="超級標準禮包", + text={ + "從最多{C:attention}#2#張{C:attention}遊戲牌{}中", + "選擇{C:attention}#1#{}張", + "到你的牌組", + }, + }, + p_standard_normal={ + name="標準禮包", + text={ + "從最多{C:attention}#2#張{C:attention}遊戲牌{}中", + "選擇{C:attention}#1#{}張", + "到你的牌組", + }, + }, + perishable={ + name="非保久", + text={ + "", + "{C:attention}#1#{}回合後遭減益", + "{C:inactive}({C:attention}#2#{C:inactive}剩餘)", + }, + }, + pinned_left={ + name="已釘選", + text={ + "這張小丑牌", + "已釘選在", + "最左邊位置", + }, + }, + playing_card={ + text={ + " {C:light_black}#1#的{V:1}#2# ", + }, + }, + purple_seal={ + name="紫色封蠟章", + text={ + "{C:attention}棄此牌時", + "產生一張{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)", + }, + }, + purple_sticker={ + name="紫色貼紙", + text={ + "使用這張小丑牌", + "贏得{C:attention}紫色", + "{C:attention}賭注{}難度", + }, + }, + red_seal={ + name="紅色封蠟章", + text={ + "重新觸發", + "{C:attention}1{}次這張牌", + }, + }, + red_sticker={ + name="紅色貼紙", + text={ + "使用這張小丑牌", + "贏得{C:attention}紅色", + "{C:attention}賭注{}難度", + }, + }, + remove_negative={ + name="負片", + text={ + "{C:inactive,s:0.9}(從複製牌中移除{C:dark_edition,s:0.9}負片{C:inactive,s:0.9})", + }, + }, + rental={ + name="租賃", + text={ + "回合結束時", + "損失{C:money}$#1#{}", + }, + }, + undiscovered_booster={ + name="未發現", + text={ + "在無種子比賽", + "打開此禮包", + "瞭解功用", + }, + }, + undiscovered_edition={ + name="未發現", + text={ + "在無種子比賽", + "找到此版本", + "瞭解功用", + }, + }, + undiscovered_joker={ + name="未發現", + text={ + "在無種子比賽", + "購買或使用", + "禮券", + "瞭解功用", + }, + }, + undiscovered_planet={ + name="未發現", + text={ + "在無種子比賽", + "購買或使用", + "禮券", + "瞭解功用", + }, + }, + undiscovered_spectral={ + name="未發現", + text={ + "在無種子比賽", + "購買或使用", + "禮券", + "瞭解功用", + }, + }, + undiscovered_tag={ + name="未發現", + text={ + "使用這個標籤在", + "在無種子比賽", + "瞭解功用", + }, + }, + undiscovered_tarot={ + name="未發現", + text={ + "在無種子比賽", + "購買或使用", + "禮券", + "瞭解功用", + }, + }, + undiscovered_voucher={ + name="未發現", + text={ + "在無種子比賽", + "兌換此", + "禮券", + "瞭解功用", + }, + }, + white_sticker={ + name="白色貼紙", + text={ + "使用這張小丑牌", + "贏得{C:attention}白色", + "{C:attention}賭注{}難度", + }, + }, + wip_locked={ + name="已鎖定", + text={ + "正在", + "製作中", + }, + }, + }, + Planet={ + c_ceres={ + name="穀神星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_earth={ + name="地球", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_eris={ + name="鬩神星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_jupiter={ + name="木星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_mars={ + name="火星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_mercury={ + name="水星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_neptune={ + name="海王星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_planet_x={ + name="X行星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_pluto={ + name="冥王星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_saturn={ + name="土星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_uranus={ + name="天王星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + c_venus={ + name="金星", + text={ + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼", + }, + }, + }, + Spectral={ + c_ankh={ + name="安卡", + text={ + "隨機複製一張", + "擁有的{C:attention}小丑牌{}", + "並摧毀其它小丑牌", + }, + }, + c_aura={ + name="光環", + text={ + "新增{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{},", + "或{C:dark_edition}彩色{}效果到", + "{C:attention}1{}張選定的手牌中", + }, + }, + c_black_hole={ + name="黑洞", + text={ + "升級每個", + "{C:legendary,E:1}牌型", + "{C:attention}1{}個等級", + }, + }, + c_cryptid={ + name="傳說動物", + text={ + "選擇{C:attention}1{}張手牌", + "建立{C:attention}#1#{}張", + "選定牌的複製牌", + }, + }, + c_deja_vu={ + name="既視感", + text={ + "新增一個{C:red}紅色封蠟章{}", + "至{C:attention}1{}張", + "選擇的手牌中", + }, + }, + c_ectoplasm={ + name="靈質", + text={ + "新增{C:dark_edition}負片{}效果到", + "一張隨機的{C:attention}小丑牌,", + "{C:red}-1{}的手牌數量", + }, + }, + c_familiar={ + name="熟悉", + text={ + "摧毀隨機{C:attention}1{}張手牌,", + "再新增{C:attention}#1#{}張", + "隨機{C:attention}加強人頭牌{}", + "到手牌中", + }, + }, + c_grim={ + name="無情", + text={ + "摧毀手上隨機{C:attention}1{}張牌", + "再新增{C:attention}#1#{}張", + "{C:attention}加強版A{}", + "到手牌中", + }, + }, + c_hex={ + name="妖術", + text={ + "新增{C:dark_edition}彩色{}效果至", + "一個隨機{C:attention}小丑牌{},", + "並摧毀其它小丑牌", + }, + }, + c_immolate={ + name="犧牲", + text={ + "隨機摧毀", + "{C:attention}#1#{}張手牌", + "獲得{C:money}$#2#", + }, + }, + c_incantation={ + name="咒語", + text={ + "摧毀手上隨機{C:attention}1{}張牌", + "再新增{C:attention}#1#{}張", + "{C:attention}加強版數字牌{}", + "到手牌中", + }, + }, + c_medium={ + name="靈媒", + text={ + "新增一個{C:purple}紫色封蠟章{}", + "至{C:attention}1{}張", + "選擇的手牌中", + }, + }, + c_ouija={ + name="占卜板", + text={ + "轉換手牌中", + "所有牌卡成一種", + "隨機{C:attention}點數", + "{C:red}-1{}手牌數量", + }, + }, + c_sigil={ + name="魔符", + text={ + "轉換手牌中", + "所有牌卡成一種", + "隨機{C:attention}花色", + }, + }, + c_soul={ + name="靈魂", + text={ + "產生一張", + "{C:legendary,E:1}傳奇{}小丑牌", + "{C:inactive}(必須有空位)", + }, + }, + c_talisman={ + name="護身符", + text={ + "新增{C:attention}金色封蠟章{}", + "到選擇的{C:attention}1{}張", + "手牌中", + }, + }, + c_trance={ + name="入迷", + text={ + "新增一個{C:blue}藍色封蠟章{}", + "至{C:attention}1{}張", + "選擇的手牌中", + }, + }, + c_wraith={ + name="幻影", + text={ + "產生一張隨機的", + "{C:red}稀有{C:attention}小丑牌{},", + "設定金額至{C:money}$0", + }, + }, + }, + Stake={ + stake_black={ + name="黑色賭注", + text={ + "商店有{C:attention}永存{}小丑牌", + "{C:inactive,s:0.8}(無法賣出或摧毀)", + "{s:0.8}適用於所有先前的賭注", + }, + }, + stake_blue={ + name="藍色賭注", + text={ + "{C:red}-1{}棄牌次數", + "{s:0.8}適用於所有先前的賭注", + }, + }, + stake_gold={ + name="金色賭注", + text={ + "商店可出現{C:attention}租賃{}小丑", + "{C:inactive,s:0.8}(每回合花費{C:money,s:0.8}$3{C:inactive,s:0.8})", + "{s:0.8}適用於所有先前的賭注", + }, + }, + stake_green={ + name="綠色賭注", + text={ + "每個{C:attention}底注所需分數", + "以更快的尺度提高", + "{s:0.8}適用於所有先前的賭注", + }, + }, + stake_orange={ + name="橘色賭注", + text={ + "商店可出現{C:attention}非保久{}小丑", + "{C:inactive,s:0.8}(5回合後遭減益)", + "{s:0.8}適用於所有先前的賭注", + }, + }, + stake_purple={ + name="紫色賭注", + text={ + "每個{C:attention}底注所需分數", + "以更快的尺度提高", + "{s:0.8}適用於所有先前的賭注", + }, + }, + stake_red={ + name="紅色賭注", + text={ + "{C:attention}小盲注{}", + "無獎勵金", + "{s:0.8}適用於所有先前的賭注", + }, + }, + stake_white={ + name="白色賭注", + text={ + "基本難度", + }, + }, + }, + Tag={ + tag_boss={ + name="Boss標籤", + text={ + "重摋", + "{C:attention}Boss盲注", + }, + }, + tag_buffoon={ + name="丑角標籤", + text={ + "獲得一個免費的", + "{C:attention}丑角禮包", + }, + }, + tag_charm={ + name="魔力標籤", + text={ + "獲得一個免費的", + "{C:tarot}超級奧秘禮包", + }, + }, + tag_coupon={ + name="優惠券標籤", + text={ + "下一家店的", + "初始牌卡和擴充包", + "均為免費", + }, + }, + tag_d_six={ + name="D6標籤", + text={ + "下一次商店重摋", + "起價為{C:money}$0", + }, + }, + tag_double={ + name="雙倍標籤", + text={ + "複製下一個", + "選定的{C:attention}標籤{}", + "{s:0.8,C:attention}雙倍標籤{s:0.8}除外", + }, + }, + tag_economy={ + name="經濟標籤", + text={ + "金錢加倍", + "{C:inactive}(最高{C:money}$#1#{C:inactive})", + }, + }, + tag_ethereal={ + name="永存標籤", + text={ + "獲得一個免費的", + "{C:spectral}幻靈禮包", + }, + }, + tag_foil={ + name="銀箔標籤", + text={ + "下個基本版商店", + "小丑免費並", + "變為{C:dark_edition}銀箔", + }, + }, + tag_garbage={ + name="垃圾標籤", + text={ + "本賽局每一未使用的{C:red}棄牌次數{}", + "得到{C:money}$#1#{}", + "{C:inactive}(將得到{C:money}$#2#{C:inactive})", + }, + }, + tag_handy={ + name="方便標籤", + text={ + "本賽局每打出一次{C:blue}手牌{}", + "獲得{C:money}$#1#{}", + "{C:inactive}(將得到{C:money}$#2#{C:inactive})", + }, + }, + tag_holo={ + name="全像攝影標籤", + text={ + "下個基本版商店", + "小丑免費並", + "變為{C:dark_edition}全像攝影", + }, + }, + tag_investment={ + name="投資標籤", + text={ + "擊敗", + "Boss盲注以後,", + "獲得{C:money}$#1#", + }, + }, + tag_juggle={ + name="雜耍標籤", + text={ + "下一回合", + "{C:attention}+#1#{}手牌數量", + }, + }, + tag_meteor={ + name="流星標籤", + text={ + "獲得一個免費的", + "{C:planet}超級天外禮包", + }, + }, + tag_negative={ + name="負片標籤", + text={ + "下個基本版商店", + "小丑免費並", + "變為{C:dark_edition}負片", + }, + }, + tag_orbital={ + name="軌道標籤", + text={ + "升級{C:attention}#1#", + "{C:attention}#2#個等級", + }, + }, + tag_polychrome={ + name="彩色標籤", + text={ + "下個基本版商店", + "小丑免費並", + "變為{C:dark_edition}彩色", + }, + }, + tag_rare={ + name="稀有標籤", + text={ + "商店有一個", + "免費的{C:red}稀有小丑", + }, + }, + tag_skip={ + name="速度標籤", + text={ + "本賽局中每跳過", + "一次盲注,獲得{C:money}$#1#{}", + "{C:inactive}(會給{C:money}$#2#{C:inactive})", + }, + }, + tag_standard={ + name="標準標籤", + text={ + "獲得一個免費的", + "{C:attention}超級標準禮包", + }, + }, + tag_top_up={ + name="儲值標籤", + text={ + "產生最多{C:attention}#1#張", + "{C:blue}一般{}小丑牌", + "{C:inactive}(必須有空位)", + }, + }, + tag_uncommon={ + name="罕見標籤", + text={ + "商店有一個", + "免費的{C:green}罕見小丑", + }, + }, + tag_voucher={ + name="禮券標籤", + text={ + "增加一張{C:voucher}禮券", + "到下一間商店", + }, + }, + }, + Tarot={ + c_chariot={ + name="戰車", + text={ + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#", + }, + }, + c_death={ + name="死神", + text={ + "選擇{C:attention}#1#{}張牌卡,", + "將{C:attention}左邊{}的牌卡", + "轉換至{C:attention}右邊{}的牌卡", + "{C:inactive}(拉動即可重新排列)", + }, + }, + c_devil={ + name="惡魔", + text={ + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#", + }, + }, + c_emperor={ + name="皇帝", + text={ + "產生最多{C:attention}#1#張", + "任意{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)", + }, + }, + c_empress={ + name="皇后", + text={ + "加強{C:attention}#1#{}張", + "所選的牌卡至", + "{C:attention}#2#", + }, + }, + c_fool={ + name="愚者", + text={ + "產生本賽局中", + "上一張使用的", + "{C:tarot}塔羅牌{}或{C:planet}行星牌{}", + "{s:0.8,C:tarot}愚者牌{s:0.8}除外", + }, + }, + c_hanged_man={ + name="吊人", + text={ + "最多可摧毀", + "{C:attention}#1#{}張選定的牌", + }, + }, + c_heirophant={ + name="教皇", + text={ + "加強{C:attention}#1#{}張", + "所選的牌卡成為", + "{C:attention}#2#", + }, + }, + c_hermit={ + name="隱士", + text={ + "金錢加倍", + "{C:inactive}(最高{C:money}$#1#{C:inactive})", + }, + }, + c_high_priestess={ + name="女祭司", + text={ + "產生最多{C:attention}#1#張", + "隨機{C:planet}行星牌{}", + "{C:inactive}(必須有空位)", + }, + }, + c_judgement={ + name="審判", + text={ + "產生一張隨機的", + "{C:attention}小丑牌{}", + "{C:inactive}(必須有空位)", + }, + }, + c_justice={ + name="正義", + text={ + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#", + }, + }, + c_lovers={ + name="戀人", + text={ + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#", + }, + }, + c_magician={ + name="魔術師", + text={ + "加強{C:attention}#1#{}張", + "所選的牌卡至", + "{C:attention}#2#", + }, + }, + c_moon={ + name="月亮", + text={ + "最多可轉換", + "{C:attention}#1#{}張選定的牌", + "至{V:1}#2#{}", + }, + }, + c_star={ + name="星星", + text={ + "最多可轉換", + "{C:attention}#1#{}張選定的牌", + "至{V:1}#2#{}", + }, + }, + c_strength={ + name="力量", + text={ + "將最多{C:attention}#1#{}張", + "選定的牌卡", + "點數提高{C:attention}1", + }, + }, + c_sun={ + name="太陽", + text={ + "最多可轉換", + "{C:attention}#1#{}張選定的牌", + "至{V:1}#2#{}", + }, + }, + c_temperance={ + name="節制", + text={ + "給出目前手上", + "所有小丑牌卡", + "的總賣價{C:inactive}(最高{C:money}$#1#{C:inactive})", + "{C:inactive}(目前為{C:money}$#2#{C:inactive})", + }, + }, + c_tower={ + name="高塔", + text={ + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#", + }, + }, + c_wheel_of_fortune={ + name="幸運之輪", + text={ + "{C:green}#1#/#2#{}的機率會增加", + "{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{}和", + "{C:dark_edition}彩色{}版本", + "至隨機一張{C:attention}小丑牌", + }, + }, + c_world={ + name="世界", + text={ + "最多可轉換", + "{C:attention}#1#{}張選定的牌", + "至{V:1}#2#{}", + }, + }, + }, + Voucher={ + v_antimatter={ + name="反物質", + text={ + "{C:dark_edition}+1{}小丑牌欄位", + }, + unlock={ + "兌換{C:voucher}空白{}禮券", + "總計{C:attention}#1#{}次", + "{C:inactive}(#2#)", + }, + }, + v_blank={ + name="空白", + text={ + "{C:inactive}有作用嗎?", + }, + }, + v_clearance_sale={ + name="清倉拍賣", + text={ + "店內的所有牌卡和禮包", + "費用減{C:attention}#1#%{}", + }, + }, + v_crystal_ball={ + name="水晶球", + text={ + "{C:attention}+1{}消耗牌欄位", + }, + }, + v_directors_cut={ + name="導演佳作", + text={ + "重摋Boss盲注", + "每個底注重摋{C:attention}1{}次,", + "每次{C:money}$#1#{}", + }, + }, + v_glow_up={ + name="閃亮亮", + text={ + "{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{}和", + "{C:dark_edition}彩色{}牌卡", + "出現頻率{C:attention}X#1#倍", + }, + unlock={ + "至少擁有{C:attention}#1#{}張", + "{C:attention}小丑牌{}有", + "{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{}或", + "{C:dark_edition}彩色{}版本", + }, + }, + v_grabber={ + name="搶奪者", + text={ + "每回合", + "永久增加", + "{C:blue}+#1#{}次出牌", + }, + }, + v_hieroglyph={ + name="象形文字", + text={ + "每回合", + "{C:attention}-#1#{}底注,", + "{C:blue}-#1#{}出牌次數", + }, + }, + v_hone={ + name="磨刀石", + text={ + "{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{}和", + "{C:dark_edition}彩色{}牌卡", + "出現頻率{C:attention}X#1#倍", + }, + }, + v_illusion={ + name="幻想", + text={ + "在商店內的{C:attention}遊戲牌{}", + "可能是{C:enhanced}加強牌{}、{C:dark_edition}不同版本{}", + "或/及蓋有{C:attention}封蠟章{}", + }, + unlock={ + "在商店", + "購買總共", + "{C:attention}#1#{}張遊戲牌", + "{C:inactive}(#2#)", + }, + }, + v_liquidation={ + name="清算", + text={ + "店內的所有牌卡和禮包", + "皆享{C:attention}#1#%{}折扣優惠 ", + }, + unlock={ + "在一場比賽中", + "至少兌換", + "{C:attention}#1#{C:voucher}張禮券{}", + }, + }, + v_magic_trick={ + name="魔術", + text={ + "{C:attention}商店{}裡面", + "有{C:attention}遊戲牌{}", + "可供選購", + }, + }, + v_money_tree={ + name="金錢樹", + text={ + "將每回合收益", + "利息上限提升至", + "{C:money}$#1#{}", + }, + unlock={ + "連續{C:attention}#1#{}回合", + "將回合收益", + "利息提升到最高", + "{C:inactive}(#2#)", + }, + }, + v_nacho_tong={ + name="唐納喬", + text={ + "每回合", + "永久增加", + "{C:blue}+#1#{}次出牌", + }, + unlock={ + "打出總共", + "{C:attention}#1#{}張牌", + "{C:inactive}(#2#)", + }, + }, + v_observatory={ + name="天文台", + text={ + "在您{C:attention}消耗牌欄位{}中", + "的{C:planet}行星牌{}", + "為該特定{C:attention}手牌類型", + "給予{X:red,C:white}X#1#{}倍數", + }, + unlock={ + "從任一{C:planet}天外禮包中", + "使用總計{C:attention}#1#張", + "{C:planet}行星牌{}", + "{C:inactive}(#2#)", + }, + }, + v_omen_globe={ + name="預兆地球儀", + text={ + "{C:spectral}幻靈牌{}", + "可能出現在任何", + "{C:attention}奧秘禮包中", + }, + unlock={ + "從任一{C:tarot}奧秘禮包{}中", + "使用總計{C:attention}#1#張", + "{C:tarot}塔羅牌{}", + "{C:inactive}(#2#)", + }, + }, + v_overstock_norm={ + name="存貨過多", + text={ + "店內牌卡欄位", + "{C:attention}+1{}", + }, + }, + v_overstock_plus={ + name="存貨過多增強版", + text={ + "店內牌卡欄位", + "{C:attention}+1{}", + }, + unlock={ + "在店內花費總計", + "{C:money}$#1#{}", + "{C:inactive}($#2#)", + }, + }, + v_paint_brush={ + name="油漆刷", + text={ + "{C:attention}+#1#{}手牌數量", + }, + }, + v_palette={ + name="調色板", + text={ + "{C:attention}+#1#{}手牌數量", + }, + unlock={ + "縮減手牌數量", + "至{C:attention}#1#{}張", + }, + }, + v_petroglyph={ + name="岩石雕刻", + text={ + "每回合", + "{C:attention}-#1#{}底注,", + "{C:red}-#1#{}棄牌", + }, + unlock={ + "達到底注", + "級別{E:1,C:attention}#1#", + }, + }, + v_planet_merchant={ + name="行星牌商家", + text={ + "商店內出現", + "{C:planet}行星牌{}的頻率", + "{C:attention}X#1#{}倍", + }, + }, + v_planet_tycoon={ + name="行星大亨", + text={ + "商店內出現", + "{C:planet}行星牌{}的頻率", + "{C:attention}X#1#{}倍", + }, + unlock={ + "在商店", + "購買總共", + "{C:attention}#1#{}張{C:planet}行星牌{}", + "{C:inactive}(#2#)", + }, + }, + v_recyclomancy={ + name="回收魔法", + text={ + "每一回合", + "永久{C:red}+#1#{}次", + "棄牌", + }, + unlock={ + "棄牌總數達到", + "{C:attention}#1#{}張牌", + "{C:inactive}(#2#)", + }, + }, + v_reroll_glut={ + name="重摋加強版", + text={ + "重摋費用", + "減少{C:money}$#1#{}", + }, + unlock={ + "商店重摋", + "總計{C:attention}#1#{}次", + "{C:inactive}(#2#)", + }, + }, + v_reroll_surplus={ + name="多次重摋", + text={ + "重摋費用", + "減少{C:money}$#1#{}", + }, + }, + v_retcon={ + name="修訂佳作", + text={ + "重摋Boss盲注", + "{C:attention}無限次{}", + "每次花費{C:money}$#1#{}", + }, + unlock={ + "發現", + "{C:attention}#1#{}個盲注", + }, + }, + v_seed_money={ + name="種子資金", + text={ + "將每回合收益", + "利息上限提升至", + "{C:money}$#1#{}", + }, + }, + v_tarot_merchant={ + name="塔羅牌商家", + text={ + "商店內出現", + "{C:tarot}塔羅牌{}的頻率", + "{C:attention}X#1#{}倍", + }, + }, + v_tarot_tycoon={ + name="塔羅大亨", + text={ + "商店內出現", + "{C:tarot}塔羅牌{}的頻率", + "{C:attention}X#1#{}倍", + }, + unlock={ + "在商店", + "購買總共", + "{C:attention}#1#張{C:tarot}塔羅牌{}", + "{C:inactive}(#2#)", + }, + }, + v_telescope={ + name="望遠鏡", + text={ + "{C:attention}天外禮包{}裡面", + "總是會有", + "你最常使用{C:attention}牌型{}", + "的{C:planet}行星牌{}", + }, + }, + v_wasteful={ + name="浪費", + text={ + "每一回合", + "永久{C:red}+#1#{}次", + "棄牌", + }, + }, + }, + }, + misc={ + achievement_descriptions={ + _100000k="在單一手牌中獲得100,000,000籌碼", + _1000k="在單一手牌中獲得1,000,000籌碼", + _10k="在單一手牌中獲得10,000籌碼", + ante_up="達到底注4", + ante_upper="達到底注8", + astronomy="找到所有行星牌", + big_hands="牌組中擁有80張以上牌卡", + card_discarder="丟棄至少2500張牌", + card_player="打出至少2500張牌", + cartomancy="找到所有塔羅牌", + clairvoyance="找到所有幻靈牌", + completionist="找到100%個人收藏牌卡", + completionist_plus="在金色賭注難度中,使用每副牌組贏得勝利", + completionist_plus_plus="每張小丑牌都獲得金色貼紙", + extreme_couponer="找到所有禮券", + flushed="用5張萬能牌打出一次同花", + heads_up="贏得比賽", + high_stakes="至少在金色賭注難度贏得比賽", + legendary="找到傳奇小丑", + low_stakes="至少在紅色賭注難度贏得比賽", + mid_stakes="至少在藍色賭注難度贏得比賽", + nest_egg="在單一回合中擁有$400以上", + retrograde="將任一手牌提升至等級10", + roi="在底注4的遊戲中購買5禮券", + royale="打出同花大順", + rule_bender="完成任一挑戰賽", + rule_breaker="完成所有挑戰賽", + shattered="在單一手牌中破壞2玻璃牌", + speedrunner="在12回合以內贏得比賽", + tiny_hands="將你的牌組縮減至20張或以下", + you_get_what_you_get="在不使用商店重摋的情況下贏得比賽", + }, + achievement_names={ + _100000k="100,000K", + _1000k="1,000K", + _10k="10K", + ante_up="底注上升!", + ante_upper="底注再上升!", + astronomy="天文學", + big_hands="大手牌", + card_discarder="棄牌者", + card_player="牌卡玩家", + cartomancy="卜卦", + clairvoyance="未卜先知", + completionist="完美主義者", + completionist_plus="完美主義者+", + completionist_plus_plus="完美主義者++", + extreme_couponer="精打細算者", + flushed="同花", + heads_up="注意", + high_stakes="高賭注", + legendary="傳奇", + low_stakes="低賭注", + mid_stakes="中賭注", + nest_egg="儲備金", + retrograde="逆行", + roi="投報率", + royale="王室", + rule_bender="規則突破者", + rule_breaker="規則破壞者", + shattered="粉碎", + speedrunner="快速破關者", + tiny_hands="小手牌", + you_get_what_you_get="接受現況", + }, + blind_states={ + Current="目前", + Defeated="已被擊敗", + Select="選擇", + Selected="已選擇", + Skipped="跳過", + Upcoming="下一回合", + }, + challenge_names={ + c_blast_off_1="一飛沖天", + c_bram_poker_1="布蘭撲克", + c_city_1="一刻鐘城市", + c_cruelty_1="殘忍無情", + c_double_nothing_1="孤注一擲", + c_five_card_1="五張換牌", + c_fragile_1="脆弱不堪", + c_golden_needle_1="黃金針", + c_inflation_1="通貨膨脹", + c_jokerless_1="小丑不再", + c_knife_1="刀鋒之上", + c_luxury_1="奢侈稅", + c_mad_world_1="瘋狂世界", + c_medusa_1="梅杜莎", + c_monolith_1="巨石柱", + c_non_perishable_1="保久物資", + c_omelette_1="煎蛋捲", + c_rich_1="富者愈富", + c_typecast_1="定型角色", + c_xray_1="透視眼", + }, + collabs={ + Clubs={ + ["1"]="預設", + ["2"]="Vampire Survivors", + ["3"]="Slay the Spire", + ["4"]="Potion Craft", + ["5"]="Warframe", + ["6"]="Vault-Tec", + ["7"]="Dead by Daylight", + }, + Diamonds={ + ["1"]="預設", + ["2"]="潛水員戴夫", + ["3"]="Stardew Valley", + ["4"]="Enter the Gungeon", + ["5"]="1000xRESIST", + ["6"]="Civilization VII", + ["7"]="Rust", + }, + Hearts={ + ["1"]="預設", + ["2"]="Among Us", + ["3"]="The Binding of Isaac", + ["4"]="進擊羔羊傳說", + ["5"]="Divinity Original Sin 2", + ["6"]="Critical Role", + ["7"]="Bugsnax", + }, + Spades={ + ["1"]="預設", + ["2"]="The Witcher", + ["3"]="電馭叛客 2077", + ["4"]="Shovel Knight", + ["5"]="饑荒", + ["6"]="Assassin's Creed", + ["7"]="Slay the Princess", + }, + }, + dictionary={ + ["$"]="$", + b_FAQ="常見問題", + b_and_use="和使用", + b_back="返回", + b_blinds="盲注", + b_booster_packs="擴充包", + b_buy="購買", + b_cash_out="兌現", + b_challenges="挑戰", + b_collection="收藏", + b_collection_cap="收藏", + b_continue="繼續", + b_copy="複製", + b_copy_seed="複製種子", + b_create_profile="建立個人檔案", + b_credits="製作人員", + b_current_profile="目前資料", + b_customize_deck="定製牌組", + b_deck="牌組", + b_decks="牌組", + b_delete_profile="刪除個人檔案", + b_discard="棄牌", + b_editions="版本", + b_endless="無盡模式", + b_enhanced_cards="加強牌", + b_full_deck="完整牌組", + b_high_contrast_cards="高對比牌", + b_how_to_play="怎麼玩", + b_imagery="影像", + b_jokers="小丑", + b_load_profile="載入個人檔案", + b_main_menu="主選單", + b_music="音樂", + b_new_challenge="開始新挑戰", + b_new_run="新一回合", + b_next="下一個", + b_next_round_1="下一個", + b_next_round_2="回合", + b_open="打開", + b_options="選項", + b_options_cap="選項", + b_planet_cards="行星牌", + b_play_cap="開始遊戲", + b_play_hand="出牌", + b_playbalatro="造訪playbalatro.com", + b_poker_hands="手牌", + b_quit_cap="退出", + b_redeem="兌換", + b_reduced_motion="減少動作", + b_remaining="剩下", + b_reroll_boss="重摋Boss盲注", + b_reset_profile="重設個人檔案", + b_restrictions="限制", + b_retry="重试", + b_rules="規則", + b_run_info_1="比賽", + b_run_info_2="資訊", + b_seals="封蠟章", + b_seed="種子", + b_select="選擇", + b_sell="賣出", + b_set_CRT="CRT", + b_set_CRT_bloom="模擬CRT螢光效果", + b_set_apply="套用", + b_set_audio="音訊", + b_set_crash_reports="當機報告", + b_set_game="遊戲", + b_set_game_vol="遊戲音量", + b_set_gamespeed="遊戲速度", + b_set_graphics="圖像", + b_set_master_vol="主音量", + b_set_monitor="顯示螢幕", + b_set_music_vol="音樂音量", + b_set_pixel_smoothing="像素圖像平滑", + b_set_play_discard_pos="出牌/棄牌按鈕位置", + b_set_rumble="控制器震動", + b_set_screenshake="螢幕抖動", + b_set_shadows="陰影", + b_set_vibration="震動", + b_set_video="影像", + b_set_windowmode="視窗模式", + b_settings="設定", + b_skip="跳過", + b_skip_blind="跳過盲注", + b_skip_reward="跳過獎勵", + b_sort_hand="理牌", + b_sounds="聲音", + b_spectral_cards="幻靈牌", + b_stake="賭注", + b_start_new_run="開始新的一局", + b_stat_consumables="消耗牌", + b_stat_jokers="小丑", + b_stat_planets="行星牌", + b_stat_spectrals="幻靈牌", + b_stat_tarots="塔羅牌", + b_stat_vouchers="禮券", + b_stats="統計數據", + b_tags="標籤", + b_tarot_cards="塔羅牌", + b_unlock_all="解鎖全部", + b_use="使用", + b_vouchers="禮券", + b_wishlist="加入Steam願望清單", + k_aces="A", + k_achievement="成就", + k_achievements_disabled="禁用成就", + k_active="使用中", + k_active_ex="使用中!", + k_again_ex="再一次!", + k_all_hands="所有手牌", + k_also_applied="也適用於", + k_ante="底注", + k_ante_cap="底注", + k_arcana_pack="奧秘禮包", + k_balanced="已平衡", + k_banned_cards="禁卡", + k_banned_tags="禁標籤", + k_base_cap="基本", + k_base_cards="基本牌卡", + k_best_hand="最好的一手", + k_booster="擴充", + k_buffoon_pack="丑角禮包", + k_cap_consumables="消耗牌", + k_card_stats="牌卡統計數據", + k_celestial_pack="天外禮包", + k_challenge_mode="挑戰模式", + k_challenges="挑戰", + k_choose="選擇", + k_collection="收藏", + k_common="一般", + k_compatible="相容", + k_copied_ex="已複製!", + k_custom_rules="自訂規則", + k_daily_run="每日比賽", + k_debuffed="遭減益", + k_deck="牌組", + k_deck_stake_wins="牌組賭注完成度", + k_defeated_by="擊敗", + k_demo_version_ex="試玩版", + k_disabled_ex="已失效!", + k_drank_ex="大喝一口!", + k_duplicated_ex="複製!", + k_dwarf_planet="矮行星", + k_eaten_ex="吞噬!", + k_edition="版本", + k_effective="有效", + k_empty_caps="空", + k_enter_name="輸入名稱", + k_enter_seed="進入種子", + k_enter_text="輸入文字", + k_eroded_ex="侵蝕!", + k_extinct_ex="消滅了!", + k_face_cards="人頭牌", + k_game_modifiers="遊戲修改者", + k_gold="金色", + k_high_score_ex="高分!", + k_hud_discards="棄牌", + k_hud_hands="出牌", + k_incompatible="不相容", + k_joker="小丑", + k_joker_stickers="小丑貼紙", + k_jokers_cap="小丑", + k_legendary="傳奇", + k_level_prefix="等級", + k_level_up_ex="升級!", + k_locked="已鎖定", + k_lower_score="分數", + k_lvl="等級", + k_melted_ex="已融化!", + k_money="資金", + k_mult="倍數", + k_no_other_jokers="沒有其他小丑牌!", + k_no_reward="無獎勵", + k_no_room_ex="沒有空間!", + k_no_space_ex="沒有空間!", + k_none="無", + k_nope_ex="不!", + k_not_allowed_ex="禁止!", + k_not_discovered="未發現", + k_numbered_cards="數字牌", + k_or="或", + k_other="其他", + k_page="頁面", + k_planet="行星牌", + k_planet_q="行星?", + k_playing_as="角色名稱", + k_plus_joker="+1小丑", + k_plus_planet="+1行星牌", + k_plus_spectral="+1幻靈牌", + k_plus_stone="+1石頭牌", + k_plus_tarot="+1塔羅牌", + k_poker_hand="牌型", + k_profile="個人檔案", + k_progress="進度", + k_rank="點數", + k_rare="稀有", + k_redeemed_ex="已兌換!", + k_reroll="重摋", + k_reset="重設", + k_reward="獎勵", + k_round="回合", + k_safe_ex="安全!", + k_saved_ex="已儲存!", + k_seed="種子", + k_seeded_run="種子比賽", + k_skipped_cap="已跳過", + k_spectral="幻靈", + k_spectral_pack="幻靈禮包", + k_stake="賭注", + k_stake_level="賭注等級", + k_standard_pack="標準禮包", + k_suit="花色", + k_swapped_ex="已切換!", + k_tarot="塔羅牌", + k_trophies_disabled="獎盃停用", + k_trophy="獎盃", + k_uncommon="罕見", + k_undisovered="未發現", + k_unknown="?????", + k_unlocked_ex="已解鎖!", + k_upgrade_ex="升級!", + k_val_up="提高價值!", + k_view="檢視", + k_voucher="禮券", + k_vouchers_cap="禮券", + k_wins="獲勝數", + k_x_base="X基本", + ml_bloom_opt={ + "關閉", + "開啟", + }, + ml_buy_and_use_target={ + "購買", + "和使用", + }, + ml_buy_target={ + "購買", + }, + ml_card_stats={ + "牌卡", + "統計數據", + }, + ml_controller_required={ + "你需要遊戲控制器才能遊玩。", + "請連線至控制器以繼續。", + }, + ml_crash_report_info={ + "當機報告會送給開發商", + "以協助減少未來的問題。系統並不會", + "送出可識別身分的資訊或個人資料。", + }, + ml_demo_thanks_message={ + "不妨到", + "Steam將Balatro加入願望清單", + "並在playbalatro.com訂閱電子報", + }, + ml_disabled_seed={ + "全部解鎖及", + "發現均被禁用", + }, + ml_edition_seal_enhancement_explanation={ + "每張遊戲牌可能會有", + "加強、版本與封蠟章版本", + }, + ml_eternal={ + "永恆", + "不能賣出", + "或催毀", + }, + ml_gold_seal_desc={ + "金色封蠟章", + "重返手上", + "白貼紙時", + }, + ml_offline_message={ + "此裝置為離線狀態。", + "目前的存檔可能已過時。", + }, + ml_open_target={ + "打開", + }, + ml_paste_seed={ + "貼上", + "種子", + }, + ml_play_discard_pos_opt={ + "棄牌/出牌", + "出牌/棄牌", + }, + ml_redeem_target={ + "兌換", + }, + ml_sell_target={ + "賣出", + }, + ml_shadow_opt={ + "開啟", + "關閉", + }, + ml_smoothing_opt={ + "關閉", + "開啟", + }, + ml_unlock_all_explanation={ + "警告!解鎖完整收藏", + "將禁用此個人檔案的成就!", + }, + ml_unlock_all_trophies={ + "警告!解鎖完整收藏", + "將停用此個人檔案的獎盃!", + }, + ml_vsync_opt={ + "垂直同步開啟", + "垂直同步關閉", + }, + ml_windowmode_opt={ + "視窗模式", + "全螢幕模式", + "無邊界模式", + }, + ph_1_level="+1級", + ph_4_7_of_clubs="四張梅花7", + ph_alert_debuff_confirm="再按一次「出牌」確認", + ph_all_poker_hand="所有手牌", + ph_blind_reward="獎勵: ", + ph_blind_score_at_least="至少得分", + ph_boss_disabled="Boss盲注限制條件失效", + ph_choose_blind_1="選擇您的", + ph_choose_blind_2="下一個盲注", + ph_click_confirm="再按一下即可確認", + ph_deck_preview_effective="因小丑、盲注和卡牌增強而產生的有效總數量", + ph_deck_preview_stones="石頭", + ph_defeat_the_boss="戰勝Boss盲注", + ph_defeat_this_blind_1="戰勝盲注", + ph_defeat_this_blind_2="發現它", + ph_demo_thanks_1="感謝您體驗", + ph_demo_thanks_2="BALATRO試玩版", + ph_display_stickers="在一局比賽中展示賭注貼紙", + ph_game_over="遊戲結束", + ph_improve_run="順順手氣!", + ph_most_played="{最常出的牌型}", + ph_mr_bones="已被骷髏頭救出", + ph_no_boss_active="無使用中的好牌", + ph_no_vouchers="本賽局沒有兌換禮券", + ph_score_at_least="分數達到", + ph_score_cards_discarded="丟棄的牌", + ph_score_cards_played="打出的牌", + ph_score_cards_purchased="已選購的牌", + ph_score_furthest_ante="底注", + ph_score_furthest_round="回合", + ph_score_hand="最好的一手", + ph_score_new_collection="新發現", + ph_score_poker_hand="玩得最多的一局", + ph_score_times_rerolled="重摋次數", + ph_select_challenge="選擇一個挑戰", + ph_sneak_peek="先睹為快", + ph_stat_consumable="這張牌卡使用過的次數", + ph_stat_joker="這張牌卡總共完成的回合數", + ph_stat_voucher="這張禮券兌換過的次數", + ph_unscored_hand="出牌將不會得分", + ph_up_ante_1="提高底注", + ph_up_ante_2="提高所有盲注", + ph_up_ante_3="重洗盲注", + ph_vouchers_redeemed="本賽局兌換的禮券", + ph_you_win="你獲勝了!", + ph_you_win_demo="你在試玩版中獲勝了!", + }, + high_scores={ + boss_streak="最多連續好牌", + collection="收藏", + current_streak="", + furthest_ante="最高底注", + furthest_round="最高回合", + hand="最好的一手", + most_money="最多資金", + poker_hand="最常出的牌", + win_streak="至佳連贏", + }, + labels={ + blue_seal="藍色封蠟章", + common="一般", + eternal="永恆", + foil="銀箔", + gold_seal="金色封蠟章", + holographic="全像攝影", + legendary="傳奇", + locked="已鎖定", + negative="負片", + perishable="非保久", + pinned_left="已釘選", + planet="行星牌", + pluto_planet="矮行星", + polychrome="彩色", + purple_seal="紫色封蠟章", + rare="稀有", + red_seal="紅色封蠟章", + rental="租賃", + tarot="塔羅牌", + uncommon="罕見", + voucher="禮券", + }, + poker_hand_descriptions={ + ["Five of a Kind"]={ + "5張相同點數的牌", + }, + Flush={ + "5張相同花色的牌", + }, + ["Flush Five"]={ + "5張相同點數與花色的牌", + }, + ["Flush House"]={ + "三條和對子與", + "所有牌分享相同花色", + }, + ["Four of a Kind"]={ + "4張牌一樣點數。可以與", + "其他1張未計分的牌一起出", + }, + ["Full House"]={ + "三條和對子", + }, + ["High Card"]={ + "如果玩的手牌不屬於上述任一種,", + "只有最高點數的牌可以計入分數", + }, + Pair={ + "2張相同點數的牌。可以與", + "最多其他3張未計分的牌卡一起出", + }, + ["Royal Flush"]={ + "5張牌一連(連續數字)且", + "所有牌分享相同花色", + }, + Straight={ + "5張牌一連(連續數字)", + }, + ["Straight Flush"]={ + "5張牌一連(連續數字)且", + "所有牌分享相同花色", + }, + ["Three of a Kind"]={ + "3張牌相同點數的牌。可以與", + "其他2張未計分的牌卡一起出", + }, + ["Two Pair"]={ + "兩對不同點數的牌。可以與", + "其他1張未計分的牌一起出", + }, + }, + poker_hands={ + ["Five of a Kind"]="五條", + Flush="同花", + ["Flush Five"]="同花五條", + ["Flush House"]="同花葫蘆", + ["Four of a Kind"]="四條", + ["Full House"]="葫蘆", + ["High Card"]="高牌", + Pair="對子", + ["Royal Flush"]="皇家同花順", + Straight="順子", + ["Straight Flush"]="同花順", + ["Three of a Kind"]="三條", + ["Two Pair"]="兩對", + }, + quips={ + dq_1={ + "唉!我希望", + "你有什麼妙計", + "能應付這", + "最後的挑戰!", + }, + lq_1={ + "感覺", + "我們更適合玩", + "Go Fish……", + }, + lq_10={ + "真是糗到不行!", + }, + lq_2={ + "我們放棄得", + "有點輕易欸!", + }, + lq_3={ + "是時候該", + "重新洗牌", + "然後重新開局了!", + }, + lq_4={ + "人家不是常說那句話嗎?", + "就是", + "贏的永遠是莊家!", + }, + lq_5={ + "看來我們", + "找到誰才是", + "真正的「小丑」了!", + }, + lq_6={ + "天啊,難道", + "你也是在吹牛?", + }, + lq_7={ + "沒想到", + "我們讓人看笑話了!", + }, + lq_8={ + "這種情況,", + "只要有手的人都想", + "把眼睛遮起來吧!", + }, + lq_9={ + "我確實是個", + "傻瓜,但你的", + "藉口是什麼?", + }, + wq_1={ + "你的表現超出色!", + }, + wq_2={ + "你超讚", + "很棒呢!", + }, + wq_3={ + "看來", + "你不是在吹牛!", + }, + wq_4={ + "這些籌碼", + "要是都是真錢", + "該有多好啊……", + }, + wq_5={ + "看來我已經", + "把你教得很好嘛!", + }, + wq_6={ + "你的決策", + "非常明智!", + }, + wq_7={ + "幸好", + "我不打賭", + "不是你!", + }, + }, + ranks={ + ["10"]="10", + ["2"]="2", + ["3"]="3", + ["4"]="4", + ["5"]="5", + ["6"]="6", + ["7"]="7", + ["8"]="8", + ["9"]="9", + Ace="A", + Jack="J", + King="K", + Queen="Q", + }, + suits_plural={ + Clubs="梅花", + Diamonds="方塊", + Hearts="紅心", + Spades="黑桃", + }, + suits_singular={ + Clubs="梅花", + Diamonds="方塊", + Hearts="紅心", + Spades="黑桃", + }, + tutorial={ + bb_1={ + "選擇{C:attention}大盲注", + "將賺到現金", + }, + bb_2={ + "您也可以選擇{C:attention}跳過", + "取得{C:attention}標籤{}!每個", + "{C:attention}標籤{}都有獨特的效果", + }, + bb_3={ + "不過請小心", + "{C:attention}Boss盲注{}。每個Boss盲注", + "都有著限制條件", + "您必須要有策略來應對。", + }, + bb_4={ + "如果您贏了,", + "{C:attention}底注{}就會增加,然後所有", + "{C:attention}盲注{}都會變難", + }, + bb_5={ + "打敗{C:attention}底注{}#1#就能獲勝", + "現在做出您的選擇吧!", + }, + fh_1={ + "賺到籌碼,全靠", + "打出{C:attention}手牌", + }, + fh_2={ + "每次打出{C:attention}手牌{}都", + "能賺取基本{C:blue}籌碼", + "再透過{C:red}倍數加成", + }, + fh_3={ + "請前往{C:attention}比賽資訊{}區塊", + "查看你的{C:attention}牌型", + "以及其他跟目前比賽", + "有關的資訊", + }, + fh_4={ + "牌卡也可賺取", + "{C:blue}籌碼{},將滑鼠", + "移到卡上即可查看!", + }, + fh_4_touch={ + "牌卡也可賺取", + "{C:blue}籌碼{},將滑鼠", + "在卡上長按即可查看!", + }, + fh_5={ + "現在,最多", + "選擇{C:attention}5{}張牌", + "並按下{C:blue}「出牌」", + }, + fh_5_touch={ + "現在,最多", + "點按{C:attention}5{}張牌", + "並按下{C:blue}「出牌」", + }, + fh_6={ + "您也可以{C:red}「棄牌」", + "(最多選定{C:attention}5{}張牌)", + "來創造更好的手牌。", + "快試試看吧!", + }, + fh_7={ + "請小心,每回合", + "{C:blue}出牌{}和{C:red}棄牌{}次數", + "皆有上限", + }, + fh_8={ + "在使用所有{C:blue}手牌次數前", + "賺取{C:attention}300籌碼{}", + "贏得這一回合。", + "祝您好運!", + }, + s_1={ + "很棒!現在", + "您有一些{C:money}現金{},", + "立即前往{C:attention}商店", + "買一些新卡牌吧!", + }, + s_10={ + "{C:attention}禮券{}會在", + "您擊敗{C:attention}Boss盲注{}", + "後重新上架。", + }, + s_11={ + "快去看看兩個", + "商店賣的{C:booster}擴充包{},", + "每次商店都會販售,", + "擴充包有滿滿好康!", + }, + s_12={ + "我們現在進入", + "{C:attention}下一回合{}。", + }, + s_2={ + "試試買這張", + "帥氣的小丑牌", + }, + s_2_touch={ + "試試買這張", + "帥氣的小丑牌!", + "將其從商店", + "拖動至{C:attention}「購買」{}區域", + }, + s_3={ + "這是{C:attention}#1#張其中一張", + "可以加到比賽的", + "{C:attention}小丑牌{}。每張{C:attention}小丑牌", + "都有不一樣的功能", + }, + s_4={ + "這張可以增加{C:red}+4倍數{}到", + "您打出的每張牌!", + }, + s_5={ + "挑剔一點,", + "您一次只能帶", + "{C:attention}5張小丑牌{}", + }, + s_6={ + "現在,從{C:attention}商店購買", + "另一張卡牌。", + }, + s_7={ + "這張{C:tarot}塔羅牌{}是", + "{C:attention}消耗牌{},可以", + "加強您打出的牌。", + "好好留著這張牌!", + }, + s_8={ + "您一次最多", + "可以攜帶", + "{C:attention}2張消耗牌{}", + }, + s_9={ + "如果您有足夠積蓄,", + "也可考慮購買{C:attention}禮券{}。", + "{C:attention}禮券{}可以", + "幫您升級比賽!", + }, + sb_1={ + "您好!我的名字是", + "{C:attention}金寶{},讓我來幫您", + "瞭解遊玩的方式!", + }, + sb_2={ + "您的目標是要賺取", + "{C:blue}籌碼{}來擊敗", + "對手{C:attention}盲注", + }, + sb_3={ + "這裡是{C:blue}小盲注{},", + "您只需要獲得", + "{C:attention}300籌碼{}就可以擊敗他。", + }, + sb_4={ + "選擇{C:blue}小盲注", + "開始這一回合!", + }, + sh_1={ + "如果您有多張牌卡,", + "記得您可以重新", + "理牌。{C:attention}小丑牌{}觸發", + "是從左到右的排列方式", + }, + sh_2={ + "別忘了", + "{C:attention}使用{}您的消耗牌!", + }, + sh_3={ + "選擇手上最多{C:attention}2{}張牌", + "然後在{C:tarot}塔羅牌{}上", + "按下{C:attention}「使用」{}", + "就能加強效果!", + }, + sh_3_touch={ + "選擇手上最多{C:attention}2{}張牌", + "然後將", + "{C:tarot}塔羅{}牌拖動到{C:attention}「使用」{}", + "區域就能加強效果!", + }, + }, + v_dictionary={ + a_chips="+#1#", + a_chips_minus="-#1#", + a_hands="+#1# 出牌次數", + a_handsize="+#1#的手牌數量", + a_handsize_minus="-#1#手牌數量", + a_mult="+#1#倍數", + a_mult_minus="-#1#倍數", + a_remaining="剩下#1#", + a_sold_tally="#1#/#2#賣出", + a_xmult="X#1#倍數", + a_xmult_minus="-X#1#倍數", + ante_x_voucher="底注#1#張禮券", + challenges_completed="已完成#1#/#2#個挑戰", + completed="已完成#1#/#2#", + deck_preview_wheel_plural="因#1#牌面朝下,數字可能較小", + deck_preview_wheel_singular="因#1#牌面朝下,數字可能較小", + interest="每$#2#獲得#1#利息(上限為#3#)", + loyalty_active="開啟!", + loyalty_inactive="剩下#1#", + ml_foil_desc={ + "銀箔", + "+#1#籌碼", + }, + ml_holo_desc={ + "全像攝影", + "+#1#倍數", + }, + ml_negative_consumable_desc={ + "負片", + "+#1#消耗牌欄位", + }, + ml_negative_desc={ + "負片", + "+#1#小丑牌欄位", + }, + ml_polychrome_desc={ + "彩色", + "X#1#倍數", + }, + remaining_discard_money="剩餘棄牌次數(每次$#1#)", + remaining_hand_money="剩餘出牌次數(每次$#1#)", + unlocked="已解鎖#1#/#2#", + }, + v_text={ + ch_c_all_eternal={ + "所有商店內小丑都是{C:eternal}永恆的{}", + }, + ch_c_chips_dollar_cap={ + "{C:blue}籌碼{}不能超過目前的{C:money}$", + }, + ch_c_daily={ + "{E:1,s:1.2,C:red}每日挑戰!", + }, + ch_c_debuff_played_cards={ + "所有{C:attention}打出過的{}牌在計分後會遭到{C:attention}減益{}", + }, + ch_c_discard_cost={ + "每次棄牌支付{C:money}$#1#{}", + }, + ch_c_flipped_cards={ + "每{C:green}#1#{}張牌中有1張會是面朝下抽出", + }, + ch_c_inflation={ + "每次選購永久提高價格{C:money}$1{}", + }, + ch_c_minus_hand_size_per_X_dollar={ + "每擁有{C:money}$#1#{},就{C:red}-1{}張能持有的手牌", + }, + ch_c_no_extra_hand_money={ + "額外{C:blue}手牌{}無法再獲得資金", + }, + ch_c_no_interest={ + "每一回合結束時無法獲得{C:attention}利息{}", + }, + ch_c_no_reward={ + "所有{C:attention}盲注{}均沒有獎勵金", + }, + ch_c_no_reward_specific={ + "{C:attention}#1#盲注{}均沒有獎勵金", + }, + ch_c_no_shop_jokers={ + "{C:attention}商店{}中不再出現小丑牌", + }, + ch_c_none={ + "{C:inactive}無", + }, + ch_c_set_eternal_ante={ + "當{C:attention}#1#{}Boss盲注被擊敗後,所有的小丑牌都會成為{C:attention}永恆狀態", + }, + ch_c_set_joker_slots_ante={ + "當{C:attention}#1#{}Boss盲注被擊敗後,將小丑牌欄位數變為{C:attention}0", + }, + ch_c_set_seed={ + "嘗試設定種子1次:{C:inactive}{隱藏}", + }, + ch_m_consumable_slots={ + "{C:attention}#1#{}消耗牌欄位", + }, + ch_m_discards={ + "每回合{C:red}-#1#{}棄牌次數", + }, + ch_m_dollars={ + "從{C:money}$#1#開始玩", + }, + ch_m_hand_size={ + "{C:attention}#1#{}手牌數量", + }, + ch_m_hands={ + "每回合{C:blue}#1#{}出牌次數", + }, + ch_m_joker_slots={ + "{C:attention}#1#{}小丑牌欄位", + }, + ch_m_none={ + "{C:inactive}無", + }, + }, + }, +} \ No newline at end of file diff --git a/src/main.lua b/src/main.lua new file mode 100644 index 0000000..34a99df --- /dev/null +++ b/src/main.lua @@ -0,0 +1,388 @@ +if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end +require "engine/object" +require "bit" +require "engine/string_packer" +require "engine/controller" +require "back" +require "tag" +require "engine/event" +require "engine/node" +require "engine/moveable" +require "engine/sprite" +require "engine/animatedsprite" +require "functions/misc_functions" +require "game" +require "globals" +require "engine/ui" +require "functions/UI_definitions" +require "functions/state_events" +require "functions/common_events" +require "functions/button_callbacks" +require "functions/misc_functions" +require "functions/test_functions" +require "card" +require "cardarea" +require "blind" +require "card_character" +require "engine/particles" +require "engine/text" +require "challenges" + +math.randomseed( G.SEED ) + +function love.run() + if love.load then love.load(love.arg.parseGameArguments(arg), arg) end + + -- We don't want the first frame's dt to include time taken by love.load. + if love.timer then love.timer.step() end + + local dt = 0 + local dt_smooth = 1/100 + local run_time = 0 + + -- Main loop time. + return function() + run_time = love.timer.getTime() + -- Process events. + if love.event and G and G.CONTROLLER then + love.event.pump() + local _n,_a,_b,_c,_d,_e,_f,touched + for name, a,b,c,d,e,f in love.event.poll() do + if name == "quit" then + if not love.quit or not love.quit() then + return a or 0 + end + end + if name == 'touchpressed' then + touched = true + elseif name == 'mousepressed' then + _n,_a,_b,_c,_d,_e,_f = name,a,b,c,d,e,f + else + love.handlers[name](a,b,c,d,e,f) + end + end + if _n then + love.handlers['mousepressed'](_a,_b,_c,touched) + end + end + + -- Update dt, as we'll be passing it to update + if love.timer then dt = love.timer.step() end + dt_smooth = math.min(0.8*dt_smooth + 0.2*dt, 0.1) + -- Call update and draw + if love.update then love.update(dt_smooth) end -- will pass 0 if love.timer is disabled + + if love.graphics and love.graphics.isActive() then + if love.draw then love.draw() end + love.graphics.present() + end + + run_time = math.min(love.timer.getTime() - run_time, 0.1) + G.FPS_CAP = G.FPS_CAP or 500 + if run_time < 1./G.FPS_CAP then love.timer.sleep(1./G.FPS_CAP - run_time) end + end +end + +function love.load() + G:start_up() + --Steam integration + local os = love.system.getOS() + if os == 'OS X' or os == 'Windows' then + local st = nil + --To control when steam communication happens, make sure to send updates to steam as little as possible + if os == 'OS X' then + local dir = love.filesystem.getSourceBaseDirectory() + local old_cpath = package.cpath + package.cpath = package.cpath .. ';' .. dir .. '/?.so' + st = require 'luasteam' + package.cpath = old_cpath + else + st = require 'luasteam' + end + + st.send_control = { + last_sent_time = -200, + last_sent_stage = -1, + force = false, + } + if not (st.init and st:init()) then + love.event.quit() + end + --Set up the render window and the stage for the splash screen, then enter the gameloop with :update + G.STEAM = st + else + end + + --Set the mouse to invisible immediately, this visibility is handled in the G.CONTROLLER + love.mouse.setVisible(false) +end + +function love.quit() + --Steam integration + if G.SOUND_MANAGER then G.SOUND_MANAGER.channel:push({type = 'stop'}) end + if G.STEAM then G.STEAM:shutdown() end +end + +function love.update( dt ) + --Perf monitoring checkpoint + timer_checkpoint(nil, 'update', true) + G:update(dt) +end + +function love.draw() + --Perf monitoring checkpoint + timer_checkpoint(nil, 'draw', true) + G:draw() +end + +function love.keypressed(key) + if not _RELEASE_MODE and G.keybind_mapping[key] then love.gamepadpressed(G.CONTROLLER.keyboard_controller, G.keybind_mapping[key]) + else + G.CONTROLLER:set_HID_flags('mouse') + G.CONTROLLER:key_press(key) + end +end + +function love.keyreleased(key) + if not _RELEASE_MODE and G.keybind_mapping[key] then love.gamepadreleased(G.CONTROLLER.keyboard_controller, G.keybind_mapping[key]) + else + G.CONTROLLER:set_HID_flags('mouse') + G.CONTROLLER:key_release(key) + end +end + +function love.gamepadpressed(joystick, button) + button = G.button_mapping[button] or button + G.CONTROLLER:set_gamepad(joystick) + G.CONTROLLER:set_HID_flags('button', button) + G.CONTROLLER:button_press(button) +end + +function love.gamepadreleased(joystick, button) + button = G.button_mapping[button] or button + G.CONTROLLER:set_gamepad(joystick) + G.CONTROLLER:set_HID_flags('button', button) + G.CONTROLLER:button_release(button) +end + +function love.mousepressed(x, y, button, touch) + G.CONTROLLER:set_HID_flags(touch and 'touch' or 'mouse') + if button == 1 then + G.CONTROLLER:queue_L_cursor_press(x, y) + end + if button == 2 then + G.CONTROLLER:queue_R_cursor_press(x, y) + end +end + + +function love.mousereleased(x, y, button) + if button == 1 then G.CONTROLLER:L_cursor_release(x, y) end +end + +function love.mousemoved(x, y, dx, dy, istouch) + G.CONTROLLER.last_touch_time = G.CONTROLLER.last_touch_time or -1 + if next(love.touch.getTouches()) ~= nil then + G.CONTROLLER.last_touch_time = G.TIMERS.UPTIME + end + G.CONTROLLER:set_HID_flags(G.CONTROLLER.last_touch_time > G.TIMERS.UPTIME - 0.2 and 'touch' or 'mouse') +end + +function love.joystickaxis( joystick, axis, value ) + if math.abs(value) > 0.2 and joystick:isGamepad() then + G.CONTROLLER:set_gamepad(joystick) + G.CONTROLLER:set_HID_flags('axis') + end +end + +function love.errhand(msg) + if G.F_NO_ERROR_HAND then return end + msg = tostring(msg) + + if G.SETTINGS.crashreports and _RELEASE_MODE and G.F_CRASH_REPORTS then + local http_thread = love.thread.newThread([[ + local https = require('https') + CHANNEL = love.thread.getChannel("http_channel") + + while true do + --Monitor the channel for any new requests + local request = CHANNEL:demand() + if request then + https.request(request) + end + end + ]]) + local http_channel = love.thread.getChannel('http_channel') + http_thread:start() + local httpencode = function(str) + local char_to_hex = function(c) + return string.format("%%%02X", string.byte(c)) + end + str = str:gsub("\n", "\r\n"):gsub("([^%w _%%%-%.~])", char_to_hex):gsub(" ", "+") + return str + end + + + local error = msg + local file = string.sub(msg, 0, string.find(msg, ':')) + local function_line = string.sub(msg, string.len(file)+1) + function_line = string.sub(function_line, 0, string.find(function_line, ':')-1) + file = string.sub(file, 0, string.len(file)-1) + local trace = debug.traceback() + local boot_found, func_found = false, false + for l in string.gmatch(trace, "(.-)\n") do + if string.match(l, "boot.lua") then + boot_found = true + elseif boot_found and not func_found then + func_found = true + trace = '' + function_line = string.sub(l, string.find(l, 'in function')+12)..' line:'..function_line + end + + if boot_found and func_found then + trace = trace..l..'\n' + end + end + + http_channel:push('https://958ha8ong3.execute-api.us-east-2.amazonaws.com/?error='..httpencode(error)..'&file='..httpencode(file)..'&function_line='..httpencode(function_line)..'&trace='..httpencode(trace)..'&version='..(G.VERSION)) + end + + if not love.window or not love.graphics or not love.event then + return + end + + if not love.graphics.isCreated() or not love.window.isOpen() then + local success, status = pcall(love.window.setMode, 800, 600) + if not success or not status then + return + end + end + + -- Reset state. + if love.mouse then + love.mouse.setVisible(true) + love.mouse.setGrabbed(false) + love.mouse.setRelativeMode(false) + end + if love.joystick then + -- Stop all joystick vibrations. + for i,v in ipairs(love.joystick.getJoysticks()) do + v:setVibration() + end + end + if love.audio then love.audio.stop() end + love.graphics.reset() + local font = love.graphics.setNewFont("resources/fonts/m6x11plus.ttf", 20) + + love.graphics.clear(G.C.BLACK) + love.graphics.origin() + + + local p = 'Oops! Something went wrong:\n'..msg..'\n\n'..(not _RELEASE_MODE and debug.traceback() or G.SETTINGS.crashreports and + 'Since you are opted in to sending crash reports, LocalThunk HQ was sent some useful info about what happened.\nDon\'t worry! There is no identifying or personal information. If you would like\nto opt out, change the \'Crash Report\' setting to Off' or + 'Crash Reports are set to Off. If you would like to send crash reports, please opt in in the Game settings.\nThese crash reports help us avoid issues like this in the future') + + local function draw() + local pos = love.window.toPixels(70) + love.graphics.push() + love.graphics.clear(G.C.BLACK) + love.graphics.setColor(1., 1., 1., 1.) + love.graphics.printf(p, font, pos, pos, love.graphics.getWidth() - pos) + love.graphics.pop() + love.graphics.present() + + end + + while true do + love.event.pump() + + for e, a, b, c in love.event.poll() do + if e == "quit" then + return + elseif e == "keypressed" and a == "escape" then + return + elseif e == "touchpressed" then + local name = love.window.getTitle() + if #name == 0 or name == "Untitled" then name = "Game" end + local buttons = {"OK", "Cancel"} + local pressed = love.window.showMessageBox("Quit "..name.."?", "", buttons) + if pressed == 1 then + return + end + end + end + + draw() + + if love.timer then + love.timer.sleep(0.1) + end + end + +end + +function love.resize(w, h) + if w/h < 1 then --Dont allow the screen to be too square, since pop in occurs above and below screen + h = w/1 + end + + --When the window is resized, this code resizes the Canvas, then places the 'room' or gamearea into the middle without streching it + if w/h < G.window_prev.orig_ratio then + G.TILESCALE = G.window_prev.orig_scale*w/G.window_prev.w + else + G.TILESCALE = G.window_prev.orig_scale*h/G.window_prev.h + end + + if G.ROOM then + G.ROOM.T.w = G.TILE_W + G.ROOM.T.h = G.TILE_H + G.ROOM_ATTACH.T.w = G.TILE_W + G.ROOM_ATTACH.T.h = G.TILE_H + + if w/h < G.window_prev.orig_ratio then + G.ROOM.T.x = G.ROOM_PADDING_W + G.ROOM.T.y = (h/(G.TILESIZE*G.TILESCALE) - (G.ROOM.T.h+G.ROOM_PADDING_H))/2 + G.ROOM_PADDING_H/2 + else + G.ROOM.T.y = G.ROOM_PADDING_H + G.ROOM.T.x = (w/(G.TILESIZE*G.TILESCALE) - (G.ROOM.T.w+G.ROOM_PADDING_W))/2 + G.ROOM_PADDING_W/2 + end + + G.ROOM_ORIG = { + x = G.ROOM.T.x, + y = G.ROOM.T.y, + r = G.ROOM.T.r + } + + if G.buttons then G.buttons:recalculate() end + if G.HUD then G.HUD:recalculate() end + end + + G.WINDOWTRANS = { + x = 0, y = 0, + w = G.TILE_W+2*G.ROOM_PADDING_W, + h = G.TILE_H+2*G.ROOM_PADDING_H, + real_window_w = w, + real_window_h = h + } + + G.CANV_SCALE = 1 + + if love.system.getOS() == 'Windows' and false then --implement later if needed + local render_w, render_h = love.window.getDesktopDimensions(G.SETTINGS.WINDOW.selcted_display) + local unscaled_dims = love.window.getFullscreenModes(G.SETTINGS.WINDOW.selcted_display)[1] + + local DPI_scale = math.floor((0.5*unscaled_dims.width/render_w + 0.5*unscaled_dims.height/render_h)*500 + 0.5)/500 + + if DPI_scale > 1.1 then + G.CANV_SCALE = 1.5 + + G.AA_CANVAS = love.graphics.newCanvas(G.WINDOWTRANS.real_window_w*G.CANV_SCALE, G.WINDOWTRANS.real_window_h*G.CANV_SCALE, {type = '2d', readable = true}) + G.AA_CANVAS:setFilter('linear', 'linear') + else + G.AA_CANVAS = nil + end + end + + G.CANVAS = love.graphics.newCanvas(w*G.CANV_SCALE, h*G.CANV_SCALE, {type = '2d', readable = true}) + G.CANVAS:setFilter('linear', 'linear') +end diff --git a/src/resources/fonts/GoNotoCJKCore.ttf b/src/resources/fonts/GoNotoCJKCore.ttf new file mode 100644 index 0000000..be659ac Binary files /dev/null and b/src/resources/fonts/GoNotoCJKCore.ttf differ diff --git a/src/resources/fonts/GoNotoCurrent-Bold.ttf b/src/resources/fonts/GoNotoCurrent-Bold.ttf new file mode 100644 index 0000000..665626a Binary files /dev/null and b/src/resources/fonts/GoNotoCurrent-Bold.ttf differ diff --git a/src/resources/fonts/NotoSans-Bold.ttf b/src/resources/fonts/NotoSans-Bold.ttf new file mode 100644 index 0000000..d84248e Binary files /dev/null and b/src/resources/fonts/NotoSans-Bold.ttf differ diff --git a/src/resources/fonts/NotoSansJP-Bold.ttf b/src/resources/fonts/NotoSansJP-Bold.ttf new file mode 100644 index 0000000..384f8eb Binary files /dev/null and b/src/resources/fonts/NotoSansJP-Bold.ttf differ diff --git a/src/resources/fonts/NotoSansKR-Bold.ttf b/src/resources/fonts/NotoSansKR-Bold.ttf new file mode 100644 index 0000000..6cf639e Binary files /dev/null and b/src/resources/fonts/NotoSansKR-Bold.ttf differ diff --git a/src/resources/fonts/NotoSansSC-Bold.ttf b/src/resources/fonts/NotoSansSC-Bold.ttf new file mode 100644 index 0000000..b9010df Binary files /dev/null and b/src/resources/fonts/NotoSansSC-Bold.ttf differ diff --git a/src/resources/fonts/NotoSansTC-Bold.ttf b/src/resources/fonts/NotoSansTC-Bold.ttf new file mode 100644 index 0000000..461a666 Binary files /dev/null and b/src/resources/fonts/NotoSansTC-Bold.ttf differ diff --git a/src/resources/fonts/m6x11plus.ttf b/src/resources/fonts/m6x11plus.ttf new file mode 100644 index 0000000..bc81cbc Binary files /dev/null and b/src/resources/fonts/m6x11plus.ttf differ diff --git a/src/resources/gamecontrollerdb.txt b/src/resources/gamecontrollerdb.txt new file mode 100644 index 0000000..13f8dea --- /dev/null +++ b/src/resources/gamecontrollerdb.txt @@ -0,0 +1,1515 @@ +# Game Controller DB for SDL in 2.0.16 format +# Source: https://github.com/gabomdq/SDL_GameControllerDB + +# Windows +03000000fa2d00000100000000000000,3DRUDDER,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, +03000000d0160000040d000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000050d000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000060d000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000070d000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000600a000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000c82d00000951000000000000,8BitDo Dogbone Modkit,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, +03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,guide:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b2,start:b11,leftshoulder:b8,rightshoulder:b6,dpup:-a2,dpdown:+a2,dpleft:-a0,dpright:+a0,lefttrigger:b9,righttrigger:b7,platform:Windows, +03000000c82d00000151000000000000,8BitDo M30 ModKit,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows, +03000000c82d00000451000000000000,8BitDo N30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,start:b11,platform:Windows, +03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000290000000000000,8Bitdo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, +03000000c82d00003038000000000000,8Bitdo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, +03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000022000000090000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000203800000900000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00002038000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00002867000000000000,8BitDo S30 Modkit,a:b0,b:b1,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000060000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000061000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000102800000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003028000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000351000000000000,8BitDo SN30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000031000000000000,8BitDo Wireless Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000a00500003232000000000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000d81d00000e00000000000000,AC02,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows, +030000008f0e00001200000000000000,Acme GA02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006d0400000bc2000000000000,Action Pad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:a5~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:a2~,start:b8,x:b3,y:b4,platform:Windows, +03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows, +030000006f0e00001301000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001302000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001304000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001413000000000000,Afterglow,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00003901000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ab1200000103000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000000f9000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000491900001904000000000000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000710100001904000000000000,Amazon Luna Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b8,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b4,rightstick:b7,rightx:a3,righty:a4,start:b6,x:b3,y:b2,platform:Windows, +03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows, +03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000ef0500000300000000000000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500000230000000000000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, +03000000d6200000e557000000000000,Batarang,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, +030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000001f9000000000000,BB 070,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows, +030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000000055000000000000,Betop BFM Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006321000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000000700000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000808300000300000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00006401000000000000,BF One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000300f00000202000000000000,Bigben,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a5,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +030000006b1400000209000000000000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000380700008232000000000000,Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +0300000066f700000500000000000000,BrutalLegendTest,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000d81d00000b00000000000000,BUFFALO BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, +030000006d04000042c2000000000000,ChillStream,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000b0400003365000000000000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +030000004c050000c505000000000000,CronusMax Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d814000007cd000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d8140000cefa000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows, +030000003807000002cb000000000000,Cyborg,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000a306000022f6000000000000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000f806000000a3000000000000,DA Leader,a:b7,b:b6,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b8,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:b3,rightx:a2,righty:a3,start:b12,x:b4,y:b5,platform:Windows, +030000001a1c00000001000000000000,Datel,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000007d0400000840000000000000,Destroyer Tiltpad,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows, +03000000c0160000e105000000000000,Dual,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000791d00000103000000000000,Dual Box WII,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000007c1800000006000000000000,Dual Compat,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +030000004f040000070f000000000000,Dual Power,a:b8,b:b9,back:b4,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,leftshoulder:b13,leftstick:b6,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b12,rightstick:b7,righttrigger:b15,start:b5,x:b10,y:b11,platform:Windows, +030000004f04000012b3000000000000,Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000020b3000000000000,Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000bd12000002e0000000000000,Dual USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000ff1100003133000000000000,DualForce,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b1,platform:Windows, +030000008f0e00000910000000000000,DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000317300000100000000000000,DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000006f0e00003001000000000000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fc0400000250000000000000,Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +030000006e0500000a20000000000000,Elecom DUX60 MMO Gamepad,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows, +03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +030000006e0500000520000000000000,Elecom P301U,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +03000000411200004450000000000000,Elecom U1012,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000320000000000000,Elecom U3613M (DInput),a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000e20000000000000,Elecom U3912T,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000f20000000000000,Elecom U4013S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500001320000000000000,Elecom U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006e0500001020000000000000,Elecom U4113S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000720000000000000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000430b00000300000000000000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000242f000000b7000000000000,ESM 9110,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, +03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000341a00000108000000000000,EXEQ RF USB Gamepad 8206,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000790000003018000000000000,F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00003900000000000000,F300 Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008401000000000000,Faceoff Deluxe Audio Wired Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008001000000000000,Faceoff Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +030000004f04000008d0000000000000,Ferrari 150,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008500000000000000,Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008400000000000000,Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008700000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008800000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +030000000d0f00002700000000000000,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000380700002847000000000000,FightPad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700001847000000000000,FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700008031000000000000,FightStick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008731000000000000,FightStick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000003807000038b7000000000000,FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +78696e70757403000000000000000000,Fightstick TES,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows, +03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows, +03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows, +03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000151900004000000000000000,Flydigi Vader 2,a:b11,b:b10,back:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,leftstick:b1,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b0,righttrigger:b4,rightx:a3,righty:a4,start:b2,x:b9,y:b8,platform:Windows, +03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows, +030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows, +03000000ac0500002d02000000000000,G2U,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000790000002201000000000000,Game Controller for PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000341a000005f7000000000000,GameCube,a:b2,b:b3,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b1,y:b0,platform:Windows, +03000000430b00000500000000000000,GameCube,a:b0,b:b2,dpdown:b10,dpleft:b8,dpright:b9,dpup:b11,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a3,rightx:a5,righty:a2,start:b7,x:b1,y:b3,platform:Windows, +03000000790000004718000000000000,GameCube,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000260900002625000000000000,Gamecube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows, +03000000790000004618000000000000,GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +030000008f0e00000d31000000000000,Gamepad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000280400000140000000000000,GamePad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000ac0500003d03000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500004d04000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00001110000000000000,GameStick Bluetooth Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000ffff00000000000000000000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows, +030000008f0e00001411000000000000,Gamo2 Divaller PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c9110000f055000000000000,GC100XF,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000b01000000000000,GGE909 Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c283000000000000,Gioteck,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c383000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c483000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000026b3000000000000,GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000079000000d418000000000000,GPD Win,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000025b000000000000,GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000007d0400000540000000000000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000007d0400000340000000000000,Gravis G44011 Xterminator,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a2,start:b9,x:b3,y:b4,platform:Windows, +030000008f0e00000610000000000000,GreenAsia,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a5,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000ac0500006b05000000000000,GT2a,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fd0500003902000000000000,Hammerhead,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,rightshoulder:b7,rightstick:b5,righttrigger:b9,start:b10,x:b0,y:b1,platform:Windows, +03000000fd0500002a26000000000000,Hammerhead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500002f26000000000000,Hammerhead FX,a:b4,b:b5,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b1,y:b2,platform:Windows, +030000000d0f00004900000000000000,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000001008000001e1000000000000,Havit HV G60,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, +030000000d0f00000c00000000000000,HEXT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d81400000862000000000000,HitBox Edition Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +03000000632500002605000000000000,HJD X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00000a00000000000000,Hori DOA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008600000000000000,Hori Fighting Commander,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000ba00000000000000,Hori Fighting Commander,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005100000000000000,Hori Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001000000000000000,Hori Fighting Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000f0d00000010000000000000,Hori Fighting Stick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003200000000000000,Hori Fighting Stick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c000000000000000,Hori Fighting Stick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00000d00000000000000,Hori Fighting Stick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00003701000000000000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows, +030000000d0f00004000000000000000,Hori Fighting Stick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002100000000000000,Hori Fighting Stick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows, +030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003801000000000000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Windows, +030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001100000000000000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002600000000000000,Hori Real Arcade Pro 3P,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004b00000000000000,Hori Real Arcade Pro 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006f00000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00007000000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003d00000000000000,Hori Real Arcade Pro N3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b4,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b6,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000ae00000000000000,Hori Real Arcade Pro N4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008c00000000000000,Hori Real Arcade Pro P4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000aa00000000000000,Hori Real Arcade Pro S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000d800000000000000,Hori Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00002200000000000000,Hori Real Arcade Pro V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005b00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005c00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000af00000000000000,Hori Real Arcade Pro VHS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001b00000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b07,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b08,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002301000000000000,Hori Wired PS4 Controller Light,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006e00000000000000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005b1c00002400000000000000,Horipad Mini,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00000f00000000000000,iBUFFALO BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00001000000000000000,iBUFFALO BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows, +03000000696400006964000000000000,iDroidCon Bluetooth Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +030000006f0e00002401000000000000,Injustice FightStick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000fd0500005302000000000000,InterAct ProPad,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000ac0500002c02000000000000,Ipega Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000204000000000000,Ipega PG9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000304000000000000,Ipega PG9087 - Bluetooth Gamepad,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, +030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows, +030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000bd12000003c0000000000000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000250900000017000000000000,Joypad to USB Adapter,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, +03000000ff1100004033000000000000,JPD FFB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a2,start:b15,x:b3,y:b0,platform:Windows, +03000000242f00002d00000000000000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00008a00000000000000,JYS Wireless Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +03000000c4100000c082000000000000,KADE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000828200000180000000000000,Keio,a:b4,b:b5,back:b8,leftshoulder:b2,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b1,platform:Windows, +03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000bd12000001e0000000000000,Leadership,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00000103000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00000104000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008f0e00001300000000000000,Logic3,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows, +030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001dc2000000000000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d0400001ec2000000000000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d04000018c2000000000000,Logitech F510 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d04000019c2000000000000,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001ac2000000000000,Logitech Precision Gamepad,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000009c2000000000000,Logitech WingMan,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, +03000000380700005645000000000000,Lynx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000222200006000000000000000,Macally,a:b1,b:b2,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700003888000000000000,Mad Catz Arcade Fightstick TE S Plus PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008532000000000000,Mad Catz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006352000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006652000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005032000000000000,Mad Catz FightPad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005082000000000000,Mad Catz FightPad PRO PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008433000000000000,Mad Catz FightStick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008483000000000000,Mad Catz FightStick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008134000000000000,Mad Catz FightStick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008184000000000000,Mad Catz FightStick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006252000000000000,Mad Catz Micro CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700001888000000000000,Mad Catz SFIV FightStick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000380700008081000000000000,Mad Catz SFV Arcade FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, +03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,back:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b4,leftstick:b0,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00001030000000000000,Mayflash USB Adapter for original Sega Saturn controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, +0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000002418000000000000,Mega Drive,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, +0300000079000000ae18000000000000,Mega Drive,a:b0,b:b1,back:b7,dpdown:b14,dpleft:b15,dpright:b13,dpup:b2,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000c0160000990a000000000000,Mega Drive,a:b0,b:b1,leftx:a0,lefty:a1,righttrigger:b2,start:b3,platform:Windows, +030000005e0400000300000000000000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000005e0400000700000000000000,Microsoft SideWinder,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +030000005e0400000e00000000000000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows, +030000005e0400002700000000000000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Windows, +03000000280d00000202000000000000,Miller Lite Cantroller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b5,x:b2,y:b3,platform:Windows, +030000005b1c00002500000000000000,Mini,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +03000000ad1b000023f0000000000000,MLG,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a6,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000ad1b00003ef0000000000000,MLG FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700006382000000000000,MLG GamePad PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d6200000e589000000000000,Moga 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000007162000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000d6200000ad0d000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400002a89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows, +030000006b140000010c000000000000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000080d000000000000,Nacon Revolution Unlimited Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000bd12000001c0000000000000,Nebular,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000eb0300000000000000000000,NeGcon USB Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows, +0300000038070000efbe000000000000,NEO SE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000921200004b46000000000000,NES 2 port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, +03000000000f00000100000000000000,NES Controller,a:b1,b:b0,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +03000000571d00002100000000000000,NES Controller,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +03000000921200004346000000000000,NES Controller,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +03000000790000004518000000000000,NEXILUX GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows, +03000000050b00000045000000000000,Nexus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Windows, +03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +030000007e0500001920000000000000,Nintendo Switch N64 Controller,+rightx:b8,+righty:b2,-rightx:b3,-righty:b7,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,start:b9,platform:Windows, +030000007e0500001720000000000000,Nintendo Switch Online Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows, +03000000d620000013a7000000000000,NSW wired controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000550900001472000000000000,NVIDIA Controller v01.04,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows, +03000000550900001072000000000000,NVIDIA Shield,a:b9,b:b8,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b3,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b2,righttrigger:a4,rightx:a2,righty:a5,start:b0,x:b7,y:b6,platform:Windows, +030000005509000000b4000000000000,NVIDIA Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c00000288000000000000,Nyko Air Flo Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000004b120000014d000000000000,Nyko Airflo,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, +03000000d62000001d57000000000000,Nyko Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000782300000a10000000000000,Onlive Wireless Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows, +030000000d0f00000401000000000000,Onyx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008916000001fd000000000000,Onza CE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a3,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008916000000fd000000000000,Onza TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000362800000100000000000000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows, +03000000120c0000f60e000000000000,P4 Wired Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008501000000000000,PDP Fightpad Pro,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows, +030000006f0e00000901000000000000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000d9040000160f000000000000,Playstation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000110e000000000000,Pro5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000632500002306000000000000,PS Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000e30500009605000000000000,PS to USB convert cable,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, +030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f90e000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000250900000118000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000218000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, +030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows, +030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,leftshoulder:b10,leftstick:b1,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, +030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows, +030000003807000056a8000000000000,PS3 RF pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000100000008200000000000000,PS360 v1.66,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:h0.4,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f10e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000ff000000cb01000000000000,PSP,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows, +03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000011000000000000,Qanba Arcade Stick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows, +03000000300f00001611000000000000,Qanba Arcade Stick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +03000000222c00000020000000000000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001211000000000000,Qanba Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, +03000000222c00000223000000000000,Qanba Obsidian Arcade Stick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows, +03000000086700006626000000000000,RadioShack,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +030000009b2800002300000000000000,Raphnet Technologies 3DO USB Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, +030000009b2800006900000000000000,Raphnet Technologies 3DO USB Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, +030000009b2800000800000000000000,Raphnet Technologies Dreamcast USB Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows, +030000009b2800003200000000000000,Raphnet Technologies GC/N64 to USB v3.4,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800006000000000000000,Raphnet Technologies GC/N64 to USB v3.6,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800001800000000000000,Raphnet Technologies Jaguar USB Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows, +030000009b2800000200000000000000,Raphnet Technologies NES USB Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows, +030000009b2800004300000000000000,Raphnet Technologies Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000009b2800000500000000000000,Raphnet Technologies Saturn Adapter 2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +030000009b2800000300000000000000,Raphnet Technologies SNES USB Adapter,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000009b2800005600000000000000,Raphnet Technologies SNES USB Adapter,a:b1,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800005700000000000000,Raphnet Technologies SNES USB Adapter,a:b1,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800001e00000000000000,Raphnet Technologies Vectrex USB Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows, +030000009b2800002b00000000000000,Raphnet Technologies Wii Classic USB Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800002c00000000000000,Raphnet Technologies Wii Classic USB Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000321500000204000000000000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000710000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000a10000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000011000000000000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000bd12000013d0000000000000,Retrolink USB Sega Saturn Classic,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows, +03000000bd12000015d0000000000000,Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +0300000000f000000300000000000000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +0300000000f00000f100000000000000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +03000000830500000960000000000000,Revenger,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b5,platform:Windows, +030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000020d000000000000,Revolution Pro Controller 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000001d0000000000000,Rumble Force,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000003d0000000000000,Run N Drive,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000009d0000000000000,Run N Drive,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000008916000000fe000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000045d000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000023f6000000000000,Saitek Cyborg V.1 Game pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001201000000000000,Saitek Dual Analog Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000a30600000cff000000000000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b0,y:b1,platform:Windows, +03000000a30600000d5f000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600000dff000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000018f5000000000000,Saitek P3200,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001001000000000000,Saitek P480 Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000901000000000000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b5,rightx:a3,righty:a2,x:b0,y:b1,platform:Windows, +03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a30600002106000000000000,Saitek PS1000,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000020f6000000000000,Saitek PS2700,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001101000000000000,Saitek Rumble Pad,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000e804000000a0000000000000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c01100000252000000000000,Sanwa Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000c01100004350000000000000,Sanwa Micro Grip P3,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,x:b3,y:b2,platform:Windows, +03000000411200004550000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a1,righty:a2,start:b9,x:b1,y:b3,platform:Windows, +03000000c01100004150000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000c01100004450000000000000,Sanwa Online Grip,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b14,x:b3,y:b4,platform:Windows, +03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows, +03000000c01100000051000000000000,Satechi Bluetooth Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000004f04000028b3000000000000,Score A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows, +03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +0300000000050000289b000000000000,Sega Saturn Adapter 2,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows, +03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows, +03000000120c00001c1e000000000000,SnakeByte GamePad 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +0300000003040000c197000000000000,SNES Controller,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000571d00002000000000000000,SNES Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows, +03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000008b2800000300000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000921200004653000000000000,SNES Controller,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000341a00000208000000000000,Speedlink 6555,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000908000000000000,Speedlink 6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008f0e00000800000000000000,Speedlink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows, +03000000790000001c18000000000000,STK 7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000003014000000000000,Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000381000003114000000000000,Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003847000000000000,Street Fighter Fighting Stick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, +030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000d620000011a7000000000000,Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000f600000000000000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows, +030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d814000001a0000000000000,TE Kitty,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows, +03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, +03000000790000002601000000000000,TGZ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000023b3000000000000,Thrustmaster Dual Trigger 3 in 1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ed0000000000000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows, +030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000666600000488000000000000,TigerGame PS/PS2 Game Controller Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000004f04000007d0000000000000,TMini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c01100000055000000000000,Tronsmart,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows, +03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, +03000000d90400000200000000000000,TwinShock PS2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000000b0400003065000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00006e00000000000000,USB Game Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows, +03000000300f00000701000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000341a00002308000000000000,USB Game Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000666600000188000000000000,USB Game Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000666600000288000000000000,USB Game Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000006b1400000203000000000000,USB Game Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000790000000a00000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000b404000081c6000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001503000000000000,USB Game Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000bd12000012d0000000000000,USB Game Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000f0250000c183000000000000,USB Game Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ff1100004133000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000632500002305000000000000,USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000302000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000702000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows, +03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000007e0500003003000000000000,WiiU Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +0300000032150000030a000000000000,Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ff02000000000000,Wired Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ea02000000000000,Wireless Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000032150000140a000000000000,Wolverine,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000002e160000efbe000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, +03000000380700001647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700002045000000000000,Xbox 360 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700002644000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a5,start:b8,x:b2,y:b3,platform:Windows, +03000000380700002647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000003807000026b7000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a7,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400001907000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400009102000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000000fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000001fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000016f0000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b00008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400000053000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000fdfa000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000a102000000000000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c00000a88000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000120c00001088000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2~,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5~,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000002a0600002000000000000000,Xbox Controller,a:b0,b:b1,back:b13,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b5,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b15,righttrigger:b7,rightx:a2,righty:a5,start:b12,x:b2,y:b3,platform:Windows, +03000000300f00008888000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:b13,dpleft:b10,dpright:b11,dpup:b12,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700001645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700002645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700008645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000202000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400008502000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400008702000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400008902000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b8,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b9,righttrigger:b4,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00006300000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000c0b000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000fd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e0000a802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e0000c802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400003a54000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000130b000000000000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000450c00002043000000000000,Xeox Gamepad SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000ac0500005b05000000000000,Xiaoji Gamesir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000172700004431000000000000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000120c0000101e000000000000,Zeroplus P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002500000000000000,Hori Fighting Commander 3,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,lefttrigger:b6,righttrigger:b7,platform:Windows, +03000000490b00004406000000000000,ASCII Seamic Controller,a:b0,b:b1,x:b3,y:b4,back:b8,start:b9,leftshoulder:b6,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,lefttrigger:b7,righttrigger:b2,platform:Windows, +030000005e0400002800000000000000,Microsoft Dual Strike,a:b3,b:b2,x:b1,y:b0,back:b4,start:b5,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,rightx:a0,righty:a1~,platform:Windows, + +# Mac OS X +030000008f0e00000300000009010000,2In1 USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +030000003512000012ab000001000000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000022000000090000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000190000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000102800000900000000000000,8Bitdo SFC30 GamePad Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001290000001000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00004028000000010000,8Bitdo SN30 GamePad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000031000001000000,8BitDo Wireless Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000a00500003232000009010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000ef0500000300000000020000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X, +03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d8140000cecf000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008400000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008500000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle3:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Mac OS X, +03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, +03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000102000000000000,GameStop Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000007d0400000540000001010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000280400000140000000020000,Gravis Gamepad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00000300000007010000,GreenAsia USB Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X, +030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00001330000011010000,HuiJia SNES Controller,a:b4,b:b2,back:b16,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b12,rightshoulder:b14,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000830500006020000000000000,iBuffalo Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000242f00002d00000007010000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000005030000,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d0400001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006d04000018c2000000010000,Logitech RumblePad 2 USB,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005032000000010000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005082000000010000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008433000000010000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008483000000010000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, +0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, +03000000790000000018000000010000,Mayflash Wii U Pro Controller Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X, +03000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c62400002b89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000632500007505000000020000,NEOGEO mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X, +030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000011a7000000020000,Nintendo Switch Core Plus Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d620000011a7000010050000,Nintendo Switch PowerA Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000550900001472000025050000,NVIDIA Controller v01.04,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X, +030000006f0e00000901000002010000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c050000da0c000000010000,Playstation Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000321500000204000000010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000010000000010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000321500000011000000010000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000001100000005010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000830500006020000000010000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000c6240000fefa000000000000,Rock Candy Gamepad for PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Mac OS X, +03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, +03000000b40400000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, +030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X, +030000004c050000e60c000000010000,Sony DualSense,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000a00b000000000000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +05000000556e6b6e6f776e2048494400,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, +030000004f0400000ed0000000020000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, +03000000bd12000015d0000000000000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000bd12000015d0000000010000,Tomee Retro Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, +030000006f0e00000302000025040000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000702000003060000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000791d00000103000009010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, +050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, +030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006f0e00000104000000000000,Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000c6240000045d000000000000,Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000050b000003090000,Xbox Elite Wireless Controller Series 2,a:b0,b:b1,back:b31,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b53,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c62400003a54000000000000,Xbox One PowerA Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000d102000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000dd02000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000e302000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000011050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000e002000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e040000e002000003090000,Xbox Wireless Controller,a:b0,b:b1,x:b3,y:b4,back:b16,guide:b15,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X, +030000005e040000ea02000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000fd02000003090000,Xbox Wireless Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000120c0000100e000000010000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000101e000000010000,Zeroplus P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,x:b1,y:b0,back:b4,start:b5,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,rightx:a0,righty:a1~,platform:Mac OS X, + +# Linux +03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001038000000010000,8Bitdo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +03000000022000000090000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000190000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00002038000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000061000000010000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +030000003512000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +030000003512000012ab000010010000,8Bitdo SFC30 GamePad,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, +05000000102800000900000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003028000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000202800000900000000010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000031000011010000,8BitDo Wireless Adapter (DInput),a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e0400008e02000020010000,8BitDo Wireless Adapter (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +050000005e040000e002000030110000,8BitDo Zero 2 (XInput),a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +05000000a00500003232000001000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +05000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00001302000000010000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000020060000,Afterglow Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000013020000,Afterglow Prismatic Wired Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000100000008200000011010000,Akishop Customs PS360 v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000007c1800000006000010010000,Alienware Dual Compatible Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +05000000491900000204000021000000,Amazon Fire Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000491900001904000011010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux, +05000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000a30c00002800000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +05000000050b00000045000031000000,Asus Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +05000000050b00000045000040000000,Asus Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +03000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, +05000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, +03000000503200000210000000000000,Atari Game Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, +05000000503200000210000000000000,Atari Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +03000000120c00000500000010010000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000ef0500000300000000010000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000c31100000791000011010000,Be1 GC101 GAMEPAD 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000bc2000000055000001000000,BETOP AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000666600006706000000010000,Boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, +03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux, +03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000022f6000011010000,Cyborg V3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000004b3000010010000,Dual Power 2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c11100000191000011010000,EasySMX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006e0500000320000010010000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, +03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000ac0500002d0200001b010000,Gamesir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000bc2000005656000011010000,Gamesir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000007d0400000540000000010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000280400000140000000010000,Gravis GamePad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux, +030000008f0e00001200000010010000,GreenAsia USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +06000000adde0000efbe000002010000,Hidromancer Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d81400000862000011010000,HitBox PS3 PC Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, +03000000c9110000f055000011010000,HJC Game Gamepqd,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000632500002605000010010000,HJDX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000000d0f00000d00000000010000,Hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux, +030000000d0f00008500000010010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00008600000002010000,Hori Fighting Commander,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005001000009040000,Hori Fighting Commander OCTA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00001000000011010000,Hori Fighting Stick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux, +030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000aa00000011010000,Hori Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f0000c100000011010000,Horipad S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Linux, +03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000d80400008200000003000000,IMS PCU0 Gamepad,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux, +03000000fd0500000030000000010000,InterAct GoPad I73000,a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,platform:Linux, +0500000049190000020400001b010000,Ipega PG 9069 Bluetooth Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000632500007505000011010000,Ipega PG 9099 Bluetooth Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +0500000049190000030400001b010000,Ipega PG9099,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000491900000204000000000000,Ipega PG9118,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +03000000bd12000003c0000010010000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000242f00002d00000011010000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000242f00008a00000011010000,JYS Wireless Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000019200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux, +030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux, +05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005032000011010000,Mad Catz FightPad PRO PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005082000011010000,Mad Catz FightPad PRO PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000380700008034000011010000,Mad Catz fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008084000011010000,Mad Catz fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008433000011010000,Mad Catz FightStick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008483000011010000,Mad Catz FightStick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000380700003847000090040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700003888000010010000,MadCatz PC USB Wired Stick 8838,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000790000004318000010010000,Mayflash GameCube Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0300000025090000e803000001010000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, +030000005e0400000700000000010000,Microsoft SideWinder Game Pad USB,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux, +030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux, +030000005e0400008e02000056210000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000004010000,Microsoft Xbox 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000062230000,Microsoft Xbox 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000000b000008040000,Microsoft Xbox One Elite 2 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000050b000003090000,Microsoft Xbox One Elite 2 pad,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000e302000003020000,Microsoft Xbox One Elite pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000001010000,Microsoft Xbox One pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000dd02000003020000,Microsoft Xbox One pad 2015,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000003020000,Microsoft Xbox One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000008040000,Microsoft Xbox One S pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008502000000010000,Microsoft Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400008902000021010000,Microsoft Xbox pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, +050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000004d4f435554452d3035305800,Mocute 054X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000d6200000e589000001000000,Moga 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +03000000c62400002b89000011010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c62400001a89000000010000,MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000250900006688000000010000,MP8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000006b140000010c000010010000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f1f00000800000011010000,Neogeo PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux, +060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +060000007e0500000820000000000000,Nintendo Combined Joy-Cons (joycond),a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, +03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux, +050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b9,b:b8,back:b5,leftshoulder:b2,leftstick:b6,leftx:a1,lefty:a0~,rightshoulder:b4,start:b0,x:b7,y:b10,platform:Linux, +03000000d620000013a7000011010000,Nintendo Switch PowerA Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0~,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux, +050000007e0500001720000001000000,Nintendo Switch SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0500000308000010010000,Nostromo n45 Dual Analog Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux, +03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +19000000010000000100000001010000,odroidgo2 joypad,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux, +19000000010000000200000011000000,odroidgo2 joypad v11,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux, +03000000c0160000dc27000001010000,OnyxSoft Dual JoyDivision,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:Linux, +05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +03000000830500005020000010010000,Padix Co. Ltd. Rockfire PSX/USB Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux, +03000000790000001c18000011010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e0000b802000001010000,PDP Afterglow Wired Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000b802000013020000,PDP Afterglow Wired Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00008001000011010000,PDP Faceoff Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00008701000011010000,PDP Rock Candy Wired Controller for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00000901000011010000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e0000a802000023020000,PDP Wired Controller for Xbox One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e00008501000011010000,PDP Wired Fight Pad Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000004c050000da0c000011010000,Playstation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d9040000160f000000010000,Playstation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d62000000228000001010000,PowerA Wired Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000220000001010000,PowerA Wired Controller for Xbox One and Xbox Series S and X,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400001a54000001010000,PowerA Xbox One Mini Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +050000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000ff000000cb01000010010000,PSP,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, +03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux, +030000009b2800004200000001010000,Raphnet Technologies Dual NES to USB v2.0,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux, +030000009b2800003200000001010000,Raphnet Technologies GC/N64 to USB v3.4,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800006000000001010000,Raphnet Technologies GC/N64 to USB v3.6,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800000300000001010000,raphnet.net 4nes4snes v1.5,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, +030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008916000000fd000024010000,Razer Onza Tournament Edition,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000810000011010000,Razer Panthera Evo Arcade Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b13,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux, +03000000321500000010000011010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000011000011010000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux, +0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, +0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux, +03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux, +03000000a30600000cff000010010000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux, +03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, +03000000a306000018f5000010010000,Saitek P3200 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, +03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux, +03000000a306000020f6000011010000,Saitek PS2700 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux, +03000000a30c00002500000011010000,Sega Genesis Mini 3B controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Linux, +030000001f08000001e4000010010000,SFC Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000f025000021c1000010010000,Shanwan Gioteck PS3 Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000632500007505000010010000,Shanwan PS3 PC Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000bc2000000055000010010000,Shanwan PS3 PC Wired GamePad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005f140000c501000010010000,Shanwan Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000632500002305000010010000,ShanWan USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000004c050000e60c000011810000,Sony DualSense,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000e60c000000810000,Sony DualSense,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000005e0400008e02000073050000,Speedlink Torid Wireless Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog Gamepad pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800004211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000ad1b000038f0000090040000,Street Fighter IV FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000003b07000004a1000000010000,Suncom SFX Plus for USB,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Linux, +03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000008f0e00001431000010010000,SZMY Power PS3 gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux, +030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3 in 1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f0400000ed0000011010000,Thrustmaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,back:b11,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b0,righttrigger:b9,start:b1,x:b3,y:b5,platform:Linux, +030000004f04000003b3000010010000,Thrustmaster Firestorm Dual Analog 2,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b9,rightx:a2,righty:a3,x:b1,y:b3,platform:Linux, +030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux, +030000004f04000026b3000002040000,Thrustmaster Gamepad GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000025b000002020000,Thrustmaster GPX Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000007d0000000010000,Thrustmaster T Mini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000012b3000010010000,Thrustmaster vibrating gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +03000000bd12000015d0000010010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d814000007cd000011010000,Toodles 2008 Chimp PC PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, +03000000790000001100000000010000,USB Gamepad1,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, +03000000790000001100000011010000,USB Saturn Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Linux, +03000000790000002201000011010000,USB Saturn Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +03000000b40400000a01000000010000,USB Saturn Pad,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux, +030000006f0e00000302000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00000702000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000791d00000103000010010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +050000000d0f0000f600000001000000,Wireless HORIPAD Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000014010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +030000005e0400001907000000010000,Xbox 360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400009102000007010000,Xbox 360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000000010000,Xbox 360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000007010000,Xbox 360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000000010000,Xbox 360 Wireless EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000014010000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001304000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000ffff0000ffff000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +0000000058626f782047616d65706100,Xbox Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400000a0b000005040000,Xbox One Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, +030000005e040000ea02000000000000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000ea02000001030000,Xbox One Wireless Controller (Model 1708),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b000007050000,Xbox One Wireless Controller (Model 1914),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400000202000000010000,Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, +030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000005050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux, +03000000450c00002043000010010000,XEOX Gamepad SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000ac0500005b05000010010000,Xiaoji Gamesir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +05000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, +03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000120c0000100e000011010000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000101e000011010000,Zeroplus P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,x:b1,y:b0,back:b4,start:b5,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,rightx:a0,righty:a1~,platform:Linux, +03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b2,start:b11,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,platform:Linux, +060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,x:b3,y:b2,back:b9,start:b10,leftshoulder:b5,rightshoulder:b6,lefttrigger:b7,righttrigger:b8,dpup:b14,dpdown:b15,dpleft:b16,dpright:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3,leftstick:b12,rightstick:b13,platform:Linux, +03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,y:b0,x:b3,start:b9,guide:b30,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux, +03000000380700008532000010010000,Madcatz Fightpad,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:b5,righttrigger:b7,platform:Linux, +03000000ad1b000003f5000033050000,Hori Fighting Stick VX,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,-leftx:h0.8,+leftx:h0.2,-lefty:h0.1,+lefty:h0.4,lefttrigger:b6,righttrigger:b7,platform:Linux, +050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux, +03000000571d00002000000010010000,Tomee SNES USB Adapter,x:b2,a:b0,b:b1,y:b3,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,platform:Linux, + +# Android +38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android, +33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android, +39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android, +64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android, +66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android, +66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000006500000ffff3f00,8BitDo M30 Gamepad,a:b1,b:b0,back:b4,guide:b17,leftshoulder:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000051060000ffff3f00,8BitDo M30 Gamepad,a:b1,b:b0,back:b4,guide:b17,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android, +61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android, +05000000c82d000012900000ffff3f00,8BitDo SN30 Gamepad,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000062280000ffff3f00,8BitDo SN30 Gamepad,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000002600000ffff0f00,8BitDo SN30 Pro+,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000002028000009000000ffff3f00,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000003512000020ab000000780f00,8BitDo SNES30 Gamepad,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android, +33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +32333634613735616163326165323731,Amazon Luna Game Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android, +30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android, +05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +0500000031366332860c44aadfff0f00,GS Gamepad,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b18,platform:Android, +31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android, +64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android, +65346535636333663931613264643164,Joy Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android, +33346566643039343630376565326335,Joy Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +35313531613435623366313835326238,Joy Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +38383665633039363066383334653465,Joy Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39363561613936303237333537383931,Joy Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +32303165626138343962363666346165,Mars,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +31323564663862633234646330373138,Mega Drive,a:b23,b:b22,leftx:a0,lefty:a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, +37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android, +30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,leftshoulder:b20,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android, +64633436313965656664373634323364,Microsoft X-Box 360 pad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android, +050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android, +34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000003720000cf7f3f00,NVIDIA Controller v01.01,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000010720000ffff3f00,NVIDIA Controller v01.03,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000014720000df7f3f00,NVIDIA Controller v01.04,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android, +32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android, +61363034663839376638653463633865,PS3,a:b0,b:b1,back:b15,dpdown:a14,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66366539656564653432353139356536,PS3,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66383132326164626636313737373037,PS3,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30303839663330346632363232623138,PS4,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +31326235383662333266633463653332,PS4,a:b1,b:b16,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android, +31663838336334393132303338353963,PS4,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34613139376634626133336530386430,PS4,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37626233336235343937333961353732,PS4,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38393161636261653636653532386639,PS4,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63313733393535663339656564343962,PS4,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63393662363836383439353064663939,PS4,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65366465656364636137653363376531,PS4,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +66613532303965383534396638613230,PS4,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +62653335326261303663356263626339,PSX,a:b19,b:b1,back:b17,leftshoulder:b9,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android, +64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android, +38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android, +33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, +66386565396238363534313863353065,Sanwa Mobile,a:b21,b:b22,leftshoulder:b23,leftx:a0,lefty:a1,rightshoulder:b24,platform:Android, +32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +37316565396364386635383230353365,Saturn,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +38613865396530353338373763623431,Saturn,a:b0,b:b1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android, +61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +32633532643734376632656664383733,Sony DualSense,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +61303162353165316365336436343139,Sony DualSense,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android, +63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, +050000004f0400000ed00000fffe3f00,ThrustMaster eSwap PRO Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +5477696e20555342204a6f7973746963,Twin USB Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, +30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b23,paddle2:b24,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b23,paddle2:b24,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30386438313564306161393537333663,Wii Classic,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +33333034646336346339646538643633,Wii Classic,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +30306539356238653637313730656134,Wireless HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +30396232393162346330326334636566,Xbox 360,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38313038323730383864666463383533,Xbox 360,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65353331386662343338643939643636,Xbox 360,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65613532386633373963616462363038,Xbox 360,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000e00200000ffe3f00,Xbox One Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, +050000005e040000fd020000ffff3f00,Xbox One Wireless Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e04000091020000ff073f00,Xbox Wireless Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +34356136633366613530316338376136,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android, +36616131643361333337396261666433,Xbox Wireless Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000001727000044310000ffff3f00,XiaoMi Game Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, + +# iOS +05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000df076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, +4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff876d01,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000e60c0000df870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,touchpad:b10,x:b2,y:b3,platform:iOS, +050000004c050000e60c0000ff870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, +05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +050000005e040000050b0000df070001,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b10,paddle2:b12,paddle3:b11,paddle4:b13,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000050b0000ff070001,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000005e040000130b0000df870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000130b0000ff870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000005e040000e0020000df070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000e0020000ff070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, diff --git a/src/resources/shaders/CRT.fs b/src/resources/shaders/CRT.fs new file mode 100644 index 0000000..b8ad65c --- /dev/null +++ b/src/resources/shaders/CRT.fs @@ -0,0 +1,154 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec2 distortion_fac; +extern MY_HIGHP_OR_MEDIUMP vec2 scale_fac; +extern MY_HIGHP_OR_MEDIUMP number feather_fac; +extern MY_HIGHP_OR_MEDIUMP number noise_fac; +extern MY_HIGHP_OR_MEDIUMP number bloom_fac; +extern MY_HIGHP_OR_MEDIUMP number crt_intensity; +extern MY_HIGHP_OR_MEDIUMP number glitch_intensity; +extern MY_HIGHP_OR_MEDIUMP number scanlines; + +#define BUFF 0.01 +#define BLOOM_AMT 3 + +vec4 effect(vec4 color, Image tex, vec2 tc, vec2 pc) +{ + //Keep the original texture coords + MY_HIGHP_OR_MEDIUMP vec2 orig_tc = tc; + + //recenter + tc = tc*2.0 - vec2(1.0); + tc *= scale_fac; + + //bulge from middle + tc += (tc.yx*tc.yx) * tc * (distortion_fac - 1.0); + + //smoothly transition the edge to black + //buffer for the outer edge, this gets wonky if there is no buffer + MY_HIGHP_OR_MEDIUMP number mask = (1.0 - smoothstep(1.0-feather_fac,1.0,abs(tc.x) - BUFF)) + * (1.0 - smoothstep(1.0-feather_fac,1.0,abs(tc.y) - BUFF)); + + //undo the recenter + tc = (tc + vec2(1.0))/2.0; + + //Create the horizontal glitch offset effects + MY_HIGHP_OR_MEDIUMP number offset_l = 0.; + MY_HIGHP_OR_MEDIUMP number offset_r = 0.; + if(glitch_intensity > 0.01){ + MY_HIGHP_OR_MEDIUMP number timefac = 3.0*time; + offset_l = 50.0*(-3.5+sin(timefac*0.512 + tc.y*40.0) + + sin(-timefac*0.8233 + tc.y*81.532) + + sin(timefac*0.333 + tc.y*30.3) + + sin(-timefac*0.1112331 + tc.y*13.0)); + offset_r = -50.0*(-3.5+sin(timefac*0.6924 + tc.y*29.0) + + sin(-timefac*0.9661 + tc.y*41.532) + + sin(timefac*0.4423 + tc.y*40.3) + + sin(-timefac*0.13321312 + tc.y*11.0)); + + if(glitch_intensity > 1.0){ + offset_l = 50.0*(-1.5+sin(timefac*0.512 + tc.y*4.0) + + sin(-timefac*0.8233 + tc.y*1.532) + + sin(timefac*0.333 + tc.y*3.3) + + sin(-timefac*0.1112331 + tc.y*1.0)); + offset_r = -50.0*(-1.5+sin(timefac*0.6924 + tc.y*19.0) + + sin(-timefac*0.9661 + tc.y*21.532) + + sin(timefac*0.4423 + tc.y*20.3) + + sin(-timefac*0.13321312 + tc.y*5.0)); + } + tc.x = tc.x + 0.001*glitch_intensity*clamp(offset_l, clamp(offset_r, -1.0, 0.0), 1.0); + } + + //Apply mask and bulging effect + MY_HIGHP_OR_MEDIUMP vec4 crt_tex = Texel( tex, tc); + + //intensity multiplier for any visual artifacts + MY_HIGHP_OR_MEDIUMP float artifact_amplifier = (abs(clamp(offset_l, clamp(offset_r, -1.0, 0.0), 1.0))*glitch_intensity > 0.9 ? 3. : 1.); + + //Horizontal Chromatic Aberration + MY_HIGHP_OR_MEDIUMP float crt_amout_adjusted = (max(0., (crt_intensity)/(0.16*0.3)))*artifact_amplifier; + if(crt_amout_adjusted > 0.0000001) { + crt_tex.r = crt_tex.r*(1.-crt_amout_adjusted) + crt_amout_adjusted*Texel( tex, tc + vec2(0.0005*(1. +10.*(artifact_amplifier - 1.))*1600./love_ScreenSize.x, 0.)).r; + crt_tex.g = crt_tex.g*(1.-crt_amout_adjusted) + crt_amout_adjusted*Texel( tex, tc + vec2(-0.0005*(1. +10.*(artifact_amplifier - 1.))*1600./love_ScreenSize.x, 0.)).g; + } + MY_HIGHP_OR_MEDIUMP vec3 rgb_result = crt_tex.rgb*(1.0 - (1.0*crt_intensity*artifact_amplifier)); + + //post processing on the glitch effect to amplify green or red for a few lines of pixels + if (sin(time + tc.y*200.0) > 0.85) { + if (offset_l < 0.99 && offset_l > 0.01) rgb_result.r = rgb_result.g*1.5; + if (offset_r > -0.99 && offset_r < -0.01) rgb_result.g = rgb_result.r*1.5; + } + + //Add the pixel scanline overlay, a repeated 'pixel' mask that doesn't actually render the real image. If these pixels were used to render the image it would be too harsh + MY_HIGHP_OR_MEDIUMP vec3 rgb_scanline = 1.0*vec3( + clamp(-0.3+2.0*sin( tc.y * scanlines-3.14/4.0) - 0.8*clamp(sin( tc.x*scanlines*4.0), 0.4, 1.0), -1.0, 2.0), + clamp(-0.3+2.0*cos( tc.y * scanlines) - 0.8*clamp(cos( tc.x*scanlines*4.0), 0.0, 1.0), -1.0, 2.0), + clamp(-0.3+2.0*cos( tc.y * scanlines -3.14/3.0) - 0.8*clamp(cos( tc.x*scanlines*4.0-3.14/4.0), 0.0, 1.0), -1.0, 2.0)); + + rgb_result += crt_tex.rgb * rgb_scanline * crt_intensity * artifact_amplifier; + + //Add in some noise + MY_HIGHP_OR_MEDIUMP number x = (tc.x - mod(tc.x, 0.002)) * (tc.y - mod(tc.y, 0.0013)) * time * 1000.0; + x = mod( x, 13.0 ) * mod( x, 123.0 ); + MY_HIGHP_OR_MEDIUMP number dx = mod( x, 0.11 )/0.11; + rgb_result = (1.0-clamp( noise_fac*artifact_amplifier, 0.0,1.0 ))*rgb_result + dx * clamp( noise_fac*artifact_amplifier, 0.0,1.0 ) * vec3(1.0,1.0,1.0); + + //contrast and brightness correction for the CRT effect, also adjusting brightness for bloom + rgb_result -= vec3(0.55 - 0.02*(artifact_amplifier - 1. - crt_amout_adjusted*bloom_fac*0.7)); + rgb_result = rgb_result*(1.0 + 0.14 + crt_amout_adjusted*(0.012 - bloom_fac*0.12)); + rgb_result += vec3(0.5); + + //Prepare the final colour to return + MY_HIGHP_OR_MEDIUMP vec4 final_col = vec4( rgb_result*1.0, 1.0 ); + + //Finally apply bloom + MY_HIGHP_OR_MEDIUMP vec4 col = vec4(0.0); + MY_HIGHP_OR_MEDIUMP float bloom = 0.0; + + if (bloom_fac > 0.00001 && crt_intensity > 0.000001){ + bloom = 0.03*(max(0., (crt_intensity)/(0.16*0.3))); + MY_HIGHP_OR_MEDIUMP float bloom_dist = 0.0015*float(BLOOM_AMT); + MY_HIGHP_OR_MEDIUMP vec4 samp; + MY_HIGHP_OR_MEDIUMP float cutoff = 0.6; + + for (int i = -BLOOM_AMT; i <= BLOOM_AMT; ++i) + for (int j = -BLOOM_AMT; j <= BLOOM_AMT; ++j){ + samp = Texel( tex, tc + (bloom_dist/float(BLOOM_AMT))*vec2(float(i), float(j))); + samp.r = max(1./(1.-cutoff)*samp.r - 1./(1.-cutoff) + 1., 0.); + samp.g = max(1./(1.-cutoff)*samp.g - 1./(1.-cutoff) + 1., 0.); + samp.b = max(1./(1.-cutoff)*samp.b - 1./(1.-cutoff) + 1., 0.); + col += min(min(samp.r,samp.g),samp.b) * (2. - float(abs(float(i+j)))/float(BLOOM_AMT+BLOOM_AMT)); + } + + col /= float(BLOOM_AMT*BLOOM_AMT); + col.a = final_col.a; + } + + return (final_col*(1. -1.*bloom) + bloom*col)*mask; +} + + + +#ifdef VERTEX +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + MY_HIGHP_OR_MEDIUMP float mid_dist = screen_scale*length(vertex_position.xy/screen_scale - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + MY_HIGHP_OR_MEDIUMP vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + MY_HIGHP_OR_MEDIUMP float scale = 0.002*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/background.fs b/src/resources/shaders/background.fs new file mode 100644 index 0000000..162236f --- /dev/null +++ b/src/resources/shaders/background.fs @@ -0,0 +1,52 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP number spin_time; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_2; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_3; +extern MY_HIGHP_OR_MEDIUMP number contrast; +extern MY_HIGHP_OR_MEDIUMP number spin_amount; + +#define PIXEL_SIZE_FAC 700. +#define SPIN_EASE 0.5 + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //Convert to UV coords (0-1) and floor for pixel effect + MY_HIGHP_OR_MEDIUMP number pixel_size = length(love_ScreenSize.xy)/PIXEL_SIZE_FAC; + MY_HIGHP_OR_MEDIUMP vec2 uv = (floor(screen_coords.xy*(1./pixel_size))*pixel_size - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy) - vec2(0.12, 0.); + MY_HIGHP_OR_MEDIUMP number uv_len = length(uv); + + //Adding in a center swirl, changes with time. Only applies meaningfully if the 'spin amount' is a non-zero number + MY_HIGHP_OR_MEDIUMP number speed = (spin_time*SPIN_EASE*0.2) + 302.2; + MY_HIGHP_OR_MEDIUMP number new_pixel_angle = (atan(uv.y, uv.x)) + speed - SPIN_EASE*20.*(1.*spin_amount*uv_len + (1. - 1.*spin_amount)); + MY_HIGHP_OR_MEDIUMP vec2 mid = (love_ScreenSize.xy/length(love_ScreenSize.xy))/2.; + uv = (vec2((uv_len * cos(new_pixel_angle) + mid.x), (uv_len * sin(new_pixel_angle) + mid.y)) - mid); + + //Now add the paint effect to the swirled UV + uv *= 30.; + speed = time*(2.); + MY_HIGHP_OR_MEDIUMP vec2 uv2 = vec2(uv.x+uv.y); + + for(int i=0; i < 5; i++) { + uv2 += sin(max(uv.x, uv.y)) + uv; + uv += 0.5*vec2(cos(5.1123314 + 0.353*uv2.y + speed*0.131121),sin(uv2.x - 0.113*speed)); + uv -= 1.0*cos(uv.x + uv.y) - 1.0*sin(uv.x*0.711 - uv.y); + } + + //Make the paint amount range from 0 - 2 + MY_HIGHP_OR_MEDIUMP number contrast_mod = (0.25*contrast + 0.5*spin_amount + 1.2); + MY_HIGHP_OR_MEDIUMP number paint_res =min(2., max(0.,length(uv)*(0.035)*contrast_mod)); + MY_HIGHP_OR_MEDIUMP number c1p = max(0.,1. - contrast_mod*abs(1.-paint_res)); + MY_HIGHP_OR_MEDIUMP number c2p = max(0.,1. - contrast_mod*abs(paint_res)); + MY_HIGHP_OR_MEDIUMP number c3p = 1. - min(1., c1p + c2p); + + MY_HIGHP_OR_MEDIUMP vec4 ret_col = (0.3/contrast)*colour_1 + (1. - 0.3/contrast)*(colour_1*c1p + colour_2*c2p + vec4(c3p*colour_3.rgb, c3p*colour_1.a)); + + return ret_col; +} \ No newline at end of file diff --git a/src/resources/shaders/booster.fs b/src/resources/shaders/booster.fs new file mode 100644 index 0000000..ef9f47e --- /dev/null +++ b/src/resources/shaders/booster.fs @@ -0,0 +1,98 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 booster; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + MY_HIGHP_OR_MEDIUMP float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + MY_HIGHP_OR_MEDIUMP float t = time * 10.0 + 2003.; + MY_HIGHP_OR_MEDIUMP vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + MY_HIGHP_OR_MEDIUMP vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + MY_HIGHP_OR_MEDIUMP vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + MY_HIGHP_OR_MEDIUMP vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + MY_HIGHP_OR_MEDIUMP vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + MY_HIGHP_OR_MEDIUMP float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + MY_HIGHP_OR_MEDIUMP vec2 borders = vec2(0.2, 0.8); + + MY_HIGHP_OR_MEDIUMP float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + MY_HIGHP_OR_MEDIUMP vec4 tex = Texel( texture, texture_coords); + MY_HIGHP_OR_MEDIUMP vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + MY_HIGHP_OR_MEDIUMP number low = min(tex.r, min(tex.g, tex.b)); + MY_HIGHP_OR_MEDIUMP number high = max(tex.r, max(tex.g, tex.b)); + MY_HIGHP_OR_MEDIUMP number delta = max(high-low, low*0.7); + + MY_HIGHP_OR_MEDIUMP number fac = 0.8 + 0.9*sin(13.*uv.x+5.32*uv.y + booster.r*12. + cos(booster.r*5.3 + uv.y*4.2 - uv.x*4.)); + MY_HIGHP_OR_MEDIUMP number fac2 = 0.5 + 0.5*sin(10.*uv.x+2.32*uv.y + booster.r*5. - cos(booster.r*2.3 + uv.x*8.2)); + MY_HIGHP_OR_MEDIUMP number fac3 = 0.5 + 0.5*sin(12.*uv.x+6.32*uv.y + booster.r*6.111 + sin(booster.r*5.3 + uv.y*3.2)); + MY_HIGHP_OR_MEDIUMP number fac4 = 0.5 + 0.5*sin(4.*uv.x+2.32*uv.y + booster.r*8.111 + sin(booster.r*1.3 + uv.y*13.2)); + MY_HIGHP_OR_MEDIUMP number fac5 = sin(0.5*16.*uv.x+5.32*uv.y + booster.r*12. + cos(booster.r*5.3 + uv.y*4.2 - uv.x*4.)); + + MY_HIGHP_OR_MEDIUMP number maxfac = 0.6*max(max(fac, max(fac2, max(fac3,0.0))) + (fac+fac2+fac3*fac4), 0.); + + tex.rgb = tex.rgb*0.5 + vec3(0.4, 0.4, 0.8); + + tex.r = tex.r-delta + delta*maxfac*(0.7 + fac5*0.07) - 0.1; + tex.g = tex.g-delta + delta*maxfac*(0.7 - fac5*0.17) - 0.1; + tex.b = tex.b-delta + delta*maxfac*0.7 - 0.1; + tex.a = tex.a*(0.8*max(min(1., max(0.,0.3*max(low*0.2, delta)+ min(max(maxfac*0.1,0.), 0.4)) ), 0.) + 0.15*maxfac*(0.1+delta)); + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + MY_HIGHP_OR_MEDIUMP float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + MY_HIGHP_OR_MEDIUMP vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + MY_HIGHP_OR_MEDIUMP float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/debuff.fs b/src/resources/shaders/debuff.fs new file mode 100644 index 0000000..1656b75 --- /dev/null +++ b/src/resources/shaders/debuff.fs @@ -0,0 +1,149 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP vec2 debuff; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y == 0.) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + vec4 SAT = HSL(tex*0.8 + 0.2*vec4(1., 0., 0., tex.a)); + SAT.g = 0.5; + + number width = 0.0; + + if (debuff.g > 0.0 || debuff.g < 0.0) { + width = 0.1; + } + bool test = false; + if ((uv.x+uv.y > 1. - width && uv.x+uv.y < 1. + width) || ((1.-uv.x)+uv.y > 1. - width && (1.-uv.x)+uv.y < 1. + width)) + { + test = true; + SAT.r = 1.; + SAT.g = 0.7; + SAT.b = 0.8*SAT.b; + } else{ + SAT.g = SAT.g*0.5; + SAT.b = SAT.b*0.7; + } + + + tex = RGB(SAT); + if (!test){ + tex.a = tex.a*0.3; + } + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/dissolve.fs b/src/resources/shaders/dissolve.fs new file mode 100644 index 0000000..8a2aaa6 --- /dev/null +++ b/src/resources/shaders/dissolve.fs @@ -0,0 +1,86 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + MY_HIGHP_OR_MEDIUMP float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + MY_HIGHP_OR_MEDIUMP float t = time * 10.0 + 2003.; + MY_HIGHP_OR_MEDIUMP vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + MY_HIGHP_OR_MEDIUMP vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + MY_HIGHP_OR_MEDIUMP vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + MY_HIGHP_OR_MEDIUMP vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + MY_HIGHP_OR_MEDIUMP vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + MY_HIGHP_OR_MEDIUMP float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + MY_HIGHP_OR_MEDIUMP vec2 borders = vec2(0.2, 0.8); + + MY_HIGHP_OR_MEDIUMP float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + MY_HIGHP_OR_MEDIUMP vec4 tex = Texel( texture, texture_coords); + MY_HIGHP_OR_MEDIUMP vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + if (!shadow && dissolve > 0.01){ + if (burn_colour_2.a > 0.01){ + tex.rgb = tex.rgb*(1.-0.6*dissolve) + 0.6*burn_colour_2.rgb*dissolve; + } else if (burn_colour_1.a > 0.01){ + tex.rgb = tex.rgb*(1.-0.6*dissolve) + 0.6*burn_colour_1.rgb*dissolve; + } + } + + return dissolve_mask(tex, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + MY_HIGHP_OR_MEDIUMP float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + MY_HIGHP_OR_MEDIUMP vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + MY_HIGHP_OR_MEDIUMP float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/flame.fs b/src/resources/shaders/flame.fs new file mode 100644 index 0000000..8118c95 --- /dev/null +++ b/src/resources/shaders/flame.fs @@ -0,0 +1,69 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP float time; +extern MY_HIGHP_OR_MEDIUMP float amount; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_2; +extern MY_HIGHP_OR_MEDIUMP float id; + +#define PIXEL_SIZE_FAC 60. +#define WHITE vec4(1.,1.,1.,1.) + + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + float intensity = 1.0*min(10.,amount); + if(intensity < 0.1){ + return vec4(0.,0.,0.,0.); + } + + //Convert to UV coords (0-1) and floor for pixel effect + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba - 0.5; + vec2 floored_uv = (floor((uv*PIXEL_SIZE_FAC)))/PIXEL_SIZE_FAC; + vec2 uv_scaled_centered = (floored_uv); + uv_scaled_centered += uv_scaled_centered*0.01*(sin(-1.123*floored_uv.x + 0.2*time)*cos(5.3332*floored_uv.y + time*0.931)); + vec2 flame_up_vec = vec2(0., mod(4.*time, 10000.) - 5000. + mod(1.781*id, 1000.) ); + + float scale_fac = (7.5 + 3./(2. + 2.*intensity)); + vec2 sv = uv_scaled_centered*scale_fac + flame_up_vec; + float speed = mod(20.781*id, 100.) + 1.*sin(time+id)*cos(time*0.151+id); + vec2 sv2 = vec2(0.,0.); + + for(int i=0; i < 5; i++) { + sv2 += sv + 0.05*sv2.yx*(mod(float(i), 2.)>1.?-1.:1.) + 0.3*(cos(length(sv)*0.411) + 0.3344*sin(length(sv)) - 0.23*cos(length(sv))); + sv += 0.5*vec2( + cos(cos(sv2.y) + speed*0.0812)*sin(3.22 + (sv2.x) - speed*0.1531), + sin(-sv2.x*1.21222 + 0.113785*speed)*cos(sv2.y*0.91213 - 0.13582*speed)); + } + + //Make the smoke amount range from 0 - 2 + float smoke_res = max(0.,((length((sv - flame_up_vec)/scale_fac*5.)+ 0.1*(length(uv_scaled_centered) - 0.5))*(2./(2.+ intensity*0.2)))) ; + smoke_res = intensity < 0.1 ? 1.: smoke_res + max(0., 2. - 0.3*intensity)*max(0., 2.*(uv_scaled_centered.y - 0.5)*(uv_scaled_centered.y - 0.5)); + + if(abs(uv.x) > 0.4){ + smoke_res = smoke_res + 10.*(abs(uv.x) - 0.4); + } + if(length((uv - vec2(0., 0.1))*vec2(0.19, 1.)) < min(0.1, intensity*0.5) && smoke_res > 1.){ + smoke_res = smoke_res + min(8.5,intensity*10.)*(length((uv - vec2(0., 0.1))*vec2(0.19, 1.))-0.1); + } + + vec4 ret_col = colour_1; + if(smoke_res > 1.){ + ret_col.a = 0.; + }else{ + if( uv.y < 0.12){ + ret_col = ret_col*(1. - 0.5*(0.12 - uv.y)) + 2.5*(0.12 - uv.y)*colour_2; + ret_col += ret_col*(-2.+0.5*intensity*smoke_res)*(0.12 - uv.y); + } + ret_col.a = 1.; + } + + return ret_col; +} \ No newline at end of file diff --git a/src/resources/shaders/flash.fs b/src/resources/shaders/flash.fs new file mode 100644 index 0000000..fc4485a --- /dev/null +++ b/src/resources/shaders/flash.fs @@ -0,0 +1,23 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP number mid_flash; + +#define PIXEL_SIZE_FAC 700. + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //Convert to UV coords (0-1) and floor for pixel effect + number pixel_size = length(love_ScreenSize.xy)/PIXEL_SIZE_FAC; + vec2 uv = (floor(screen_coords.xy*(1./pixel_size))*pixel_size - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + + float mid_white = min(1.,(time > 2.5 ? max(0., sqrt(time - 2.5) - 60.*length(uv)) : 0.) + + (time > 11. ? max(0., (time-11.)*(time-11.) - 5.*length(uv)) : 0.)); + + return vec4(1., 1., 1., mid_flash*mid_white); +} \ No newline at end of file diff --git a/src/resources/shaders/foil.fs b/src/resources/shaders/foil.fs new file mode 100644 index 0000000..fbd221f --- /dev/null +++ b/src/resources/shaders/foil.fs @@ -0,0 +1,143 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP vec2 foil; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y < 0.0001) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel( texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + vec2 adjusted_uv = uv - vec2(0.5, 0.5); + adjusted_uv.x = adjusted_uv.x*texture_details.b/texture_details.a; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = min(high, max(0.5, 1. - low)); + + number fac = max(min(2.*sin((length(90.*adjusted_uv) + foil.r*2.) + 3.*(1.+0.8*cos(length(113.1121*adjusted_uv) - foil.r*3.121))) - 1. - max(5.-length(90.*adjusted_uv), 0.), 1.), 0.); + vec2 rotater = vec2(cos(foil.r*0.1221), sin(foil.r*0.3512)); + number angle = dot(rotater, adjusted_uv)/(length(rotater)*length(adjusted_uv)); + number fac2 = max(min(5.*cos(foil.g*0.3 + angle*3.14*(2.2+0.9*sin(foil.r*1.65 + 0.2*foil.g))) - 4. - max(2.-length(20.*adjusted_uv), 0.), 1.), 0.); + number fac3 = 0.3*max(min(2.*sin(foil.r*5. + uv.x*3. + 3.*(1.+0.5*cos(foil.r*7.))) - 1., 1.), -1.); + number fac4 = 0.3*max(min(2.*sin(foil.r*6.66 + uv.y*3.8 + 3.*(1.+0.5*cos(foil.r*3.414))) - 1., 1.), -1.); + + number maxfac = max(max(fac, max(fac2, max(fac3, max(fac4, 0.0)))) + 2.2*(fac+fac2+fac3+fac4), 0.); + + tex.r = tex.r-delta + delta*maxfac*0.3; + tex.g = tex.g-delta + delta*maxfac*0.3; + tex.b = tex.b + delta*maxfac*1.9; + tex.a = min(tex.a, 0.3*tex.a + 0.9*min(0.5, maxfac*0.1)); + + return dissolve_mask(tex, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/gold_seal.fs b/src/resources/shaders/gold_seal.fs new file mode 100644 index 0000000..850dd31 --- /dev/null +++ b/src/resources/shaders/gold_seal.fs @@ -0,0 +1,22 @@ +extern vec4 gold_seal; + +vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //r controls timing + //a controls alpha, but white will always be 1 + vec4 pixel; + pixel = Texel(texture, texture_coords); + number low = min(pixel.r, min(pixel.g, pixel.b)); + number high = max(pixel.r, max(pixel.g, pixel.b)); + number delta; + delta = high*0.5; + + number fac; + fac = 0.3+sin((texture_coords.x*450. + sin(gold_seal.r*6.)*180.)-700.*gold_seal.r) - sin((texture_coords.x*190. + texture_coords.y*30.)+1080.3*gold_seal.r); + + pixel.r = max(pixel.r, (1. - pixel.r)*delta*fac + pixel.r); + pixel.g = max(pixel.g, (1. - pixel.g)*delta*fac + pixel.g); + pixel.b = max(pixel.b, (1. - pixel.b)*delta*fac + pixel.b); + + return pixel; +} \ No newline at end of file diff --git a/src/resources/shaders/holo.fs b/src/resources/shaders/holo.fs new file mode 100644 index 0000000..c1d2d54 --- /dev/null +++ b/src/resources/shaders/holo.fs @@ -0,0 +1,152 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 holo; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y < 0.0001) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + vec4 hsl = HSL(0.5*tex + 0.5*vec4(0.,0.,1.,tex.a)); + + float t = holo.y*7.221 + time; + vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba; + vec2 uv_scaled_centered = (floored_uv - 0.5) * 250.; + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + + float res = (.5 + .5* cos( (holo.x) * 2.612 + ( field + -.5 ) *3.14)); + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = 0.2+0.3*(high- low) + 0.1*high; + + number gridsize = 0.79; + number fac = 0.5*max(max(max(0., 7.*abs(cos(uv.x*gridsize*20.))-6.),max(0., 7.*cos(uv.y*gridsize*45. + uv.x*gridsize*20.)-6.)), max(0., 7.*cos(uv.y*gridsize*45. - uv.x*gridsize*20.)-6.)); + + hsl.x = hsl.x + res + fac; + hsl.y = hsl.y*1.3; + hsl.z = hsl.z*0.6+0.4; + + tex =(1.-delta)*tex + delta*RGB(hsl)*vec4(0.9,0.8,1.2,tex.a); + + if (tex[3] < 0.7) + tex[3] = tex[3]/3.; + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/hologram.fs b/src/resources/shaders/hologram.fs new file mode 100644 index 0000000..c101f70 --- /dev/null +++ b/src/resources/shaders/hologram.fs @@ -0,0 +1,129 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 hologram; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //Glow effect + number glow = 0.; + int glow_samples = 4; + int actual_glow_samples = 0; + number glow_dist = 0.0015; + number _a = 0.; + + for (int i = -glow_samples; i <= glow_samples; ++i){ + for (int j = -glow_samples; j <= glow_samples; ++j){ + _a = Texel( texture, texture_coords + (glow_dist)*vec2(float(i), float(j))).a; + if (_a < 0.9){ + actual_glow_samples += 1; + glow = glow + _a; + } + } + } + glow /= 0.7*float(actual_glow_samples); + + //Create the horizontal glitch offset effects + number offset_l = 0.; + number offset_r = 0.; + number timefac = 1.0*hologram.g; + offset_l = -10.0*(-0.5+sin(timefac*0.512 + texture_coords.y*14.0) + + sin(-timefac*0.8233 + texture_coords.y*11.532) + + sin(timefac*0.333 + texture_coords.y*13.3) + + sin(-timefac*0.1112331 + texture_coords.y*4.044343)); + offset_r = -10.0*(-0.5+sin(timefac*0.6924 + texture_coords.y*19.0) + + sin(-timefac*0.9661 + texture_coords.y*21.532) + + sin(timefac*0.4423 + texture_coords.y*30.3) + + sin(-timefac*0.13321312 + texture_coords.y*3.011)); + if (offset_r >= 1.5 || offset_r <= 0.){offset_r = 0.;} + if (offset_l >= 1.5 || offset_l <= 0.){offset_l = 0.;} + texture_coords.x = texture_coords.x + 0.002*(-offset_l + offset_r); + + vec4 tex = Texel( texture, texture_coords); + if (tex.a > 0.999){tex = vec4(0.,0.,0.,0.);} + if (tex.a < 0.001){tex.rgb = vec3(0.,1.,1.);} + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + if (uv.x >0.95 || uv.x < 0.05 || uv.y > 0.95 || uv.y < 0.05){ + return vec4(0.,0.,0.,0.); + } + + number light_strength = 0.4*(0.3*sin(2.*hologram.g) + 0.6 + 0.3*sin(hologram.r*3.) + 0.9); + vec4 final_col; + if (tex.a < 0.001){ + final_col = tex*colour + vec4(0., 1., .5,0.6)*light_strength*(1.+abs(offset_l)+abs(offset_r))*glow; + } + else{ + final_col = tex*colour + vec4(0., 0.3, 0.2,0.3)*light_strength*(1.+abs(offset_l)+abs(offset_r))*glow; + } + +// + return dissolve_mask(final_col, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/negative.fs b/src/resources/shaders/negative.fs new file mode 100644 index 0000000..689f8e1 --- /dev/null +++ b/src/resources/shaders/negative.fs @@ -0,0 +1,133 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 negative; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y < 0.0001) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + vec4 SAT = HSL(tex); + + if (negative.g > 0.0 || negative.g < 0.0) { + SAT.b = (1.-SAT.b); + } + SAT.r = -SAT.r+0.2; + + tex = RGB(SAT) + 0.8*vec4(79./255., 99./255.,103./255.,0.); + + if (tex[3] < 0.7) + tex[3] = tex[3]/3.; + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/negative_shine.fs b/src/resources/shaders/negative_shine.fs new file mode 100644 index 0000000..c168779 --- /dev/null +++ b/src/resources/shaders/negative_shine.fs @@ -0,0 +1,98 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 negative_shine; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel( texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = high-low -0.1; + + number fac = 0.8 + 0.9*sin(11.*uv.x+4.32*uv.y + negative_shine.r*12. + cos(negative_shine.r*5.3 + uv.y*4.2 - uv.x*4.)); + number fac2 = 0.5 + 0.5*sin(8.*uv.x+2.32*uv.y + negative_shine.r*5. - cos(negative_shine.r*2.3 + uv.x*8.2)); + number fac3 = 0.5 + 0.5*sin(10.*uv.x+5.32*uv.y + negative_shine.r*6.111 + sin(negative_shine.r*5.3 + uv.y*3.2)); + number fac4 = 0.5 + 0.5*sin(3.*uv.x+2.32*uv.y + negative_shine.r*8.111 + sin(negative_shine.r*1.3 + uv.y*11.2)); + number fac5 = sin(0.9*16.*uv.x+5.32*uv.y + negative_shine.r*12. + cos(negative_shine.r*5.3 + uv.y*4.2 - uv.x*4.)); + + number maxfac = 0.7*max(max(fac, max(fac2, max(fac3,0.0))) + (fac+fac2+fac3*fac4), 0.); + + tex.rgb = tex.rgb*0.5 + vec3(0.4, 0.4, 0.8); + + tex.r = tex.r-delta + delta*maxfac*(0.7 + fac5*0.27) - 0.1; + tex.g = tex.g-delta + delta*maxfac*(0.7 - fac5*0.27) - 0.1; + tex.b = tex.b-delta + delta*maxfac*0.7 - 0.1; + tex.a = tex.a*(0.5*max(min(1., max(0.,0.3*max(low*0.2, delta)+ min(max(maxfac*0.1,0.), 0.4)) ), 0.) + 0.15*maxfac*(0.1+delta)); + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/played.fs b/src/resources/shaders/played.fs new file mode 100644 index 0000000..6e0533a --- /dev/null +++ b/src/resources/shaders/played.fs @@ -0,0 +1,130 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP vec2 played; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y == 0.) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + vec4 SAT = HSL(tex); + SAT.g = SAT.g*0.5 + 0.000001*played.r; + SAT.b = SAT.b*0.8; + + tex = RGB(SAT); + tex.a = tex.a*0.5; + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/polychrome.fs b/src/resources/shaders/polychrome.fs new file mode 100644 index 0000000..1197afe --- /dev/null +++ b/src/resources/shaders/polychrome.fs @@ -0,0 +1,150 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 polychrome; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y < 0.0001) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = high - low; + + number saturation_fac = 1. - max(0., 0.05*(1.1-delta)); + + vec4 hsl = HSL(vec4(tex.r*saturation_fac, tex.g*saturation_fac, tex.b, tex.a)); + + float t = polychrome.y*2.221 + time; + vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba; + vec2 uv_scaled_centered = (floored_uv - 0.5) * 50.; + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + + float res = (.5 + .5* cos( (polychrome.x) * 2.612 + ( field + -.5 ) *3.14)); + hsl.x = hsl.x+ res + polychrome.y*0.04; + hsl.y = min(0.6,hsl.y+0.5); + + tex.rgb = RGB(hsl).rgb; + + if (tex[3] < 0.7) + tex[3] = tex[3]/3.; + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/skew.fs b/src/resources/shaders/skew.fs new file mode 100644 index 0000000..4934eed --- /dev/null +++ b/src/resources/shaders/skew.fs @@ -0,0 +1,18 @@ +extern vec2 mouse_screen_pos; +extern float hovering; +extern float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/splash.fs b/src/resources/shaders/splash.fs new file mode 100644 index 0000000..5f5293d --- /dev/null +++ b/src/resources/shaders/splash.fs @@ -0,0 +1,56 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP number vort_speed; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_2; +extern MY_HIGHP_OR_MEDIUMP number mid_flash; +extern MY_HIGHP_OR_MEDIUMP number vort_offset; + +#define PIXEL_SIZE_FAC 700. +#define BLACK 0.6*vec4(79./255.,99./255., 103./255., 1./0.6) + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //Convert to UV coords (0-1) and floor for pixel effect + MY_HIGHP_OR_MEDIUMP number pixel_size = length(love_ScreenSize.xy)/PIXEL_SIZE_FAC; + MY_HIGHP_OR_MEDIUMP vec2 uv = (floor(screen_coords.xy*(1./pixel_size))*pixel_size - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + MY_HIGHP_OR_MEDIUMP number uv_len = length(uv); + + //Adding in a center swirl, changes with time + MY_HIGHP_OR_MEDIUMP number speed = time*vort_speed; + MY_HIGHP_OR_MEDIUMP number new_pixel_angle = atan(uv.y, uv.x) + (2.2 + 0.4*min(6.,speed))*uv_len - 1. - speed*0.05 - min(6.,speed)*speed*0.02 + vort_offset; + MY_HIGHP_OR_MEDIUMP vec2 mid = (love_ScreenSize.xy/length(love_ScreenSize.xy))/2.; + MY_HIGHP_OR_MEDIUMP vec2 sv = vec2((uv_len * cos(new_pixel_angle) + mid.x), (uv_len * sin(new_pixel_angle) + mid.y)) - mid; + + //Now add the smoke effect to the swirled UV + + sv *= 30.; + speed = time*(6.)*vort_speed + vort_offset + 1033.; + MY_HIGHP_OR_MEDIUMP vec2 uv2 = vec2(sv.x+sv.y); + + for(int i=0; i < 5; i++) { + uv2 += sin(max(sv.x, sv.y)) + sv; + sv += 0.5*vec2(cos(5.1123314 + 0.353*uv2.y + speed*0.131121),sin(uv2.x - 0.113*speed)); + sv -= 1.0*cos(sv.x + sv.y) - 1.0*sin(sv.x*0.711 - sv.y); + } + + //Make the smoke amount range from 0 - 2 + MY_HIGHP_OR_MEDIUMP number smoke_res =min(2., max(-2., 1.5 + length(sv)*0.12 - 0.17*(min(10.,time*1.2 - 4.)))); + if (smoke_res < 0.2) { + smoke_res = (smoke_res - 0.2)*0.6 + 0.2; + } + + MY_HIGHP_OR_MEDIUMP number c1p = max(0.,1. - 2.*abs(1.-smoke_res)); + MY_HIGHP_OR_MEDIUMP number c2p = max(0.,1. - 2.*(smoke_res)); + MY_HIGHP_OR_MEDIUMP number cb = 1. - min(1., c1p + c2p); + + MY_HIGHP_OR_MEDIUMP vec4 ret_col = colour_1*c1p + colour_2*c2p + vec4(cb*BLACK.rgb, cb*colour_1.a); + MY_HIGHP_OR_MEDIUMP number mod_flash = max(mid_flash*0.8, max(c1p, c2p)*5. - 4.4) + mid_flash*max(c1p, c2p); + + return ret_col*(1. - mod_flash) + mod_flash*vec4(1., 1., 1., 1.); +} \ No newline at end of file diff --git a/src/resources/shaders/vortex.fs b/src/resources/shaders/vortex.fs new file mode 100644 index 0000000..da1eb38 --- /dev/null +++ b/src/resources/shaders/vortex.fs @@ -0,0 +1,21 @@ +extern float vortex_amt; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + vec2 uv = (vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + + float effectRadius = 1.6 - 0.05*vortex_amt; + float effectAngle = 0.5 + 0.15*vortex_amt; + + float len = length(uv * vec2(love_ScreenSize.x / love_ScreenSize.y, 1.)); + float angle = atan(uv.y, uv.x) + effectAngle * smoothstep(effectRadius, 0., len); + float radius = length(uv); + + vec2 center = 0.5*love_ScreenSize.xy/length(love_ScreenSize.xy); + + vertex_position.x = (radius * cos(angle) + center.x)*length(love_ScreenSize.xy); + vertex_position.y = (radius * sin(angle) + center.y)*length(love_ScreenSize.xy); + return transform_projection * vertex_position; +} +#endif \ No newline at end of file diff --git a/src/resources/shaders/voucher.fs b/src/resources/shaders/voucher.fs new file mode 100644 index 0000000..5031cde --- /dev/null +++ b/src/resources/shaders/voucher.fs @@ -0,0 +1,98 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 voucher; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel( texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = high-low; + + number fac = 0.8 + 0.9*sin(13.*uv.x+5.32*uv.y + voucher.r*12. + cos(voucher.r*5.3 + uv.y*4.2 - uv.x*4.)); + number fac2 = 0.5 + 0.5*sin(10.*uv.x+2.32*uv.y + voucher.r*5. - cos(voucher.r*2.3 + uv.x*8.2)); + number fac3 = 0.5 + 0.5*sin(12.*uv.x+6.32*uv.y + voucher.r*6.111 + sin(voucher.r*5.3 + uv.y*3.2)); + number fac4 = 0.5 + 0.5*sin(4.*uv.x+2.32*uv.y + voucher.r*8.111 + sin(voucher.r*1.3 + uv.y*13.2)); + number fac5 = sin(0.5*16.*uv.x+5.32*uv.y + voucher.r*12. + cos(voucher.r*5.3 + uv.y*4.2 - uv.x*4.)); + + number maxfac = 0.6*max(max(fac, max(fac2, max(fac3,0.0))) + (fac+fac2+fac3*fac4), 0.); + + tex.rgb = tex.rgb*0.5 + vec3(0.4, 0.4, 0.8); + + tex.r = tex.r-delta + delta*maxfac*(0.7 + fac5*0.07) - 0.1; + tex.g = tex.g-delta + delta*maxfac*(0.7 - fac5*0.17) - 0.1; + tex.b = tex.b-delta + delta*maxfac*0.7 - 0.1; + tex.a = tex.a*(0.8*max(min(1., max(0.,0.3*max(low*0.2, delta)+ min(max(maxfac*0.1,0.), 0.4)) ), 0.) + 0.15*maxfac*(0.1+delta)); + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/src/resources/sounds/ambientFire1.ogg b/src/resources/sounds/ambientFire1.ogg new file mode 100644 index 0000000..fb30ee0 Binary files /dev/null and b/src/resources/sounds/ambientFire1.ogg differ diff --git a/src/resources/sounds/ambientFire2.ogg b/src/resources/sounds/ambientFire2.ogg new file mode 100644 index 0000000..8e47da1 Binary files /dev/null and b/src/resources/sounds/ambientFire2.ogg differ diff --git a/src/resources/sounds/ambientFire3.ogg b/src/resources/sounds/ambientFire3.ogg new file mode 100644 index 0000000..7846b71 Binary files /dev/null and b/src/resources/sounds/ambientFire3.ogg differ diff --git a/src/resources/sounds/ambientOrgan1.ogg b/src/resources/sounds/ambientOrgan1.ogg new file mode 100644 index 0000000..93dd7de Binary files /dev/null and b/src/resources/sounds/ambientOrgan1.ogg differ diff --git a/src/resources/sounds/button.ogg b/src/resources/sounds/button.ogg new file mode 100644 index 0000000..226d626 Binary files /dev/null and b/src/resources/sounds/button.ogg differ diff --git a/src/resources/sounds/cancel.ogg b/src/resources/sounds/cancel.ogg new file mode 100644 index 0000000..14059f9 Binary files /dev/null and b/src/resources/sounds/cancel.ogg differ diff --git a/src/resources/sounds/card1.ogg b/src/resources/sounds/card1.ogg new file mode 100644 index 0000000..6b8b67a Binary files /dev/null and b/src/resources/sounds/card1.ogg differ diff --git a/src/resources/sounds/card3.ogg b/src/resources/sounds/card3.ogg new file mode 100644 index 0000000..4d9ffe5 Binary files /dev/null and b/src/resources/sounds/card3.ogg differ diff --git a/src/resources/sounds/cardFan2.ogg b/src/resources/sounds/cardFan2.ogg new file mode 100644 index 0000000..4d0fe22 Binary files /dev/null and b/src/resources/sounds/cardFan2.ogg differ diff --git a/src/resources/sounds/cardSlide1.ogg b/src/resources/sounds/cardSlide1.ogg new file mode 100644 index 0000000..22cb1a7 Binary files /dev/null and b/src/resources/sounds/cardSlide1.ogg differ diff --git a/src/resources/sounds/cardSlide2.ogg b/src/resources/sounds/cardSlide2.ogg new file mode 100644 index 0000000..3fc4fe9 Binary files /dev/null and b/src/resources/sounds/cardSlide2.ogg differ diff --git a/src/resources/sounds/chips1.ogg b/src/resources/sounds/chips1.ogg new file mode 100644 index 0000000..c953e73 Binary files /dev/null and b/src/resources/sounds/chips1.ogg differ diff --git a/src/resources/sounds/chips2.ogg b/src/resources/sounds/chips2.ogg new file mode 100644 index 0000000..2a3f9d7 Binary files /dev/null and b/src/resources/sounds/chips2.ogg differ diff --git a/src/resources/sounds/coin1.ogg b/src/resources/sounds/coin1.ogg new file mode 100644 index 0000000..3262684 Binary files /dev/null and b/src/resources/sounds/coin1.ogg differ diff --git a/src/resources/sounds/coin2.ogg b/src/resources/sounds/coin2.ogg new file mode 100644 index 0000000..4840b3c Binary files /dev/null and b/src/resources/sounds/coin2.ogg differ diff --git a/src/resources/sounds/coin3.ogg b/src/resources/sounds/coin3.ogg new file mode 100644 index 0000000..d20899d Binary files /dev/null and b/src/resources/sounds/coin3.ogg differ diff --git a/src/resources/sounds/coin4.ogg b/src/resources/sounds/coin4.ogg new file mode 100644 index 0000000..263e53d Binary files /dev/null and b/src/resources/sounds/coin4.ogg differ diff --git a/src/resources/sounds/coin5.ogg b/src/resources/sounds/coin5.ogg new file mode 100644 index 0000000..fd40a16 Binary files /dev/null and b/src/resources/sounds/coin5.ogg differ diff --git a/src/resources/sounds/coin6.ogg b/src/resources/sounds/coin6.ogg new file mode 100644 index 0000000..046ab3d Binary files /dev/null and b/src/resources/sounds/coin6.ogg differ diff --git a/src/resources/sounds/coin7.ogg b/src/resources/sounds/coin7.ogg new file mode 100644 index 0000000..1140d4b Binary files /dev/null and b/src/resources/sounds/coin7.ogg differ diff --git a/src/resources/sounds/crumple1.ogg b/src/resources/sounds/crumple1.ogg new file mode 100644 index 0000000..e23e3cf Binary files /dev/null and b/src/resources/sounds/crumple1.ogg differ diff --git a/src/resources/sounds/crumple2.ogg b/src/resources/sounds/crumple2.ogg new file mode 100644 index 0000000..8525f8c Binary files /dev/null and b/src/resources/sounds/crumple2.ogg differ diff --git a/src/resources/sounds/crumple3.ogg b/src/resources/sounds/crumple3.ogg new file mode 100644 index 0000000..bf102aa Binary files /dev/null and b/src/resources/sounds/crumple3.ogg differ diff --git a/src/resources/sounds/crumple4.ogg b/src/resources/sounds/crumple4.ogg new file mode 100644 index 0000000..2ad288b Binary files /dev/null and b/src/resources/sounds/crumple4.ogg differ diff --git a/src/resources/sounds/crumple5.ogg b/src/resources/sounds/crumple5.ogg new file mode 100644 index 0000000..970af6f Binary files /dev/null and b/src/resources/sounds/crumple5.ogg differ diff --git a/src/resources/sounds/crumpleLong1.ogg b/src/resources/sounds/crumpleLong1.ogg new file mode 100644 index 0000000..2e26e93 Binary files /dev/null and b/src/resources/sounds/crumpleLong1.ogg differ diff --git a/src/resources/sounds/crumpleLong2.ogg b/src/resources/sounds/crumpleLong2.ogg new file mode 100644 index 0000000..dfee185 Binary files /dev/null and b/src/resources/sounds/crumpleLong2.ogg differ diff --git a/src/resources/sounds/explosion1.ogg b/src/resources/sounds/explosion1.ogg new file mode 100644 index 0000000..ac1d1f7 Binary files /dev/null and b/src/resources/sounds/explosion1.ogg differ diff --git a/src/resources/sounds/explosion_buildup1.ogg b/src/resources/sounds/explosion_buildup1.ogg new file mode 100644 index 0000000..19ba006 Binary files /dev/null and b/src/resources/sounds/explosion_buildup1.ogg differ diff --git a/src/resources/sounds/explosion_release1.ogg b/src/resources/sounds/explosion_release1.ogg new file mode 100644 index 0000000..d950551 Binary files /dev/null and b/src/resources/sounds/explosion_release1.ogg differ diff --git a/src/resources/sounds/foil1.ogg b/src/resources/sounds/foil1.ogg new file mode 100644 index 0000000..f234c5e Binary files /dev/null and b/src/resources/sounds/foil1.ogg differ diff --git a/src/resources/sounds/foil2.ogg b/src/resources/sounds/foil2.ogg new file mode 100644 index 0000000..754c567 Binary files /dev/null and b/src/resources/sounds/foil2.ogg differ diff --git a/src/resources/sounds/generic1.ogg b/src/resources/sounds/generic1.ogg new file mode 100644 index 0000000..d5d6a20 Binary files /dev/null and b/src/resources/sounds/generic1.ogg differ diff --git a/src/resources/sounds/glass1.ogg b/src/resources/sounds/glass1.ogg new file mode 100644 index 0000000..31ae330 Binary files /dev/null and b/src/resources/sounds/glass1.ogg differ diff --git a/src/resources/sounds/glass2.ogg b/src/resources/sounds/glass2.ogg new file mode 100644 index 0000000..6e5c139 Binary files /dev/null and b/src/resources/sounds/glass2.ogg differ diff --git a/src/resources/sounds/glass3.ogg b/src/resources/sounds/glass3.ogg new file mode 100644 index 0000000..659eefa Binary files /dev/null and b/src/resources/sounds/glass3.ogg differ diff --git a/src/resources/sounds/glass4.ogg b/src/resources/sounds/glass4.ogg new file mode 100644 index 0000000..b2f90f4 Binary files /dev/null and b/src/resources/sounds/glass4.ogg differ diff --git a/src/resources/sounds/glass5.ogg b/src/resources/sounds/glass5.ogg new file mode 100644 index 0000000..52d86c4 Binary files /dev/null and b/src/resources/sounds/glass5.ogg differ diff --git a/src/resources/sounds/glass6.ogg b/src/resources/sounds/glass6.ogg new file mode 100644 index 0000000..d7cf979 Binary files /dev/null and b/src/resources/sounds/glass6.ogg differ diff --git a/src/resources/sounds/gold_seal.ogg b/src/resources/sounds/gold_seal.ogg new file mode 100644 index 0000000..8dd3d70 Binary files /dev/null and b/src/resources/sounds/gold_seal.ogg differ diff --git a/src/resources/sounds/gong.ogg b/src/resources/sounds/gong.ogg new file mode 100644 index 0000000..0cf31ad Binary files /dev/null and b/src/resources/sounds/gong.ogg differ diff --git a/src/resources/sounds/highlight1.ogg b/src/resources/sounds/highlight1.ogg new file mode 100644 index 0000000..db0b4a1 Binary files /dev/null and b/src/resources/sounds/highlight1.ogg differ diff --git a/src/resources/sounds/highlight2.ogg b/src/resources/sounds/highlight2.ogg new file mode 100644 index 0000000..1dff921 Binary files /dev/null and b/src/resources/sounds/highlight2.ogg differ diff --git a/src/resources/sounds/holo1.ogg b/src/resources/sounds/holo1.ogg new file mode 100644 index 0000000..2d7d366 Binary files /dev/null and b/src/resources/sounds/holo1.ogg differ diff --git a/src/resources/sounds/introPad1.ogg b/src/resources/sounds/introPad1.ogg new file mode 100644 index 0000000..d2199bd Binary files /dev/null and b/src/resources/sounds/introPad1.ogg differ diff --git a/src/resources/sounds/magic_crumple.ogg b/src/resources/sounds/magic_crumple.ogg new file mode 100644 index 0000000..36b5cc4 Binary files /dev/null and b/src/resources/sounds/magic_crumple.ogg differ diff --git a/src/resources/sounds/magic_crumple2.ogg b/src/resources/sounds/magic_crumple2.ogg new file mode 100644 index 0000000..9569f0e Binary files /dev/null and b/src/resources/sounds/magic_crumple2.ogg differ diff --git a/src/resources/sounds/magic_crumple3.ogg b/src/resources/sounds/magic_crumple3.ogg new file mode 100644 index 0000000..6cc136f Binary files /dev/null and b/src/resources/sounds/magic_crumple3.ogg differ diff --git a/src/resources/sounds/multhit1.ogg b/src/resources/sounds/multhit1.ogg new file mode 100644 index 0000000..c578f67 Binary files /dev/null and b/src/resources/sounds/multhit1.ogg differ diff --git a/src/resources/sounds/multhit2.ogg b/src/resources/sounds/multhit2.ogg new file mode 100644 index 0000000..be2903a Binary files /dev/null and b/src/resources/sounds/multhit2.ogg differ diff --git a/src/resources/sounds/music1.ogg b/src/resources/sounds/music1.ogg new file mode 100644 index 0000000..71ebb23 Binary files /dev/null and b/src/resources/sounds/music1.ogg differ diff --git a/src/resources/sounds/music2.ogg b/src/resources/sounds/music2.ogg new file mode 100644 index 0000000..8ff5784 Binary files /dev/null and b/src/resources/sounds/music2.ogg differ diff --git a/src/resources/sounds/music3.ogg b/src/resources/sounds/music3.ogg new file mode 100644 index 0000000..6ccdbc3 Binary files /dev/null and b/src/resources/sounds/music3.ogg differ diff --git a/src/resources/sounds/music4.ogg b/src/resources/sounds/music4.ogg new file mode 100644 index 0000000..8590901 Binary files /dev/null and b/src/resources/sounds/music4.ogg differ diff --git a/src/resources/sounds/music5.ogg b/src/resources/sounds/music5.ogg new file mode 100644 index 0000000..1db4df5 Binary files /dev/null and b/src/resources/sounds/music5.ogg differ diff --git a/src/resources/sounds/negative.ogg b/src/resources/sounds/negative.ogg new file mode 100644 index 0000000..b0b1805 Binary files /dev/null and b/src/resources/sounds/negative.ogg differ diff --git a/src/resources/sounds/other1.ogg b/src/resources/sounds/other1.ogg new file mode 100644 index 0000000..eb24357 Binary files /dev/null and b/src/resources/sounds/other1.ogg differ diff --git a/src/resources/sounds/paper1.ogg b/src/resources/sounds/paper1.ogg new file mode 100644 index 0000000..0f1efef Binary files /dev/null and b/src/resources/sounds/paper1.ogg differ diff --git a/src/resources/sounds/polychrome1.ogg b/src/resources/sounds/polychrome1.ogg new file mode 100644 index 0000000..96a5f42 Binary files /dev/null and b/src/resources/sounds/polychrome1.ogg differ diff --git a/src/resources/sounds/slice1.ogg b/src/resources/sounds/slice1.ogg new file mode 100644 index 0000000..65889da Binary files /dev/null and b/src/resources/sounds/slice1.ogg differ diff --git a/src/resources/sounds/splash_buildup.ogg b/src/resources/sounds/splash_buildup.ogg new file mode 100644 index 0000000..0f2d9b7 Binary files /dev/null and b/src/resources/sounds/splash_buildup.ogg differ diff --git a/src/resources/sounds/tarot1.ogg b/src/resources/sounds/tarot1.ogg new file mode 100644 index 0000000..51ba5bc Binary files /dev/null and b/src/resources/sounds/tarot1.ogg differ diff --git a/src/resources/sounds/tarot2.ogg b/src/resources/sounds/tarot2.ogg new file mode 100644 index 0000000..fbc8913 Binary files /dev/null and b/src/resources/sounds/tarot2.ogg differ diff --git a/src/resources/sounds/timpani.ogg b/src/resources/sounds/timpani.ogg new file mode 100644 index 0000000..3a47ded Binary files /dev/null and b/src/resources/sounds/timpani.ogg differ diff --git a/src/resources/sounds/voice1.ogg b/src/resources/sounds/voice1.ogg new file mode 100644 index 0000000..afa722e Binary files /dev/null and b/src/resources/sounds/voice1.ogg differ diff --git a/src/resources/sounds/voice10.ogg b/src/resources/sounds/voice10.ogg new file mode 100644 index 0000000..b1083ee Binary files /dev/null and b/src/resources/sounds/voice10.ogg differ diff --git a/src/resources/sounds/voice11.ogg b/src/resources/sounds/voice11.ogg new file mode 100644 index 0000000..ddb6823 Binary files /dev/null and b/src/resources/sounds/voice11.ogg differ diff --git a/src/resources/sounds/voice2.ogg b/src/resources/sounds/voice2.ogg new file mode 100644 index 0000000..5e7124f Binary files /dev/null and b/src/resources/sounds/voice2.ogg differ diff --git a/src/resources/sounds/voice3.ogg b/src/resources/sounds/voice3.ogg new file mode 100644 index 0000000..6238b88 Binary files /dev/null and b/src/resources/sounds/voice3.ogg differ diff --git a/src/resources/sounds/voice4.ogg b/src/resources/sounds/voice4.ogg new file mode 100644 index 0000000..28d4673 Binary files /dev/null and b/src/resources/sounds/voice4.ogg differ diff --git a/src/resources/sounds/voice5.ogg b/src/resources/sounds/voice5.ogg new file mode 100644 index 0000000..664de83 Binary files /dev/null and b/src/resources/sounds/voice5.ogg differ diff --git a/src/resources/sounds/voice6.ogg b/src/resources/sounds/voice6.ogg new file mode 100644 index 0000000..e4acc6a Binary files /dev/null and b/src/resources/sounds/voice6.ogg differ diff --git a/src/resources/sounds/voice7.ogg b/src/resources/sounds/voice7.ogg new file mode 100644 index 0000000..3974e41 Binary files /dev/null and b/src/resources/sounds/voice7.ogg differ diff --git a/src/resources/sounds/voice8.ogg b/src/resources/sounds/voice8.ogg new file mode 100644 index 0000000..d6ee50f Binary files /dev/null and b/src/resources/sounds/voice8.ogg differ diff --git a/src/resources/sounds/voice9.ogg b/src/resources/sounds/voice9.ogg new file mode 100644 index 0000000..ea409f8 Binary files /dev/null and b/src/resources/sounds/voice9.ogg differ diff --git a/src/resources/sounds/whoosh.ogg b/src/resources/sounds/whoosh.ogg new file mode 100644 index 0000000..a9aa892 Binary files /dev/null and b/src/resources/sounds/whoosh.ogg differ diff --git a/src/resources/sounds/whoosh1.ogg b/src/resources/sounds/whoosh1.ogg new file mode 100644 index 0000000..f8fadcc Binary files /dev/null and b/src/resources/sounds/whoosh1.ogg differ diff --git a/src/resources/sounds/whoosh2.ogg b/src/resources/sounds/whoosh2.ogg new file mode 100644 index 0000000..5c3ee83 Binary files /dev/null and b/src/resources/sounds/whoosh2.ogg differ diff --git a/src/resources/sounds/whoosh_long.ogg b/src/resources/sounds/whoosh_long.ogg new file mode 100644 index 0000000..098a29b Binary files /dev/null and b/src/resources/sounds/whoosh_long.ogg differ diff --git a/src/resources/sounds/win.ogg b/src/resources/sounds/win.ogg new file mode 100644 index 0000000..e8d69d3 Binary files /dev/null and b/src/resources/sounds/win.ogg differ diff --git a/src/resources/textures/1x/8BitDeck.png b/src/resources/textures/1x/8BitDeck.png new file mode 100644 index 0000000..6661550 Binary files /dev/null and b/src/resources/textures/1x/8BitDeck.png differ diff --git a/src/resources/textures/1x/8BitDeck_opt2.png b/src/resources/textures/1x/8BitDeck_opt2.png new file mode 100644 index 0000000..39b931f Binary files /dev/null and b/src/resources/textures/1x/8BitDeck_opt2.png differ diff --git a/src/resources/textures/1x/BlindChips.png b/src/resources/textures/1x/BlindChips.png new file mode 100644 index 0000000..37fcbc1 Binary files /dev/null and b/src/resources/textures/1x/BlindChips.png differ diff --git a/src/resources/textures/1x/Enhancers.png b/src/resources/textures/1x/Enhancers.png new file mode 100644 index 0000000..e0cf3cc Binary files /dev/null and b/src/resources/textures/1x/Enhancers.png differ diff --git a/src/resources/textures/1x/Jokers.png b/src/resources/textures/1x/Jokers.png new file mode 100644 index 0000000..2d41248 Binary files /dev/null and b/src/resources/textures/1x/Jokers.png differ diff --git a/src/resources/textures/1x/ShopSignAnimation.png b/src/resources/textures/1x/ShopSignAnimation.png new file mode 100644 index 0000000..0d797a4 Binary files /dev/null and b/src/resources/textures/1x/ShopSignAnimation.png differ diff --git a/src/resources/textures/1x/Tarots.png b/src/resources/textures/1x/Tarots.png new file mode 100644 index 0000000..c75cfdc Binary files /dev/null and b/src/resources/textures/1x/Tarots.png differ diff --git a/src/resources/textures/1x/Vouchers.png b/src/resources/textures/1x/Vouchers.png new file mode 100644 index 0000000..ae65b0b Binary files /dev/null and b/src/resources/textures/1x/Vouchers.png differ diff --git a/src/resources/textures/1x/balatro.png b/src/resources/textures/1x/balatro.png new file mode 100644 index 0000000..a3ccb5e Binary files /dev/null and b/src/resources/textures/1x/balatro.png differ diff --git a/src/resources/textures/1x/balatro_alt.png b/src/resources/textures/1x/balatro_alt.png new file mode 100644 index 0000000..73afcba Binary files /dev/null and b/src/resources/textures/1x/balatro_alt.png differ diff --git a/src/resources/textures/1x/boosters.png b/src/resources/textures/1x/boosters.png new file mode 100644 index 0000000..79a640a Binary files /dev/null and b/src/resources/textures/1x/boosters.png differ diff --git a/src/resources/textures/1x/chips.png b/src/resources/textures/1x/chips.png new file mode 100644 index 0000000..92b1445 Binary files /dev/null and b/src/resources/textures/1x/chips.png differ diff --git a/src/resources/textures/1x/collabs/collab_AC_1.png b/src/resources/textures/1x/collabs/collab_AC_1.png new file mode 100644 index 0000000..ba9a883 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_AC_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_AC_2.png b/src/resources/textures/1x/collabs/collab_AC_2.png new file mode 100644 index 0000000..fbd9a9b Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_AC_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_AU_1.png b/src/resources/textures/1x/collabs/collab_AU_1.png new file mode 100644 index 0000000..aeb2728 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_AU_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_AU_2.png b/src/resources/textures/1x/collabs/collab_AU_2.png new file mode 100644 index 0000000..dd04961 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_AU_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_BUG_1.png b/src/resources/textures/1x/collabs/collab_BUG_1.png new file mode 100644 index 0000000..14a2ea9 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_BUG_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_BUG_2.png b/src/resources/textures/1x/collabs/collab_BUG_2.png new file mode 100644 index 0000000..c5caccc Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_BUG_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_C7_1.png b/src/resources/textures/1x/collabs/collab_C7_1.png new file mode 100644 index 0000000..6fa4209 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_C7_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_C7_2.png b/src/resources/textures/1x/collabs/collab_C7_2.png new file mode 100644 index 0000000..7f8661a Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_C7_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_CL_1.png b/src/resources/textures/1x/collabs/collab_CL_1.png new file mode 100644 index 0000000..2ef8944 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_CL_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_CL_2.png b/src/resources/textures/1x/collabs/collab_CL_2.png new file mode 100644 index 0000000..6f0e47c Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_CL_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_CR_1.png b/src/resources/textures/1x/collabs/collab_CR_1.png new file mode 100644 index 0000000..064005b Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_CR_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_CR_2.png b/src/resources/textures/1x/collabs/collab_CR_2.png new file mode 100644 index 0000000..b8efc90 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_CR_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_CYP_1.png b/src/resources/textures/1x/collabs/collab_CYP_1.png new file mode 100644 index 0000000..4fdc801 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_CYP_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_CYP_2.png b/src/resources/textures/1x/collabs/collab_CYP_2.png new file mode 100644 index 0000000..bfaa4d2 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_CYP_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_D2_1.png b/src/resources/textures/1x/collabs/collab_D2_1.png new file mode 100644 index 0000000..fac571c Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_D2_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_D2_2.png b/src/resources/textures/1x/collabs/collab_D2_2.png new file mode 100644 index 0000000..fe03385 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_D2_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_DBD_1.png b/src/resources/textures/1x/collabs/collab_DBD_1.png new file mode 100644 index 0000000..a635cac Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_DBD_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_DBD_2.png b/src/resources/textures/1x/collabs/collab_DBD_2.png new file mode 100644 index 0000000..b07bc85 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_DBD_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_DS_1.png b/src/resources/textures/1x/collabs/collab_DS_1.png new file mode 100644 index 0000000..187398c Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_DS_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_DS_2.png b/src/resources/textures/1x/collabs/collab_DS_2.png new file mode 100644 index 0000000..752127a Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_DS_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_DTD_1.png b/src/resources/textures/1x/collabs/collab_DTD_1.png new file mode 100644 index 0000000..8efd112 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_DTD_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_DTD_2.png b/src/resources/textures/1x/collabs/collab_DTD_2.png new file mode 100644 index 0000000..e1146c7 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_DTD_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_EG_1.png b/src/resources/textures/1x/collabs/collab_EG_1.png new file mode 100644 index 0000000..534e844 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_EG_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_EG_2.png b/src/resources/textures/1x/collabs/collab_EG_2.png new file mode 100644 index 0000000..4b1580d Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_EG_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_FO_1.png b/src/resources/textures/1x/collabs/collab_FO_1.png new file mode 100644 index 0000000..2b4cad8 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_FO_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_FO_2.png b/src/resources/textures/1x/collabs/collab_FO_2.png new file mode 100644 index 0000000..9f2de55 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_FO_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_PC_1.png b/src/resources/textures/1x/collabs/collab_PC_1.png new file mode 100644 index 0000000..4105e18 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_PC_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_PC_2.png b/src/resources/textures/1x/collabs/collab_PC_2.png new file mode 100644 index 0000000..5c708bf Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_PC_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_R_1.png b/src/resources/textures/1x/collabs/collab_R_1.png new file mode 100644 index 0000000..deeb22e Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_R_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_R_2.png b/src/resources/textures/1x/collabs/collab_R_2.png new file mode 100644 index 0000000..a4d44a1 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_R_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_SK_1.png b/src/resources/textures/1x/collabs/collab_SK_1.png new file mode 100644 index 0000000..6aaac1d Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_SK_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_SK_2.png b/src/resources/textures/1x/collabs/collab_SK_2.png new file mode 100644 index 0000000..4bbcc99 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_SK_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_STP_1.png b/src/resources/textures/1x/collabs/collab_STP_1.png new file mode 100644 index 0000000..5ba9b79 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_STP_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_STP_2.png b/src/resources/textures/1x/collabs/collab_STP_2.png new file mode 100644 index 0000000..032f2d4 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_STP_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_STS_1.png b/src/resources/textures/1x/collabs/collab_STS_1.png new file mode 100644 index 0000000..357d54d Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_STS_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_STS_2.png b/src/resources/textures/1x/collabs/collab_STS_2.png new file mode 100644 index 0000000..dd5042f Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_STS_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_SV_1.png b/src/resources/textures/1x/collabs/collab_SV_1.png new file mode 100644 index 0000000..509775a Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_SV_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_SV_2.png b/src/resources/textures/1x/collabs/collab_SV_2.png new file mode 100644 index 0000000..1026a2b Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_SV_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_TBoI_1.png b/src/resources/textures/1x/collabs/collab_TBoI_1.png new file mode 100644 index 0000000..d2f61c6 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_TBoI_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_TBoI_2.png b/src/resources/textures/1x/collabs/collab_TBoI_2.png new file mode 100644 index 0000000..8eb4067 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_TBoI_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_TW_1.png b/src/resources/textures/1x/collabs/collab_TW_1.png new file mode 100644 index 0000000..931666e Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_TW_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_TW_2.png b/src/resources/textures/1x/collabs/collab_TW_2.png new file mode 100644 index 0000000..945b032 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_TW_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_VS_1.png b/src/resources/textures/1x/collabs/collab_VS_1.png new file mode 100644 index 0000000..cffe33b Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_VS_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_VS_2.png b/src/resources/textures/1x/collabs/collab_VS_2.png new file mode 100644 index 0000000..7c1e0d2 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_VS_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_WF_1.png b/src/resources/textures/1x/collabs/collab_WF_1.png new file mode 100644 index 0000000..b07e203 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_WF_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_WF_2.png b/src/resources/textures/1x/collabs/collab_WF_2.png new file mode 100644 index 0000000..4c7db97 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_WF_2.png differ diff --git a/src/resources/textures/1x/collabs/collab_XR_1.png b/src/resources/textures/1x/collabs/collab_XR_1.png new file mode 100644 index 0000000..82f81d0 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_XR_1.png differ diff --git a/src/resources/textures/1x/collabs/collab_XR_2.png b/src/resources/textures/1x/collabs/collab_XR_2.png new file mode 100644 index 0000000..a9288e1 Binary files /dev/null and b/src/resources/textures/1x/collabs/collab_XR_2.png differ diff --git a/src/resources/textures/1x/gamepad_ui.png b/src/resources/textures/1x/gamepad_ui.png new file mode 100644 index 0000000..b621653 Binary files /dev/null and b/src/resources/textures/1x/gamepad_ui.png differ diff --git a/src/resources/textures/1x/icons.png b/src/resources/textures/1x/icons.png new file mode 100644 index 0000000..c2931c3 Binary files /dev/null and b/src/resources/textures/1x/icons.png differ diff --git a/src/resources/textures/1x/localthunk-logo.png b/src/resources/textures/1x/localthunk-logo.png new file mode 100644 index 0000000..9cad67a Binary files /dev/null and b/src/resources/textures/1x/localthunk-logo.png differ diff --git a/src/resources/textures/1x/playstack-logo.png b/src/resources/textures/1x/playstack-logo.png new file mode 100644 index 0000000..d7b9618 Binary files /dev/null and b/src/resources/textures/1x/playstack-logo.png differ diff --git a/src/resources/textures/1x/stickers.png b/src/resources/textures/1x/stickers.png new file mode 100644 index 0000000..ef1c1c6 Binary files /dev/null and b/src/resources/textures/1x/stickers.png differ diff --git a/src/resources/textures/1x/tags.png b/src/resources/textures/1x/tags.png new file mode 100644 index 0000000..b0248cd Binary files /dev/null and b/src/resources/textures/1x/tags.png differ diff --git a/src/resources/textures/1x/ui_assets.png b/src/resources/textures/1x/ui_assets.png new file mode 100644 index 0000000..ffb5f32 Binary files /dev/null and b/src/resources/textures/1x/ui_assets.png differ diff --git a/src/resources/textures/1x/ui_assets_opt2.png b/src/resources/textures/1x/ui_assets_opt2.png new file mode 100644 index 0000000..dfb2b81 Binary files /dev/null and b/src/resources/textures/1x/ui_assets_opt2.png differ diff --git a/src/resources/textures/2x/8BitDeck.png b/src/resources/textures/2x/8BitDeck.png new file mode 100644 index 0000000..7af99be Binary files /dev/null and b/src/resources/textures/2x/8BitDeck.png differ diff --git a/src/resources/textures/2x/8BitDeck_opt2.png b/src/resources/textures/2x/8BitDeck_opt2.png new file mode 100644 index 0000000..e284646 Binary files /dev/null and b/src/resources/textures/2x/8BitDeck_opt2.png differ diff --git a/src/resources/textures/2x/BlindChips.png b/src/resources/textures/2x/BlindChips.png new file mode 100644 index 0000000..0f67c8c Binary files /dev/null and b/src/resources/textures/2x/BlindChips.png differ diff --git a/src/resources/textures/2x/Enhancers.png b/src/resources/textures/2x/Enhancers.png new file mode 100644 index 0000000..b8fdc3d Binary files /dev/null and b/src/resources/textures/2x/Enhancers.png differ diff --git a/src/resources/textures/2x/Jokers.png b/src/resources/textures/2x/Jokers.png new file mode 100644 index 0000000..9d27c18 Binary files /dev/null and b/src/resources/textures/2x/Jokers.png differ diff --git a/src/resources/textures/2x/ShopSignAnimation.png b/src/resources/textures/2x/ShopSignAnimation.png new file mode 100644 index 0000000..813b8a9 Binary files /dev/null and b/src/resources/textures/2x/ShopSignAnimation.png differ diff --git a/src/resources/textures/2x/Tarots.png b/src/resources/textures/2x/Tarots.png new file mode 100644 index 0000000..2880644 Binary files /dev/null and b/src/resources/textures/2x/Tarots.png differ diff --git a/src/resources/textures/2x/Vouchers.png b/src/resources/textures/2x/Vouchers.png new file mode 100644 index 0000000..6927a72 Binary files /dev/null and b/src/resources/textures/2x/Vouchers.png differ diff --git a/src/resources/textures/2x/balatro.png b/src/resources/textures/2x/balatro.png new file mode 100644 index 0000000..160ea68 Binary files /dev/null and b/src/resources/textures/2x/balatro.png differ diff --git a/src/resources/textures/2x/balatro_alt.png b/src/resources/textures/2x/balatro_alt.png new file mode 100644 index 0000000..d7c6051 Binary files /dev/null and b/src/resources/textures/2x/balatro_alt.png differ diff --git a/src/resources/textures/2x/boosters.png b/src/resources/textures/2x/boosters.png new file mode 100644 index 0000000..cbfe9bc Binary files /dev/null and b/src/resources/textures/2x/boosters.png differ diff --git a/src/resources/textures/2x/chips.png b/src/resources/textures/2x/chips.png new file mode 100644 index 0000000..9ebaaa2 Binary files /dev/null and b/src/resources/textures/2x/chips.png differ diff --git a/src/resources/textures/2x/collabs/collab_AC_1.png b/src/resources/textures/2x/collabs/collab_AC_1.png new file mode 100644 index 0000000..955cf74 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_AC_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_AC_2.png b/src/resources/textures/2x/collabs/collab_AC_2.png new file mode 100644 index 0000000..211ce89 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_AC_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_AU_1.png b/src/resources/textures/2x/collabs/collab_AU_1.png new file mode 100644 index 0000000..1c33b40 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_AU_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_AU_2.png b/src/resources/textures/2x/collabs/collab_AU_2.png new file mode 100644 index 0000000..ebb5156 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_AU_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_BUG_1.png b/src/resources/textures/2x/collabs/collab_BUG_1.png new file mode 100644 index 0000000..2a43d76 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_BUG_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_BUG_2.png b/src/resources/textures/2x/collabs/collab_BUG_2.png new file mode 100644 index 0000000..6ed4328 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_BUG_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_C7_1.png b/src/resources/textures/2x/collabs/collab_C7_1.png new file mode 100644 index 0000000..5a31735 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_C7_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_C7_2.png b/src/resources/textures/2x/collabs/collab_C7_2.png new file mode 100644 index 0000000..6de2df9 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_C7_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_CL_1.png b/src/resources/textures/2x/collabs/collab_CL_1.png new file mode 100644 index 0000000..61c4b64 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_CL_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_CL_2.png b/src/resources/textures/2x/collabs/collab_CL_2.png new file mode 100644 index 0000000..600b2f7 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_CL_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_CR_1.png b/src/resources/textures/2x/collabs/collab_CR_1.png new file mode 100644 index 0000000..3492e5c Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_CR_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_CR_2.png b/src/resources/textures/2x/collabs/collab_CR_2.png new file mode 100644 index 0000000..3b2d69b Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_CR_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_CYP_1.png b/src/resources/textures/2x/collabs/collab_CYP_1.png new file mode 100644 index 0000000..ce1e30e Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_CYP_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_CYP_2.png b/src/resources/textures/2x/collabs/collab_CYP_2.png new file mode 100644 index 0000000..580b91b Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_CYP_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_D2_1.png b/src/resources/textures/2x/collabs/collab_D2_1.png new file mode 100644 index 0000000..ae1eecf Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_D2_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_D2_2.png b/src/resources/textures/2x/collabs/collab_D2_2.png new file mode 100644 index 0000000..14699f0 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_D2_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_DBD_1.png b/src/resources/textures/2x/collabs/collab_DBD_1.png new file mode 100644 index 0000000..9443d98 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_DBD_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_DBD_2.png b/src/resources/textures/2x/collabs/collab_DBD_2.png new file mode 100644 index 0000000..e87f94a Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_DBD_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_DS_1.png b/src/resources/textures/2x/collabs/collab_DS_1.png new file mode 100644 index 0000000..f6a3845 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_DS_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_DS_2.png b/src/resources/textures/2x/collabs/collab_DS_2.png new file mode 100644 index 0000000..567b958 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_DS_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_DTD_1.png b/src/resources/textures/2x/collabs/collab_DTD_1.png new file mode 100644 index 0000000..d97998b Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_DTD_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_DTD_2.png b/src/resources/textures/2x/collabs/collab_DTD_2.png new file mode 100644 index 0000000..e332387 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_DTD_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_EG_1.png b/src/resources/textures/2x/collabs/collab_EG_1.png new file mode 100644 index 0000000..6c84b98 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_EG_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_EG_2.png b/src/resources/textures/2x/collabs/collab_EG_2.png new file mode 100644 index 0000000..451041d Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_EG_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_FO_1.png b/src/resources/textures/2x/collabs/collab_FO_1.png new file mode 100644 index 0000000..5359c2d Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_FO_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_FO_2.png b/src/resources/textures/2x/collabs/collab_FO_2.png new file mode 100644 index 0000000..481fe8a Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_FO_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_PC_1.png b/src/resources/textures/2x/collabs/collab_PC_1.png new file mode 100644 index 0000000..e848591 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_PC_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_PC_2.png b/src/resources/textures/2x/collabs/collab_PC_2.png new file mode 100644 index 0000000..b729121 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_PC_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_R_1.png b/src/resources/textures/2x/collabs/collab_R_1.png new file mode 100644 index 0000000..db47c83 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_R_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_R_2.png b/src/resources/textures/2x/collabs/collab_R_2.png new file mode 100644 index 0000000..2e054e9 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_R_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_SK_1.png b/src/resources/textures/2x/collabs/collab_SK_1.png new file mode 100644 index 0000000..9657f6c Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_SK_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_SK_2.png b/src/resources/textures/2x/collabs/collab_SK_2.png new file mode 100644 index 0000000..06a5dd2 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_SK_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_STP_1.png b/src/resources/textures/2x/collabs/collab_STP_1.png new file mode 100644 index 0000000..9b68c57 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_STP_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_STP_2.png b/src/resources/textures/2x/collabs/collab_STP_2.png new file mode 100644 index 0000000..474544e Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_STP_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_STS_1.png b/src/resources/textures/2x/collabs/collab_STS_1.png new file mode 100644 index 0000000..85cd41b Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_STS_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_STS_2.png b/src/resources/textures/2x/collabs/collab_STS_2.png new file mode 100644 index 0000000..91efdde Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_STS_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_SV_1.png b/src/resources/textures/2x/collabs/collab_SV_1.png new file mode 100644 index 0000000..59bd65f Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_SV_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_SV_2.png b/src/resources/textures/2x/collabs/collab_SV_2.png new file mode 100644 index 0000000..7f2ae94 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_SV_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_TBoI_1.png b/src/resources/textures/2x/collabs/collab_TBoI_1.png new file mode 100644 index 0000000..37017f8 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_TBoI_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_TBoI_2.png b/src/resources/textures/2x/collabs/collab_TBoI_2.png new file mode 100644 index 0000000..aba4830 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_TBoI_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_TW_1.png b/src/resources/textures/2x/collabs/collab_TW_1.png new file mode 100644 index 0000000..44cd599 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_TW_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_TW_2.png b/src/resources/textures/2x/collabs/collab_TW_2.png new file mode 100644 index 0000000..00a7514 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_TW_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_VS_1.png b/src/resources/textures/2x/collabs/collab_VS_1.png new file mode 100644 index 0000000..61a4dfd Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_VS_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_VS_2.png b/src/resources/textures/2x/collabs/collab_VS_2.png new file mode 100644 index 0000000..d9b59c0 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_VS_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_WF_1.png b/src/resources/textures/2x/collabs/collab_WF_1.png new file mode 100644 index 0000000..aa1a3aa Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_WF_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_WF_2.png b/src/resources/textures/2x/collabs/collab_WF_2.png new file mode 100644 index 0000000..1a259d0 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_WF_2.png differ diff --git a/src/resources/textures/2x/collabs/collab_XR_1.png b/src/resources/textures/2x/collabs/collab_XR_1.png new file mode 100644 index 0000000..dd90d5d Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_XR_1.png differ diff --git a/src/resources/textures/2x/collabs/collab_XR_2.png b/src/resources/textures/2x/collabs/collab_XR_2.png new file mode 100644 index 0000000..4b4af69 Binary files /dev/null and b/src/resources/textures/2x/collabs/collab_XR_2.png differ diff --git a/src/resources/textures/2x/gamepad_ui.png b/src/resources/textures/2x/gamepad_ui.png new file mode 100644 index 0000000..7828a5b Binary files /dev/null and b/src/resources/textures/2x/gamepad_ui.png differ diff --git a/src/resources/textures/2x/icons.png b/src/resources/textures/2x/icons.png new file mode 100644 index 0000000..cbb12ca Binary files /dev/null and b/src/resources/textures/2x/icons.png differ diff --git a/src/resources/textures/2x/localthunk-logo.png b/src/resources/textures/2x/localthunk-logo.png new file mode 100644 index 0000000..e770984 Binary files /dev/null and b/src/resources/textures/2x/localthunk-logo.png differ diff --git a/src/resources/textures/2x/playstack-logo.png b/src/resources/textures/2x/playstack-logo.png new file mode 100644 index 0000000..8c2c17c Binary files /dev/null and b/src/resources/textures/2x/playstack-logo.png differ diff --git a/src/resources/textures/2x/stickers.png b/src/resources/textures/2x/stickers.png new file mode 100644 index 0000000..0761eb7 Binary files /dev/null and b/src/resources/textures/2x/stickers.png differ diff --git a/src/resources/textures/2x/tags.png b/src/resources/textures/2x/tags.png new file mode 100644 index 0000000..5c59357 Binary files /dev/null and b/src/resources/textures/2x/tags.png differ diff --git a/src/resources/textures/2x/ui_assets.png b/src/resources/textures/2x/ui_assets.png new file mode 100644 index 0000000..5b36bcf Binary files /dev/null and b/src/resources/textures/2x/ui_assets.png differ diff --git a/src/resources/textures/2x/ui_assets_opt2.png b/src/resources/textures/2x/ui_assets_opt2.png new file mode 100644 index 0000000..6b5a487 Binary files /dev/null and b/src/resources/textures/2x/ui_assets_opt2.png differ diff --git a/src/tag.lua b/src/tag.lua new file mode 100644 index 0000000..53df238 --- /dev/null +++ b/src/tag.lua @@ -0,0 +1,595 @@ +--Class +Tag = Object:extend() + +--Class Methods +function Tag:init(_tag, for_collection, _blind_type) + self.key = _tag + local proto = G.P_TAGS[_tag] or G.tag_undiscovered + self.config = copy_table(proto.config) + self.pos = proto.pos + self.name = proto.name + self.tally = G.GAME.tag_tally or 0 + self.triggered = false + G.tagid = G.tagid or 0 + self.ID = G.tagid + G.tagid = G.tagid + 1 + self.ability = { + orbital_hand = '['..localize('k_poker_hand')..']', + blind_type = _blind_type + } + G.GAME.tag_tally = G.GAME.tag_tally and (G.GAME.tag_tally + 1) or 1 + if not for_collection then self:set_ability() end +end + +function Tag:nope() + G.E_MANAGER:add_event(Event({ + delay = 0.2, + trigger = 'after', + func = (function() + attention_text({ + text = 'NOPE', + colour = G.C.WHITE, + scale = 0.7, + hold = 0.3/G.SETTINGS.GAMESPEED, + cover = self.HUD_tag, + cover_colour = G.C.BLACK, + align = 'cm', + }) + play_sound('cancel', 1.4, 0.5) + return true + end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = (function() + self.HUD_tag.states.visible = false + play_sound('cancel', 1.26, 0.5) + return true + end) + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = (function() + self:remove() + return true + end) + })) +end + +function Tag:yep(message, _colour, func) + stop_use() + + G.E_MANAGER:add_event(Event({ + delay = 0.4, + trigger = 'after', + func = (function() + attention_text({ + text = message, + colour = G.C.WHITE, + scale = 1, + hold = 0.3/G.SETTINGS.GAMESPEED, + cover = self.HUD_tag, + cover_colour = _colour or G.C.GREEN, + align = 'cm', + }) + play_sound('generic1', 0.9 + math.random()*0.1, 0.8) + play_sound('holo1', 1.2 + math.random()*0.1, 0.4) + return true + end) + })) + G.E_MANAGER:add_event(Event({ + func = (function() + self.HUD_tag.states.visible = false + return true + end) + })) + G.E_MANAGER:add_event(Event({ + func = func + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.7, + func = (function() + self:remove() + return true + end) + })) +end + +function Tag:set_ability() + if self.name == 'Orbital Tag' then + if G.orbital_hand then + self.ability.orbital_hand = G.orbital_hand + elseif self.ability.blind_type then + if G.GAME.orbital_choices and G.GAME.orbital_choices[G.GAME.round_resets.ante][self.ability.blind_type] then + self.ability.orbital_hand = G.GAME.orbital_choices[G.GAME.round_resets.ante][self.ability.blind_type] + end + end + end +end + +function Tag:apply_to_run(_context) + if not self.triggered and self.config.type == _context.type then + if _context.type == 'eval' then + if self.name == 'Investment Tag' and + G.GAME.last_blind and G.GAME.last_blind.boss then + self:yep('+', G.C.GOLD,function() + return true + end) + self.triggered = true + return { + dollars = self.config.dollars, + condition = localize('ph_defeat_the_boss'), + pos = self.pos, + tag = self + } + end + elseif _context.type == 'immediate' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + if self.name == 'Top-up Tag' then + self:yep('+', G.C.PURPLE,function() + for i = 1, self.config.spawn_jokers do + if G.jokers and #G.jokers.cards < G.jokers.config.card_limit then + local card = create_card('Joker', G.jokers, nil, 0, nil, nil, nil, 'top') + card:add_to_deck() + G.jokers:emplace(card) + end + end + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Skip Tag' then + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + ease_dollars((G.GAME.skips or 0)*self.config.skip_bonus) + self.triggered = true + return true + end + if self.name == 'Garbage Tag' then + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + ease_dollars((G.GAME.unused_discards or 0)*self.config.dollars_per_discard) + self.triggered = true + return true + end + if self.name == 'Handy Tag' then + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + ease_dollars((G.GAME.hands_played or 0)*self.config.dollars_per_hand) + self.triggered = true + return true + end + if self.name == 'Economy Tag' then + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + ease_dollars(math.min(self.config.max, math.max(0,G.GAME.dollars)), true) + return true + end + })) + self.triggered = true + return true + end + if self.name == 'Orbital Tag' then + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, { + handname= self.ability.orbital_hand, + chips = G.GAME.hands[self.ability.orbital_hand].chips, + mult = G.GAME.hands[self.ability.orbital_hand].mult, + level= G.GAME.hands[self.ability.orbital_hand].level}) + level_up_hand(self, self.ability.orbital_hand, nil, self.config.levels) + update_hand_text({sound = 'button', volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = '', level = ''}) + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + elseif _context.type == 'new_blind_choice' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + if self.name == 'Charm Tag' then + self:yep('+', G.C.PURPLE,function() + local key = 'p_arcana_mega_'..(math.random(1,2)) + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Meteor Tag' then + self:yep('+', G.C.SECONDARY_SET.Planet,function() + local key = 'p_celestial_mega_'..(math.random(1,2)) + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Ethereal Tag' then + self:yep('+', G.C.SECONDARY_SET.Spectral,function() + local key = 'p_spectral_normal_1' + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Standard Tag' then + self:yep('+', G.C.SECONDARY_SET.Spectral,function() + local key = 'p_standard_mega_1' + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Buffoon Tag' then + self:yep('+', G.C.SECONDARY_SET.Spectral,function() + local key = 'p_buffoon_mega_1' + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Boss Tag' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + self:yep('+', G.C.GREEN,function() + G.from_boss_tag = true + G.FUNCS.reroll_boss() + + G.E_MANAGER:add_event(Event({func = function() + G.E_MANAGER:add_event(Event({func = function() + G.CONTROLLER.locks[lock] = nil + return true; end})) + return true; end})) + + return true + end) + self.triggered = true + return true + end + elseif _context.type == 'voucher_add' then + if self.name == 'Voucher Tag' then + self:yep('+', G.C.SECONDARY_SET.Voucher,function() + G.ARGS.voucher_tag = G.ARGS.voucher_tag or {} + local voucher_key = get_next_voucher_key(true) + G.ARGS.voucher_tag[voucher_key] = true + G.shop_vouchers.config.card_limit = G.shop_vouchers.config.card_limit + 1 + local card = Card(G.shop_vouchers.T.x + G.shop_vouchers.T.w/2, + G.shop_vouchers.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[voucher_key],{bypass_discovery_center = true, bypass_discovery_ui = true}) + create_shop_card_ui(card, 'Voucher', G.shop_vouchers) + card:start_materialize() + G.shop_vouchers:emplace(card) + G.ARGS.voucher_tag = nil + return true + end) + self.triggered = true + end + elseif _context.type == 'tag_add' then + if self.name == 'Double Tag' and _context.tag.key ~= 'tag_double' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + self:yep('+', G.C.BLUE,function() + if _context.tag.ability and _context.tag.ability.orbital_hand then + G.orbital_hand = _context.tag.ability.orbital_hand + end + add_tag(Tag(_context.tag.key)) + G.orbital_hand = nil + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + end + elseif _context.type == 'round_start_bonus' then + if self.name == 'Juggle Tag' then + self:yep('+', G.C.BLUE,function() + return true + end) + G.hand:change_size(self.config.h_size) + G.GAME.round_resets.temp_handsize = (G.GAME.round_resets.temp_handsize or 0) + self.config.h_size + self.triggered = true + return true + end + elseif _context.type == 'store_joker_create' then + local card = nil + if self.name == 'Rare Tag' then + local rares_in_posession = {0} + for k, v in ipairs(G.jokers.cards) do + if v.config.center.rarity == 3 and not rares_in_posession[v.config.center.key] then + rares_in_posession[1] = rares_in_posession[1] + 1 + rares_in_posession[v.config.center.key] = true + end + end + + if #G.P_JOKER_RARITY_POOLS[3] > rares_in_posession[1] then + card = create_card('Joker', _context.area, nil, 1, nil, nil, nil, 'rta') + create_shop_card_ui(card, 'Joker', _context.area) + card.states.visible = false + self:yep('+', G.C.RED,function() + card:start_materialize() + card.ability.couponed = true + card:set_cost() + return true + end) + else + self:nope() + end + self.triggered = true + elseif self.name == 'Uncommon Tag' then + card = create_card('Joker', _context.area, nil, 0.9, nil, nil, nil, 'uta') + create_shop_card_ui(card, 'Joker', _context.area) + card.states.visible = false + self:yep('+', G.C.GREEN,function() + card:start_materialize() + card.ability.couponed = true + card:set_cost() + return true + end) + end + self.triggered = true + return card + elseif _context.type == 'shop_start' then + if self.name == 'D6 Tag' and not G.GAME.shop_d6ed then + G.GAME.shop_d6ed = true + self:yep('+', G.C.GREEN,function() + G.GAME.round_resets.temp_reroll_cost = 0 + calculate_reroll_cost(true) + return true + end) + self.triggered = true + return true + end + elseif _context.type == 'store_joker_modify' then + local _applied = nil + if not _context.card.edition and not _context.card.temp_edition and _context.card.ability.set == 'Joker' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + if self.name == 'Foil Tag' then + _context.card.temp_edition = true + self:yep('+', G.C.DARK_EDITION,function() + _context.card:set_edition({foil = true}, true) + _context.card.ability.couponed = true + _context.card:set_cost() + _context.card.temp_edition = nil + G.CONTROLLER.locks[lock] = nil + return true + end) + _applied = true + elseif self.name == 'Holographic Tag' then + _context.card.temp_edition = true + self:yep('+', G.C.DARK_EDITION,function() + _context.card.temp_edition = nil + _context.card:set_edition({holo = true}, true) + _context.card.ability.couponed = true + _context.card:set_cost() + G.CONTROLLER.locks[lock] = nil + return true + end) + _applied = true + elseif self.name == 'Polychrome Tag' then + _context.card.temp_edition = true + self:yep('+', G.C.DARK_EDITION,function() + _context.card.temp_edition = nil + _context.card:set_edition({polychrome = true}, true) + _context.card.ability.couponed = true + _context.card:set_cost() + G.CONTROLLER.locks[lock] = nil + return true + end) + _applied = true + elseif self.name == 'Negative Tag' then + _context.card.temp_edition = true + self:yep('+', G.C.DARK_EDITION,function() + _context.card.temp_edition = nil + _context.card:set_edition({negative = true}, true) + _context.card.ability.couponed = true + _context.card:set_cost() + G.CONTROLLER.locks[lock] = nil + return true + end) + _applied = true + end + self.triggered = true + end + + return _applied + elseif _context.type == 'shop_final_pass' then + if self.name == 'Coupon Tag' and (G.shop and not G.GAME.shop_free) then + G.GAME.shop_free = true + self:yep('+', G.C.GREEN,function() + if G.shop_jokers and G.shop_booster then + for k, v in pairs(G.shop_jokers.cards) do + v.ability.couponed = true + v:set_cost() + end + for k, v in pairs(G.shop_booster.cards) do + v.ability.couponed = true + v:set_cost() + end + end + return true + end) + self.triggered = true + return true + end + end + end +end + +function Tag:save() + return { + key = self.key, + tally = self.tally, + ability = self.ability + } +end + +function Tag:load(tag_savetable) + self.key = tag_savetable.key + local proto = G.P_TAGS[self.key] or G.tag_undiscovered + self.config = copy_table(proto.config) + self.pos = proto.pos + self.name = proto.name + self.tally = tag_savetable.tally + self.ability = tag_savetable.ability + G.GAME.tag_tally = math.max(self.tally, G.GAME.tag_tally) + 1 +end + +function Tag:juice_up(_scale, _rot) + if self.tag_sprite then self.tag_sprite:juice_up(_scale, _rot) end +end + +function Tag:generate_UI(_size) + _size = _size or 0.8 + + local tag_sprite_tab = nil + + local tag_sprite = Sprite(0,0,_size*1,_size*1,G.ASSET_ATLAS["tags"], (self.hide_ability) and G.tag_undiscovered.pos or self.pos) + tag_sprite.T.scale = 1 + tag_sprite_tab = {n= G.UIT.C, config={align = "cm", ref_table = self, group = self.tally}, nodes={ + {n=G.UIT.O, config={w=_size*1,h=_size*1, colour = G.C.BLUE, object = tag_sprite, focus_with_object = true}}, + }} + tag_sprite:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'}, + }) + tag_sprite.float = true + tag_sprite.states.hover.can = true + tag_sprite.states.drag.can = false + tag_sprite.states.collide.can = true + tag_sprite.config = {tag = self, force_focus = true} + + tag_sprite.hover = function(_self) + if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then + if not _self.hovering and _self.states.visible then + _self.hovering = true + if _self == tag_sprite then + _self.hover_tilt = 3 + _self:juice_up(0.05, 0.02) + play_sound('paper1', math.random()*0.1 + 0.55, 0.42) + play_sound('tarot2', math.random()*0.1 + 0.55, 0.09) + end + + self:get_uibox_table(tag_sprite) + _self.config.h_popup = G.UIDEF.card_h_popup(_self) + _self.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = _self} + Node.hover(_self) + if _self.children.alert then + _self.children.alert:remove() + _self.children.alert = nil + if self.key and G.P_TAGS[self.key] then G.P_TAGS[self.key].alerted = true end + G:save_progress() + end + end + end + end + tag_sprite.stop_hover = function(_self) _self.hovering = false; Node.stop_hover(_self); _self.hover_tilt = 0 end + + tag_sprite:juice_up() + self.tag_sprite = tag_sprite + + return tag_sprite_tab, tag_sprite +end + +function Tag:get_uibox_table(tag_sprite) + tag_sprite = tag_sprite or self.tag_sprite + local name_to_check, loc_vars = self.name, {} + if name_to_check == 'Uncommon Tag' then + elseif name_to_check == 'Investment Tag' then loc_vars = {self.config.dollars} + elseif name_to_check == 'Handy Tag' then loc_vars = {self.config.dollars_per_hand, self.config.dollars_per_hand*(G.GAME.hands_played or 0)} + elseif name_to_check == 'Garbage Tag' then loc_vars = {self.config.dollars_per_discard, self.config.dollars_per_discard*(G.GAME.unused_discards or 0)} + elseif name_to_check == 'Juggle Tag' then loc_vars = {self.config.h_size} + elseif name_to_check == 'Top-up Tag' then loc_vars = {self.config.spawn_jokers} + elseif name_to_check == 'Skip Tag' then loc_vars = {self.config.skip_bonus, self.config.skip_bonus*((G.GAME.skips or 0)+1)} + elseif name_to_check == 'Orbital Tag' then loc_vars = { + (self.ability.orbital_hand == '['..localize('k_poker_hand')..']') and self.ability.orbital_hand or localize(self.ability.orbital_hand, 'poker_hands'), self.config.levels} + elseif name_to_check == 'Economy Tag' then loc_vars = {self.config.max} + end + tag_sprite.ability_UIBox_table = generate_card_ui(G.P_TAGS[self.key], nil, loc_vars, (self.hide_ability) and 'Undiscovered' or 'Tag', nil, (self.hide_ability)) + return tag_sprite +end + +function Tag:remove_from_game() + local tag_key = nil + for k, v in pairs(G.GAME.tags) do + if v == self then tag_key = k end + end + table.remove(G.GAME.tags, tag_key) +end + +function Tag:remove() + self:remove_from_game() + local HUD_tag_key = nil + for k, v in pairs(G.HUD_tags) do + if v == self.HUD_tag then HUD_tag_key = k end + end + + if HUD_tag_key then + if G.HUD_tags and G.HUD_tags[HUD_tag_key+1] then + if HUD_tag_key == 1 then + G.HUD_tags[HUD_tag_key+1]:set_alignment({type = 'bri', + offset = {x=0.7,y=0}, + xy_bond = 'Weak', + major = G.ROOM_ATTACH}) + else + G.HUD_tags[HUD_tag_key+1]:set_role({ + xy_bond = 'Weak', + major = G.HUD_tags[HUD_tag_key-1]}) + end + end + table.remove(G.HUD_tags, HUD_tag_key) + end + + self.HUD_tag:remove() +end diff --git a/src/version.jkr b/src/version.jkr new file mode 100644 index 0000000..d076452 --- /dev/null +++ b/src/version.jkr @@ -0,0 +1,3 @@ +1.0.1o-FULL +1.0.1o +PROD_PC_Console \ No newline at end of file