JoyShock
Help

Contents

I. Introduction: A basic description of JoyShock and its use.

II. Main Dialog Features: A  detailed description of the features you see on the main JoyShock dialog.

III. Your First Profile: A walk-through for creating a set of simple scripts that make your joystick emulate the arrow keys on your keyboard.

IV. Script Commands: A detailed description of the script commands that are available in JoyShock.

V. Sample Profiles: Some sample scripts to help you get started.

VI. Contact Information: Where to report problems you are experiencing with JoyShock and give feedback to the author.

VII. Disclaimer and License: The usual legal stuff.

VIII. Known Issues: A list of known bugs and issues with JoyShock.

 

 

I. Introduction

JoyShock is an application that performs a simple yet very useful task- it lets you emulate keyboard and mouse events with your joystick. This is wonderful if you have a game that doesn't have joystick support but you really wish you could use your joystick with, or if you simply get tired of using the mouse all of the time and would rather use your joystick to move around in windows. 

The basic premise to keep in mind when using  JoyShock is that of mapping a "joystick event" to a "script." A joystick event is any action that you can perform on the joystick. Some examples of joystick events are:

"pressing the stick to the right"        
"pressing button #3"
"releasing the stick (same as letting the stick go to the center)"
"pressing the hat in the northward direction"
"releasing the hat"

You can assign any of the basic joystick events a "script" which tells JoyShock what you would like it to emulate when that joystick event occurs. For example, you might want to emulate a left mouse click when you press button #2, so for the "button #2 press" event, you would assign a "left mouse button down, left mouse button up" script.

II. Main Dialog Features

Basic Joystick Events:

Press/Release: Each basic joystick event can really be broken into two events, the activation (or "press") and the deactivation (or "release"). On the dialog, you will see a list of the basic joystick events, each having a corresponding set of "press" and "release" buttons. To assign a script to one of these events, simply click on the "press" or "release" button for the event you wish to program. You can then start a script for that event by using the script buttons on the right hand portion of the screen (key up, key down, etc.). The button for the event you are currently working with will always be highlighted in blue. Events that have assigned scripts will be highlighted in yellow.

Stick Left, Stick Right, Stick Up, Stick Down: These are the events that correspond to the movement of the main joystick.

Rot. Left, Rot. Right: Some joysticks allow for rotational controls (such as the rotation of the main joystick). These events are for rotational controls.

Z Left, Z Right: Some joysticks allow for movement in the Z or 3rd dimension. These events are for 3rd dimensional  controls.

POV North, POV NE, POV East, POV SE, POV South, POV SW, POV West, POV NW: Some joysticks have a secondary smaller joystick called a "hat" or "POV." JoyShock allows you to capture movements of the hat in eight discrete positions. For example, the "POV North" event corresponds to when you press the hat up, and the "POV South" event corresponds to when you press the hat down.

POV Center: The "POV Center" event is special and always occurs when the hat is returned to center (always right after one of the other POV events).

Button 1-8: These events correspond to up to eight buttons on the joystick. You will have to do some testing to see which button corresponds to which event, as all joysticks are different (see "Joystick Status" below).

Shift Button 1-8: Some joysticks have a special "shift" button that puts the other buttons into a shift state, thus allowing two functions for each button. These events correspond to the shift states for each button.

X Tol, Y Tol, Z Tol, R Tol:

These tolerance values control the "dead zone" for the main joystick. The dead zone is the amount you have to move the main stick in order for JoyShock to register an event. For instance, if you set the X tolerance to 0, then the left/right movements of the main stick will be very sensitive- JoyShock will register an event if you slightly move the stick. However, if you assign a larger value for X tolerance, such as the default of 300, you will have to move the stick significantly more to register an event. These values will be different for different applications and different joysticks- play around with them to see what kind of adjustment you prefer.

Commands For:

This window displays the script that is assigned to the current joystick event. The current joystick event is the one which has its "press/release" button highlighted in blue. You can assign scripts by using the script buttons located directly below the "Commands For" window.

Key Down, Key Up, Right Mouse Down, Right Mouse Up, Clear, Left Mouse Down, Left Mouse Up, Mouse Move, Block Command, Delay:

These are the "script buttons," that is, each button will place a certain script statement into the script for the current joystick event. For a detailed description of what each does, see the section "script commands," below.

Joystick Status

This window will display a status update for each joystick event that occurs. For example, if you press the main joystick to the right, you will see "Executing Stick Right PRESS" in the status window. This window is useful for finding out which events the buttons on your joystick will fire, simply press a button on the joystick, and note the button number on the message that is displayed in the stats window.

Keyboard Input Simulation Test Box

This area is convenient for testing keystrokes that you have mapped to joystick events. Simply place the focus on the input test box by clicking on it, it will act like a normal windows edit box (that is, you can type freely into it using the keyboard). If you have keystrokes assigned to various events, perform those actions with the joystick and watch the keystrokes happen in the input test box.

About

This button will display the about box for JoyShock.

Save Profile, Load Profile

These buttons will allow you to save and load your scripts. This is useful for storing different script sets for different applications.

Register

This button will bring up the registration dialog. In order to register JoyShock, follow the instructions on this dialog. Registration will remove the trial time limit and enable the "save/load profile" buttons. Your registration will help permit further development on this product and is very much appreciated! 

Registration Trial Time

If your copy of JoyShock is unregistered, it will have a functional time limit that is reset each time you start JoyShock. The remaining time limit is displayed on the main dialog underneath the "Keyboard Input Simulation Test Box."

III. Your First Profile

This section will help you create your first profile. This profile will allow you to use your joystick as you would use the arrow keys on the keyboard. 

1. First, lets take care of the left arrow key- we want to simulate a left arrow key when the main joystick is pressed to the left. Click on the "press" button by the "Stick Left" event- this designates that we would like to assign a script to the left joystick press. Notice that the "Stick Left" label turns blue, and the "commands for" label changes to indicate that you are currently working on the script for the "stick left press" event. Now, click on the "key down" script button. A dialog appears displaying a small keyboard. On the keyboard, click the left arrow key. The "commands for" window should now display the script command "KEY DOWN LEFT" indicating that a left arrow key down will occur when the joystick is pressed to the left.

2. Every time you use a key down command, it is important to have a corresponding key up event. Click on the "release" button by the "Stick Left" event. Notice that the "press" button has changed to yellow. A yellow color on the event buttons indicates that they have an assigned script. The "release" button has now turned blue, indicating that you are working on the "Stick Left Release" event. For this event, we would like to have a left arrow key up command occur. Click on the "key up" script button. Click the left arrow key button on the window containing the small keyboard. A "KEY UP LEFT" script command is now displayed in the script ("commands for") window.

3. To assign the scripts for the right movement of the main joystick do the following: Click the "Stick Right Press" event button, click the "Key Down" script button, click the right arrow key button. Now click the "Stick Right Release" event button, click the "Key Up" script button, click the right arrow key button.

4. Repeat step three for the up and down press/release events of the main joystick, assigning those events the up/down key presses for the up/down arrow keys.

5. Now you are ready to test your profile! Place the focus on the input simulation test box and type several lines of text using your keyboard. You should be able to move the cursor around the text using the joystick instead of using the arrow keys! Neat huh?

IV. Script Commands

This section describes each of the script buttons/commands in more detail.

Key Down

Syntax:         

KEY DOWN sKey

Parameters:   

sKey    a string indicating the keyboard key

Effect:

Simulates pressing sKey down on the keyboard. Each key down script command should be accompanied by a corresponding key up command.     

Key Up

Syntax:         

KEY UP  sKey

Parameters:   

sKey    a string indicating the keyboard key

Effect:

Simulates releasing sKey on the keyboard. Each key up script command should be preceded by a corresponding key down command.  

Right Mouse Down

Syntax:         

RIGHT MOUSE DOWN

Parameters:   

n/a

Effect:

Simulates pressing the right mouse button.

Right Mouse Up

Syntax:         

RIGHT MOUSE UP

Parameters:   

n/a

Effect:

Simulates releasing the right mouse button.

Left Mouse Down

Syntax:         

LEFT MOUSE DOWN

Parameters:   

n/a

Effect:

Simulates pressing the left mouse button.  

Left Mouse Up

Syntax:         

LEFT MOUSE UP

Parameters:   

n/a

Effect:

Simulates releasing the left mouse button. 

