  On the Rain-Slick Precipice of Darkness, Episode One


    End User License Agreement (EULA)

YOU SHOULD CAREFULLY READ THE FOLLOWING END USER LICENSE AGREEMENT
BEFORE USING THIS SOFTWARE PROGRAM. BY USING THIS SOFTWARE PROGRAM, YOU
AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT. *IF YOU DO NOT AGREE
TO THE TERMS OF THIS AGREEMENT, CLICK "QUIT" AND CEASE ALL USE OF THIS
SOFTWARE.*

This software program, including any electronic documentation
(collectively, the "Program"), any printed materials, and any and all
copies of such Program and materials are the copyrighted work of Hothead
Games, Inc. ("Hothead") and/or its affiliates or subsidiaries, and/or
its suppliers or licensors. All rights are reserved, except as expressly
stated below. Your use of the Program is governed by the terms of this
End User License Agreement (the "License Agreement"). The Program is
solely for use by end users according to the terms of the License
Agreement. Any use, reproduction or redistribution of the Program not in
accordance with the terms of the License Agreement is expressly
prohibited.

 1. *Thank You.* /We, Hothead, would first like to thank you for
    licensing the Program. We know you probably don't care much for
    reading through EULAs, but our lawyers want to make sure we keep
    control and ownership of the stuff we and our licensors have spent
    so much time, effort and energy developing. In order to keep
    developing cool stuff that we hope provides you hours and hours of
    entertainment and fun, we have to make sure you understand and agree
    that you are just buying the right to use the Program and that there
    are certain limits to your rights to use the Program. What follows
    is what you need to agree to before you can use the Program./

 2. *Limited Use License.* /Like we mentioned above, you are buying the
    right to use the Program, not the rights to the Program itself./
    Hothead hereby grants, and by using the Program you thereby accept,
    a limited, non-exclusive license and right to install and/or use the
    Program on your personal computers belonging or primarily used by
    you (for example, on your home computer(s) and a laptop) with the
    express understanding that the Program is licensed, not sold, and
    that your license confers no title or ownership of the Program. If
    you wish to use the Program on more computers than the program
    automatically allows, Hothead's customer support may (in its sole
    discretion) increase the number of computers on which the Program
    may be used on a case by case basis. /If you need to increase any
    limits the game places on the number of installs you can use, simply
    contact us and we'll be happy to adjust the settings on your license
    code to make this happen./ This license is not a sale of the
    original software program (which means that the fee you paid gives
    you the right only to use the Program). To avoid any
    misunderstandings, the license granted hereunder is for one
    individual person and the Program will be deemed in "use" on a
    computer when it is loaded onto temporary memory (i.e., RAM) or
    installed into the permanent memory (e.g., hard disk, CD-ROM or
    other storage device) of a computer. Installation of the Program on
    a network server is strictly prohibited. Nothing in this Agreement
    shall be construed as granting any right to use the Program on a
    computer that is not owned or primarily used by you.

 3. *Intellectual Property Ownership.* /In order to keep making cool
    games in the future, we need to make sure that you understand who
    owns the intellectual property rights to the Program./ All title,
    ownership rights and intellectual property rights in and to the
    Program and any and all copies thereof (including but not limited to
    all copyrights, trademarks, trade secrets, trade names, proprietary
    rights, patents, titles, computer code, themes, objects, characters,
    character names, stories, dialog, catch phrases, locations,
    concepts, artwork, animations, sounds, musical compositions,
    audio-visual effects, methods of operation, moral rights, any
    related documentation, and "applets" incorporated into the Program)
    are owned by Hothead or its licensors. The Program is protected by
    the copyright laws of Canada, the United States, international
    copyright treaties and conventions and other laws. All rights are
    reserved. The Program contains certain licensed materials and
    Hothead's licensors may protect their rights in the event of any
    violation of this Agreement. The Program may not be copied or
    reproduced in any manner or medium, in whole or in part, without
    prior written consent from Hothead.

 4. *Responsibilities of End User.* /We've mentioned this before, but it
    probably won't hurt to be a bit more detailed about what you're
    agreeing to by licensing the Program. We want you to be able to
    enjoy the games we make to the maximum extent possible, but our
    lawyers tell us we have to set some rules about what you can and
    can't do to keep from getting us in trouble (and to allow us to stay
    in business and keep making cool new games). So by licensing the
    Program you agree to the following:/
     1. Subject to the license grant above, you may not, in whole or in
        part, copy, photocopy, reproduce, translate, reverse engineer,
        derive source code, modify, disassemble, decompile, modify or
        create derivative works based on the Program or any part
        thereof, or remove any proprietary notices or labels on the
        Program without the prior written consent of Hothead. You may
        not work around any technical limitations in the Program.

     2. The Program is licensed to you as a single product. Its
        component parts may not be separated for use on more than one
        computer.

     3. You are entitled to use the Program for your personal use, but
        you are not entitled to sell, grant a security interest in or
        transfer reproductions of the Program or otherwise distribute
        copies of the Program to other parties in any way, nor to rent,
        lease or license the Program to others without the prior written
        consent of Hothead.

     4. You are expressly prohibited from selling or otherwise profiting
        from any levels, add-on packs, sequels or other items based upon
        or related to the Program or created by use of any part of the
        Program. If you create levels, add-on packs, sequels or other
        items to the Program, including the construction of new levels
        (collectively, the "Modifications"), you are subject to the
        following restrictions:
         1. Modifications are considered separate from the Program in
            the sense that they are not guaranteed or supported by
            Hothead. However, by creating a Modification you shall be
            deemed to have assigned in favour of Hothead all copyrights
            and intellectual property rights to the Modifications;

         2. your Modifications must require a full, licensed copy of the
            Program to run;

         3. your Modifications must not contain any libellous,
            defamatory or other illegal material, material that is
            scandalous or invades the rights of privacy or publicity of
            any third party, or contain any trademarks,
            copyright-protected work or other property of third parties;

         4. your Modifications must be distributed solely for free.
            Neither you nor any other person or party may sell them to
            anyone, commercially exploit them in any way, or charge
            anyone for using them without a license from Hothead.

     5. The prohibitions and restrictions in this Section apply to
        anyone in possession of the Program or any of your
        Modifications. For greater certainty, notwithstanding anything
        to the contrary in this Agreement, you are not permitted to
        reverse engineer, decompile or disassemble the Program in any
        way. Any copying of the Program not specifically allowed in this
        Agreement is a violation of this Agreement.

 5. *Compliance with Ratings.* /To keep the politicians from carrying
    through on their threats to decide what video games you should and
    shouldn't be able to play (and what developers can and can't
    create), we need to make sure you understand the rating given to the
    Program is important and that you agree to use the Program in
    accordance with its rating./ The Program may consist of a video game
    that has been rated by one or more ratings boards (a "Rating
    Board"). By using the Program you expressly represent, warrant and
    agree that:

     1. you are aware of the rating (the "Rating") issued to the Program
        by the applicable Rating Board in the jurisdiction in which you
        reside or will otherwise be using the Program;

     2. you are of an appropriate age to use the Program in accordance
        with the Rating issued in such jurisdiction;

     3. you will not permit use of the Program by those under the age
        set out in the Rating in the jurisdiction in which you reside or
        will otherwise be using or permitting use of the Program.

    YOU AGREE TO INDEMNIFY AND HOLD HARMLESS HOTHEAD FROM AND AGAINST
    ANY CAUSE OF ACTION, ACTION, SUIT, PROCEEDING AGAINST OR DAMAGES OR
    OTHER LIABILITY SUFFERED BY HOTHEAD IN CONNECTION WITH YOUR BREACH
    OF THIS SECTION 5.

 6. *No Transfer.* /What is this "transfer", you ask? It means that once
    you accept, you can't sell or give the game to someone else./ You
    may not transfer or assign this Agreement or any of your rights or
    obligations under this Agreement.

 7. *Termination.* /We hope this section never has to come into play (or
    section 12 for that matter), as that means you are doing something
    you shouldn't be under the terms of this Agreement (which would suck
    for both of us, but more for you as it means we have to get our
    lawyers involved)./ This Agreement is effective until the earlier of
    (i) termination of this License Agreement by you or Hothead or (ii)
    termination of this Agreement in the event you fail to comply with
    any term contained herein, in which event this Agreement shall be
    deemed to terminate automatically. You may terminate this Agreement
    at any time by destroying all copies of the Program in your
    possession. Hothead may, at its discretion, terminate this License
    at any time upon notifying you of such termination (including by way
    of public notice to all licensees of the Program). In such event
    /(or if you are bad and are not complying with the terms of this
    agreement)/, you must immediately destroy all copies of the Program
    in your possession. Any license agreement to which you may have
    previously agreed that governs your use of prior versions of the
    Program is hereby terminated and is replaced by this agreement. The
    provisions of Sections 3, 7, and 10-13 will survive any termination
    of this Agreement.

 8. *Updates; New Versions.* /We can't support all versions forever but
    we will do our best to support the latest version that we have made
    available./ Hothead may, in its sole discretion, provide updates or
    new versions of the Program in the future. Hothead may provide such
    updates or future versions subject to a separate license, which may
    by its terms terminate this license pursuant to Section 7. Hothead
    shall have no obligation to provide support or updates for the
    Program.

 9. *Export Controls.* /Don't be a criminal . . . I mean, what else can
    we say here?/ You agree to comply with all applicable laws,
    regulations, rulings and executive orders of any governmental
    authority relating to the exportation or importation of the Program,
    including but not limited to the export and destination control
    regulations for Canadian goods.

