0% found this document useful (0 votes)
22 views52 pages

Unity in Action Multiplatform Game Development in C With Unity 5 1st Edition Joseph Hocking Instant Download

The document is about 'Unity in Action: Multiplatform Game Development in C# with Unity 5' by Joseph Hocking, which provides a comprehensive guide to game development using Unity 5. It covers various aspects including 3D space, 2D functionality, audio, and deployment of games across multiple platforms. The document also includes links to additional recommended resources for further learning in game development with Unity.

Uploaded by

clxjekgdi7973
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
22 views52 pages

Unity in Action Multiplatform Game Development in C With Unity 5 1st Edition Joseph Hocking Instant Download

The document is about 'Unity in Action: Multiplatform Game Development in C# with Unity 5' by Joseph Hocking, which provides a comprehensive guide to game development using Unity 5. It covers various aspects including 3D space, 2D functionality, audio, and deployment of games across multiple platforms. The document also includes links to additional recommended resources for further learning in game development with Unity.

Uploaded by

clxjekgdi7973
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 52

Unity in Action Multiplatform Game Development in C

with Unity 5 1st Edition Joseph Hocking -


Downloadable PDF 2025

https://ebookfinal.com/download/unity-in-action-multiplatform-game-
development-in-c-with-unity-5-1st-edition-joseph-hocking/

Visit ebookfinal.com today to download the complete set of


ebooks or textbooks
Here are some recommended products that we believe you will be
interested in. You can click the link to download.

Game Audio Development with Unity 5 X Design a blockbuster


game soundtrack with Unity 5 X 1st Edition Micheal Lanham

https://ebookfinal.com/download/game-audio-development-with-
unity-5-x-design-a-blockbuster-game-soundtrack-with-unity-5-x-1st-
edition-micheal-lanham/

Game development with Unity 2nd Edition Edition Michelle


Menard

https://ebookfinal.com/download/game-development-with-unity-2nd-
edition-edition-michelle-menard/

Beginning 3D Game Development with Unity All in One Multi


Platform Game Development 2nd edition Edition Sue Blackman

https://ebookfinal.com/download/beginning-3d-game-development-with-
unity-all-in-one-multi-platform-game-development-2nd-edition-edition-
sue-blackman/

Getting Started with Unity 2018 A Beginner s Guide to 2D


and 3D Game Development with Unity Third Edition. Edition
Edward Lavieri
https://ebookfinal.com/download/getting-started-with-
unity-2018-a-beginner-s-guide-to-2d-and-3d-game-development-with-
unity-third-edition-edition-edward-lavieri/
Learn Unity for 2D Game Development 1st Edition Alan Thorn

https://ebookfinal.com/download/learn-unity-for-2d-game-
development-1st-edition-alan-thorn/

Procedural Content Generation for Unity Game Development


Harness the power of procedural content generation to
design unique games with Unity 1st Edition Ryan Watkins
https://ebookfinal.com/download/procedural-content-generation-for-
unity-game-development-harness-the-power-of-procedural-content-
generation-to-design-unique-games-with-unity-1st-edition-ryan-watkins/

Creating 3D Game Art for the iPhone with Unity Featuring


modo and Blender Pipelines 1st Edition Wes Mcdermott

https://ebookfinal.com/download/creating-3d-game-art-for-the-iphone-
with-unity-featuring-modo-and-blender-pipelines-1st-edition-wes-
mcdermott/

Unity Animation Essentials Bring your characters to life


with the latest features of Unity and Mecanim 1st Edition
Alan Thorn
https://ebookfinal.com/download/unity-animation-essentials-bring-your-
characters-to-life-with-the-latest-features-of-unity-and-mecanim-1st-
edition-alan-thorn/

Learn 2D Game Development with C 1st Edition Jebediah


Pavleas

https://ebookfinal.com/download/learn-2d-game-development-with-c-1st-
edition-jebediah-pavleas/
Unity in Action Multiplatform Game Development in C
with Unity 5 1st Edition Joseph Hocking Digital Instant
Download
Author(s): Joseph Hocking
ISBN(s): 9781617292323, 161729232X
Edition: 1
File Details: PDF, 15.92 MB
Year: 2015
Language: english
Multiplatform game development in C#

Covers Unity 5

Joseph Hocking
FOREWORD BY Jesse Schell

MANNING
Unity in Action

Licensed to Mark Watson <[email protected]>


ii

Licensed to Mark Watson <[email protected]>


Unity in Action
Multiplatform Game Development in C#

JOSEPH HOCKING

MANNING
SHELTER ISLAND

Licensed to Mark Watson <[email protected]>


iv

For online information and ordering of this and other Manning books, please visit
www.manning.com. The publisher offers discounts on this book when ordered in quantity.
For more information, please contact
Special Sales Department
Manning Publications Co.
20 Baldwin Road
PO Box 761
Shelter Island, NY 11964
Email: [email protected]

©2015 by Manning Publications Co. All rights reserved.

No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in


any form or by means electronic, mechanical, photocopying, or otherwise, without prior written
permission of the publisher.

Many of the designations used by manufacturers and sellers to distinguish their products are
claimed as trademarks. Where those designations appear in the book, and Manning
Publications was aware of a trademark claim, the designations have been printed in initial caps
or all caps.

Recognizing the importance of preserving what has been written, it is Manning’s policy to have
the books we publish printed on acid-free paper, and we exert our best efforts to that end.
Recognizing also our responsibility to conserve the resources of our planet, Manning books are
printed on paper that is at least 15 percent recycled and processed without elemental chlorine.

Manning Publications Co. Development editor: Dan Maharry


20 Baldwin Road Technical development editor: Scott Chaussee
PO Box 761 Copyeditor: Elizabeth Welch
Shelter Island, NY 11964 Proofreader: Melody Dolab
Technical proofreader: Christopher Haupt
Typesetter: Marija Tudor
Cover designer: Marija Tudor

ISBN: 9781617292323
Printed in the United States of America
1 2 3 4 5 6 7 8 9 10 – EBM – 20 19 18 17 16 15

Licensed to Mark Watson <[email protected]>


brief contents
PART 1 FIRST STEPS ................................................................ 1
1 ■
Getting to know Unity 3
2 ■
Building a demo that puts you in 3D space 21
3 ■
Adding enemies and projectiles to the 3D game 46
4 ■
Developing graphics for your game 69

PART 2 GETTING COMFORTABLE ........................................... 93