Mouse Move

Syntax:         

MOUSE MOVE type bounds xstep ystep xmult ymult

Parameters:   

type     "A" indicates absolute movement, that is, xstep and ystep will be absolute screen coordinates where the mouse should be moved. "R" indicates relative mouse movement. The mouse will be moved (xstep,ystep) relative to its current position.

 

bounds "B" indicates that screen bounds should be checked, the mouse cursor will not be moved beyond the screen limits. "N" indicates that screen bounds should not be checked. In this case, mouse movements will wrap around to the other side of the screen.

 

xstep    a floating point number indicating the amount to move the mouse cursor along the x axis

 

ystep    a floating point number indicating the amount to move the mouse cursor along the y axis

 

xmult    xstep is multiplied by this number, which is the magnitude that the main joystick is pressed on a certain axis. The multiplier will vary between -500 and +500 depending on how far the stick is applied on the axis. For example, if xmult is "X" and the main stick is pressed all the way to the left, then xstep will be multiplied by -500. If the stick is in the center then xstep will be multiplied by 0. If the stick is pressed fully to the right, then xstep is multiplied by +500. xmult is useful for making relative mouse moves "accelerated" according to the amount the main stick is applied. If xmult is "X" then the x axis of the main stick is used.  If xmult is "Y" then the y axis of the main stick is used.  If xmult is "Z" then the z axis of the main stick is used.   If xmult is "R" then the rotational axis of the main stick is used. if xmult is "N", this indicates that no x multiplier is applied to xstep.

 

ymult    ystep is multiplied by this number. Its function is similar to that of xmult.

Effect:

Moves the mouse cursor. Depending on the type parameter, the movement can be to an absolute set of screen coordinates or can be relative to the current mouse position.

Block Command

A block command can actually be one of three specific types of block commands. Each is detailed below.

Repeat block

Syntax:         

BEGBLOCK label RPT count

Parameters:   

label    a three digit numeric symbol that is a unique identifier for this block

 

count   a positive integer indicating the number of times to execute the code in this block. A count of zero indicates that this loop should be executed indefinitely until a "terminate block" command is executed for this block. 

Effect:

All of the script commands between the BEGBLOCK RPT command and its corresponding ENDBLOCK command will be repeatedly executed count times. Nested repeat blocks are currently not supported.

End block

Syntax:         

ENDBLOCK label

Parameters:   

label    a three digit numeric symbol that is a unique identifier for this block

Effect:

Each ENDBLOCK command must have a preceding BEGBLOCK command. All of the script commands between the a BEGBLOCK and its corresponding ENDBLOCK command are considered a singular unit and will be executed as such. For example, if a repeat block, all of the commands between the BEGBLOCK RPT and ENDBLOCK will be executed as part of the repeat loop.

Terminate block

Syntax:         

TRMBLOCK label

Parameters:   

label    a three digit numeric symbol that is a unique identifier for this block

Effect:

Terminates execution of a block of code. This is useful if a repeat block has been executed with a count of zero, which indicates the loop is indefinite. This can be used, for example, to cause a joystick button to "fire" repeatedly until released. Simply put the fire script in a repeat block with count of zero in the button press event, and put a terminate block command in the button release event. 

Delay

Syntax:         

DELAY nMilliseconds

Parameters:   

nMilliseconds    an integer indicating a number of milliseconds to pause

Effect:

Pauses execution of a script for a small amount of time. Useful to keep loops from executing too quickly.  

Clear

This is not really a script command, it is just a button that clears "commands for" window. In future releases of JoyShock, this will be accompanied by a complete set of editing buttons.

V. Sample Profiles

Following are several example profiles to help you get started with JoyShock.

Repeating arrow keys as long as the joystick is pressed.

These scripts achieve a similar effect to those in section three, however, these repeatedly simulate arrow key presses while the main joystick is held down.

Stick Left Press:
BEGBLOCK 001 RPT 0
KEYDOWN LEFT
KEYUP LEFT
ENDBLOCK 001

Stick Left Release:
TRMBLOCK 001

Stick Right Press:
BEGBLOCK 002 RPT 0
KEYDOWN RIGHT
KEYUP RIGHT
ENDBLOCK 002

Stick Right Release:
TRMBLOCK 002