10. *No Warranties.* /We have no idea what you have already on your
    computer and what state or health your computer is in. The entire
    risk arising out of use or performance of the Program remains with
    you./ THE PROGRAM IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND,
    EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
    PURPOSE, OR NONINFRINGEMENT. ANY WARRANTY AGAINST INFRINGEMENT THAT
    MAY BE PROVIDED IN SECTION 2-312(3) OF THE UNIFORM COMMERCIAL CODE
    IN THE UNITED STATES AND/OR IN ANY OTHER COMPARABLE STATE,
    PROVINCIAL OR FEDERAL STATUTE IS EXPRESSLY DISCLAIMED. Some
    jurisdictions do not allow the exclusion or limitation of implied
    warranties, so the above limitations may not apply to you to that
    extent.

11. *Limitation of Liability.* HOTHEAD SHALL NOT BE LIABLE TO YOU, OR TO
    ANY PERSON ACCESSING GAMEPLAY AS A RESULT OF THE LICENSE GRANTED TO
    YOU, IN ANY WAY FOR LOSS OR DAMAGE OF ANY KIND RESULTING FROM YOUR
    USE OF THE PROGRAM, INCLUDING, BUT NOT LIMITED TO, LOSS OF GOODWILL,
    WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
    COMMERCIAL DAMAGES OR LOSSES ARISING OUT OF THE USE OF OR INABILITY
    TO USE THE PROGRAM, EVEN IF HOTHEAD HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES. FURTHER, HOTHEAD SHALL NOT BE LIABLE IN
    ANY WAY FOR THE LOSS OR DAMAGE TO ANY PLAYER CHARACTERS, ACCOUNTS,
    STATISTICS OR USER PROFILE INFORMATION. YOU UNDERSTAND AND
    ACKNOWLEDGE THAT HOTHEAD CANNOT AND WILL NOT BE RESPONSIBLE FOR ANY
    INTERRUPTIONS OF ONLINE GAMEPLAY, INCLUDING, BUT NOT LIMITED TO ISP
    DISRUPTIONS, SOFTWARE OR HARDWARE FAILURES OR ANY OTHER EVENT WHICH
    MAY RESULT IN A LOSS OF DATA OR DISRUPTION OF ONLINE GAMEPLAY. Some
    jurisdictions do not allow the exclusion or limitation of incidental
    or consequential damages, so the above limitations may not apply to
    that extent. In no event shall our total liability to you for any
    and all damages, losses and causes of action (whether in tort,
    contract or otherwise) exceed the amount paid by you for the
    Program.

