Data Structures For Game Programmers (2003)

977 512 0
Data Structures For Game Programmers (2003)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Team LRN Data Structures for Game Programmers Team LRN This page intentionally left blank Team LRN Data Structures for Game Programmers Ron Penton TM Team LRN © 2003 by Premier Press, a division of Course Technology All rights reserved No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system without written permission from Premier Press, except for the inclusion of brief quotations in a review The Premier Press logo and related trade dress are trademarks of Premier Press and may not be used without written permission TM Publisher: Stacy L Hiquet Marketing Manager: Heather Hurley Acquisitions Editor: Emi Smith Project Editor: Karen A Gill Technical Reviewer: André LaMothe Copyeditor: Stephanie Koutek Interior Layout: LJ Graphics, Susan Honeywell Cover Design: Mike Tanamachi Indexer: Kelly Talbot Proofreader: Jenny Davidson Microsoft, Windows, and Visual C++ are trademarks of Microsoft Corporation.Wolfenstein, Doom, and Quake are trademarks of Id Software, Inc Warcraft and Starcraft are trademarks of Blizzard Entertainment The artwork used in this book is copyrighted by its respective owners, and you may not use it in your own commercial works All other trademarks are the property of their respective owners Important: Premier Press cannot provide software support Please contact the appropriate software manufacturer’s technical support line or Web site for assistance Premier Press and the author have attempted throughout this book to distinguish proprietary trademarks from descriptive terms by following the capitalization style used by the manufacturer Information contained in this book has been obtained by Premier Press from sources believed to be reliable However, because of the possibility of human or mechanical error by our sources, Premier Press, or others, the Publisher does not guarantee the accuracy, adequacy, or completeness of any information and is not responsible for any errors or omissions or the results obtained from use of such information Readers should be particularly aware of the fact that the Internet is an ever-changing entity Some facts may have changed since this book went to press ISBN: 1-931841-94-2 Library of Congress Catalog Card Number: 2002111226 Printed in the United States of America 03 04 05 06 07 BH 10 Premier Press, a division of Course Technology 2645 Erie Avenue, Suite 41 Cincinnati, Ohio 45208 Team LRN To my family, for always being there for me Team LRN Acknowledgments I would first like to thank my family for putting up with me for the past nine months Yes, yes, I’ll start cleaning the house now I would like to thank all of my friends at school: Jim, James, Dan, Scott, Kevin, and Kelvin, for helping me get through all of those boring classes without falling asleep I would like to thank everyone at work for supporting me through this endeavor I especially want to thank Ernest Pazera, André LaMothe, and everyone else at Premier Press for giving me this tremendous opportunity and believing in me I would like to thank Bruno Sousa for opening the door to writing for me I want to thank the pioneers of Gamedev.net, Kevin Hawkins and Dave Astle, for paving the road for me and making a book such as this possible I would like to thank all of you in the #gamedev crew, specifically (in no particular order) Trent Polack, Evan Pipho, April Gould, Joseph Fernald, Andrew Vehlies, Andrew Nguyen, John Hattan, Ken Kinnison, Seth Robinson, Denis Lukianov, Sean Kent, Nicholas Cooper, Ian Overgard, Greg Rosenblatt, Yannick Loitière, Henrik Stuart, Chris Hargrove, Richard Benson, Mat Noguchi, and everyone else! I would like to thank my artists, Steven Seator and Ari Feldman, who made this book’s demos look so much better than they would have been And finally, I would like to thank the Pepsi Corporation, for making that wonderful “stay awake” juice known as Mountain Dew Team LRN About the Author Ron Penton’s lifelong dream has always been to be a game programmer From the age of 11, when his parents bought him his first game programming book on how to make adventure games, he has always striven to learn the most about how games work and how to create them Ron is currently finishing up his bachelor’s degree in computer science at the State University of New York at Buffalo He hopes to have a long career in game development Team LRN Contents at a Glance Introduction xxxii Part One Concepts Chapter Chapter Basic Algorithm Analysis Templates 13 Part Two The Basics 37 Chapter Chapter Chapter Chapter Chapter Chapter Chapter Arrays 39 Bitvectors 83 Multi-Dimensional Arrays 107 Linked Lists 147 Stacks and Queues 189 Hash Tables 217 Tying It Together: The Basics 241 Part Three Recursion and Trees 315 Chapter Chapter Chapter Chapter Chapter 10 11 12 13 14 Recursion 317 Trees 329 Binary Trees 359 Binary Search Trees 389 Priority Queues and Heaps 407 Team LRN Contents at a Glance Chapter 15 Chapter 16 Game Trees and Minimax Trees 431 Tying It Together: Trees 463 Part Four Graphs 477 Chapter 17 Chapter 18 Chapter 19 Graphs 479 Using Graphs for AI: Finite State Machines 529 Tying It Together: Graphs 563 Part Five Algorithms 597 Chapter 20 Chapter 21 Chapter 22 Chapter 23 Chapter 24 Conclusion Sorting Data 599 Data Compression 645 Random Numbers 697 Pathfinding 715 Tying It Together: Algorithms 769 793 Part Six Appendixes 799 Appendix A Appendix B Appendix C Appendix D A C++ Primer 801 The Memory Layout of a Computer Program 835 Introduction to SDL 847 Introduction to the Standard Template Library 879 Index 901 Team LRN ix 920 Index weighted, 754-755 graphical demonstration, 755-756 pathfinding, 758-759 terrain, 756-762 marking nodes, 495 Massively Multiplayer Online games, 105 math bit math, 802-810 binary numbers, 802-804 bitshifting, 809-810 bitwise, 807-808 datatype sizes, 805-806 integer data sizes, 805-806 functions, 817-818 math rules (binary), 91 mazes (pathfinding), 719-721 mean (statistics), 618 median (statistics), 618 median-of-three (quicksorts), 618 MedianOfThree function, 623-624 memory arrays cache, 77-80 size, 80 caching (bitvectors), 101 code, 837 crashes, 55 free store, 836, 844-845 global, 838-839 leaks directionmaps, 573 dynamic arrays, 53- 55 troubleshooting, 168 overhead, 185-186 sections, 836-837 speed, 105 stack, 840-844 Menu class, 201-204 menus (stacks), 199-204 merge sorts, 637 Microsoft XBox data compression, 648 variable, 61 MiniMax function, 449 minimax states (tic tac toe), 439-442 minimax trees base numbers, 441 checkers, 442, 456-459 chess, 442 defined, 434-437 game states, 439-442 graphical demonstration, 437-439 limited depth algorithms, 460 recursion, 446-448 Rock Piles, 442-456 MMO (Massively Multiplayer Online) games, 105 mode wb, 69 statistics, 618 modulo, 703-704 Monster class, 72 monsters Game Demo, 71-77 MouseDown function, 873 MouseUp function, 873 multi-dimensional arrays See also 2D arrays; 3D arrays accessing, 115-116 analysis, 144-145 branch predictors, 142-144 conventions, 118 coordinates, 118 declaring, 112-115 defined, 108-110 dynamic, 121-131 finite state machines, 542-544 Team LRN Index initializing, 113-114 non-symmetrical, 114 variable length, 114-115 passing functions, 119-121 performance, 142-144 pipelining, 142-144 size, 144 speed, 142-144 921 O N namespaces (STL), 883-885 naming conventions (STL), 882-883 network graphs, 484 new function, 52 nodes graphs, 482 doubly linked lists inserting, 172-173 removing, 173-174 structure, 171-172 linked lists, 148-149 marking, 495 NodeType datatype, 501 non-constant values (random integers), 702 non-linear random numbers, 707-714 non-symmetrical multi-dimensional arrays, 114 nonvariable length symmetrical multi dimensional arrays, 114-115 notation See algorithms numbers See also integers base (minimax trees), 441 binary, 802-804 random, non-linear, 707-714 O notation, 4-9 Object class, 250-255 inheritance, 260-265 object tracing, 719-721 OOP (object-oriented programming), 243 operators access, 89-91 and, 91-93 assignment, 344 binary and, 90-91 conversion, 63-64, 829-830 delete, 54, 57 equivalence, 445 intarray, 62-63 or, 91-93 overloading, 827-829 sizeof, 48 OpponentMove function, 453-454 optimizing bubble sorts, 604-605 or operator, 91-93 output See I/O overflow linear, 224-225 linked, 225-226 quadratic, 225 overhead (memory), 185-186 overloading operators, 827-829 P parameterized types, 17 parameters classes Array2D class, 122 arrays, 30-31 Team LRN 922 Index templates data types, 24-29 values, 27-32 parents (classes), 249 ParseArithmetic function, 382-384 parsing binary trees, 374-376 algorithms, 381-382 arithmetic expressions, 376-377 code, 382-384 executing, 384-386 recursive descent, 377-386 scanning, 378-379 tokenizing, 378-379 tokens, 377-378 variables, 378 passing functions multi-dimensional arrays, 119-121 static arrays, 46-48 PathAStar function, 775-778 PathDistanceFirst function, 734-739 pathfinding A*, 750-752 code, 752-753 DirectionMap class, 780-785 graphical demonstration, 752 Tilemap class, 771-779 Adventure, 770 breadth-first, 721-727 calculating, 726 distance-first, 725-727 code, 730-739 graphical demonstration, 727-730 efficiency, 790-791 graphical demonstration, 753-754 heuristics, 739-748 code, 744-745, 749-750 graphical demonstration, 742-744, 748-749 line-based, 762-764 object tracing, 719-721 overview, 716-718 quadtrees, 764-765 random bouncing, 718-719 speed, 786-790 waypoints, 765-767 weighted maps, 758-759 patterns (random integers), 699-700 Pentium data compression, 647 percents (random), 705-706 PerformAI function, 787-790 performance (multi-dimensional arrays), 142-144 performing quicksorts, 618-621 Person class, 258-260, 290-297, 788 PickUp function, 471 pipelining multi-dimensional arrays, 142-144 pivots (quicksorts), 616-618 Player class, 97 trees, 469-470 players, saving, 96-102 playing Adventure, 582 plotlines (trees), 352-358 pointers classes, 252-254 dynamic arrays, 53, 55 FILE, 69 functions, 832-833 memory leaks, 55 static arrays, 47-48 strong type-checking, 51 this, 830 Pop function, 195, 198 popping stacks, 191 portal engines, 518-527 Postorder function, 350-351, 372 Team LRN Index postorder traversal, 449 powers (recursion), 319-320 Preorder function, 348-350, 372 Prepend function, 158 priority queues AI, 425 building, 424-430 defined, 408-410 Huffman trees, 668-674 private classes, 246-248 Probability Distribution Graphs, 707-708 ProcessAI function, 557-559 programs, distributing, 858 projects (SDL), 853-855 public classes, 245-246 pure finite state machines, 538 Push function, 194-195, 198 pushing stacks, 191 Q quadratic overflow, 225 quadtrees, 764-765 queues arrayed, 207-212 circular, 207 commands, 212-216 defined, 204 functions, 206 graphical demonstration, 204-205 implementing, 206-212 linked, 206-207 priority queues See priority queues QuickSort function, 624-627 quicksorts, 616 code, 623-627 923 graphical demonstration, 621-622, 627-630 median-of-three, 618 performing, 618-621 pivots, 616-618 R radix sorts, 630-631 base 2, 633-635 base 4, 636 base 16, 636 bin size, 633 code, 633-637 graphical demonstration, 631-633 rand function, 700-702, 819 random bouncing, 718-719 Random Distribution Graphs graphical demonstration, 712-714 random floats, 706-707 random integers, 698-699 determinism, 699-700 functions, 700-702 linear congruency, 700 non-constant values, 702 ranges, 702-705 repeating patterns, 699-700 random non-linear numbers, 707-714 random percents, 705-706 random-access data structures, 41 RandomPercent function, 705-706 RandomRange function, 704-705 RandomRangeF function, 706-707 RandomRangeModulo function, 702-704 ranges linked, 544-545 random integers, 702-705 Team LRN 924 Index ReadFile function, 70-71, 94-95 ReadFromDisk function, 175-176 reading arrays, 70-71 static arrays, 45-46 realloc function, 54-57 recursion AI, 319 algorithms, 319 defined, 318-319 Fibbionacci series, 318 functions, 318 base case, 319 minimax trees, 446-448 powers, 319-320 Towers of Hanoi, 320-328 graphical demonstration, 327-328 trees, 332 recursive descent (binary trees), 377-386 red-black BSTs, 395 references (data types), 62 registers (arrays), 77-80 Remove function, 65-66, 74-76, 504 singly linked lists, 166-168 RemoveArc function, 509 RemoveHead function, 158-160 RemoveNode function, 506-508 RemoveTail function, 160-161 removing arrays, 80 data (BSTs), 394 items, 65-66, 414-416 nodes (doubly linked lists), 173-174 repeating patterns (random integers), 699-700 ResetIterator function, 344-345 Resize function Array class, 60-61 Array2D class, 123-125 Bitvector class, 88-89 Resource class, 402 ResourceCompare function, 403 resources hash tables, 235-239 storing (BSTs), 402-405 return codes, 820-821 return values (functions), 843 right binary trees, 361 RLE (Run Length Encoding) compressor, 656-665 data compression, 649-651 decompressor, 656-665 graphical demonstration, 651-655 sprites, 655 RLE class, 656-665 RLEPair class, 656 Rock Piles (minimax trees), 442-456 RockState class, 443-445 global variables, 445-446 Root function, 345 rotations (BSTs), 395 RTTI (Run Time Type Information), 261-263 rules (BSTs), 394 Run Length Encoding See RLE Run Time Type Information (RTTI), 261-263 S Save function, 312, 590-595 SaveData function, 661, 686-687 SavePlayers function, 100-101 SaveToDisk function, 174-175 SaveTree function, 686 Team LRN Index saving directionmaps, 590-593 players, 96-102 scanning (binary trees), 378-379 SDL (simple directmedia layer), 848 C++, 851-853 distributing programs, 858 event handling, 861-863 files, 849-851 graphics, 858-861 GUI, 869-878 licensing, 848-849 projects, 853-855 SDL TTF, 856-858, 863-865 setup, 849-855 text, 856-858, 863-865 timer, 863 using, 858 vector graphics, 865-867 video, 858-861 SDL TTF, 856-858, 863-865 SDLArrowLine function, 866 SDLBlit function, 135, 867 SDLBox function, 867 SDLFrame class, 867-868 SDLGUI class, 869-874 SDLGUIFrame class, 876-878 SDLGUIItem class, 874-876 SDLHelpers library, 865-867 SDLLine function, 866 SDLPoint function, 866 searches breadth-first, 495-499 depth-first, 493-495 DLDFS, 521-522 keys, 226 pathfinding See pathfinding Sector class, 523 sectors (graphs), 519-522 sequence containers, 890-896 Set function, 91-93 set functions, 91 SetAll function, 93-94 SetFocus function, 872 SetFollow function, 788 SetFont function, 870 SetLife function, 99 SetNewMap function, 302-303, 471-472 setup (SDL), 849-855 shell sorts, 637 simple directmedia layer See SDL SimpleHeuristic function, 744-745 singly linked lists analysis, 169 Append function, 156-157 constructor, 155 destructor, 155-156 encapsulating, 154-155 graphical demonstration, 149-150 Insert function, 164-167 InsertAfter function, 152-153 iterators, 153-154, 164 Prepend function, 158 Remove function, 166-168 RemoveHead function, 158-160 RemoveTail function, 160-161 SListIterator class, 162-163 SListNode class, 151-152 structure, 150 size arrayed binary trees, 364-366 arrays (memory), 80 bins (radix sorts), 633 datatype sizes, 805-806 dynamic arrays, 54-57 integer data sizes, 805-806 Team LRN 925 926 Index linked lists, 185-186 multi-dimensional arrays, 144 static arrays, 48 Size function, 67-68 Array2D class, 125 sizeof operator, 48 SListIterator class, 162-163 SListNode class, 151-152 Append function, 156-157 constructor, 155 destructor, 155-156 encapsulating, 154-155 InsertAfter function, 152-153 iterators, 153-154 Prepend function, 158 RemoveHead function, 158-160 RemoveTail function, 160-161 sorts bin, 630 brute force, 600 BSTs, 638 bubble code, 605-609 comparison functions, 606 defined, 600-602 graphical demonstration, 602-604 optimizing, 604-605 depth-based, 638-642 z-buffers, 639 heap, 609-611 code, 613-616 graphical demonstration, 611-613 insertion, 637 merge, 637 quicksorts, 616 code, 623-627 graphical demonstration, 621-622, 627-630 median-of-three, 618 performing, 618-621 pivots, 616-618 radix, 630-631 base 2, 633-635 base 4, 636 base 16, 636 bin size, 633 code, 633-637 graphical demonstration, 631-633 shell, 637 statistics mean, 618 median, 618 mode, 618 sparse data, 218-219 speed culling, 519 game logic, 787-790 linked lists, 187-188 memory, 105 multi-dimensional arrays, 142-144 pathfinding, 786-790 speed variable, 247 splay BSTs, 395 sprites (RLE), 655 srand function, 700-702, 819 stacks analysis, 196 arrayed, 196-199 analysis, 199 defined, 190-192 FILO, 191 functions, 193 graphical demonstration, 192-193 graphs (traversals), 495 implementing, 193-199 LIFO, 191 Team LRN Index linked, 194-196 memory, 840-844 menus, 199-204 popping, 191 pushing, 191 standard template library See STL Start function, 162 state transition tables, 535-536 states FSM See Finite State Machines games, 439-442 static arrays, 43-49 accessing, 44-46 declaring, 43-44 fencepost errors, 44 initializing, 48 passing to functions, 46-48 pointers, 47-48 reading, 45-46 size, 48 troubleshooting, 45-46 writing, 45-46 static variables, 839 statistics, 618 STL (standard template library), 880 algorithms, 885-889 containers, 898-899 adaptors, 896-898 associative, 896 categories, 888-889 functions, 889-890 sequence, 890-896 data structures, 885-889 deque, 893-894 list, 894-896 vector, 891-893 iterators, 886 namespaces, 883-885 naming conventions, 882-883 STLPort directory, 880-882 STLPort directory, 880-882 storing data 2D arrays, 116-117 3D arrays, 117-118 4D arrays, 117-118 arrays, 68-77 classes, 243-245 resources (BSTs), 402-405 stray pointers (dynamic arrays), 53 strcat function, 663 String class, 236-237 StringHash function, 223-224 strings (hash tables), 223-224 strong type-checking, 51 structure binary trees, 362-366 doubly linked lists, 171-172 singly linked lists, 150 Tree class, 339 TreeIterator class, 343 trees, 332-333 structures See data structures sub-optimal BSTs, 395 sum variable, 16 Sumtype data type, 25 switch function, 516-517 T tables See also hash tables adjacency, 486-488 direction, 488-489 frequency tables, 667-668 Team LRN 927 928 Index lookup tables, 691 state transition tables, 535-536 template keyword, 17 templates classes, 19-24 declaring, 23 instances, 23 documenting, 33 functions, 15-19 implementing, 34-35 overview, 14-15 parameters data types, 24-26, 29 values, 27-32 troubleshooting, 32-33 Visual C++, 34-35 terrain (weighted maps), 756-762 pathfinding, 758-759 test files (data compression), 692-693 text (SDL), 856-858, 863-865 this pointer, 830 tic tac toe, 440-442 TileCell class, 773-774, 781 TileMap class A* pathfinding, 771-779 trees, 469 tilemap editor, 310-314 tilemaps 2D arrays, 131-136 3D arrays, 136-144 Adventure, 275-290 graphs, 485-486 linked lists, 180-183 map editor, upgrading, 594-595 TilePathfind function, 766-767 tiles (directionmaps), 586-588 tilesets, 580 time function, 818-819 timer (SDL), 863 tokenizing (binary trees), 378-379 tokens (binary trees), 377-378 Top function, 195, 198 Towers of Hanoi, 320-328 graphical demonstration, 327-328 tracing objects, 719-721 traversals graphs, 493 breadth-first searches, 495-499 depth-first searches, 493-495 graphical demonstration, 500-501 marking nodes, 495 stacks, 495 postorder, 449 traversing arrayed binary trees, 365-366 binary trees, 371-374 graphical demonstration, 373-374 trees, 347-351 graphical demonstration, 351-352 Tree class, 338 constructor, 340 Count function, 342 Destroy function, 341-342 destructor, 340-341 structure, 339 TreeIterator class, 342 assignment operator, 344 constructor, 343-344 Down function, 346 horizontal functions, 346 ResetIterator function, 344-345 Root function, 345 structure, 343 Up function, 345-346 trees Adventure Team LRN Index game logic, 470-472 Item class, 467-468 Map class, 468-469 map editor, 473-475 maps, 464-466 Player class, 469-470 TileMap class, 469 binary See binary trees BSTs See BSTs building, 347 defined, 330-332 finite state machines, 545-546 game trees See game trees graphical demonstration, 333-338 graphs, 480-481 heaps See heaps Huffman See Huffman trees linked lists, 332 minimax trees See minimax trees plotlines, 352-358 quadtrees See quadtrees recursion, 332 structure, 332-333 traversing, 347-351 graphical demonstration, 351-352 troubleshooting See also error handling bad alloc exception, 61 design, 772 memory crashes, 55 memory leaks, 55, 168 directionmaps, 573 dynamic arrays, 53 speed (pathfinding), 786-790 static arrays, 45-46 templates, 32-33 try keyword, 821-823 type-checking (pointers), 51 types See data types U uni-directional graphs, 483-484, 491 Up function, 345-346 upgrading tilemaps, 594-595 using bitfields, 103-105 hash tables, 233-235 SDL, 858 V Valid function, 163 values non-constant, 702 return, 843 templates (parameters), 27-32 variables cin, 812-814 cout, 811-812 global, 838-839 RockState class, 445-446 index, 16 local, 840-842 min, 61 parsing, 378 speed, 247 static, 839 sum, 16 vector data structure, 891-893 vector graphics (SDL), 865-867 video (SDL), 858-861 virtual functions, 251-255 Visual C++ templates, 34-35 Team LRN 929 930 Index W-Z walk down algorithm (heaps), 414 walk up algorithm (heaps), 411 WalkDown function, 422-424 WalkUp function, 420-422 wavelets (data compression), 694 waypoints (pathfinding), 765-767 wb mode, 69 Web sites, 798, 881 weighted graphs, 484 weighted maps, 754-755 graphical demonstration, 755-756 pathfinding, 758-759 terrain, 756-762 Width function, 125 WriteFile function, 69, 94 writing arrays, 69-70 static arrays, 45-46 XBox data compression, 648 z-buffers, 639 Team LRN Take Your Game to the X TREME! Xtreme Games LLC was founded to help small game developers around the world create and publish their games on the commercial market Xtreme Games helps younger developers break into the field of game programming by insulating them from complex legal and business issues Xtreme Games has hundreds of developers around the world, if you’re interested in becoming one of them, then visit us at www.xgames3d.com www.xgames3d.com Team LRN “Game programming is without a doubt the most intellectually challenging field of Computer Science in the world However, we would be fooling ourselves if we said that we are ‘serious’ people! Writing (and reading) a game programming book should be an exciting adventure for both the author and the reader.” —André LaMothe, Series Editor ™ Premier Press, Inc www.premierpressbooks.com Team LRN Team LRN License Agreement/Notice of Limited Warranty By opening the sealed disc container in this book, you agree to the following terms and conditions If, upon reading the following license agreement and notice of limited warranty, you cannot agree to the terms and conditions set forth, return the unused book with unopened disc to the place where you purchased it for a refund License: The enclosed software is copyrighted by the copyright holder(s) indicated on the software disc You are licensed to copy the software onto a single computer for use by a single user and to a backup disc You may not reproduce, make copies, or distribute copies or rent or lease the software in whole or in part, except with written permission of the copyright holder(s) You may transfer the enclosed disc only together with this license, and only if you destroy all other copies of the software and the transferee agrees to the terms of the license You may not decompile, reverse assemble, or reverse engineer the software Notice of Limited Warranty: The enclosed disc is warranted by Premier Press, Inc to be free of physical defects in materials and workmanship for a period of sixty (60) days from end user’s purchase of the book/disc combination During the sixty-day term of the limited warranty, Premier Press will provide a replacement disc upon the return of a defective disc Limited Liability: THE SOLE REMEDY FOR BREACH OF THIS LIMITED WARRANTY SHALL CONSIST ENTIRELY OF REPLACEMENT OF THE DEFECTIVE DISC IN NO EVENT SHALL PREMIER PRESS OR THE AUTHORS BE LIABLE FOR ANY OTHER DAMAGES, INCLUDING LOSS OR CORRUPTION OF DATA, CHANGES IN THE FUNCTIONAL CHARACTERISTICS OF THE HARDWARE OR OPERATING SYSTEM, DELETERIOUS INTERACTION WITH OTHER SOFTWARE, OR ANY OTHER SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES THAT MAY ARISE, EVEN IF PREMIER AND/OR THE AUTHORS HAVE PREVIOUSLY BEEN NOTIFIED THAT THE POSSIBILITY OF SUCH DAMAGES EXISTS Disclaimer of Warranties: PREMIER AND THE AUTHORS SPECIFICALLY DISCLAIM ANY AND ALL OTHER WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING WARRANTIES OF MERCHANTABILITY, SUITABILITY TO A PARTICULAR TASK OR PURPOSE, OR FREEDOM FROM ERRORS SOME STATES DO NOT ALLOW FOR EXCLUSION OF IMPLIED WARRANTIES OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THESE LIMITATIONS MIGHT NOT APPLY TO YOU Other: This Agreement is governed by the laws of the State of Indiana without regard to choice of law principles The United Convention of Contracts for the International Sale of Goods is specifically disclaimed This Agreement constitutes the entire agreement between you and Premier Press regarding use of the software Team LRN

Ngày đăng: 11/10/2016, 13:28

Tài liệu cùng người dùng

Tài liệu liên quan