Stick Up Press:
BEGBLOCK 003 RPT 0
KEYDOWN UP
KEYUP UP
ENDBLOCK 003

Stick Up Release:
TRMBLOCK 003

Stick Down Press:
BEGBLOCK 004 RPT 0
KEYDOWN DOWN
KEYUP DOWN
ENDBLOCK 004

Stick Down Release:
TRMBLOCK 004

Making the mouse move using your joystick.

The following scripts let you move the mouse cursor around with the joystick. Note the use of the xmult and ymult parameters on the MOUSE MOVE commands to make the mouse movement "accelerate" depending on how hard you press the joystick. Also note the "other settings" section that specifies 0 tolerance for the X and Y axis of the main stick. These settings indicate no dead zone for the main stick, which means you will get the maximum advantage from using the acceleration parameters in MOUSE MOVE. Try experimenting with these scripts. Mouse movement quality can vary a lot depending on delay values, step values, and multiplier values. One experiment is to have each event move steps of 0.1 for both X and Y mouse movements and specify acceleration factors for both axis. That is, something like this: MOUSE MOVE R B 0.1 0.1 X Y Instead of MOUSE MOVE R B 0.1 0 X N. This often produces smoother mouse motion, do you know why?!  

Stick Left Press:
BEGBLOCK 001 RPT 0
MOUSE MOVE R B 0.1 0 X N
DELAY 1
ENDBLOCK 001

Stick Left Release:
TRMBLOCK 001

Stick Right Press:
BEGBLOCK 002 RPT 0
MOUSE MOVE R B 0.1 0 X N
DELAY 1
ENDBLOCK 002

Stick Right Release:
TRMBLOCK 002

Stick Up Press:
BEGBLOCK 003 RPT 0
MOUSE MOVE R B 0 0.1 N Y
DELAY 1
ENDBLOCK 003

Stick Up Release:
TRMBLOCK 003

Stick Down Press:
BEGBLOCK 004 RPT 0
MOUSE MOVE R B 0 0.1 N Y
DELAY 1
ENDBLOCK 004

Stick Down Release:
TRMBLOCK 004

Other Settings:
X Tolerance = 0
Y Tolerance = 0

Using your joystick buttons for text macros.

Another cool way to use JoyShock is to program its buttons for text macros that you often use. For instance, in multiplayer games where you have to type to chat, it may be helpful to have some buttons with preprogrammed messages. In future versions, pure text macros will be made simpler by the addition of a "STRING" script command.

Button 1 Press:

KEY DOWN H
KEY UP H
 KEY DOWN e
KEY UP e
KEY DOWN l
KEY UP l
KEY DOWN p
KEY UP p
KEY DOWN SPACE
KEY UP SPACE
KEY DOWN M
KEY UP M
 KEY DOWN e
KEY UP e
KEY DOWN !
KEY UP !

Using your joysticks for games that do not have joystick support- example Diablo II scripts.

JoyShock really comes into its own when you use it to give joystick power to games that do not have built in joystick support. The author of JoyShock is a true fan of Diablo II (if you haven't played it, try it, it rocks)! Following are some of the scripts that have been used to give Diablo II joystick power. These scripts do not all belong to one profile, but can be mixed and matched depending on what you like and your style of play.

Use the main joystick left/right motions to activate potions quickly in battle:

Stick Left Press:
KEY DOWN 1
KEY UP 1

Stick Right Press:
KEY DOWN 2
KEY UP 2

Use the main joystick down motion to show all of the items and map on the screen, when you release the stick, the information goes away (assumes automap is mapped to "\" and showitems is mapped to "]")! Using a sorceress, you could also have this automatically activate telekinesis to grab items quickly!

Stick Down Press:
KEY DOWN \
KEY UP \
KEY DOWN ]

Stick Down Release:
KEY DOWN \
KEY UP \
KEY UP ]

Use rotation to activate a teleport quickly (assumes you have F8 mapped to your tome of town portal).

Rot. Left Press:
KEY DOWN F8
KEY UP F8
RIGHT MOUSE DOWN
RIGHT MOUSE UP

Use POV north to activate and repeatedly fire a special ability rapidly (ability is mapped to F1).