5 ■
Building a Memory game using Unity’s new 2D
functionality 95
6 ■
Putting a 2D GUI in a 3D game 119
7 ■
Creating a third-person 3D game: player movement
and animation 140
8 ■
Adding interactive devices and items within the game 167

PART 3 STRONG FINISH ....................................................... 193


9 ■
Connecting your game to the internet 195
10 ■
Playing audio: sound effects and music 222
11 ■
Putting the parts together into a complete game 246
12 ■
Deploying your game to players’ devices 276

Licensed to Mark Watson <[email protected]>


vi BRIEF CONTENTS

Licensed to Mark Watson <[email protected]>


contents
foreword xv
preface xvii
acknowledgments xix
about this book xx

PART 1 FIRST STEPS ..................................................... 1

1 Getting to know Unity 3


1.1 Why is Unity so great? 4
Unity's strengths and advantages 4 Downsides to be

aware of 6 Example games built with Unity 7


1.2 How to use Unity 9


Scene view, Game view, and the Toolbar 10 Using the mouse

and keyboard 11 The Hierarchy tab and the Inspector 12


The Project and Console tabs 13


1.3 Getting up and running with Unity programming 14
How code runs in Unity: script components 15 Using

MonoDevelop, the cross-platform IDE 16 Printing to the


console: Hello World! 17


1.4 Summary 20

vii

Licensed to Mark Watson <[email protected]>


viii CONTENTS

2 Building a demo that puts you in 3D space 21


2.1 Before you start… 22
Planning the project 22 ■
Understanding 3D coordinate space 23
2.2 Begin the project: place objects in the scene 25
The scenery: floor, outer walls, inner walls 25 Lights and ■

cameras 27 The player’s collider and viewpoint 29


2.3 Making things move: a script that applies transforms 30


Diagramming how movement is programmed 30 Writing code to ■

implement the diagram 31 Local vs. global coordinate space 32


2.4 Script component for looking around: MouseLook 33


Horizontal rotation that tracks mouse movement 35 Vertical ■

rotation with limits 35 Horizontal and vertical rotation at the


same time 38
2.5 Keyboard input component: first-person controls 40
Responding to key presses 40 Setting a rate of movement

independent of the computer’s speed 41 Moving the ■

CharacterController for collision detection 42 Adjusting ■

components for walking instead of flying 43


2.6 Summary 45

3 Adding enemies and projectiles to the 3D game 46


3.1 Shooting via raycasts 47
What is raycasting? 47 Using the command

ScreenPointToRay for shooting 48 Adding visual indicators ■

for aiming and hits 50


3.2 Scripting reactive targets 53
Determining what was hit 53 ■
Alert the target that
it was hit 54
3.3 Basic wandering AI 55
Diagramming how basic AI works 56 “Seeing” obstacles ■

with a raycast 56 Tracking the character’s state 58


3.4 Spawning enemy prefabs 60


What is a prefab? 60 Creating the enemy prefab 60

Instantiating from an invisible SceneController 61


3.5 Shooting via instantiating objects 63
Creating the projectile prefab 64 Shooting the projectile

and colliding with a target 65 Damaging the player 67


3.6 Summary 68

Licensed to Mark Watson <[email protected]>


CONTENTS ix

4 Developing graphics for your game 69


4.1 Understanding art assets 69
4.2 Building basic 3D scenery: whiteboxing 72
Whiteboxing explained 72 Drawing a floor plan for the

level 73 Laying out primitives according to the plan 74


4.3 Texture the scene with 2D images 75


Choosing a file format 76 ■
Importing an image file 77
Applying the image 78
4.4 Generating sky visuals using texture images 80
What is a skybox? 80 ■
Creating a new skybox
material 81
4.5 Working with custom 3D models 83
Which file format to choose? 83 ■
Exporting and importing
the model 84
4.6 Creating effects using particle systems 86
Adjusting parameters on the default effect 87 Applying a ■

new texture for fire 88 Attaching particle effects to


3D objects 90
4.7 Summary 91

PART 2 GETTING COMFORTABLE ................................ 93

5 Building a Memory game using Unity’s new 2D


functionality 95
5.1 Setting everything up for 2D graphics 96
Preparing the project 97 Displaying 2D images (aka

sprites) 98 Switching the camera to 2D mode 101


5.2 Building a card object and making it react to clicks 102


Building the object out of sprites 102 ■
Mouse input code 103
Revealing the card on click 104
5.3 Displaying the various card images 104
Loading images programmatically 104 Setting the image ■

from an invisible SceneController 105 Instantiating a grid■

of cards 107 Shuffling the cards 109


5.4 Making and scoring matches 110


Storing and comparing revealed cards 111 Hiding ■

mismatched cards 111 Text display for the score 112


Licensed to Mark Watson <[email protected]>


x CONTENTS

5.5 Restart button 114


Programming a UIButton component using SendMessage 115
Calling LoadLevel from SceneController 117
5.6 Summary 118

6 Putting a 2D GUI in a 3D game 119


6.1 Before you start writing code… 121
Immediate mode GUI or advanced 2D interface? 121
Planning the layout 122 Importing UI images 122

6.2 Setting up the GUI display 123


Creating a canvas for the interface 123 Buttons, images, and

text labels 124 Controlling the position of UI elements 127


6.3 Programming interactivity in the UI 128


Programming an invisible UIController 129 Creating a pop-up

window 131 Setting values using sliders and input fields 133

6.4 Updating the game by responding to events 135


Integrating an event system 136 Broadcasting and listening

for events from the scene 137 Broadcasting and listening for

events from the HUD 138


6.5 Summary 139

7 Creating a third-person 3D game: player movement and


animation 140
7.1 Adjusting the camera view for third-person 142
Importing a character to look at 142 Adding shadows to the

scene 144 Orbiting the camera around the player


character 145
7.2 Programming camera-relative movement controls 148
Rotating the character to face movement direction 149
Moving forward in that direction 151
7.3 Implementing the jump action 152
Applying vertical speed and acceleration 153 Modifying the

ground detection to handle edges and slopes 154


7.4 Setting up animations on the player character 158
Defining animation clips in the imported model 160
Creating the animator controller for these animations 162
Writing code that operates the animator 165
7.5 Summary 166

Licensed to Mark Watson <[email protected]>


CONTENTS xi

8 Adding interactive devices and items within the game 167


8.1 Creating doors and other devices 168
Doors that open and close on a keypress 168 Checking ■

distance and facing before opening the door 170


Operating a color-changing monitor 171
8.2 Interacting with objects by bumping into them 172
Colliding with physics-enabled obstacles 173 Triggering the