12. *Equitable Remedies.* /We need to make sure we can put a quick stop
    to anyone doing something they shouldn't be under this agreement./
    You hereby agree that Hothead would be irreparably damaged if the
    terms of this Agreement were not specifically enforced, and
    therefore you agree that Hothead shall be entitled, without bond,
    other security, or proof of damages, to appropriate equitable
    remedies with respect to breaches of this Agreement, in addition to
    such other remedies as Hothead may otherwise have available to it
    under applicable laws. In the event any litigation is brought by
    either party in connection with this Agreement, the prevailing party
    in such litigation shall be entitled to recover from the other party
    all the costs, attorneys' fees and other expenses incurred by such
    prevailing party in the litigation.

13. *Miscellaneous*
     1. This Agreement shall be deemed to have been made and executed in
        the Province of British Columbia, Canada and any dispute arising
        hereunder shall be resolved in accordance with the law of
        British Columbia. You agree that any claim asserted in any legal
        proceeding by you against Hothead or its licensors shall be
        commenced and maintained in a court located in Vancouver,
        British Columbia having subject matter jurisdiction with respect
        to the dispute between the parties.

     2. Hothead reserves the right, at its sole discretion, to change,
        modify, add to, supplement or delete any of the terms and
        conditions of this Agreement, effective upon prior notice as
        follows: Hothead will post notification of any such changes to
        this Agreement on the its website, and may provide such other
        notice as Hothead may elect in its sole discretion.

     3. In the event that any provision of this Agreement shall be held
        by a court or other tribunal of competent jurisdiction to be
        unenforceable, such provision will be enforced to the maximum
        extent permissible and the remaining portions of this Agreement
        shall remain in full force and effect.

     4. This Agreement constitutes and contains the entire agreement
        between the parties with respect to the subject matter hereof
        and supersedes any prior oral or written agreements.

    You hereby acknowledge that you have read and understand the
    foregoing terms of this Agreement and agree that the act of using
    the Program is an acknowledgment of your agreement to be bound by
    the terms and conditions of this Agreement. You also acknowledge and
    agree that this Agreement is the complete and exclusive statement of
    the agreement between Hothead and you with regard to the subject
    matter hereof and that this Agreement supersedes any prior or
    contemporaneous agreement, either oral or written, and any other
    communications between Hothead and you regarding the subject matter
    hereof.

/That's it! Not so bad, right? Thanks for supporting us and reading all
the way to the end./