POV North Press:
KEY DOWN F1
KEY UP F1
BEGBLOCK 001 RPT 0
RIGHT MOUSE DOWN
RIGHT MOUSE UP
ENDBLOCK 001

POV North Release:
TRMBLOCK 001

Use POV east to activate and fire an ability (ability is mapped to F2).

POV East Press:
KEY DOWN F2
KEY UP F2
RIGHT MOUSE DOWN
RIGHT MOUSE UP

Alternatively, you could use the POV to move your character around the screen instead of using the mouse.

POV North Press:
MOUSE MOVE A B 320 140 N N
LEFT MOUSE DOWN

POV North Release:
LEFT MOUSE UP

POV NE Press:
MOUSE MOVE A B 385 140 N N
LEFT MOUSE DOWN

POV NE Release:
LEFT MOUSE UP

POV East Press:
MOUSE MOVE A B 385 224 N N
LEFT MOUSE DOWN

POV East Release:
LEFT MOUSE UP

POV SE Press:
MOUSE MOVE A B 385 250 N N
LEFT MOUSE DOWN

POV SE Release:
LEFT MOUSE UP

POV South Press:
MOUSE MOVE A B 320 250 N N
LEFT MOUSE DOWN

POV South Release:
LEFT MOUSE UP

POV SW Press:
MOUSE MOVE A B 235 250 N N
LEFT MOUSE DOWN

POV SW Release:
LEFT MOUSE UP

POV West Press:
MOUSE MOVE A B 235 224 N N
LEFT MOUSE DOWN

POV West Release:
LEFT MOUSE UP

POV NW Press:
MOUSE MOVE A B 235 140 N N
LEFT MOUSE DOWN

POV NW Release:
LEFT MOUSE UP

Another alternative is to use the main joystick to move the mouse around and use buttons for your special abilities and mouse clicks (see "Making the mouse move using your joystick" section).

There are many other configurations that are useful for Diablo II, especially when you start to customize them for the different styles of play and abilities required by the different character classes. Experiment! Try new things! You will eventually find scripts to help you play better and smarter, good luck!

VI. Contact Information

Send bug reports and comments to cleverdevs@hotmail.com. If you need special attention, you may reach the author at zwrm1@hotmail.com. This email address is subject to change without notice. For the most up to date contact information, visit the CleverDevs home page at: http://www.cleverdevs.com. Updated versions of this document may be found at the CleverDevs home page.

Any comments, suggestions, or bug reports pertaining to this product are very welcome!

VII. Disclaimer and License

This license does not constitute proof of your license to use the JoyShock software. This license is subject to change without notice.

PLEASE READ THIS LICENSE CAREFULLY BEFORE USING THIS SOFTWARE. BY USING USING THE SOFTWARE (JOYSHOCK), YOU AGREE TO BECOME BOUND BY THE TERMS OF THIS LICENSE. IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, DO NOT USE THIS SOFTWARE.

SHAREWARE VERSION

Evaluation and Registration.
This is not free software. Subject to the terms below, you are hereby licensed to use JoyShcock for evaluation purposes without charge for a period of 30 days. If you use this software after the 30 day evaluation period a registration fee is required. Payment and Registration Information is available at: http://www.cleverdevs.com

Unregistered use of JoyShock after the 30 day evaluation period is in violation of U.S. and international copyright laws.

The computer program JoyShock ("Software") is licensed, not sold, to you by CleverDevs. JoyShock is for use only under the terms of this License, and CleverDevs reserves any rights not expressly granted to you. You own the media on which the Software is recorded or fixed, but CleverDevs retains ownership of the Software itself.

1. License. This License allows you to:
(a) Use the Software on one (1) computer or local workstation. To "use" the Software means that the Software is either loaded in the memory (i.e., RAM) of a computer or installed on the permanent memory of a computer (i.e., hard disk, etc.). One registered copy of JoyShock may either be used by a single person who uses the software personally on one computer, or installed on a single workstation used nonsimultaneously by multiple people, but not both.

(b) Make one copy of the Software in machine readable form solely for backup purposes. As an express condition of this License, you must reproduce on each copy any copyright notice or other proprietary notice that is on the original copy supplied by JoyShock.