door with a pressure plate 174 Collecting items scattered


around the level 176


8.3 Managing inventory data and game state 178
Setting up player and inventory managers 178
Programming the game managers 180 Storing inventory

in a collection object: List vs. Dictionary 184


8.4 Inventory UI for using and equipping items 186
Displaying inventory items in the UI 186 Equipping a key

to use on locked doors 188 Restoring the player’s health by


consuming health packs 190


8.5 Summary 191

PART 3 STRONG FINISH ........................................... 193

9 Connecting your game to the internet 195


9.1 Creating an outdoor scene 197
Generating sky visuals using a skybox 197 ■
Setting up an
atmosphere that’s controlled by code 198
9.2 Downloading weather data from an internet service 201
Requesting WWW data using coroutines 203 Parsing ■

XML 207 Parsing JSON 209 Affecting the scene based


■ ■

on Weather Data 210


9.3 Adding a networked billboard 212
Loading images from the internet 212 Displaying images

on the billboard 214 Caching the downloaded image


for reuse 216


9.4 Posting data to a web server 217
Tracking current weather: sending post requests 218 ■
Server-
side code in PHP 220
9.5 Summary 221

Licensed to Mark Watson <[email protected]>


xii CONTENTS

10 Playing audio: sound effects and music 222


10.1 Importing sound effects 223
Supported file formats 223 ■
Importing audio files 225
10.2 Playing sound effects 226
Explaining what’s involved: audio clip vs. source vs.
listener 226 Assigning a looping sound 228

Triggering sound effects from code 229


10.3 Audio control interface 230
Setting up the central AudioManager 230 ■
Volume control
UI 232 Playing UI sounds 236

10.4 Background music 236


Playing music loops 237 Controlling music volume

separately 240 Fading between songs 242


10.5 Summary 245

11 Putting the parts together into a complete game 246


11.1 Building an action RPG by repurposing projects 247
Assembling assets and code from multiple projects 248
Programming point-and-click controls: movement and
devices 250 Replacing the old GUI with a new interface

255
11.2 Developing the overarching game structure 261
Controlling mission flow and multiple levels 262 Completing ■

a level by reaching the exit 265 Losing the level when caught

by enemies 268
11.3 Handling the player’s progression through the game 269
Saving and loading the player’s progress 269 ■
Beating the
game by completing three levels 273
11.4 Summary 275

12 Deploying your game to players’ devices 276


12.1 Start by building for the desktop: Windows, Mac, and
Linux 278
Building the application 279 Adjusting Player Settings:

setting the game’s name and icon 280 Platform-dependent


compilation 281
12.2 Building for the web 282
Unity Player vs. HTML5/WebGL 282 Building the Unity■

file and a test web page 282 Communicating with JavaScript


in the browser 283

Licensed to Mark Watson <[email protected]>


CONTENTS xiii

12.3 Building for mobile apps: iOS and Android 285


Setting up the build tools 286 ■
Texture compression 289
Developing plug-ins 290
12.4 Summary 298

afterword 299

appendix A Scene navigation and keyboard shortcuts 302


appendix B External tools used alongside Unity 304
appendix C Modeling a bench in Blender 308
appendix D Online learning resources 316

index 319

Licensed to Mark Watson <[email protected]>


xiv CONTENTS

Licensed to Mark Watson <[email protected]>


foreword
I started programming games in 1982. It wasn’t easy. We had no internet. Resources
were limited to a handful of mostly terrible books and magazines that offered fascinat-
ing but confusing code fragments, and as for game engines—well, there weren’t any!
Coding games was a massive uphill battle.
How I envy you, reader, holding the power of this book in your hands. The Unity
engine has done so much to open game programming to so many people. Unity has
managed to strike an excellent balance by being a powerful, professional game engine
that’s still affordable and approachable for someone just getting started.
Approachable, that is, with the right guidance. I once spent time in a circus troupe
run by a magician. He was kind enough to take me in and help guide me toward
becoming a good performer. “When you stand on a stage,” he pronounced, “you
make a promise. And that promise is ‘I will not waste your time.’”
What I love most about Unity in Action is the “action” part. Joe Hocking wastes none
of your time and gets you coding fast—and not just nonsense code, but interesting
code that you can understand and build from, because he knows you don’t just want
to read his book, and you don’t just want to program his examples—you want to be
coding your own game.
And with his guidance, you’ll be able to do that sooner than you might expect. Fol-
low Joe’s steps, but when you feel ready, don’t be shy about diverging from his path
and breaking out on your own. Skip around to what interests you most—try experi-
ments, be bold and brave! You can always return to the text if you get too lost.

xv

Licensed to Mark Watson <[email protected]>


xvi FOREWORD

But let’s not dally in this foreword—the entire future of game development is
impatiently waiting for you to begin! Mark this day on your calendar, for today is the
day that everything changed. It will be forever remembered as the day you started
making games.

JESSE SCHELL
CEO OF SCHELL GAMES
AUTHOR OF THE ART OF GAME DESIGN

Licensed to Mark Watson <[email protected]>


preface
I’ve been programming games for quite some time, but only started using Unity rela-
tively recently. Unity didn’t exist when I first started developing games; the first version
was released in 2005. Right from the start, it had a lot of promise as a game develop-
ment tool, but it didn’t come into its own until several versions later. In particular, plat-
forms like iOS and Android (collectively referred to as “mobile”) didn’t emerge until
later, and those platforms factor heavily into Unity’s growing prominence.
Initially, I viewed Unity as a curiosity, an interesting development tool to keep an eye
on but not actually use. During this time, I was programming games for both desktop
computers and websites and doing projects for a range of clients. I was using tools like
Blitz3D and Flash, which were great to program in but were limiting in a lot of ways. As
those tools started to show their age, I kept looking for better ways to develop games.
I started experimenting with Unity around version 3, and then completely
switched to it when Synapse Games (the company I work for now) started developing
mobile games. At first, I worked for Synapse on web games, but we eventually moved
over to mobile games. And then we came full circle because Unity enabled us to
deploy to the web in addition to mobile, all from one codebase!
I’ve always seen sharing knowledge as important, and I’ve taught game develop-
ment for the last several years. In large part I do this because of the example set for
me by the many mentors and teachers I’ve had. (Incidentally, you may even have
heard of one of my teachers because he was such an inspiring person: Randy Pausch
delivered the Last Lecture shortly before he passed away in 2008.) I’ve taught classes
at several schools, and I’ve always wanted to write a book about game development.

xvii