(c) Notwithstanding any other terms in this License, if the Software is licensed as an upgrade or update, then you may only use the Software to replace previously validly licensed versions of the same software. You agree that the upgrade or update does not constitute the granting of a second license to the Software (i.e., you may not use the upgrade or update in addition to the software it is replacing, nor may you transfer the software which is being replaced to a third party).

2. Restrictions. The Software contains trade secrets in its human perceivable form and, to protect them, you may not REVERSE ENGINEER, DECOMPILE, DISASSEMBLE OR OTHERWISE REDUCE THE SOFTWARE TO ANY HUMAN PERCEIVABLE FORM. YOU MAY NOT MODIFY, ADAPT, TRANSLATE, RENT, LEASE, LOAN OR CREATE DERIVATIVE WORKS BASED UPON THE SOFTWARE OR ANY PART THEREOF.

3. Dual Media. Even if this JoyShock product includes the Software on more than one medium (e.g., on a CD, on magnetic disks, or as a file downloaded from the Internet), you are only licensed to use one copy of the Software as described in Section 1(a). You may not use the Software stored on the other medium on another computer or common storage device, nor may you rent, lease, loan or transfer it to another user.

4. Termination. This License is effective to all Registered users of JoyShock until terminated. This License will terminate immediately without notice from JoyShock or judicial resolution if you fail to comply with any provision of this License. Upon such termination you must destroy the Software, and all copies thereof, and Sections 6, 7 and 8 will survive any termination.

5. Export Law Assurances. You agree that neither the Software nor any direct product thereof is being or will be shipped, transferred or re-exported, directly or indirectly, into any country prohibited by the United States Export Administration Act and the regulations thereunder or will be used for any purpose prohibited by the Act.

6. Limited Warranty. THIS LIMITED WARRANTY IS THE ONLY WARRANTY PROVIDED BY CLEVERDEVS AND ITS LICENSORS EXPRESSLY DISCLAIM ALL OTHER WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE WITH REGARD TO THE SOFTWARE AND ACCOMPANYING WRITTEN MATERIALS. BECAUSE SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF IMPLIED WARRANTIES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU.

7. Limitation of Remedies and Damages. In no event will CleverDevs, its directors, officers, employees or affiliates of any of the foregoing be liable to you for any consequential, incidental, indirect or special damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information and the like), whether foreseeable or unforeseeable, arising out of the use of or inability to use the Software or accompanying written materials, regardless of the basis of the claim and even if CleverDevs or an CleverDevs representative has been advised of the possibility of such damage. CleverDevs's liability to you for direct damages for any cause whatsoever, and regardless of the form of the action, will be limited to the the money paid for the Software that caused the damages.

THIS LIMITATION WILL NOT APPLY IN CASE OF PERSONAL INJURY ONLY WHERE AND TO THE EXTENT THAT APPLICABLE LAW REQUIRES SUCH LIABILITY. BECAUSE SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU.

8. General. This License will be construed under the laws of the State of Tennessee, except for that body of law dealing with conflicts of law. If any provision of this License shall be held by a court of competent jurisdiction to be contrary to law, that provision will be enforced to the maximum extent permissible, and the remaining provisions of this License will remain in full force and effect.

DISCLAIMER:

THIS PRODUCT (JOYSHOCK) IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, CLEVERDEVS FURTHER DISCLAIMS ALL WARRANTIES, INCLUDING WITHOUT LIMITATION ANY IMPLIED OR STATED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THE ENTIRE RISK ARISING OUT OF THE USE OR PERFORMANCE OF THIS PRODUCT AND DOCUMENTATION REMAINS WITH RECIPIENT. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL CLEVERDEVS OR ITS SUPPLIERS BE LIABLE FOR ANY CONSEQUENTIAL, INCIDENTAL, DIRECT, INDIRECT, SPECIAL, PUNITIVE, RECURSIVE, OR OTHER DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, PERSONAL INJURY, DISRUPTION OF FAMILY LIFE, OR OTHER PECUNIARY LOSS) ARISING OUT OF THIS AGREEMENT OR THE USE OF OR INABILITY TO USE THE PRODUCT, EVEN IF CLEVERDEVS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME STATES/JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO THE RECIPIENT.

 

VIII. Known Issues

At the time of this writing, there are no known issues with JoyShock.