Licensed to Mark Watson <[email protected]>


xviii PREFACE

In many ways, what I’ve written here is the book I wish had existed back when I was
first learning Unity. Among Unity’s many virtues is the availability of a huge treasure
trove of learning resources, but those resources tend to take the form of unfocused
fragments (like the script reference or isolated tutorials) and require a great deal of
digging to find what you need. Ideally, I’d have a book that wrapped up everything I
needed to know in one place and presented it in a clear and logically constructed
manner, so now I’m writing such a book for you. I’m targeting people who already
know how to program, but who are newcomers to Unity, and possibly new to game
development in general. The choice of projects reflects my experience of gaining
skills and confidence by doing a variety of freelance projects in rapid succession.
In learning to develop games using Unity, you’re setting out on an exciting adven-
ture. For me, learning how to develop games meant putting up with a lot of hassles.
You, on the other hand, have the advantage of a single coherent resource to learn
from: this book!

Licensed to Mark Watson <[email protected]>


acknowledgments
I would like to thank Manning Publications for giving me the opportunity to write this
book. The editors I worked with, including Robin de Jongh and especially Dan
Maharry, helped me throughout this undertaking, and the book is much stronger for
their feedback. My sincere thanks also to the many others who worked with me during
the development and production of the book.
My writing benefited from the scrutiny of reviewers every step of the way. Thanks
to Alex Lucas, Craig Hoffman, Dan Kacenjar, Joshua Frederick, Luca Campobasso,
Mark Elston, Philip Taffet, René van den Berg, Sergio Arbeo Rodríguez, Shiloh Mor-
ris, and Victor M. Perez. Special thanks to the notable review work by technical deve-
lopment editor Scott Chaussee and by technical proofreader Christopher Haupt. And
I also want to thank Jesse Schell for writing the foreword to my book.
Next, I’d like to recognize the people who’ve made my experience with Unity a fruit-
ful one. That, of course, starts with Unity Technologies, the company that makes Unity
(the game engine). I owe a debt to the community at gamedev.stackexchange.com. I
visit that QA site almost daily to learn from others and to answer questions. And the big-
gest push for me to use Unity came from Alex Reeve, my boss at Synapse Games. Simi-
larly, I’ve picked up tricks and techniques from my coworkers, and they all show up in
the code I write.
Finally, I want to thank my wife Virginia for her support during the time I was writ-
ing the book. Until I started working on it, I never really understood how much a
book project takes over your life and affects everyone around you. Thank you so much
for your love and encouragement.

xix

Licensed to Mark Watson <[email protected]>


Another Random Scribd Document
with Unrelated Content
Special Cases for Dyadic Operator Arguments When both
arguments of the dyadic operator are scalars, processing is simple
(see figure 37). Similarly, for nonscalar arguments with the same
size and shape, the scalar process is more or less applied iteratively
(see figure 38). Where only one argument is a scalar, interpretation
is a hybrid of figures 37 and 38. This is shown in figure 39. Here the
scalar value is applied iteratively to the vector or array. D(DA)*3
D(DA+D* 0 OA* DA+2 SFLOAT* DIOPG+2) VALUE* DIOPD + 2)
DYAD. -COMP D(DA)* SFLOAT SVAL(SV)* DA - 2 DA*DA + 1 Figure
37: Dyadic interpretation for the case in which both arguments are
scalars. SFLOAT = RIGHT ARG VALUE VALUE = LEFT ARG VALUE
COMPUTE RESULT ^ return"^) AUX* DA Y*l D(AUX)* DIX + Y-I)
AUX* AUX + I Y * Y+ 1 VALUE* D(Z+D(Z)-Y) SFLOAT* D ( D A + D
(DA)- Y) DYA D—COMP D(DA+D(DA)-Y)* SFLOAT Y * Y+ 1 ''NO
SVAL(SV)* DA DA*DA+D(DA) RETURN^ MAKE COPY OF ONE OF
THE ARRAYS COMPUTE RESULTS Figure 38: Dyadic interpretation for
the case in which both arguments are nonscalar but of the same
shape and size. ALPHA Z- 80 $ 495 ASSEMBLED • 12 SLOT MOTHER
BOARD • 12 CONNECTORS (S-100 BUS) • 17 AMP POWER SUPPLY •
HEAVY DUTY CABINET WITH FAN • Z-80 CPU BOARD: All Sockets
Included, Gold Contact Fingers, High Quality Glass Epoxy PC Board,
Double-Sided, Plated Through Holes, Requires Only + 8 VDC / 800
MA. NOTE: 22 SLOTS/30 AMP POWER SUPPLY - $595. ADS also sells
IMSAI and NORTH STAR Assembled at Kit Prices + LEAR SIEGLER
ADM 3A Assembled at $888.00. TERMS: Cash with Order. Prices
include Freight. (N.C Residents add 4% Sales Tax.) ADS ALPHA
DIGITAL SYSTEMS Data Acquisition, Computation anci Control
ROUTE 4 BOX 17 1A BOONE, NORTH CAROLINA 28607 Circle 382 on
inquiry card. 82
Figure 39: Dyadic interpretation for the case in which only
one argument is a scalar. AUX » DA Y * 1 D(AUX) -» AUX ■» Y ■»
DIZ+Y+I) AUX + 1 Y+ 1 MAKE A COPY OF THE ARRAY AUX ■» AUX-
I Y ■* 1 Yl •» Z-i-2 Y ■» Y* D(YI) Yl » Yl + 1 AUX NOW POINTS TO
LAST ELEMENT IN ARRAY , Y
A D(OPD+l) = I i ' I i NO -^ERROR 29^ Figure 40: Dyadic
interpretation of the reshape operator. LEFT ARGUMENT FOR
RESHAPE OPERATOR NOT A VECTOR AUX * DA+2 SIBIN ■* 1 Z * 1
SIBIN ■* SIBIN+DI0PD+2+ Z ) Z -• Z+l I 1 J Z 1 i SIBIN
Circle 384 on inquiry card. in some areas of design and
implementation. Using the experience I gained from my first
implementation, I have incorporated many desirable features into
several microprocessor implementations which are currently being
designed. Anyone designing an APL interpreter based upon this
series of articles and encountering problems should first consult Mr
Robinet's article, "Architectural Design of a Directly-Executed APL
Processor" (National Technical Information Service, US Dept of
Commerce, 5285 Port Royal Rd, Springfield VA 22161), and, failing
resolution, should contact me. Finally, although I have attempted to
verify the accuracy of all tables, charts and methods used herein, it
is still possible that errors or omissions remain. During the time that
these articles have been prepared, I have been actively working on
an 6800-based APL interpreter. This work has led to changes and
improvements to the flowcharts. Readers who would like to have the
latest information are welcome to send a stamped, self-addressed
envelope to Mike Wimble, 6026 Underwood Av SW, Cedar Rapids IA
52404." BUILDING YOUR OWN COMPUTER? WHY NOT DO IT THE
OBJECTIVE DESIGN WAY? STARTER SET INCLUDES FRONT AND
REAR PANELS OF ANODIZED ALUMINUM PRE-PUNCHED AND
DRILLED FOR MAXIMUM DESIGN VERSATILITY, COMPLETE PLANS
AND SPECIFICATIONS INCLUDE INFORMATION ON NECESSARY
PARTS AND SUPPLIERS, IDEAS FOR CUSTOMIZING, AND DETAILED
INSTRUCTIONS FOR BUILDING A 12 OR 22 SLOT S-100
CARDFRAME AND POWER SUPPLY. * AN INTERESTING AND
INEXPENSIVE WAY TO GET INTO PERSONAL COMPUTING! * A
GREATSCIENCE FAIR PROJECT! * IDEAL FOR SCHOOLS AND
UNIVERSITIES! ASK ABOUT OUR INTELLIGENT FRONT PANEL
OPTION ORDER THE CRATE KIT FOR ONLY: $39.95 PLUS SHIPPING:
U.S. — $3.00 CANADA— $4.00 FOREIGN— $10.00 ALL ITEMS
SHIPPED AIR FREIGHT OR UPS BLUE LABEL SEND CHECK OR
MONEY ORDER TO: OBJECTIVE DESIGN, INC. P.O. BOX 20325
TALLAHASSEE, FL 32304 FLORIDA RESIDENTS ADD 4% STATE
SALES TAX. PROM: Space for 2K bytes, 1702A. Store bootstrap
loaders and monitors. RAM: 1K bytes, 2102LIPC, 450 ns, low power.
NO NEED TO RELOCATE STACK WHEN ADDING MEMORY.
CIRCUITRY: Replaces memory write logic on ALTAIR™ and Imsai
front panels. REGULATORS: Two regulators. No need for regulated
power supply. JUMP-ON-RESET: PROM program execution starts at
any location in memory without interfering with programs in any
other portion of memory. S-100 BUS; +8 and -16 VDC; P/C BOARD
SOLDER MASKED BOTH SIDES WITH PLATED THROUGH HOLES;
ALL SOCKETS INCLUDED. OPTIONAL FIRMWARE: 512 byte monitor
for use with Tarbell tape interface on 2, 1702A PROMs. PROM/RAM
KIT WITHOUT PROMS $89 + OPTION A-SIORev.1 or3P+S $129 +
OPTION B - 2 SIO (MITS) $129 + OPTION C-SIO 2 (IMSAI) $129 +
OPTION D - Poly Video Interface $159 (Includes Video Driver)
California residents please add 6% tax. IMMEDIATE DELIVERY FROM
FACTORY OR YOUR LOCAL COMPUTER STORE CO* G3APHC illC.
LAKEFIELD ROAD. SUITE F • WESTLAKE VILLAGE, CA 91361 • (805)
497-0733 PROM/I BOAR 5^ fmm i Circle 385 on inquiry card.
Photo 1: This is the video display at the start of a Space
War game. The two spaceships are in their normal starting positions
and accelerating slowly towards the sun. The sun image is 14 units
across and centered on the screen, but its gravitational field
permeates all of space in its vicinity (table 4). How to Implement
Space War Dave Kruglinski 3256 Portage Bay PI E Seattle WA 98102
You say you'd love to go and play "Pong," "Tank" or "Shoot 'em"
down at the corner tavern but they won't let you in because you're
not old enough? Or maybe you learned to play Space War back in
college on a turbocharged PDP 91 1/S megacomputer and you don't
think your poor microcomputer could keep up? Or perhaps you hate
BASIC but can't think of a good reason to mess with 50 pages of
assembly language. Even if you don't fit into any of the above
categories, merely reading this article will sufficiently disturb your
mental equilibrium to start you on your way to being a Space War
freak, making all other problems fade into insignificance. Yes, it's
true, despite what false impressions you may have held. You can
play Space War on your micro: real Space War with gravity and
torpedoes and thrust and explosions and hyperspace, all right there
in front of your eyes on the screen. No message slowly banging out.
on the Teletype "THE KLINGONS ARE APPROACHING," but. your
own spaceship orbiting the sun, able to change direction, accelerate
and fire at the enemy. There's even a score to keep track of how
many times you've been hit. "Hold it!" you say, after pouring over
the listings. "This doesn't conform to ANSI 74 Space War Standards.
Alpha Centauri isn't at coordinates 137, 245 like it's supposed to be."
Relax, just, change the program to suit your taste. It should be
apparent by now that you need more than just a "naked micro" to
do the job, but what you do need is not too unreasonable. Table 1
lists the equipment I found necessary to implement a quite realistic
Space War game which is the subject of this article. If you don't like
the part about using an oscilloscope with its small screen, don't
knock it if you haven't tried it. You just have to sit close. Besides,
you can move up to a bigger display later. A vector graphics system
would be an improvement, allowing more odds and ends on the
screen before flicker sets in. The ideal, however, is a raster scan TV
monitor system with resolution close to 256 by 256; anything less is
just too coarse. Thomas R Buschbach's article in the November 1976
BYTE ["Add This Graphics Display to Your System, "page 32] 86
0 nn! n Ut3 U /^ofo 2: Were the larger of the two ships is
accelerating towards the lower right of the screen. This information
is relayed visually by the trail that is seen in back of the spaceship.
The small dot which is positioned at roughly equal distances from
both ships is a torpedo which has just been fired by the smaller
spaceship. (or Using Your Oscilloscope as a Telescope) should be
helpful here. Bear in mind that if you go the refresh memory raster
scan route you will have to think about erasing things, not a problem
with the analog refresh approach. Meanwhile, back to the software.
To start with, BASIC is out because it's far too slow. What's in is 5.5
K bytes of programs and tables, all in assembly language. "What's
the secret?" you say. "Why has Space War only been seen on
expensive systems up to now?" The answer is a special added
ingredient called TLU. TLU stands for Table LookUp and eliminates
the need for all multiplications and divisions, making your program
run ten times faster. Together with simple difference equations you
can use table lookups to generate gravity for pretty TACTICAL
MATERIEL NEEDED • An 8080 type microcomputer with 8 K of
memory and a way to load programs. An Altair 8800 or equivalent
will do fine. An assembler and text editor will be necessary if you
want to modify the program conveniently. • A general purpose DC
oscilloscope with X input. Bandwidth isn't too important, but it must
be DC. The bigger the screen the better. You can get one surplus for
about $100, and they're handy for other things, too. A raster scan
continuously refreshed point display can also be used with
appropriate modifications of graphic generation and object motion
routines. • A 2 channel digital to analog converter. This device
converts two bytes of digital data to two analog signals with a
resolution of 1/256 (3 .9x10-3). It is the interface between the
microcomputer and the oscilloscope, capable of displaying dots at
any of 65536 locations on the screen in a 256 by 256 grid. The
circuit is quite straightforward. The "Beer Budget Graphics Interface"
described in November 1976 BYTE, page 26, will do fine. You could
even skip the second latch on the Y strobe. • Two or more hand held
boxes, each with four push buttons. The two boxes together look
like one memory byte or input port and are read by the program to
determine what the player wants to do. • Software functioning as
described in this article. Table I: Basic facilities needed to implement
Space War on a microprocessor. 87
o t — : /%o?o 3: 77;e larger of the two spaceships has
been hit and destroyed. It had fired a torpedo just before it was hit.
respectable orbits for your spaceships and torpedoes. Another thing,
after subtracting 2 K for the gravity table you have 3.5 K of program
to manage. This translates to 55 pages of assembly listing with
macros expanded (more on macros later). To do this and not go
crazy you have to have a system, a way to organize the code into
modules for ease of understanding, modification and debugging. But
first some preliminaries. The Game of Space War As the game starts
you will see a sun in the center of the screen, two scores of zero at
the bottom, and two spaceships at opposite corners. You and your
opponent each have a ship. Each ship is uniquely identifiable and is
moving slowly towards the sun. Photo 1 shows the screen at the
beginning of the game as I implemented it. Each player has a hand
held box as shown schematically in figure 1. The functions of the
buttons are as follows: CCW: The player's ship rotates
counterclockwise as long as this button is held down. Rotation
increments are 45° and the rate is about one rotation every 5
seconds. CW: Same as a CCW except rotation is clockwise. FIRE: A
torpedo is fired from the player's ship when this button is depressed.
The torpedo always originates from the front of the spaceship and
travels in the same direction the ship is pointing. Its initial velocity is
constant, relative to the ship's. Each ship at any one time has only
one active torpedo at its disposal and thus can't fire a second until
the first has hit a spaceship, hit the sun, hit the screen edge, or
timed out. Figure 1 : The player control boxes consist of eight
switches, four per player, which define data for one input port to the
microprocessor. The pullup resistors boxed by a dashed line may be
omitted, depending on details of your input port.
ACC: Acceleration is applied to the player's ship as long as
this button is held down. The acceleration is applied in the same
direction the ship is pointed and is indicated visually by an exhaust,
trail at the rear of the ship. The object of the game is to get your
spaceship into a stable orbit around the sun and then shoot down
the enemy. You have to, of course, watch out for the enemy
shooting you down; and you have to be careful not to fall into the
sun. If either of these two calamities should befall you, your ship will
explode, your score will be incremented, points count against you,
and a new spaceship will be delivered to the starting position. You
have a rather interesting option when the going gets tough. You can
enter hyperspace by holding down both the CCW and CW buttons at
the same time. Your ship disappears, then reappears at some
random position with a random velocity. This happens not without
risk; however, there is a definite probability, increasing as the game
progresses, that your ship will explode when it comes back. A word
about orbits: both spaceships and torpedoes conform to Kepler's
laws, traveling in elliptical orbits around the central sun, with
revolution periods averaging about. 15 seconds. In general, the
further away from the sun the ship is, the slower it moves. Thus, if a
ship is in a long elliptical orbit the effect will be a little like "crack the
whip": the ship zips quickly around the back of the sun, then drifts
slowly out into space, then back again. Torpedoes, usually moving
faster than spaceships, are less affected by gravity and usually
escape to the edge of the screen where they disappear. If they get
close to the sun their trajectories may be bent, as much as 90°. Due
to limitations of the numerical method, the ships and torpedoes may
not come closer than seven units (screen is 256 units wide) to the
center of the screen. Thus the sun's radius is defined to be seven
units and anything coming that close is destroyed. A spaceship
which starts anywhere on the screen with zero velocity will move
radially inward to the sun and be zapped. Photos 1 to 5 show some
scenes from a typical Space War game. Some are snapshots and two
are time exposures showing the motion of spaceships and
torpedoes. Photo 4: A time exposure showing the two ships in orbit
and a near miss of a torpedo. The inner spaceship fired at the outer
orbiting spaceship. Notice how the gravity effects of the sun curve
the orbits of ships and torpedo. # ... Software - General Many of the
techniques discussed here apply not only to Space War but also to
other video games, display systems and real time applications. The
only assumption made is that you know what, an assembler Photo 5:
A very long time exposure showing the maneuvering of the two
spaceships. Notice that Kepler's laws of motion are being followed,
and the spaceship that is closer to the sun is orbiting faster than the
spaceship that is farther away, since it has only traveled a portion of
one revolution while the inner ship has completely circled the sun.
These gravity effects encourage real time tactics and use of strategy
in playing the game. 89
r DISPLAY PROCESSOR DISPATCH TABLE SPACE WAR
APPLICATIONS MODULE OBJECT BLOCKS PROGRAMS MOVE
DISPLAY FILE ACCELERATE I RANDOM SYSTEM FUNCTIONS
MODULE GRAVITY TABLE Figure 2: Block diagram of the software
for Space War. The rectangles represent programs and the squares
represent data. This general type of setup can be used in many
other games besides Space War. does and can read 8080 assembly
language. Since relocatable assemblers and loaders aren't: generally
available for microcomputers yet, chances are you will have to make
the most out of the absolute variety. It is very useful to avoid having
the entire 4 K of program in one source module. By breaking the
code up into modules you generally need only to edit and assemble
a portion of the entire program to make a correction or
enhancement. Linkage between modules is made through a few
fixed locations in low memory (0 to 80 hexadecimal). There are two
categories of modules: system and application. System modules
exist to support a variety of application modules. The application
module in this case is the Space War video game. The systems
modules needed here include: graphics display processor, interrupt
handlers and real time executive, system functions. The applications
module is a collection of programs and data related specifically to
the game. Let's look at each of these modules in detail, while
referring to the block diagram in figure 2. Display Processor In order
to have a video game you have to be able to put pictures on the
screen. Still pictures are a good place to start; it's easy to make
parts of them move later. With the digital to analog converter and XY
oscilloscope hardware configuration of the "Beer Budget Graphics
lnterface"/6y Peter Nelson, in November 1976 BYTE, page 26], it is
necessary to paint the picture one dot at a time and also to
continuously refresh any image put on the screen a minimum of 20
times a second. This suggests a loop consisting of a sequence of dot
producing instructions executed over and over again. It would be
very cumbersome, though, to have to write a new assembly
language program every time you want a new picture. What about a
single program which cycles through a table of XY coordinates? This
is better, except it takes a lot of dots to draw a line or spaceship, and
it's difficult to move something when you have to move all the dots
together. A better solution is an interpretive "language" which you
can use to describe pictures. A display file written in this language is
interpreted by a special program called the display processor in
order to provide the proper sequence of XY coordinates to paint the
picture. Understanding the display processor requires you to
visualize the beam which defines a point on the face of the
oscilloscope at position X,Y. A dot can be displayed at the beam
position or at points relative to the beam position. This is very useful
because you can define a spaceship, for instance, as a series of dots
relative to the beam coordinates. To move the spaceship you merely
move the starting beam position. Rather than define a series of dots
individually, why not specify a vector 90
or row of dots? This can be done neatly in one byte where
you specify both the length and direction of the vector. Let's say that
you have defined your spaceship, but that you want to display it
more than once on the screen. Just as in any other computer
program you use a subroutine. The subroutine in this case contains
a series of relative vector commands and is called from several
places in the display program, just after beam positioning
commands. You can pick up the details of the graphics language by
studying the nine commands shown in figure 3. Figure 3 also shows
the layouts of the graphics commands. In my assembler the
mnemonics along with the arguments are put right into a program
and the assembler produces the object code by means of macros. (A
macro is a way of telling the assembler to substitute a group of
instructions for a given symbol.) All the macros are defined at the
start of the program with dummy arguments. The real arguments
are subHexadecimal Op Code 00 02 04 06 OA 0C 0E 10 Layout
00000000 X coordinate Y coordinate 0 0 0 0 0 0 1 0 X coordinate Y
coordinate 0 0 0 0 0 1 0 0 X coordinate Y coordinate 0 0 0 0 0 1 1 0
length |0/F drctn 08 0 0 0 0 1 0 0 0 scle orent 0 0 0 0 1 0 1 0 low
order address high order address 0 0 0 0 1 1 0 0 low order address
high order address 0 0 0 0 1 1 1 0 Assembler Macro Form MBEAM
x,y MDISP x,y LVEC x,y SVEC SV length, drctn SVF length, drctn SVE
length, drctn SVEF length, drctn E = escape O/F = beam on/off PAR
AM s,o 0 0 0 1 0 0 0 0 JUMPaddr JUMPS addr RETS EXEC Meaning
The beam is moved from its previous position to the new
coordinates x,y where x and y are between 0 and 255. This
command does not cause a dot to be displayed, but is used as a
setup for following commands. Same as MBEAM except a dot is
displayed at x,y. A "long vector" is drawn from the previous beam
position to the new coordinates x,y. The new beam position is now
x,y. The relative vector is called the short vector to distinguish it
from the absolute long vector. The list is a sequence of length and
direction pairs where the length is 0 to 7 dots and the direction is
specified by a number from 0 to 7 where 0 is straight up, 1 is 45° in
a counterclockwise direction, 2 is 90° counterclockwise, etc. This
command alters the effect of all following SVEC commands until the
next PARAM statement. It is possible to change both scale (s) and
orientation (o) of all following short vectors. If scale is set to 1 , for
example, all short vectors would be twice as long as they would
have been if scale were 0. If orientation is set to 2 instead of 0, all
short vectors appear rotated 90° clockwise. Thus a figure drawn
entirely In short vectors can be enlarged and rotated by changing
one command. Interpreter control is transferred to the command at
address addr. Interpreter control is transferred to the command at
address addr and the address of the command following the JUMPS
statement is saved. This is the graphics subroutine call. Return from
the subroutine entered command. Subroutines may be nested. by
JUMPS Control is transferred to the executive so that the proper
applications programs are executed. When these are finished,
control is returned to the graphics interpreter command following
the EXEC command. Figure 3: The nine graphic commands used by
the display processor showing the op code, related mnemonic,
memory allocation, and meaning for each command. These
instructions and related programs can be used to implement a wide
variety of animated video applications. 91
Entry Byte Data Functon 1 0 1 look at last bit of TIME only
1 0 execute on even TIME only 2,3 object block 1 starting address
4,5 ship fly program starting address 2 0 1 look at last bit of TIME
only 1 1 execute on odd TIME only 2,3 object block 2 starting
address 4,5 ship fly program starting address Table 2: This table
design will allow the updating of the positions of two spaceships on
alternating cycles. Byte 7 determines whether the updating takes
place on an odd or even cycle. If it is set to zero, as in entry 1,
updating will occur on an even cycle. If byte I is set to I, as In entry
2, updating will occur on an odd cycle. Bytes (Hexadecimal Offsets)
Function 0,1 X (n), present x coordinate with 16 bits, 0 at screen
center. 2,3 X (n— 1 ), previous x coordinate. 4,5 X acceleration. 6,7
Y (n), present y coordinate. 8,9 Y (n— 1 ), previous y coordinate.
A,B Y acceleration. C,D pointer to MBEAM instruction display file.
Table 3: A list of object parameters which are found at the head of
an object block and used by the object move function. These
coordinates are continuously updated as the program progresses.
stituted when the macro is actually used. Now that you can describe
a picture with a concise list of graphics commands you should be
able to see how easy it is to animate the picture. All it takes is some
other program in the system to periodically change parts of the
display file. For example, if the MBEAM command preceding a
spaceship subroutine call is given a label through the assembler,
then the X and Y coordinates can be updated, causing the ship to
move. To destroy the ship, replace the spaceship subroutine address
with the explosion subroutine address. See listing 1 for the display
processor, and listing 2 for numeral subroutines 0 to 9. Executive
Program The Space War program was originally designed to work
with a real time clock producing 20 interrupts a second. It was
discovered later that the update and refresh cycle was stable enough
to make the clock unnecessary. This reduced the hardware
requirements for the game. To reiterate, Space War runs on a 50 ms
cycle. The first 15 ms are used to update positions of spaceships,
test buttons, compute scores, etc. The remaining 35 ms are used to
refresh the display, that is, process the display file from one EXEC
command to the next. The executive: • determines what update
tasks are to be done. • dispatches a control to these tasks. •
increments a variable called TIME. A few words on tasks and
dispatching are in order here. The applications module consists of a
number of independent programs, each with a distinct function
which is described in detail in the next section. When each of these
programs runs, it references an object. For example, the ship fly
program has to run once for ship 1 and again for ship 2. The
combination of a program and a particular object is called a task.
There are three pieces of information necessary to specify a task: •
frequency and phase at which the task is executed . • address of the
object block containing all parameters relating to a specific object . •
starting address of the program. The dispatch table (table 2) in the
applications module is a list of all the tasks. Each task has a 6 byte
entry having the format: byte 0: Mask which is logically ANDed with
TIME and compared with the value in byte 1 . byte I: Execution
time. When this matches the masked value of TIME the task is
executed. bytes 2,3: Address of the object block for this task. It is
passed to the program in register pair BC. bytes 4,5: Address of the
program to be called by the executive. If, for example, you want to
update the position of each of two spaceships on alternating cycles,
you set up two entries as in table 2. Most of the task schedules are
set up just once when you assemble the applications program.
However, it is possible to dynamically schedule one task from
another. That scheduled task runs "right now" if both the mask and
time bytes are set to zero. It runs "n cycles from now" if the mask is
all 1 and the time is TIME+n. The dynamically scheduled task will,
however, have to later deschedule itself by setting the mask to 0 and
time to 1 . Now for a few words on how programs interface with
object blocks. Normally a program references a number of fixed
memory locations using direct addressing. This works fine, for
example, if you have one program flying one spaceship. For two
spaceships you could write two programs, 92
NOTIC€ to oil BVT€ magazine subscribers and would-be
subscribers SAVE MONEY! As of January 1, 1978, we are raising our
subscription rates to meet the increased costs of producing and
mailing BYTE to our more than 110,000 monthly readers. The new
domestic subscription rates, effective January 1, 1978: Current Rates
Rates Effective January 1, 1978 One year U.S. — $12 One year U.S.
— $15 Two years U.S. — $22 Two years U.S. — $27 Three years
U.S. — $32 Three years U.S. — $39 If you already subscribe to BYTE
and still have several months to go before expiration of your
subscription, you can still take advantage of current rates for
renewal (even up to three years). Use coupon below. When your
present subscription expires, your renewal order commences. If you
are not yet a subscriber to BYTE, the leading magazine for the
creative home computer experimenter, don't delay . . . mail this
coupon and start getting your own copies of this invaluable
magazine, before new rates become effective. BUTE USE THIS
MONEY-SAVING COUPON TODAY To new subscribers: Read your first
copy of BYTE, if it's everything you expected, honor our invoice. If it
isn't, just write "CANCEL" across the invoice and mail it back. You
won't be billed, and the first issue is yours. Allow 6 to 8 weeks for
processing. Byte Publications, Inc. 1977 BYTE Subscription Dept.79D
• P.O. Box 361 • Arlington, Mass. 02174 PLEASE ENTER MY
SUBSCRIPTION FOR: □ Renewal □ New Subscription □ One year $12
(12 issues) □ Two years $22 □ Three years $32 □ Check enclosed
(entitles you to bonus of one extra issue) □ Bill me □ Bill
BankAmericard/Visa □ Bill Master Charge Card Number 1 I I I I I I I I
I 1 I I l~t Expiration Date: Signature: Name (please print) Address:
— — — City: State/Country: HIE Code:FOREIGN RATES FOR ONE
YEAR: (Please remit in U.S. Funds) □ Canada or Mexico $17.50 (Air
delivered) □ Europe $25 (Air delivered) □ All other countries except
above: $25 (Surface delivery) Offer expires December 31, 1977 Air
delivery available on request
Table 4: The 1024 by 2 byte gravity table used by the
acceleration lookup function. Notice the maximum acceleration
values of 999 in the upper left of the table which correspond to the
position of the sun. The table can be rotated around its axis of
symmetry to cover the entire screen in a minimum amount of
memory. Lines drawn In the table illustrate several contours of
roughly equal gravitational acceleration. 999 999 999 999 999 999
999 999 999 999 999 999 999 999 999 999 999 999 999 999 999
999 999 999 999 999 999 999 999 999 999 999 917 907 816 808
730 724 657 652 594 590 541 537 494 491 453 450 416 414 1384
383 356 354 330 329 308 307 287 286 269 268 252 251 999 999
999 999 999 999 999 999 999 999 999 999 999 999 999 999 999
999 999 999 999 999 999 999 999 999 999 999 999 999 999 966
888 860 792 770 711 693 642 627 582 570 530 520 485 477 445
438 410 404 999 745 999 999 999 999 999 999 999 999 999 999
999 999 999 999 999 999 999 999 999 999 999 999 999 999 999
999 999 973 922 871 825 784 742 709 670 644 608 586 555 536
507 492 466 453 429 418 452 | 295 999 840" 999 999 999 999 999
999 999 999 999 999 999 999 999 999 999 999 999 999 999 999
999 999 999 917 904 834 816 759 740 693 673 634 614 582 561
535 515 493 474 455 438 422 3,. 1 4 203 14510882 64 51 41 33 28
379 374 351 347 327 323 304 301 284 281 266 264 250 247 396
387 367 359 341 334 318 312 297 291 278 273 260 256 244 241
405f39T 376 364 350 340 326 317 305 297 285 278 268 262 251
246 237 232 900 660 999 844 999 970 999 999 999 999 999 999
999 999 999 980 999 925 984 867 905 808 832 751 764 696 702
645 645 598 594 554 548 514 507 478 469 444 435 414 404[~386
361 338 315 241| 188 150 121 377 351 328 317 307 297 288 279
271 263 255 248 240 234 227 221 498| 384 302' 646 504 4001 755
598 480 826 664 540 864 705 581 873 725 606 862 727 616 837
716 614 802 695 604 762 669 587 719 638 566 675 605 542 632
572 517 591 539 491 552 507 465 515 477 440 481 448 416 449
420(392 420[~355 370 371 350 368 349 330 345 328 311 324 309
295 304 291 278 286 275 263 270 260 249 254 245 237 240 232
224 227 220 213 215 209 202 242| 196 323 264 391 322 444| 369
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookfinal.com

You might also like