hobie@sq.UUCP (02/22/87)
I have recently discovered that there is a commercial version of the game Ogre for the Amiga. This discovery prompted me to dig out my Unix Ogre which I ported to the Amiga as my first Intuition program. So here it is. This posting is in two parts. Part 1 is the object code and instructions to play the game, Part 2 is the source code and README. I am posting to this group because it's the only Amiga group that appears to be alive and well. For those who don't know what Ogre is, it's a `display-oriented' (whatever that means) game of future tactical ground combat against a big robot tank. This version was ported to Amiga from Unix, where it was released over the net in 1984, and has been tarted up with menus and gadgets and such. It was created under 1.1 with Lattice 3.02 (seriously!) but it also compiles under 1.2 with no problems. Since it was my first large Amiga program, there are probably serious programming gaffes. I would appreciate these being pointed out to me. I would also like it if someone who knows the commercial version would mail me a comparative review. I'd like to know if we both used the same source code as a basis. -- Hobie Orris | SoftQuad Inc., Toronto, Ont. |"There'll be no more giant leeches {ihnp4 | decvax | ? }!utzoo!sq!hobie | When you find the good Lord Jesus"
hobie@sq.UUCP (02/22/87)
# Amiga Ogre Part 1: The object # This file contains the following: # Instructions - How to play # ogre.info.uue - uuencoded icon for the game # ogre.uue - uuencoded game object code # # Note: To use the help option in the game menu, the file # `instructions' should be in the volume `Ogre:' # : To unbundle, sh this file echo x - instructions 1>&2 cat >instructions <<'@@@End of instructions' OGRE 2086 --------- Introduction ------------ Ogre is a game of tactical ground combat in the year 2086. In this advanced age, the Ogres are giant cybernetic tanks, each prodigiously armed and possessing a limited self-awareness, allowing them to do their own tactical planning. Their weaponry includes long-range missiles, heavy main batteries (`hellbores'), smaller, secondary batteries (`infinite repeaters'), and short-range anti-personnel weapons. The actual configuration of these weapons depends on the type of Ogre. In the game, Ogres Mark III and Mark V are represented. The other combatants on this future battlefield include rapid-fire howitzers, heavy tanks, mobile missile launchers, GEVs, and infantry wearing powered armor. The GEVS (short for Ground Effects Vehicle) are armed and armored hovercraft which can strike their targets and retreat before the enemy has a chance to retaliate. The game pits an Amiga-controlled Ogre (naturally) against a human opponent who has control of a mixed force. The goal of the Ogre is to destroy the human command post by fire or by stomping on it. The goal of the human (this means you!) is to prevent this by immobilizing the Ogre. I say `immobilize' because there is no way to actually destroy the Ogre; even when all of its individual weapons systems are destroyed, it can still move and can still crush things, including command posts. Therefore, all of the Ogre's treads must be eliminated. Starting the Game ----------------- To start the game, type `ogre' (assuming it's in your current directory.) or click the Ogre icon from Workbench. At this point, the game loads and sets up the playfield. The map key is as follows: 7 - clear terrain * - crater Craters are impassable to everything. Clear terrain is, well, clear. Sequence of Play ---------------- A. Human Deployment B. Ogre Movement C. Ogre Combat D. Human Movement E. Human Combat F. Repeat steps B-E until someone wins. These items will be presented in order: A. Human Deployment -------------------- After the map is displayed, the cursor is left sitting in the middle of the map and a message is displayed indicating how many armor and infantry units are left to place, as well as the command post (CP). To place your units, move the cursor to the desired location and press the key for the type of unit you wish to put there. Only one unit may be placed in a single location. The operative keys are: Cursor movement: w e \ / a - s - d / \ z x The `s' key is for `sit', which is not used for deployment, but is used later in the movement phase. The gadgets in the lower right of the screen perform the same function as these keys. Unit Placement: To place a unit, press the letters used for displaying the unit type or select from the Deploy menu. The following notation is used to indicate the capabilities of the units: a/b Mc Dd where `a' is the unit's attack strength, `b' is the range, in spaces, of the unit's weapon, `c' is its movement, in spaces per turn, and `d' is its defensive strength. Unit Abilities Description ------------------------------------------------------------------ C (0/0 M0 D0) - Command Post. Only one of these can be placed per game. It is suggested that it be placed well to the rear (the right side of the map.) H (6/8 M0 D1) - Howitzer. This is the most powerful offensive unit but very vulnerable to attack, due to its immobility and weak defence. Note that a howitzer is worth TWO armor units for deployment purposes. T (4/2 M3 D3) - Heavy Tank. This is a well-rounded unit, except that, the range of its gun requires it to get pretty close to an Ogre in order to fire. Ogres tend to stomp on heavy tanks that get too close. M (3/4 M2 D2) - Missile Tank. Although slow-moving, the missile tank can outrange all but the Ogre's most powerful weapons and still keep out of the way of the Ogre's crushing treads if the Ogre has been slowed down by damage. G (2/2 M4-3 D2) - GEV. The GEV is built for speed. It has light armor and armament, but moves TWICE per turn; once before combat, and once afterwards,allowing it to move in, fire, and get out of harm's way. A pack of GEVs can surround an Ogre, concentrate their fire and then scatter, leaving the Ogre with few targets of opportunity. I (*/1 M2 D*) - Infantry. Unlike armor units, infantry can with- stand losses and still function as a unit. The * indicates the current strength of the unit. A full squad has a strength of 3, but squads of 2 or 1 are allowed. To select a full squad, hit `I' or `3'; for a lesser squad, `2' or `1'. The menu selection for infantry is for a full squad. As the squad sustains losses, it will be reduced. O several - The Ogre. The Ogre has many different weapon systems, each of which has its own attack, range and defence. Its movement is 3 at the beginning of the game but can be reduced to 0 by tread damage. As you select units, the count at the bottom of the screen is reduced. You must deploy your full complement of units before play can begin. At this point, a display of the Ogre's weapons and treads is printed on the bottom of the screen. Each line has the format, Main Batteries: 1 (4/3 D4) where `1' is the current number of functioning batteries, 4/3 is the attack strength and range of the weapon, and D4 indicates it has a defense strength of four. As the Ogre sustains losses, the number is reduced, until there are none left, at which point the line will no longer be displayed. B. Ogre Movement ---------------- The Ogre enters on the left side of the map as soon as deployment is com- plete. Its initial movement allowance is three spaces, but on the first turn it moves only one. If there are units within range of its movement, the Ogre will run them over, with a fifty percent chance that the unit will be destroyed. This type of overrun attack is resolved immediately and does not require that the Ogre fire any of its weapons. C. Ogre Combat -------------- After moving, the Ogre will fire some or all of its weapons at whatever targets are in range. It will attack a target more than once if the first attack fails to destroy the target. The Ogre comes equiped with missiles which can be fired only once. After being fired, they are removed from the Ogre's status display. The Ogre's anti-personnel weapons can only be fired at infantry type units. There are three possible results of Ogre combat: no effect, disable, and destroy. A no effect result means that the target can fire and move normally in the human turn. Disablement has different effects on infantry and armor units: a disable result against an armor unit causes the unit to be re-displayed in lower case and it can neither fire nor move for the next turn; an infantry unit has its combat strength reduced by 1 and the new value is displayed. On a destroy result the target is eliminated and removed from the display. D. Human Movement ----------------- When all Ogre attacks have been resolved the cursor is positioned on each movable (non-CP and non-howitzer) unit in turn, the message, "Move ..." is displayed and the player is free to move that unit up to the limit of its movement allowance. The movement keys are described above; `s' is used to indicate that the unit is not to be moved. Again, the arrow gadgets let you move units and the `S' gadget is for `sit'. If you do not wish to move a unit its full movement, press `s' or click the `S' gadget when you are done. Note that the map simulates a hexagonal grid, so that there are six possible directions of movement. The following example illustrates an important fact for calculating ranges: 7 7 7 7 7 7 7 7 7 T 7 7 7 7 7 G 7 7 7 7 7 O 7 7 7 7 7 7 7 7 The GEV is adjacent to the Ogre, so the range between them is one space; the heavy tank, however, is two spaces away (one to the GEV and one to the Ogre). In other words, horizontal and diagonal spaces are adjacent and vertical ones are not. When all eligible units have been moved and there are units close enough to fire on the Ogre, the combat phase begins. E. Human Combat --------------- The cursor is automatically positioned to each unit eligible to fire and the player is required to select a target at which to fire. Each weapon system of the Ogre and its treads are targets. As units are allocated for firing at a particular target (eg. the main batteries), the odds of the attack are displayed next to the line describing the target. For example, if a missile tank (attack 3) is allocated to fire at a secondary battery (defense 3) the odds 1-1 are displayed. If a howitzer (attack 6) is then allocated, the odds are updated to 3-1 (3 + 6 = 9 versus defence 3). You can allocate as many units as are within range to attack a single weapon system, or you can type `r' (for resolve) to carry out the attack immediately. Attacking the Ogre's treads is a different process. All attacks against treads are automatically at 1-1 odds and are resolved immediately as each unit is allocated. If the attacker scores a hit on the treads, a number of tread points equal to the attacker's strength are destroyed, whereas other targets are attacked individually (eg. if the above-mentioned 3-1 attack on the secondary batteries is successful then one battery is destroyed). The number of treads an Ogre has affects its movement. All Ogre types start with a number of treads (45 for Mark III, 60 for Mark V) and a movement allowance of three. When 1/3 of these treads are destroyed the Ogre's movement drops to two. When 2/3 are destroyed it drops to one. When all are destroyed, the Ogre is immobile and you win. Needless to say, the more attacking strength used against a target, the better your chances for destroying it. However, odds in excess of 4-1 are treated as 4-1, so allocating 20 attack points against a secondary battery (6-1) is no better than allocating 12 attack points (4-1). The keys used for allocating an attack are: Key Specs Description ------------------------------------------------------------------------- m (6/5 D3) - Missile. Remember, Ogre missiles are one-shot only. b (4/3 D4) - Main Battery s (3/2 D3) - Secondary Battery a (1/1 D1) - Anti-personnel weapons. Can only be fired at infantry. t (-/- D1) - Treads. These are weapons only to the extent that a mobile Ogre can overrun enemy units. r - Resolve. All attacks currently allocated are carried out. p - Pass. Save this unit to fire later on in the phase. This is useful if you want to combine the fire of two units which do not fire in sequence. The Target menu allows you to select targets as in the above table. Self-Destruct ------------- This is an optional rule included in the Steve Jackson Microgame, but not in the original Unix version of Ogre. I put it in just to be mean. If the Ogre has its treads reduced to zero but is within four spaces of the human command post, it will detonate its atomic pile, eliminating itself and everything within four spaces. All armor units five spaces away are disabled by this blast. An Ogre self-destruction results in a drawn game since it will only self-destruct if it is within 4 hexes to the command post. Credits ------- The concept of the Ogre-style war machine originated in the Bolo stories by Keith Laumer. These ripping good stories are available in the anthologies "Bolo", published by Berkeley, and "Rogue Bolo", published by Baen Books. The game Ogre was originally published as a paper board game in 1977 by Steve Jackson Games. It is widely regarded as a classic war game and spawned a series of expansion games by Steve Jackson called GEV, ShockWave, and Battlesuit. The computer game Ogre was written for Unix by Michael Caplinger of Rice University in 1982 and released to the public domain over Usenet. The game was ported to the Amiga by Hobie Orris (me) in 1986 and distributed to anybody who wants it. Comments, criticisms or enhancements are welcome. Hobie Orris 9 Ferrier Ave. uucp: utzoo!sq!hobie Toronto, Ont. ci$: 73657,1573 Canada M4K 3H5 @@@End of instructions echo x - ogre.info.uue 1>&2 cat >ogre.info.uue <<'@@@End of ogre.info.uue' begin 644 ogre.info.uue MXQ 0 $@ '0 $ , 0 !\% M ^@ )P ) !( !P @ " MO0 # M M M M ??@ #[\ /OOOO[[[] M^ 'WWW[^_??OP !]]]^_OWW[\ /OOOO[[[]^ M !_X_X_P_ M@ 8&,&,,, &!C ### !AX]X_P_@ 8>/&/&/ & M'CQCQCP !_X_X\8_@ M ____P /____ ____ "( ' M_P ___@ __ ?X($ _____! __\ ?________P /________ M^ '_________P #_________^ __________@ '_________P __ <_______X /__ end @@@End of ogre.info.uue echo x - ogre.uue 1>&2 cat >ogre.uue <<'@@@End of ogre.uue' begin 644 ogre.uue M #\P !0 $\ !G % J0 )K # HX M Q !^P !\ %_ #P , "\ @ )@ G 'P M Q@ , ! F( 5 V@ @ ## +P , "6 M$P %8 ! 00 $ : 1 $ "R / $ & M ! /P !; P &0 "A 6 "\ > + D M ! '@ 8 !X 5P "$ (> !0 0 &8 $ M # - $0 "@ , $0 0 V ! .4 H M 0 $4 !F !0 #P < / ^D !G(\ X(\@ \ M2.=^_BQY !"/. )"// -$*Y ,)/)3J[^VBA 2JP K&< 'YA M %.0J=.N0 #!8CR! (&@ K-'(T<@B: 0T\G3R2 Y .'( $AG0@5* M0F=2@ ) __Z?P%6 0G< " Y ."!Y /"0 4X#4@1^P @ %."4<C_ M]A^\ " @ %."'[$@ " 4<K_^")/+PE.N0 !P &!>80 TF$ +PCP M # O "1 ("H )&<0+'D H($ B* 3J[_@B(J "!G'"0\ #[4ZN_^(C MP $!G"N6(($ I: ( *1(>0 !.N0 !P & $("\ !"\ 3KD "T M2KD P9RPB.0 "!G!$ZN_]PB.0 $!G!$ZN_]PL>0 1.KO]\(GD M P3J[^AB ?+GD T3-]_?DYU2.<!!BX\ . !RQX 1.KO^43-]@@'!D M8)Q![ !<3J[^@$'L %Q.KOZ,3G5#^0 $1.KOYH(\ H9\).=0 ^P M 3 0 90 &* !4@ 48 $P !) 1P $ [@ M ,X "^ ?@ '@ !: ) !X 8 " ( ! M*@ 18 " -P 08 "L 0 $L ! _( /J M % 0 M 9&]S+FQI8G)A<GD #\@ M ^D *D3E;_RB!Y !"\H %9.N0 *Q8CR/ '$J 9@9P $Y>3G4@ M>0 !Q#[O_*<#,2V%'(__PO.0 !Q.N0 ,!8CTJN_]YG1" N_]X,@ M $!G) R ! &<.#( ( 9B)A 6H8")(;O_*80 #>EB/3EY.=4AN_\IA M /&6(].7DYU< !.7DYU3EY.=4Y6__QP/"\ +SP $L< O "\ 2'D CZ M2'D CF2'D C2+SD $3KD "\3^\ ("U __Q*@&<(< ,M0/_\8 9P M!2U __P@+O_\3EY.=4Y6__PC_ !%H 0\(_P 1X $6I'((\@ 1X M(_P 26 $3B/\ %8@ !&PC_ !E 2*(_D =T $2B/Y ' M> !&@C^0 !WP 2&+4C__" N__P,@ 9L('(B3KD ($#1_ M!)8B0-/\ $N"")4J[__D<@CR !4 M2/_\("[__ R !VP@<B). MN0 @0-'\ %8B) T_P 6$((E2KO_\8-21R"/( &+B/( &4"U( M__P@+O_\#( &;"AR%$ZY "! T?P > ("[__.6 (D#3_ !KHA M40 ,4J[__&#,0J[__" N__P,@ =L*'(43KD ($#1_ !_@@+O_\ MY8 B0-/\ ',"%1 Q2KO_\8,PC^0 !UP B00J[__" N__P,@ 9L M,'(B3KD ($#1_ !)8@+O_\<A1.N0 B0-/\ '@" )(4 $E*N M__Q@Q$*N__P@+O_\#( ';#!R(DZY "! T?P 5B("[__'(43KD M (D#3_ !_@@"2% !)2KO_\8,0C_ "(0 9B2'D 0\+SD $ M3KD "D4(].7DYU3E;__$*N__P@+O_\#( &;#!R+$ZY "! T?P M , ("[__'(43KD (D#3_ G0@"2% !)2KO_\8,0C_ 'P )^ M(_P #$ "DB/\ !# J8C_ 50 *Z(_P &< "SB/\ ! MY N(C_ BP +V0KD 0(3EY.=4Y6__Q"IR\Y !$AY # $ZY M B$_O Q"KO_\("[__ R !VQ4<BQ.N0 @0-'\ # '#_+P O M""\Y !$ZY $_O P@+O_\<BQ.N0 @0-'\ # $*G+SD $ M+PA.N0 $1/[P ,4J[__&"@3EY.=4Y6__9P "!N @P* 8+T * M'R(O #JB0*! /SU __X]0?_\4D!F!G 3EY.=7 ,"[__G('3KD M($#1_ ")AP # N__S1P! 03EY.=4Y6__Q"KO_\("[__ R !VPD<BQ. MN0 @0-'\ # " ((FX ""!I !RQP&<&4J[__�(&[__-'\ $-! 0 M3EY.=6$ 99.=4Y6 !"IR\N AA T4(](>0 "0YA "^6(]"IR\N AA M <4(].7DYU2'D E%+SD ,80 $>%"/3G5.5O_P("X "%* '7P F__X M<@0O 2\ 2&[_^2U A.N0 !/[P ,+4#_]%* ';P .PCX4H!![O_XT<!R M!"\!+RX #"\(+4#_\$ZY $_O PB+O_P+4#_]-"!';P 2 CX0C8(^4AN M__@O.0 PM0/_P80 $8E"/3EY.=2\Y #$ZY %B/3G5A "J3G5. M5@ +RX ""\Y #&$ !#10CTY>3G5.5@ $^X "P "Q(>0 "PO.0 M QA .J4(].7DYU3E;__D(N__Y(>0 "TO.0 ! O.0 !AA 2.3^\ M#!U __X, /__9QH, _9@Q.N0 =0/_^8 @0+O_^3EY.=6$ ^A(=0/__ M2@!GL@P #]F#$ZY !U __Y@H! N__].7DYU< <O &$ >)8CT*G3KD M 6(].=4Y6__I"ITAY )1DZY Z%"/(\ @2H!F"G !+P!A &N M6(]"ITAY )4DZY Z%"/(\ H2H!F"G "+P!A &*6(]"ITAY ) M9$ZY Z%"/(\ D2H!F"G #+P!A %F6(]"ITAY )=4ZY %"/ M(\ 42H!F"G $+P!A %"6(\O.0 !1.N0 !8CR/ #$J 9@IP M$R\ 80 !(%B/0J=(>0 "8!.N0 !0CR/ &$J 9@IP!2\ 80 _%B/ M+SD 83KD 6(\CP !!*@&8*< PO &$ -I8CTAY 7$ZY M8%B/(\ 2H!F&DAY )BDZY %B/<!0O $ZY %B/(_D M 2DAY +$ZY =%B/(\ $2H!F"' &+P!A?%B/80#[5&$ ^6(O M.0 0O.0 ! O.0 QA %H3^\ #"U __Q*@&<(< <O &%*6(](;O_[ M+SD 080 ")E"/+SD 03KD %P6(\=0/_[2@!F$"\Y $$ZY ! MA%B/8 XO.0 !A.N0 *Q8CTY>3G5.5@ ("X " 2 6T .H,@ M !-L #@Y8!.^P@"8 R& +9@ "D8 A& &1@ !$8 ,F +I@ M "V8 0F *Y@ !68 IF *)@ ">8 FF )9@ "28 5B\Y M #$ZY !-%B/+SD $3KD P6(\O.0 !.N0 !Q8CR\Y M&$ZY J%B/+SD 03KD !&6(\O.0 !1.N0 *A8CR\Y #$ZY M 1EB/+SD D3KD $ 6(\O.0 "A.N0 0!8CR\Y ($ZY ! M %B/+RX "$ZY %B/3EY.=4Y6__P@;@ ((6X $ H<'PA0 D< O "\( M+P!(>0 "9Q.N0 11/[P 0(&X "")N PC: 4 !0C: 8 !A.7DYU3E8 M "!N @Q? # !PB;@ ,P8D"0/_^P8DA20 H< $A0 D+PA.N0 4A8CW M3EY.=4Y6 @;@ (,7P P <(FX #,&) D#__L&)(4D *"%N ! )"\(3KD M %(6(]P $Y>3G5.5@ (&X "#%\ , '")N S!B0) __[!B2%) "AP_R% M "0O"$ZY !2%B/< !.7DYU3E8 "!N @Q? " !PB;@ ,P8D"0/_^P8DA M20 H< $A0 D+PA.N0 5Q8CW 3EY.=4Y6__XO+@ (3KD "L6(]*@&8. M+RX "$ZY U%B/8.(O+@ 0+RX #&&@4(\@;@ 0$!!.7DYU3E;__$CG 0O M+@ (3KD "L6(]*@&8*</],WR 3EY.=2!N PJ: H+RX $"\(80#_8E"/ M$!5,WR 3EY.=0 ^P !+ P "2( =B '7 !SX <F & MX@ !IP 9X &5 !C 3$ $J !(8 1H $-@ \P .B M #> V( -< #6 U( -. #2 T0 ,^ #.@ S0 M ,P #*@ R8 ,@ #' PH +V "P KH *V "I M I )D "4 C (L "' @X 'D !U@ ;8 &P ! MH 9@ %X !: 6 % !/ 38 $R !+ 2@ $B M !'@ 1@ $4 !#@ 0H $$ _ /@ #R [@ +8 M "P J@ # $ (Z "-H C, (O@ "+ BB (E M"(8 AX (:@ !^H ?: 'Q ![@ >6 'D !XH =P ' M6 !S0 <2 '! !O ;, &O@ !JH :& &8@ !CX 6\ M %M@ !; 68 %D@ !8P 5V %6 !40 3* #U ZX M -R "Q@ +P Z * !@ & @ X 8 %V@ M , A (^@ !U 8@ 0 "X =$ @ # 4B $ M]@ X !# $8 !"X /$ #F@ P( +N "G H@ )< M "2 @8 '. !D 5@ 4 2P "C( H, )V ":0 M EP )* ".X C@ (T@ "' ?@ 'R@ !GX 9: &-@ M $ I> *(@ !_ 0 ! $T BV (F@ !N@ :B M! $X C$ (J !PH ;$ "0 $\ B, (?@ !V@ <L M #W [0 -^ "S ,( #\@ ^H )K=&]P87HN9F]N M= ( %/9W)E(#(N,"!B>2!(;V)I92!/<G)I<P H R ,! M #8 ' @ !0 !D "T"@ #( \ H MR " & / # /__\ " ! O_ 0 +_@$ "_P! MOX 0 +_ $ "_X! N_ 0 +'X$ "@_! @'X0 ( _$ " 'Y @ \0 ( &$ " M ! ___P /__\ " ! @/_0 (!_T " /] @!_0 ( _T " ?] @/W0 ('X MT "#\% A^ 0 (_ $ "?@! CP 0 (8 $ " ! ___P /__\ " ! @( 0 M (& $ "#@! AP 0 (__T "?_] O__0 )__T "/_] AP 0 (. $ "!@! M@( 0 ( $ " ! ___P /__\ " ! @! 0 ( 8$ " '! @!X0 +__$ "_ M_Y O__0 +__D "__Q @!X0 ( <$ " &! @! 0 ( $ " ! ___P /__ M\ " ! @ 80 ( /$ " 'Y @#\0 (!^$ "@_! L?@0 +OP$ "_X! O\ 0 M +^ $ "_P! O^ 0 +_P$ " ! ___P /__\ " ! A@ 0 (\ $ "?@! MC\ 0 (?@$ "#\% @?C0 (#]T " ?] @#_0 ( ?T " /] @'_0 (#_T " M ! ___P /__\ " ! @?P0 (/^$ "'!A C@ 0 (P $ ". ! A_P0 (/^ M$ " !Q @ ,0 ( '$ "&#A A_P0 (/X$ " ! ___P % 2 $ M !\ @$ 4 !( 0 ,0" 0 !0 $@ ! !# (! M % 2 $ %4 @$ 4 !( 0 9P" 0 M !0 $@ ! !Y (! % 2 $ (L @$ '" M 'L % 2 0 P ! "= =8 M>P 4 !( ! # $ *( !N "- M !0 $@ $ , 0 IP '@ (T M% 2 0 P ! "L <( GP 4 M !( ! # $ +$ !U@"? !0 M$@ $ , 0 M@ ', (T % 2 M 0 P ! "[ !W96%D>GAS M 0 ' ! <0 ' ! M X@ ' ! M ' " !2 "@!P @ 4@ M !0 < ( %( M > ' " !2 M * !P @ 4@ #( < ( %( M (( " !2 M "@"" @ 4@ M !0 @@ ( %( > (( " !2 M * "" @ 4@ M #( @@ ( %( M \ (( " !2 "" @ M4@ 0R!#;VUM86YD(%!O<W0 2"!(;W=I='IE M<@!4($AE879Y(%1A;FL 32!-:7-S:6QE(%1A;FL 1R!'158 22!);F9A;G1R M>0 &<@ !H$ :, &F0 !J@ :N="!4<F5A9', 8B!-86EN($)A M='1E<GD <R!396-O;F1A<GD@0F%T= !M($UI<W-I;&4 82!!;G1I+5!E<G-O M;FYE; !P(%!A<W,@;F]W '(@4F5S;VQV92!N;W< !M( ;; &Z@ M!OL <% '%@ !R$_($EN<W1R=6-T:6]N<P '3$1E<&QO>0!487)G M970 2&5L< '8 !V< =N P , # M P , # P M , # P , # M P , # P M , # P , # M P , # P M , # P $-(5$U'20!T8G-M87!R M/P $-H;V]S92!A;B!/9W)E('1Y<&4 36%R:R!)24D 36%R:R!6 # M 0 #P "@ BM ,! !P $ ",$ P$ ' M 0 (R@ @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @ M(" @(" @(" @(" @(" @(" @(" @(" #&1O<RYL:6)R87)Y &EN='5I=&EO M;BYL:6)R87)Y &=R87!H:6-S+FQI8G)A<GD 8V]N,2YW<FET90!C;VXQ+G)E M860 0V%N)W0@;W!E;B!W:6YD;W< 8V]N<V]L92YD979I8V4 ^P S M P "08 CR (W@ "(P AX (9 "% @\ (* "!0 M @ '[ !]@ ?$ 'L !YP >( '? !W@ =T '7 M!T@ =$ '0 !SP <X '- !S ;. &R@ !L8 ;" & MO@ !KH 0: #[@ \( .6 #:@ SX ,2 "]@ N( +. M "N@ J8 *2 "?@ &P !& # /R #ZP P M /R #Z0 HY.5O_V3KD 20< $M0/_\#*X <__QN0G !+4#_^" N M__@,@ !QN*B\ +R[__&$ &!0CTJ 9A1PMR\ +R[_^"\N__QA #J3^\ M#%*N__A@RE*N__Q@M&$ !CA.N0 VI.7DYU3E8 ! N \2+@ +D@!> 2!N M ! 0@1(N O2 ' RD $@;@ 4$(!.7DYU3E;__A N M(@$C $BX #TB!2,%( M;O_^2&[__R\!+P!AM$_O ! 0+O_^2@!K% P "9N#A N__]* &L&# #F\& M< %.7DYU< !.7DYU3E;__A N M(@$C $BX #TB!2,%(;O_^2&[__R\!+P!A M /]F3^\ $! N__X, *;10, F;@X0+O__2@!K!@P YO!G !3EY.=7 M3EY.=4Y6__X0+@ +2(!(P!(N ](@4C!2&[__DAN__\O 2\ 80#_%$_O ! 0 M+O__2(!(P!(N__Y(@4C!XX%2@2\!+P!.N0 !-90CQ N !-(@$C +P!.N0 M!818CTY>3G5.5O_\$#D %1L"X "V84$#D %2L"X #V8(80 "7$Y>3G5" MKO_\("[__+"Y !5&Q:<@M.N0 @0-'\ !(H FR+@ +9CH@0-'\ M ! H JP+@ /9B@@+O_\<@M.N0 @0-'\ ! H A7 &<,+R[_ M_&%R6(].7DYU4J[__&":$"X "TB 2, 2+@ /2(%(P2\!+P!A 064(]*@&<D M$"X "TB 2, 2+@ /2(%(P70J+P(O 2\ 80#^W$_O Q.7DYU$"X "TB 2, 2 M+@ /2(%(P72W+P(O 2\ 80#^N$_O Q.7DYU3E;_]B N AR"TZY "! MT?P '6@ "?__($#1_ =: *__X@0-'\ ! H A(@$C #( M #9P !'@R F< ,0,@ %F $J("X "'(+3KD ($#1_ M 0$$B 2, ,@ $EF4! N__](@$C $B[__DB!2,$O0 ("X ""]! 1R M"TZY "! T?P $"@ 4B 2, &@ # O "\O @O+P (80#][$_O M Q@ "X$"[__TB 2, 2+O_^2(%(P2] @+@ (+T$ !'(+3KD ($#1 M_ 0$$B 2, O "\O @O+P (80#]I$_O Q@<! N__](@$C $B[__DB! M2,$O0 ("X ""]! 1R"TZY "! T?P $!!(@$C +P!.N0 6!8 MCR\ +R\ ""\O AA /U43^\ #& @$"[__TB 2, 2+O_^2(%(P72W+P(O 2\ M80#],D_O Q.7DYU3E;__AUY !4?__'7D %2__Y(>0 !.N0 !6Q8 MCQ N__](@$C $B[__DB!2,%T3R\"+P$O &$ _.Q/[P ,2'D *3KD 5L M6(].7DYU3E;__A N M(@$C $BX #TB!2,%(;O_^2&[__R\!+P!A /OH3^\ M$! N__](@$C $B[__DB!2,'C@5*!+P$O $ZY $UE"/3EY.=4Y6 @+@ ( M<@M.N0 @0-'\ !(H E(@4C!($#1_ 0* *2(!(P"\ +P%A M /]^4(].7DYU3E;_W! N M(@$C $BX #TB!2,$O0 D($2+@ 32(%(P10N M !=(@DC"+T$ !)*")"\ "8O 24@QU __\=0?_^2H)J!$2"8!00+@ +2(!( MP!(N !-(@4C!D($D "U"__ 0+@ /2(!(P!(N !=(@4C!D(%*@&H$1(!@$A N M ](@$C $BX %TB!2,&0@2U __00+O__2(!(P!(N__Y(@4C!D(%*@&H$1(!@ M$A N__](@$C $B[__DB!2,&0@2U __A"KO_L< $M0/_H("[_Z R VP> MY8 B+O_LY8$D-@CPM+88\&P&+6[_Z/_L4J[_Z("[_[.6 +78(\/_D(C8( M\"VN__@(\!U!__U(@4C!+4'_^$*N_^QP 2U _^@@+O_H#( ";![E@"(N M_^SE@20V"/"TMACP; 8M;O_H_^Q2KO_H8-8@+O_LY8 B+O_D)#8(\-2!( ). M7DYU3E;__$*N__P@+O_\#( 1;##C@"! T?P 4$A"R+@ +9A@@0-'\ M %! H &P+@ /9@9P 4Y>3G52KO_\8,1P $Y>3G5.5O_\0J[__" N__P, M@ !%L-N. ($#1_ !02$$B!2,$@0-'\ %! H %(@$C ="HO B\ M+P%A /I@3^\ #%*N__Q@ODY>3G5.5O^P("X #'(+3KD ($#1_ 0 M$$B 2,!R* 2! "&L RBPNQ@(9O!.^Q@& 26 H( !48 !X@ M $=@ %" 36 *( !(8 G !+P!P$"\ 3KD 364(]P$"\ 3KD M 266(\@+@ ,<@M.N0 @0-'\ !(H %(@4C!($#1_ 4* " M2()(PB! T?P %B@ TB#2,,@0-'\ ! H =(@$C +P O R\"+P$O M+@ (2'D V2&[_L$ZY $_O !Q(;O^P3KD 5L6(]@ )>< $O ' 0 M+P!.N0 !-90CW 0+P!.N0 !)98CR N QR"TZY "! T?P $B@ M 4B!2,$@0-'\ !0H )(@DC"($#1_ 6* #2(-(PR! T?P M$"@ !TB 2, O "\#+P(O 2\N A(>0 %)(;O^P3KD 3^\ '$AN_[!. MN0 !6Q8CV <9P 2\ <! O $ZY $UE"/<! O $ZY $EEB/("X #'(+ M3KD ($#1_ 2* !2(%(P2! T?P %"@ DB"2,(@0-'\ M !8H -(@TC#($#1_ 0* '2(!(P"\ +P,O B\!+RX "$AY <DAN M_[!.N0 !/[P <2&[_L$ZY %;%B/8 !+G !+P!P$"\ 3KD 364(]P M$"\ 3KD 266(\@+@ ,<@M.N0 @0-'\ !(H %(@4C!($#1_ M 4* "2()(PB! T?P %B@ TB#2,,@0-'\ ! H =(@$C +P O M R\"+P$O+@ (2'D ")2&[_L$ZY $_O !Q(;O^P3KD 5L6(]@ "6 M< $O ' 0+P!.N0 !-90CW 0+P!.N0 !)98CR N QR"TZY "! T?P M $B@ 4B!2,$@0-'\ !0H )(@DC"($#1_ 6* #2(-(PR! MT?P $"@ !TB 2, O "\#+P(O 2\N A(>0 *=(;O^P3KD 3^\ M'$AN_[!.N0 !6Q8CTY>3G4 /L %@ ( FV )'@ "(8 ?N M '5@ "BX F6 (_@ "&8 ?. $5@ !"@ &( )J@ "1( M AZ 'X@ !TH 2B !=@ &( & "P 8 H6 )?@ M".8 A. 'M@ !KX :P &=@ !F8 10 $(@ "8 = ) M_ ">P G< )S "60 E4 )1 "30 C, (O "*P B< M (- ""0 @4 (! !YP >, '? !VP ;X $T !, M / #>@ RH +P "M@ J@ *: " @ >0 '2 !P M!!H 02 !I 9@ ! + \X % +P "B F( ( M\ "%@ ? #@ $, G$ )+ ")0 ?\ '9 !O 2X M #N W( ,B "Z I( 'Z !R@ /R #Z@ #&; M,3LS,CLT,&T FS [,S$[-#!M !$0$PT-$@X/#0\/"@D/"@P'#@L*#@<,!@<* M" 8$"0D$"0,E<R!H;W=I='IE<B H)60O)60@1"5D($TE9"D )7,@;6ES<VEL M92!T86YK("@E9"\E9"!$)60@325D*0 E<R!'158@*"5D+R5D($0E9"!-)60I M "5S(&AE879Y('1A;FL@*"5D+R5D($0E9"!-)60I "5S(&EN9F%N=')Y("@E M9"\E9"!$)60@325D*0 #\@ ^D '[3E;__$JN QO$B N @B+@ , M3KD 4H!@ G &+4#__ R !F\&< 8M0/_\#*X !__QF%B N CC M@+"N QL!' 8 )P 2U __P@+O_\3EY.=4Y6 O+@ ,+RX "&&:4(_E@"! MT?P :(!!.7DYU3E;__' 0+P!.N0 !)98CTAY ;$ZY %;%B/3KD M >B(&X "! 02@!O2&$ !"YR!TZY "! T?P V(FX "! 12(!(P'(# M+P$O "]( AA /\P4(\@;P T< 0$%< 9@X0.0 4I3 !/ !2B!N @0 M* !2@!O2F$ ]IR!TZY "! T?P V(FX "! I %(@$C <@0O 2\ M+T@ "&$ _MI0CR!O #1P! 05P!F#A Y !2U, $\ %+(&X "! H )* M &]*80 #A'('3KD ($#1_ #8B;@ ($"D DB 2,!R R\!+P O2 ( M80#^A%"/(&\ -' $!!7 &8.$#D %,4P 3P 4P@;@ ($"@ TH ;TIA M ,N<@=.N0 @0-'\ -B)N @0*0 #2(!(P'(!+P$O "]( AA /XN M4(\@;P T< 0$%< 9@X0.0 4U3 !/ !32!N @0* $2@!O1&$ MAR M!TZY "! T?P V< $O "\ +T@ "&$ _>10CR!O #1P! 05P!F%"!N M @0* $2(!(P"\ 80 %+EB/<"@O ' 2+P!.N0 !-90CTAY 8$ZY % M;%B/<"@O ' 3+P!.N0 !-90CTAY 8$ZY %;%B/<"@O ' 3+P!.N0 M!-90CTAY 8$ZY %;%B/<"@O ' 4+P!.N0 !-90CTAY 8$ZY % M;%B/<"@O ' 5+P!.N0 !-90CTAY 8$ZY %;%B/<"@O ' 6+P!.N0 M!-90CTAY 8$ZY %;%B/0J=.N0 !8CTY>3G5.5O_Z("X "'(+3KD M ($#1_ 2* (5P%G &P($#1_ 0* &2@!O &>80 !GG(' M3KD ($#1_ #8@+@ (<@M.N0 B0-/\ !(I 9(@4C!(D#3 M_ 0*0 #2(!(P"\ +P$O2 (80#\@%"/(&\ -' $! =0/__("X "'(+ M3KD ($#1_ 2$ P! $EF= PN +__V9L($#1_ 2* !4P$1 M00 !($#1_ 2* !2@%F#B! T?P $7P P (("X "'(+3KD M($#1_ 2* )2(%(P2! T?P $"@ "DB 2, O "\!3KD &24(]. M7DYU("X "'(+3KD ($#1_ 0* (2(!(P R F<D#( ! M9CX@+@ (<@M.N0 @0-'\ !%N__\ "& B#"X ?__9QH@+@ (<@M. MN0 @0-'\ !%\ , "" N AR"TZY "! T?P $B@ "%,! M9RP@0-'\ !(H E(@4C!($#1_ 0* *2(!(P"\ +P%.N0 9)0 MCTY>3G5.5O_\0J[__$JN__QF%$ZY !M'(&3KD +4'__&#F("[__$Y> M3G5.5O_X0J[__" N__RPN0 51L &D<@M.N0 @0-'\ !(H D4 M.0 5&R F8 7P@0-'\ ! H H2.0 5*P 68 60@+O_\<@M.N0 M @0-'\ ! H A7 &< 48@+O_\3KD ($#1_ 0$$B 2, , M@ $EF3A Y !34H ;P !&B N__QR"TZY "! T?P $B@ 5,! M$4$ 2! T?P $B@ 4H!9@ ZB! T?P $7P P (8 V" N__QR M"TZY "! T?P $B@ !$H!9Q @0-'\ ! H A5 &9$("[__'(+ M3KD ($#1_ 1? # @@0-'\ ! 0# 5&8$< )@ G !+P!A M $P6(]"ITZY %B/8&8@+O_\<@M.N0 @0-'\ "]( !A /YR M#( #;P1P V "< (@;P $4 "" N__QR"TZY "! T?P $! , M !49@1P F "< $O &$ ,A8CT*G3KD 6(]2KO_\8 #^4DY>3G5.5@ M("X "'(+3KD ($#1_ 2* )%#D %1L@)F "$($#1_ 0 M* *$CD %2L %F;" N AR"TZY "! T?P $! , !)9U @+@ ( M3KD ($#1_ 0$ P %1F"G "+P!A-%B/8 AP 2\ 82I8CR N AR M"TZY "! T?P $7P P (0J=.N0 !8CTY>3G5.5@ $#D %. M2(!(P)"N @3P 4YR !/! !3TH ;P@3_ ! !3Q Y !4TB 2,!R M TZY !(Y !3DB!2,&R@&\($_P @ 4\0.0 5-(@$C XX!R TZY M !(Y !3DB!2,&R@&\($_P P 4].7DYU #[ X " " MX L( *D "A@ F@ )* "[@ M *R "E G8 )8 M D (( " !0 !,P 06 #@ @ -& "Z LH M *L "C@ G )2 "# ;8 %@ !"@ +8 "* ;@ M $ 4 F 0 8 '8 !JH 9" "^ #H = % M#@ !U( <D '"@ !N@ ;0 &C !EH 8D &%@ !?H 7J M %S !;H 6H %>@ !5X 4Z %(@ !+H 2J $F@ !( M 1< $, ! 0 /T #V@ \H .X #H VH -: #* M Q8 ?D 'U !\ >Z 'J@ !Y@ >2 'A@ !WX =P & M\@ !MH 6. %1 !2P 'L !Y 98 &. !0 3@ #J M X@ $ \ $Y@ 0 ! 'S@ !Z0 3N % !H M !# '2@ !QP <" &R !H0 92 &#@ !>( 6@ %<@ M!58 4: $D@ !'@ 14 $* ^P .8 #4@ SX ,. " M! :X %8 ! @ *X #\@ ^H ?,"\Q #$O,@ Q+S$ M,B\Q #,O,0 T+S$ *P ! @ , $ !0 8 0$! M 0(" P$! 0(" P,! 0(" P,# 0$" P,# P$" P,# P,! P,# P,#(" @(" @ M(" @(" 4F5S;VQV:6YG+BXN ^P ' " #( N M*@ "8 B '@ !H #\@ ^D %_3E;_^AU\ '__W * M+P!(>0 !A -44(].N0 7!*+O__9P XD(N__]"KO_Z("[_^K"Y ! M5&SD$#D %/2@!F!DZY :" N__IR"TZY "! T?P $B@ "%,! M9@ F"! T?P 2B@ !F8 (@@+O_Z<@M.N0 @0-'\ ! H %* M &]J("[_^DZY "! T?P (D#3_ 0* %$BD K !;D0O+O_Z M2'D 3KD ;D4(\O+O_Z8498CPR <&8('7P ?__8!H@+O_Z<@M. MN0 @0-'\ !%\ $ !E*N__I@ /\J2'D 3KD !X6(].7DYU M3E;__B\N A.N0 !*Q8CT(N__Y.N0 !:8=0/__2(!(P'(X!($ (:P " M$+"[& AF\$[[& 8 !R8 !W '1@ %H 86 1( !S8 O M &)@ !F ;6 ! !P8 G!P3EY.=1 Y !2DH ;SH@+@ (<@M. MN0 @0-'\ ! Y !(H '0 1/ ! N__](@$C +P!A '" M6(]@ &*'7P ?_^8 !@! Y !2TH ;SH@+@ (<@M.N0 @0-'\ M ! Y 1(H '0 1/ 1 N__](@$C +P!A %T6(]@ $\'7P ?_^ M8 !,A Y !3$H ;SH@+@ (<@M.N0 @0-'\ ! Y A(H '0 M 1/ A N__](@$C +P!A $F6(]@ #N'7P ?_^8 Y! Y !34H M;SH@+@ (<@M.N0 @0-'\ ! Y Q(H '0 1/ Q N__]( M@$C +P!A #86(]@ "@'7P ?_^8 EA Y !3DH ;S@@+@ (<@M.N0 M @0-'\ ! Y !!(H '0 1/ !! N__](@$C +P!A "*6(]@ M!AU\ '__DHN__YF1DAY $ZY >%B/< HO $AY &$Z4(]@*$AY M $ZY >%B/< HO $AY &$<4(]P<$Y>3G4=? !__Y*+O_^9@#] MR' 3EY.=4Y6__Q"KO_\("[__+"N QL#B!N C1P$(04J[__&#H3EY.=4Y6 M_ZP0+@ +2(!(P'(H!($ (:P "5+"[& AF\$[[& 8 !T8 !Z &%@ M %V ;6 0( !S8 @@ &)@ "<"@O ' 2+P!.N0 !-90CTAY M !4ZY %;%B/<"@O ' 2+P!.N0 !-90CQ Y 4B 2,!R!"\!+P O M0 (3KD !84(\O '($+P$O+P (2'D /2&[_L$ZY $_O !1(;O^P M3KD 5L6(]@ &J<"@O ' 3+P!.N0 !-90CTAY !4ZY %;%B/<"@O M ' 3+P!.N0 !-90CQ Y DB 2,!R R\!+P O0 (3KD !84(\O '(# M+P$O+P (2'D :2&[_L$ZY $_O !1(;O^P3KD 5L6(]@ $R<"@O M ' 4+P!.N0 !-90CTAY !4ZY %;%B/<"@O ' 4+P!.N0 !-90CQ Y M $B 2,!R R\!+P!.N0 %A0CR\ 2'D E2&[_L$ZY $_O Q( M;O^P3KD 5L6(]@ #&<"@O ' 5+P!.N0 !-90CTAY !4ZY %;%B/ M<"@O ' 5+P!.N0 !-90CQ Y TB 2,!R 2\!+P!.N0 %A0CR\ 2'D M H2&[_L$ZY $_O Q(;O^P3KD 5L6(]@6G H+P!P%B\ 3KD 36 M4(](>0 5.N0 !6Q8CW H+P!P%B\ 3KD 364(\0.0 1(@$C +P!( M>0 "M(;O^P3KD 3^\ #$AN_[!.N0 !6Q8CTY>3G4 /L %0 M ( 7R %M@ !98 5, %*@ !. 2^ $: !$8 /P % MQ@ !:@ 5< %/@ !/ 32 $> !%H 0 #X@ 3 " M !0 20 #( !P < 5T %" !)0 0< #/ QX M $0 "P H 7: %L !7X 5& %$@ !-H 2F $8@ M!"X /J P@ !4 + %S@ !60 3X $@ ! @ -( # M-@ RH ,8 "] N@ *F "F@ E@ ), ""@ ?X &\ M !L 0H 0 0 !8 < 0 !L !( $@ !T M +B "E D8 'X !J@ /8 "L I (H !N 7 M LH )\ "+@ > &2 /@ #8 % +P !>0 6( % M' !+ 0X "0 $, +: "C CX 'P !H@ .X "< M @@ %0 #\@ ^H /1FER90 @(" @(" @(" @)60@)60@ M*"5S*0 E9" E9" H)7,I "5S "5S #$O,2 H)60I(" @(" #\@ M ^L # #\@ ^D "\3E;__$*N__P@+O_\L+D %4;'AR"TZY M "! T?P $B@ "%,!9E@@0-'\ ! H =* &\2+R[__$AY $ZY M &Y%"/("[__'(+3KD ($#1_ 2* '2@%O&B! T?P $"@ M"%, 9@HO+O_\81!8CV#*4J[__& _WY.7DYU3E;_^!U\ '__THN__]G )* M("X "'(+3KD ($#1_ 2* )($#1_ 0* *'4'__4B!2,$= M0/_\2(!(P"\ +P%.N0 !&!0CT(N__Y.N0 !:8=0/_[2(!(P') !($ ( M:P EK"[& AF\$[[& 8 @8 9@ '-@ !> >F % !W8 M0@ &%@ P >& "( !E8 % &1@ "4R[__5,N__Q@1E,N M__U@0%,N__Q@.E(N__U2+O_\8#!2+O_\8"I2+O_]8"0@+@ (<@M.N0 @ M0-'\ $(H =P $Y>3G4=? !__X0+O_]2(!(P!(N__Q(@4C!+P$O $ZY M E%"/2H!F8A N__U(@$C $B[__$B!2,$O 2\ 3KD FD4(]*@&<<("X M"'(+3KD ($#1_ 0* '4P!G)A N__U(@$C $B[__$B!2,$O 2\ M3KD 9,4(]*@&8&2B[__F<(0B[__F _G@@+@ (<@M.N0 @0-'\ M !(H D@0-'\ !0H H@0-'\ !%N__T "2! T?P $6[__ * M'4'_^DB!2,$=0O_Y2()(PB\"+P%.N0 9)0CT(N__\@+@ (<@M.N0 @ M0-'\ ! H =3 !% <O+@ (3KD :\6(\@+@ (<@M.N0 @0-'\ M !(H E(@4C!($#1_ 0* *2(!(P"\ +P%.N0 9)0CV _;). M7DYU /L 0 ( #H !@ 4 +@ ">@ @P &P M W $@ ! !P J@ ! #0 $( ! $0 = M 0 '0 LX *^ "E EH ), "0 C0 'J !A@ M +X "R ;@ %X P ( X ( 0P K8 *, " M+ >( %^ J@ %8 8 _( /J DUO=F4 M #\@ ^D "83E;_^$*G2'D !,3KD 4(\CP A*@&8&</]. M7DYU+SD (3KD 6(\CP !*@&8&</].7DYU0J=(>0 %=.N0 M !0CR/ #$J 9@9P_DY>3G4O.0 Q.N0 !8CR/ !$J 9@9P M_DY>3G4C^0 H2'D *3KD !T6(\CP !!*@&8&</].7DYU M+SD 0+SD $+SD 3KD D$3^\ #"U __A*@&<*80 HG#]3EY. M=4AY >"\Y !$ZY )Y%"/</XO $AY .DZY U%"/2H!F*DAY M 82\Y $ZY )L%"/+SP #Z3KD $ 6(]A3'#\3EY.=4AY MF4AY .DZY %"/+4#__$J 9@9P_$Y>3G4O+O_\80 ;%B/81@O+O_\ M+4#_^$ZY #CEB/("[_^$Y>3G5.5O_\+SD (3KD "H6(\O.0 !. MN0 $98CR\Y #$ZY J%B/+SD $3KD !&6(\O.0 !!.N0 M #!8CTY>3G5.5O_X< M0/_X+4#__"\N AP9"\ 2'D 43KD "03^\ M#"U __Q*@&=.2'D 4+SD 3KD FP4(\@+O_X4H M0/_X#( 5 M9KI(>0 '@O.0 0O.0 Q.N0 "AA/[P ,$\ !X0J[_^&"22'D M !X+SD $+SD ,3KD H83^\ #!/ >$Y>3G4 /L !@ M ( ). ")@ ?H $. Y +P ! ! (( ( M#P 3( $L ! @ / ", A@ $8 ( '0 ! )8 M "2 D( (\ ", B (: "% ?0 'N !U@ :X M &@ !D@ 80 %V !" -X #8 M@ + "J F@ M '( !D 5 #0 F %@ $ B !W $ D ! M. $ G !8@ ( !* !' /8 $ 30 9@ %\ M 3 X $ 3@ :8 &* :@ "P " 3P ;0 M "2 _( /J )T]G<F4@2&5L< H R ,! M$ !D "T"@ #( ]/9W)E.DEN<W1R=6-T M:6]N<P!C;VXR+G=R:71E &-O;C(N<F5A9 *0V%N)W0@;W!E;B!/9W)E.DEN M<W1R=6-T:6]N<RX@0VAE8VL@>6]U<B!V;VQU;64@;F%M92X* '( ^P M ! #P "0 #\@ ^L ? #\@ ^D ,83E;_J' * M$\ $\ !("X " R !6<:#( #9B)P$"/ "G 2(\ M &8!!P%B/ "G ;(\ &< CP 50CP )*N0 IN$$JY M !FX(2KD "9F1*N0 )G"$'Y )V &0?D I+P@O.0 8O M.0 I(>0 !(;O^P3KD 3^\ %$*G<! O $ZY $UE"/<! O $ZY M $EEB/2&[_L$ZY %;%B/80 !(&"$2'H)]G ++P O.0 51(>0 !A M"$_O !!.7DYU3E;_X$CG " @+@ ,<@).N0 M0/_\2J[__&\ -@M;O_\ M__@@+O_XL*X #&P +*0KO_\+4#_]$JN__1K ":("[_]'(+3KD (&X M"-' ("[_]-"N__Q.N0 B;@ (T\ O"2\()&X %$Z24(]*@&]B("[_]'(+ M3KD (&X "-' +T@ !$/N_^EP"A+84<C__" N__30KO_\3KD (&X M"-' +T@ "")O 1P"A+84<C__$'N_^DB;P (< H2V%'(__P@+O_\D:[_]& M_V)2KO_X8 #_1B N__QR DZY "U __Q@ /\D3-\$ $Y>3G5.5O_Z'7P M ?__0B[__A Y $B 2, 2.0 %(@4C!+P$O $ZY $8%"/2B[__V< M!!8=>0 #__1UY ?_\3KD 6F'4#_^TB 2, B/ ( $@0 AK M -\L+L8"&;P3OL8!@ $A@ +: 26 D0 S8 !C@ #)@ && M ,6 7X !'8 Y@ $U@ #> 5& -8 !#8 @@ '-@ M ,H >F &@ !W8 5@ &%@ ^ >& "P !E8 &@ M &1@ "4SD 4SD !8 "Z%,Y & MY3.0 %@ +44CD M 4CD !8 "Q%(Y 6 KI2.0 !@ *P2KD "9PH=? ! M__Y@ *>$#D 2(!(P!(Y 4B!2,$4+O_[2()(PB\"+P$O &$ N)/ M[P ,0B[__W !(\ "8 "9! Y $B 2, 2.0 %(@4C!+P$O &$ M!AI0CTJ 9BP0.0 !(@$C $CD !2(%(P2\!+P!.N0 !DQ0CTJ 9@A* MN0 IF"AU\ '__F @P0.0 !(@$C $CD !2(%(P10N__M(@DC" M+P(O 2\ 80 "4$_O Q"+O__4[D *8 !U! Y $B 2, 2.0 %( M@4C!+P$O &$ !8I0CTJ 9CP0.0 !(@$C $CD !2(%(P2\!+P!.N0 M!DQ0CTJ 9A@0+O_[2(!(P 2 ,"(Y !K* ; H=? !__Y@ %L$#D M 2(!(P!(Y 4B!2,$4+O_[2()(PB\"+P$O &$ ;!/[P ,0B[__Q N M__M(@$C !( PD;D &8 !)A Y $B 2, 2.0 %(@4C!+P$O M &$ !-Q0CTJ 9C 0.0 !(@$C $CD !2(%(P2\!+P!.N0 !DQ0CTJ M9@P,N0 , &; H=? !__Y@ #*$#D 2(!(P!(Y 4B!2,%T M,R\"+P$O &$ 11/[P ,0B[__U>Y !F )@0.0 !(@$C $CD ! M2(%(P2\!+P!A 1.4(]*@&8P$#D 2(!(P!(Y 4B!2,$O 2\ 3KD M 9,4(]*@&8,#+D ! "FX('7P ?_^8#P0.0 !(@$C $CD ! M2(%(P10N__M(@DC"+P(O 2\ 80 @D_O Q"+O__5;D *8 8=? !__X0 M.0 !(@$C $CD !2(%(P2\!+P!.N0 .)0CTJ 9@9*+O_^9Q@3[O_] M !/N__P !0B[__F _ H0.0 !(@$C $CD !2(%(P2\!+P!. MN0 !&!0CV ^^9.7DYU3E;__" Y !5%*Y !5!(N !-(@4C!+4#__'!( M!( (:P "UK*[" AF\$[[" 8 R8 "=@ #%@ (@ ,V <8 M !)8 !O@ $A@ %D 1V 0P !-8 L@ %1@ !8 0V M (@+O_\<@M.N0 @0-'\ !"\ $,@0-'\ '( $4$ 2! T?P M $4$ B! T?P $4$ R! T?P $4$ !& C8@+O_\<@M.N0 M @0-'\ !"\ %0@0-'\ !%\ 0 2! T?P $7P @ "($#1 M_ !R Q%! ,@0-'\ !%! 1@ 'D("[__'(+3KD ($#1_ M 0O !-($#1_ 1? # $@0-'\ !%\ 0 B! T?P <@(1 M00 #($#1_ 100 $8 !DB N__QR"TZY "! T?P $+P 1R! MT?P <@(100 !($#1_ 100 "($#1_ 100 #($#1_ 1 M? $ 1@ %"("[__'(+3KD ($#1_ 0O !(($#1_ 1? & M $@0-'\ !%\ @ B! T?P $7P 0 #($#1_ !"* $8 M\" N__QR"TZY "! T?P $+P 22! T?P $7P P !($#1_ M !R 1%! (@0-'\ !%! ,@0-'\ !%\ ( !& )X@+O_\<@M. MN0 @0-'\ !"\ $D@0-'\ '(!$4$ 2! T?P $4$ B! MT?P $4$ R! T?P $7P @ $8$X@+O_\<@M.N0 @0-'\ M !"\ $D@0-'\ '("$4$ 2! T?P <@$100 "($#1_ 100 # M($#1_ 1? " 0@+O_\<@M.N0 @0-'\ '( $4$ !2! T?P M $4$ !B! T?P $7P 0 (($#1_ 100 '($#1_ 1;@ + M D@0-'\ !%N \ "B\N__Q.N0 H98CTY>3G5.5O_\0J[__" N__RP MN0 51L5'(+3KD ($#1_ 2* (5P%G-B! T?P $"@ "; N M MF)" N__QR"TZY "! T?P $"@ "K N ]F!G !3EY.=5*N__Q@ MH' 3EY.=4Y6 !.N0 ;1(@$C <@=.N0 &@0 !83P0 5%P,I ! M$\ %2("X " R !6= #( #9FYP+1/ !3A/ !4Q/\ , M %/$_P @ 4H3_ ! !2Q/\ 0 %,$_P " 4U@-G \$\ %. M$\ %3$_P P 4\3_ % !2A/\ ( %+$_P !@ 4P3_ * ! M34ZY $#$Y>3G5.5O_\(&X "! 02(!(P'(P!($ (:P !=K"[& AF\$[[ M& 8 !)8 !1@ $=@ $. 36 +( !48 ; $A@ N M0V (@;@ ,$!!(@$C #( !#9@A"KO_\8 !(G#_+4#__& 1@@;@ , M$!!(@$C #( !(9Q(,@ $-F$G !+4#__& /1"KO_\8 ['#_+4#_ M_& .(@;@ ,$!!(@$C #( !49QH,@ $AG" R 0V82< $M0/_\ M8 MD*N__Q@ "N</\M0/_\8 I"!N P0$$B 2,!R( 2! "&LXL+L8 M"&;R3OL8!@ $U@ B 5& !( !(8 "@ $-@ "< $M0/_\ M8%Q"KO_\8%9P_RU __Q@3B!N P0$$B 2, ,@ $=G$ R 268.</\M M0/_\8"Q"KO_\8"9P_RU __Q@'B!N P0$$B 2, ,@ $EF!D*N__Q@!G#_ M+4#__" N__Q.7DYU #[ 0 " "-@ ,8 "Z K@ D M % *P@ "9H 7L %> !.H 0\ #K !BX (6 P M !( "4 @ '@ !# $P !B 86 &" !@ 7> % MU !<8 6B %F !8@ 5J %8 !4@ 4^ %- !18 4, M $^@ !-P 32 $N@ !+ 2F $= !&H 16 $+@ !"0 M 0, $ @ _@ /4 #R@ [@ .> #E WP -R #: M T( ,X #)@ QP ,2 #" P( +X "[@ N0 +> " M+@ B8 (( !_@ (X "( < &@ !@ 6 %( !$ M / #( J #@ @ !' '0 "KP JT *K "J0 M J< *E "HX J$ *? "G0 IL *9 "EP I6 *.@ M"C GR )U "<0 F* )? "7 EB )5@ "4@ DN ) M(@ "10 D& (^@ "-X C2 (Q@ "+@ BL (C@ "(( AT M (9@ "%H @^ (, ""( @4 (" !^H ?> 'T@ !\0 M >X 'G !XX > '<@ !V8 =* '/ !RX <@ '% M!O@ ;L &X !M( ;& X@ ";( 9( &0@ -P !, M 0 "\ "> 0 #P H8 P $ HD !V@ 0 / M 0P ">H F\ )0 "/( BD (4@ " >P '7@ !PP M :^ !E 7 %. !.@ /R #Z@ QL969T('1O('!L M86-E.B E9"!A<FUO<BP@)60@:6YF86YT<GDE<P N "P@0U /R # MZP 0 /R #Z0 F).N0 / 3^0 4\ %0$#D %02@!O#F$. M3KD 4 80 '?F#H3G5.5O_8$#D %1$CD %2+7S__X !_^0=0/_;2(!( MP%. '4'_VDB!2,%3@2\!+P!A %X4(\M0/_H$"[_VTB 2,!3@!(N_]I(@4C! M+P$O &$ 5A0CRU _^P0+O_;2(!(P!(N_]I(@4C!4H$O 2\ 80 !.%"/+4#_ M\! N_]M(@$C 4H 2+O_:2(%(P5*!+P$O &$ 190CRU __00+O_;2(!(P%* M$B[_VDB!2,$O 2\ 80 ]E"/+4#_^! N_]M(@$C $B[_VDB!2,%3@2\!+P!A M #64(\M0/_\0J[_W' !+4#_X" N_^ ,@ =L'N6 (B[_W.6!)#8(Y+2V M&.1O!BUN_^#_W%*N_^!@UB N_]P,@ =D/N. 3OL( F V8 I@$F 68!I@ M(F F4R[_VU,N_]I@(%,N_]M@&E(N_]I@%%(N_]M2+O_:8 I2+O_;8 13+O_: M$#D %1$CD %2$^[_VP 5$3[O_: !4AU _]E(@$C '4'_V$B!2,$O M 2\ 3KD &24(].N0 ! P0.0 5!3 !/ !4$Y>3G5.5O_H$"X "TB M2, 2+@ /2(%(P10Y "4B"2,(6.0 I(@TC#+P,O B\!+P!.N0 !.I/ M[P 01( 2.0 4I(@4C!%#D %+2()(PM*"%#D %,2()(PM*"0J[_\"U M__PM0?_X("[_\+"Y !5&P G1R"TZY "! T?P $"@ "%< 9P " M4A N M(@$C $BX #TB!2,$O0 ("[_\"]! 1R"TZY "! T?P M$B@ "4B!2,$@0-'\ ! H I(@$C +P O 2\O PO+P ,3KD 3J3^\ M$"U __1*@&92("[_\'(+3KD ($#1_ 0$ P $-F"G R+4#__& M =(@+O_P<@M.N0 @0-'\ ! H %(@$C <@I.N0 M0/_\8 ! MIDJN__AO &6#*X %__1N3A Y !2DH ;T0@+O_P<@M.N0 @0-'\ M !(H %(@4C!)"[__-*"($#1_ 0* $2(!(P'0$E(#2@E.N__@M M0?_\8 !/@RN __T;DX0.0 4M* &]$("[_\'(+3KD ($#1_ M 2* !2(%(P20N__S2@B! T?P $"@ !$B 2,!T!)2 TH)3KO_X+4'_ M_& .8,K@ +_]&Y.$#D %,2@!O1" N__!R"TZY "! T?P M$B@ 4B!2,$D+O_\TH(@0-'\ ! H 1(@$C = 24@-*"4Z[_^"U!__Q@ M ".#*X !__1N)A Y !34H ;QP@+O_P<@M.N0 @0-'\ ! 0 M# 26<<("[_\'(+3KD ($#1_ 0$ P $-F0" N__!R"TZY M "! T?P $B@ 4B!2,$D+O_\TH(@0-'\ ! H 1(@$C = 24@-*" M4Z[_^"U!__Q2KO_P8 #]@A N M(@$C $BX #TB!2,$O 2\ 3KD "44(]* M@&8@$"X "TB 2, 2+@ /2(%(P2\!+P!.N0 !DQ0CTJ 9P@M?/__@ '__" N M__Q.7DYU3E;_]$ZY "$$*G< $O &$ V)0CT*N__PM0/_X$#D %-2(!( MP"(N__RR@&P (@@+O_X<@M.N0 @0-'\ !(H 4, 0 !;DX@0-'\ M !(0# $ 0V<0($#1_ 0$ P $EF+B N__AR"TZY "! T?P M $"@ !E( $4 !B\N__A(>0 !A ((4(\O+O_X< $O &$ LQ0CRU M__A2KO_\8 #_:"\N__AP B\ 80 "LE"/0J[__"U __@0.0 4Q(@$C (B[_ M_+* ;%@@+O_X<@M.N0 @0-'\ !(H 4, 0 ";B(@0-'\ ! H M 96 !% 8O+O_X2'D #80 !AE"/+R[_^' "+P!A )*4(\M0/_X4J[_ M_&"6+R[_^' #+P!A (R4(]"KO_\+4#_^! Y !2TB 2, B+O_\LH!L6" N M__AR"TZY "! T?P $B@ !0P! -N(B! T?P $"@ !E@ $4 M!B\N__A(>0 !5A $&4(\O+O_X< ,O &$ <I0CRU __A2KO_\8)8O+O_X M< 4O &$ ;)0CQ(Y !2DB!2,%"KO_\+4#_^"U!__0@+O_\L*[_]&P *H@ M+O_X<@M.N0 @0-'\ !(H A7 6=R($#1_ 0$ P $EG8B N M__AR"TZY "! T?P $"@ !0P 5N1" N__A.N0 @0-'\ M ! H 9< !% 80.0 4I3 !/ !2B\N__A(>0 ")A Z4(]"ITZY M %B/+R[_^' %+P!A #T4(\M0/_X4J[__& _TY.7DYU<#PO $ZY ! M %B/3G5.5O^P("X #'(+3KD ($#1_ 0* (5P!F!$Y>3G4@+@ , M<@M.N0 @0-'\ !(H E(@4C!($#1_ 0* *2(!(P"\ +P$O M+@ (2'D J2&[_L$ZY $_O !1"IW 0+P!.N0 !-90CTAN_[!.N0 M!6Q8CR N QR"TZY "! T?P $B@ "4B!2,$@0-'\ ! H I( M@$C +P O 4ZY $8%"/80#_,B\N Q.N0 P)8CTY>3G5.5O_\("X #"(Y M !5%.!+4#__+"!9@1P & &("X #%* +4 #" N PB+O_\LH!G #,#*X M ! AF9'(+3KD ($#1_ 2* (5P%G "&($#1_ 2$ P! M $-G$"! T?P $! , !)9F0@+@ ,<@M.N0 @0-'\ ! H 5( M@$C L*X "&Y"("X #$Y>3G4@+@ ,<@M.N0 @0-'\ !(H A7 6<> M($#1_ 0* %2(!(P+"N AN"" N Q.7DYU(#D %44X B+@ ,LH!F M!' 8 8@+@ ,4H M0 ,8 #_*B N Q.7DYU #[ ( " (, M""0 ' !0 "&@ 3T $U K@ (& !O@ ;8 " M!P "'@ > !0 !4 @* '< !J0 8D %H@ ( 6 M %% ( ! & !WX !# '0 "6 B, "1 "40 M DT )"@ ".X C> (S "%8 A& '] !^0 ?$ '3@ M!S( <6 '!@ !I 9^ &$ !?X 6. %<@ !6( 50 $ MG !(8 1J $3@ ! P /V #M YX -< #1@ OX +8 M "G@ HX )8 !] >H =F '7@ !M8 9> %W@ !2X M 0V #W@ X8 ,N "* AP (2 !S <0 &< !E M 8P && -@ # 2 # @ ! +P "!0 8 M0P "2P D" (Q "#X ?< 'O !T8 <J &_@ !G8 7V M %A@ !4@ 1^ $8@ !$8 /N #E@ SX ,. "]@ M M *& "4 $ !* 'J /R #Z@ !5!4 !S96-O;F1A M<GD@8F%T=&5R>0!M86EN(&)A='1E<GD ;6ES<VEL90!/9W)E(&9I<F5S("5S M(&%T('5N:70@870@:&5X("5D)60@(" @(" /R #Z0 -I.5O_T M0J[__" N__RPN0 51L #8<@M.N0 @0-'\ ") T_P $6D M! '($#1_ 2* (50%F.B! T?P $7P 0 (($#1_ 2* ) M2(%(P2! T?P $"@ "DB 2, O "\!3KD &24(\@+O_\<@M.N0 @ M0-'\ !(Y !44B!2,$4.0 5)(@DC"(D#3_ 6*0 )2(-(PR) MT_P $"D "DB 2, O "\#+P(O 2]( !1.N0 !.I/[P 0(&\ !!% 52 MKO_\8 #_'DY>3G5.5O_T0J[__" N__RPN0 51L:'(+3KD ($#1_ M 2.0 5%(@4C!%#D %22()(PB) T_P %BD "4B#2,,B0-/\ M ! I I(@$C +P O R\"+P$O2 43KD 3J3^\ $"!O 010 %4J[__&", M3EY.=4Y6__1"KO_\("[__+"Y !5&P (AR"TZY "! T?P $B@ M"%,!9F8@0-'\ $(H 8@0-'\ !(Y !44B!2,$4.0 5)(@DC" M(D#3_ 6*0 )2(-(PR) T_P $"D "DB 2, O "\#+P(O 2]( !1. MN0 !.I/[P 0(&\ !!% 52KO_\8 #_;DY>3G5.5O_T0J[__" N__RPN0 M 51L='(+3KD ($#1_ !"* &($#1_ 2.0 5%(@4C!%#D M %22()(PB) T_P %BD "4B#2,,B0-/\ ! I I(@$C +P O R\" M+P$O2 43KD 3J3^\ $"!O 010 %4J[__&" 3EY.=4Y6__Q"KO_\("[_ M_+"Y !5&Q(<@M.N0 @0-'\ !(H A3 68J($#1_ 0$ P M $=F&B N__QR"TZY "! T?P $7P P '4J[__&"L3EY.=4Y6_[!" MIW 2+P!.N0 !-90CW 2+P!.N0 !)98CR N AR"TZY "! T?P M$"@ !4B 2, O "\N A(>0 !(;O^P3KD 3^\ $$AN_[!.N0 !6Q8 MCTZY 'HDY>3G4 ^P # @ U8 ,4 #" 4 % M "@@ ?0 %6 U '@ ! % UX ! %P SX M F '0 DP )" !O@ ;0 $@ !%@ )X "4 #*@ M N@ +, "O F@ )8 "/ C ': !R@ :X &B ! MD@ 3P $L !$ +H "J C@ &8 !6 2 #@ J M (@ JH (> !?@ /X . 0 "\ -( " $, M ,B "X K0 (H !B@ 0@ "& &@ /R #Z@ M AR86YG92!F<F]M('5N:70@)60@=&\@3V=R92 E9"X _( /I MPTY6_[!*K@ (9A 0.0 $2.0 4NP 6=T$#D %+2(!(P$J ;SXO $AY M $AN_[!.N0 !/[P ,0J=P$B\ 3KD 364(]P$B\ 3KD 266(]( M;O^P3KD 5L6(]@*$*G<!(O $ZY $UE"/<!(O $ZY $EEB/2'D A M3KD 5L6(]*K@ (9A 0.0 (2.0 4RP 6=T$#D %,2(!(P$J ;SXO M $AY (TAN_[!.N0 !/[P ,0J=P$R\ 3KD 364(]P$R\ 3KD 26 M6(](;O^P3KD 5L6(]@*$*G<!,O $ZY $UE"/<!,O $ZY $EEB/2'D M !$3KD 5L6(]*K@ (9A 0.0 2.0 4JP 6=T$#D %*2(!(P$J M;SXO $AY 1DAN_[!.N0 !/[P ,0J=P%"\ 3KD 364(]P%"\ 3KD M 266(](;O^P3KD 5L6(]@*$*G<!0O $ZY $UE"/<!0O $ZY $EEB/ M2'D !G3KD 5L6(]*K@ (9A 0.0 ,2.0 4VP 6=T$#D %-2(!( MP$J ;SXO $AY :4AN_[!.N0 !/[P ,0J=P%2\ 3KD 364(]P%2\ M3KD 266(](;O^P3KD 5L6(]@*$*G<!4O $ZY $UE"/<!4O $ZY $ MEEB/2'D "*3KD 5L6(]*K@ (9A(0.0 02.0 4ZP 6< +(0.0 M 4Y(@$C 2H!O>B\ 2'D ",2&[_L$ZY $_O Q"IW 6+P!.N0 !-90 MCW 6+P!.N0 !)98CTAN_[!.N0 !6Q8CW H+P!P%B\ 3KD 364(\0.0 M 4](@$C +P!(>0 *U(;O^P3KD 3^\ #$AN_[!.N0 !6Q8CV H0J=P M%B\ 3KD 364(]P%B\ 3KD 266(](>0 +I.N0 !6Q8CT'Y !2D/Y M ' )$MA1R/_\3EY.=0 ^P @ @ NX +$ "B B8 M '\ !G 7( $2 Z (@ !> "X GP (8 !\ M 8X %F !! -P !Z 4@ M0 *8 "< @P 'D ! M@@ 5H #X T &X !& "P !D +H "K E8 (@ M !R@ 98 % !# +8 "" + 8 : "_ C0 M &J !( )8 , # !T +V "H D8 (Z !N@ M ; $P !)@ *8 "< ' !( & +P K8 )@ ! MU 4H # -@ /R #Z@ "]-86EN($)A='1E<FEE<SH@ M(" @(" E9" H-"\S($0T*0 @ %-E8V]N9&%R>2!"871T97)I97,Z("5D("@S M+S(@1#,I " 36ES<VEL97,Z(" @(" @(" @(" @)60@*#8O-2!$,RD ( !! M;G1I+5!E<G-O;FYE;#H@(" @(" E9" H,2\Q($0Q*0 @ %1R96%D<SH@(" @ M(" @(" @(" @("5D("@Q+RH@1#$I $UO=F5M96YT.B E9 @ _( /K M P _( /I EDY6__Q.N0 !.N0 )0O "U __Q.N0 !8 MCR\N__Q.N0 "A)8CW !+P!.N0 !8CTZY $ZY %#F$D3KD M3KD 819.N0 IQ.N0 !.N0 !A F#.3E;_\D*N__80.0 A7 M &82+7P \__QP 2U __9@ %.$#D %/2@!F $>$#D %# !6P M 1!"KO_R("[_\K"Y !5&P ,AR"TZY "! T?P $B@ !0P! 5L M'B! T?P $7P P (+R[_\DZY "AEB/8 B" N__)R"TZY "! MT?P $B@ !5L!9FH@0-'\ ! H A3 &9:("[_\G(+3KD ($#1 M_ 0$ P $-G/B N__).N0 @0-'\ ! 0# 26<D("[_\DZY M "! T?P $7P @ (+R[_\DZY "AEB/4J[_\F _RX0.0 5%( M@$C $CD %22(%(P70J+P(O 2\ 3KD $T3^\ #"U\ /_\< $M0/_V M8"00.0 4]* &8:$#D %# !&\.+7P S__QP 2U __9*KO_V9W8O M+O_\3KD 6(]P$"U __(@+O_R#( 7;"!R 2\!+P!.N0 !-90CR\N M__).N0 !)98CU*N__)@U' 0+P!.N0 !)98CW !+P!P$"\ 3KD 364(\O M+O_\3KD 5L6(].N0 !:8=0/_[3KD 5F3EY.=0 ^P ( @ M E )& "/@ B( (0 ",@ @0 , ! 4 &< ! M< .8 & 0 D !, @ P !: 1@ ( 1 M ) !@ " % & ^ @ !8 !4 . $ M 8 , , < !S :8 !\ #P !T ' !M@ M 8H & !8 48 $L !$ 0 #6 Q + ": MC@ '( ! )0 >0 % 0P 5@ $^ !) /@ "\ M _( /J $U1H92!/9W)E('-E;&8M9&5S=')U8W1S(&%N9"!D M97-T<F]Y<R!T:&4@0U N($1R87<A %EO=2!W:6XA %1H92!/9W)E('=I;G,A M /R #ZP %8 /R #Z@ $ ( #\@ ^H !! " @ M(" @(" @("@H*"@H(" @(" @(" @(" @(" @(" @2! 0$! 0$! 0$! 0$! 0 M$(2$A(2$A(2$A(00$! 0$! 0@8&!@8&! 0$! 0$! 0$! 0$! 0$! 0$! 0$0 M$! 0$!""@H*"@H(" @(" @(" @(" @(" @(" @(" A 0$! @(" @(" @(" @ M*"@H*"@@(" @(" @(" @(" @(" @("!($! 0$! 0$! 0$! 0$! 0A(2$A(2$ MA(2$A! 0$! 0$!"!@8&!@8$! 0$! 0$! 0$! 0$! 0$! 0$! 1 0$! 0$(*" M@H*"@@(" @(" @(" @(" @(" @(" @("$! 0$" /R #Z@ $ M #\@ ^D :3E;__$*N__P@+O_\#( 4;"!R&$ZY "! MT?P +PA.N0 EI8CU*N__Q@U$*N__P@+O_\L+D ;! O $ZY # MCEB/4J[__&#D+RX #"\N A.N0 !0CTY>3G4 /L 0 "0 H M 0 "< !( 0 #, ^ 0 #4 !> 0 #8 M @ 0 $, 8 _( /I 1$Y6__A"KO_\(#D $ M4X CP 1*@&L2< @>0 0$%*Y & .2'D 3KD 6(\M M0/_X#(#_____9RP,@ IF$"!N C1[O_\4J[__$(08!0@;@ (T>[__%*N M__P@+O_X$(!@EDJN__QF!G 3EY.=2!N C1[O_\0A @+@ (3EY.=4Y6__A" MKO_\("X #%. (B[__+* ;$P@;@ 0("@ !%. (4 !$J :PHB4%*0< 0$6 , M+RX $$ZY %B/+4#_^%* 9QP@;@ (T>[__%*N__P@+O_X$( ,@ IF MJ$YQ("[__"!N C1P$(02H!F!G 3EY.=2 N A.7DYU #[ ( I M R #0 % -@ "X F '@ !( * _( M /J 0 /R #Z0 +).5O_X+7P __P@;O_\L?P '@ M9!(0* 02@!G"@:N &/_\8.(@;O_\L?P '@9@9P $Y>3G4O+O_\+RX M#"\N AA"$_O Q.7DYU3E;_ZB!N !!** 09P@O"&$ ?98CRUY /_T M+6X #/_P< @;O_P$"@ 0R 8F<.#( !A9A)"KO_T8 @M? @ #_ M]%*N__ @;O_P$"@ 0P "M7P40!2(%(P7 (&X #! 0'4'_[PR =V< M - ,@ ')G ""#( !A9@ !%" N__0 @ @O0 2B[_[V<$<@)@ M G(!("\ ("! ( $ +SP &D+P O+@ (3KD !<3^\ #"U __A2@&8& M< !.7DYU< (O $*G+R[_^$ZY #!D_O Q*+O_O9P@@/ (!@ G "+4#_ M_& *1*+O_O9P1P F "< B+O_T@H O 2\N A.N0 %Q0CRU __A2@&8& M< !.7DYU2B[_[V<((#P " 8 )P 2U __Q@7DHN_^]G!' "8 )P 2(N__2" M@ "! ! "! " "\\ !I"\!+RX "$ZY 7$_O PM0/_X4H!F!G M3EY.=4HN_^]G"" \ @& "< (M0/_\8 9P $Y>3G4@+O_X<@9.N0 @ M0-'\ $HH %G& CN +__R!N !#0_ 6(FX $"-( Q@""!N !!"J , M("[_^"!N ! 10 1(*@ #' (4 ""% 0@+O_\$4 $" (3EY.=4Y6 @ M;@ ($"@ $ @ %G#B\(</\O $ZY !(%"/(&X "! H ! " ,2@!F%DJH M !)G$"\H !(O* ,3KD $*4(^1R")N @C2 ,(T@ $D(I !!P ! I !$O M $ZY #CEB/3EY.=0 #[ $ C :@ 4 G "O M 38 '& !< 10 ! *0 G0 ! +0 IH ! M- @@ # -@ # 2 !@ $ !# " /R M #Z0 #Q.5O_\< @;@ ($!!2K@ (+4#__$J 9SPB.0 "!3@2/! M($J!:Q0@>0 !A2N0 !@0@'( $A!@QDAY &"\N__Q.N0 2!0CR( M8+ @.0 "!3@"/ ($J :Q8@>0 !A2N0 !AP"A" <@ 2$& 42'D M 8< HO $ZY !(%"/(@ @ 4Y>3G5.5O_X0J[_^' (&X "! 04JX ""U M__Q*@&<V(&X #"(H A3@2%! A*@6L,(E!2D!* <@ 2$6 2+RX #"\N__Q. MN0 2!0CR( +4'_^&"V("[_^$Y>3G4 /L P "D #: B M $H * -@ 'X !N : %X !6 0 #( L M(@ !H #\@ ^H ! _( /I !@$Y6 !.N0 M !*K@ (:R0@+@ (L+D ;!AR!DZY "! T?P $! ( '9@YP M"2/ ' 3EY.=2 N AR!DZY "! T?P ( A.7DYU3E;_]$*N M__P@+O_\L+D ;!QR!DZY "! T?P $!!* &<&4J[__("[_ M_+"Y &8.<!@CP !P_TY>3G4@+O_\<@9.N0 @0-'\ " Y M * " "(N RS@"U PM2/_T" #V<$<!!@ G ( " (&[_ M]!" ("X # * PR F<\#( !9Q)*@&92(&[_]! 0 0!" M8%@(+@ # ]G!' (8 )P " ('( (&[_]!(0@H 0@6 V""X P /9P1P M"& "< @ &!R "!N__02$(* $(%@%"!N__1"$' 6(\ </].7DYU M""X 0 .9PPO+@ (3KD "D6(\@+@ , H , 2H!G"BU\ #[O_X8 @M M? ^W_^"\N__@O+@ (3KD 4(\@;O_T(4 DJ 9B!.N0 / CP M !AP B/ "!N__1"$'#_3EY.=2 N__Q.7DYU3E8 " N P"@ @ M@ P$B+@ , H'__W__+P$O "\N AA /Y,3^\ #$Y>3G5.5O_X2JX $&L2 M+RX "&$ _=98CRU __A*@&8.<!8CP !P_TY>3G4O+@ 0+RX #"!N__@O M* "3KD P3^\ #"U __Q2@&843KD #P(\ 8< 4CP @+O_\ M3EY.=4Y6__A*K@ 0:Q(O+@ (80#];EB/+4#_^$J 9@YP%B/ '#_3EY. M=2!N__@0$ @ -G$' "+P!"IR\N AA0D_O PO+@ 0+RX #"!N__@O* " M3KD !,3^\ #"U __Q2@&843KD #P(\ 8< 4CP @+O_\3EY. M=4Y6__PO+@ (80#\\%B/+4#__$J 9PH,K@ ( $&,.<!8CP !P_TY> M3G4@+@ 0Y8 @0-'\ "\0+RX #")N__PO*0 "3KD "(3^\ #%* 9A1. MN0 / CP !AP%B/ ' +P O "!N__PO* "3KD "(3^\ #$Y> M3G5.5O_X+RX "&$ _&A8CRU __A*@&8&</].7DYU< @;O_X$A M0/_\" $ M F<$3EY.=2!N__@O* "3KD <6(].N0 / CP !A*@&<.< 4CP M !P_RU __P@;O_X0A @+O_\3EY.=4Y6 O+@ (3KD "D6(]*@&8:3KD M #P(\ 8< (CP !P_TY>3G5P $Y>3G5.5@ +RX "&'"6(].7DYU M3E8 "\N PO+@ (3KD "X4(]*@&8:3KD #P(\ 8< 4CP !P M_TY>3G5P $Y>3G4O/ ^U(>0 U.N0 !0CR/ ($YU3E;__DZY M $JY (&8"8=!*.0 QG'! Y #!U __]".0 QR !(N__\@ M 4Y>3G5P 2\ 2&[__R\Y ($ZY ,$_O QP ! N__].7DYU3E;__DHY M #&<:$#D ,0CD ,'4#__P* _TY>3G5A /]^3EY.=4Y6 !. MN0 !*N0 "!F!&$ _TAP 2\ 2&X "R\Y ($ZY 3$_O QP ! N M M.7DYU3E8 $HY #&<&</].7DYU("X "!/ #$Y>3G5.5O_\3KD M 2KD @9@1A /[P+SP #_+RX ""\Y ($ZY ,$_O PM0/_\ M2H!J!$*N__P@;@ (T>[__$(0("X "$Y>3G5.5@ 3KD 2KD @9@1A M /ZB+RX "$ZY %B/+P O+@ (+SD @3KD !,3^\ #$Y>3G4 M ^P 0 0 !>P 7. %E@ !8 4\ %* !-8 2@ $ MC@ !& 08 #V V8 +R ";@ <@ - ( !&@ 0@ M #Y VX ,J "^@ J( )V ".@ = %F G #@ M ! )@ +P * * !6P 5: % @ !/P 3T $O M!+( 2J $@ SX ! ,@ !=X # ,P )( !J M%@ 0 T M@ 'P !2 * 0 !# K@ '0 !* M ( 4 !( %R !7H 4B $F@ 8 5 2@ !$X M /* #@@ U( 7R %0@ MH 6< $W E8 1: $$@ M ]( -@ "[ F@ '" $A@ :X 0& !?@ /R # MZ@ 3_____ $ *@ #\@ ^D #\3E;_^"!N @0* 0 M @ ,$H 9P9P_TY>3G4@;@ (2J@ $F8<$"@ $ @ )F$B\(80 #4%B/2H!G M!G#_3EY.=2!N @0* 0" F<(< $M0/_X8"H@;@ ($"@ $ @ %G!G#_ M3EY.=2!N @0* 0 1% ! M: 2__AP "!N @0* 1+R[_^"\H PO M $ZY "&D_O PM0/_\2H!J$"!N @0* 0 (!% !!*KO_\9A @;@ ( M$"@ $ ! 10 02J[__&\.(&X ""%N__P !""H P@;@ ($"@ $ ( #!* M &<&</].7DYU(&X "" H 13@"% 1*@&L*(E!2D' $!%@"B\N AA /[H M6(].7DYU3E;_\BUN C_]B!N P0* 0 @ ,$H 9P9P_TY>3G4@;@ ,2J@ M$F9V$"@ $ @ )F; RN_____P (9@9P $Y>3G4O+@ ,80 "&%B/2H!G!G#_ M3EY.=2!N P0* 0 A% ! @* 2(4 "%. (4 "$J :Q B4%*0("X M"!* <@ 2$6 0+RX #"\N AA /]L4(\B " !3EY.=2!N P0* 0" F=( M#*[_____ AF!G 3EY.=2 N @=0/__< @;@ ,$"@ $7(!+P%(;O__+P M M0?_R3KD *"3^\ #'+_+4$ ""U __I@ #"(&X #! H ! ( 9P9P_TY> M3G4@;@ ,$"@ $ (10 0#*[_____ AG.DJH AO-" H A3@"% A* M@&L0(E!2D" N @2@'( $A%@$"\N PO+@ (80#^KE"/(@!P_RU @B;@ , M(%&QZ0 ,9T)*J0 (:@@M:0 2__)@$"!N P@* 2D*@ ""U __)P "!N P0 M* 1+R[_\B\H PO $ZY "@D_O PM0/_Z8 IP "U __HM0/_R#*[_____ M__IF$B!N P0* 0 (!% !!@&B N__JPKO_R9Q @;@ ,$"@ $ ! 1 M0 0(&X #" H !(A0 ((F@ #"")("X " R _____V<J(B@ "%.!(4$ "$J! M:PPB4%*0$H!R !(18! O+@ ,+RX "&$ _=)0CR( (&X #! H ! " P2@!G M!G#_3EY.=0RN_______V9@9P $Y>3G4@+O_V3EY.=4Y6 @;@ (2J@ $F<0 M$"@ $ @ -F!G 3EY.=2\Y $ZY $%B/(&X """ (4 #$J 9@YP M#"/ '#_3EY.=2!N @A>0 $A H ! " #S$4 $' (4 ""% M 1.7DYU #[ ( > #T Z( ! ( \ # M)P KX ( E@ $ M #J /R #Z0 %M.5O_\ M("X " : #$*G+P!.N0 !0CRU __Q*@&8&< !.7DYU(&[__,&( D#_ M_L&(("X " : #"% @O+O_\2'D 80 FE"/(&[__-#\ P@"$Y> M3G5.5O_\+RX "&&66(\M0/_\2H!G!$Y>3G4@?/____\@"$Y>3G5A+G (\ M ,(\ $(\ ((\ ((\ (\ ,(\ $3G5.5O_X M+7D __Q*KO_\9QX@;O_\+5#_^"\H @O"$ZY &%"/+6[_^/_\8-Q. M7DYU3E8 ")N @@:0 $(FX #"-( 21R"*((&X "$JH 1G!B!H 0@B2!N M PB;@ ((T@ !$J19@(BB$Y>3G5.5@ (&X #$J09@PB;@ ((V@ ! $8 PB M;@ ,(%$A:0 $ 0@;@ ,2J@ !&8((FX ""*08 HB;@ ,(&D !""13EY.=0 M #[ , ! E@ ) "* @ "L "Z 2 0 M [ K@ *( "H G ( !+ U@ !0 #\@ M ^L # #\@ ^D !D3E8 ' $"X "R\ 82)8CTJ 9A9P ! N LO M &$ #!8CTJ 9@1P & "< %.7DYU3E8 ! N L, !!90H, !:8@1P 6 " M< !.7DYU3E8 ! N L, !A90H, !Z8@1P 6 "< !.7DYU3E8 ! N L, M P90H, Y8@1P 6 "< !.7DYU3E8 ' $"X "R\ 80#_:%B/2H!F%' M$"X "R\ 8<)8CTJ 9@1P & "< %.7DYU3E8 ' $"X "W(P!($ (:T"P MNQ@(9O).^Q@& "V "H ,8 (@ U@ : "F !( ) M8 "@ "!@ "< %.7DYU< !.7DYU3E8 ! N L, @90H, !_9P1P M & "< %.7DYU3E8 ' $"X "R\ 80#_#EB/2H!G#G $"X "P2 (& & M< 0+@ +3EY.=4Y6 !P ! N LO &$ _L)8CTJ 9PYP ! N L&@ "!@ M!G $"X "TY>3G4 _( /I H4Y6__P@.0 SG@$Y>3G5.5O_\ M("X ""\ +4#__&$&6(].7DYU3E;_[$JN AN!G 3EY.=2 N A>@'((3KD M +7P (__@@;O_X+5#__"U __!*KO_\9U8@+O_P(&[__"(H 2R@&4V MLH!F"")N__@BD& 6(&[__" H 20KO_P(4 !.> T:[__" N__"1N0 P@ M;O_\( A.7DYU+6[__/_X(&[__"U0__Q@I" N__#G@"(Y $-"!4X!.N0 M B.0 !!.N0 O "U _^Q.N0 !8CRU __1*@&<8+R[_["\ 8190 MCR\N AA /\J6(].7DYU< !.7DYU3E;__" N PO "\N @M0/_\8090CTY> M3G5.5O_D2JX #&X&</].7DYU(&X ",&( D#__L&(("X #%Z <@A.N0 M M0/_DYX M2/_LT< @+O_DT;D ,+7P (__0B;O_T+5'__"U(_^A*KO_\ M9P Z"!N__P@* $YX#1P"U(__@@;O_\L>[_Z&,8(F[_["*((V[_Y $(&[_ M]"")< !.7DYU(&[__+'N_^AF'B)N_^PBD" N_^30J $(T !"!N__0@B7 M3EY.=2!N_^RQ[O_X9! @+O_DD;D ,</].7DYU(&[_[+'N__AF4"!N__Q* MD&<<(&[_Z")N__RQT6,0("[_Y)&Y #'#_3EY.=2 N_^0@;O_\T:@ !$J0 M9Q8@;O_H(F[__+'19@H@* $T:D !"*0< !.7DYU+6[__/_T+6[_^/_P(&[_ M_"U0__Q@ /\4(&[_]""N_^R1R")N_^PBB"-N_^0 !" (3EY.=0 #[ M ( ! S +P ! *@ -X ' .P A@ 'J ! M9@ 6 "6 1@ 8 # 0 4H #& 0 $ !# M T@ /R #Z0 %A.5O[L0>X #"U(_^P@;@ ($!!* &< 31( M@$C 4H@M0/_X+4@ " R )68 -H0$ P "5F1DB 2,!2K@ ((CD @ M4X$CP0 " M0/_X2H%K%"!Y &%*Y &!" 2(!(P&"B2'D 8+R[_ M^$ZY !(%"/8(Y(;O_T2&[_[$AN_NPO+@ (3KD 3^\ $"U __!*@&< M_VQ"KO_\+4 "" N__RPKO_T; #_6"(Y (%.!(\$ @2H%K'"!Y M&%*Y &$/N_NS3P! 1$(!(@$C 8!Y![O[LT>[__! 02(!(P$AY &"\ M3KD $@4(]2KO_\8*(@.0 "!3@"/ ($J :QH@>0 !A2N0 !@@ M+O_X$(!(@$C 8 #^VDAY &"\N__A.N0 2!0CV _L1(>0 !AP_R\ M3KD $@4(].7DYU #[ 0 I !5@ 4 #\ =@ ! M V !3 38 $B !' 1( $* ] - #* P M +@ !L 7@ %@ !* 0@ $ Y D /R # MZ0 "].5O[H0>X $"U(_^@M;@ (_^P@;@ ,$!!* &< (QR !(04H@M0?_X M+4@ # R! )69B$! , E9A B;@ ($H!2K@ ,4JX "&#&2&[_]$AN_^A( M;O[H+RX #$ZY $_O ! M0/_P2H!GI$*N__PM0 ,("[__+"N__1LDD'N M_NC1P")N @2D%*N A2KO_\8. @;@ (4JX "" N__@0@& _VP@;@ (0A @ M")"N_^PM0/_T3EY.=0 ^P ! .0 %X #\@ ^D > M3E;__' (&X "$(0+4#__ RN @ 0; 1.7DYU2JX #&HB#*X # !!L M!G 3EY.=2!N @0O M1*X #' !+4#__" N__P@;@ (T< B+@ 0DH!3@2\! M+RX #"\(3KD 3^\ #"(N__S2@" !3EY.=0 #[ $ Q M8@ /R #Z0 "Q.5O_L2.<@ "!N A"$ RN @ 0; IP $S? M 1.7DYU< LM0/_\4Z[__" N QR"DZY :! ," N__P=@0CM("X M#'(*3KD +4 #$JN QFS' +(B[__)"!)"X $+2 ;@A2@)""T:[__$*N M__@@+O_\#( +;!8@;@ (T>[_^%*N__P0M@CM4J[_^&#>("[_^"!N C1 MP$(03-\ !$Y>3G4 ^P " /P $X T _( /I M "4Y6__Q"KO_\(&X "-'N__P0$$H 9P92KO_\8.P@+O_\3EY.=0 _( M /J 0 !0 /R #ZP !X /R #Z0 9.5@ +RX #"\N M A.N0 0Y0CTY>3G4 /L 0 . _( /K M> _( /I 5TY6__I"N0 ,N0 " ; B"!N @0$$B M2,!2@") T_P $!$( #9P92K@ (8-X@;@ ($!!* &=:(#D Y8!2 MN0 @0-'\ !""N @@;@ ($!!(@$C 2H!G&%* (D#3_ 0$0@ M -F!E*N A@VB!N @0$'( $(%2K@ ('4#__TH 9@#_<$YQ0CD 1< $3 MP ! 3P "EP A/ *!/ 01/ 0" Y "(Y +&! M" $ #V<$<!!@ G +4#_^DZY :"/ B N__H @ ,03P !. MN0 '@CP @@+O_Z ( "D$\ &3KD !X(\ .("[_^@" M I!/ #$AY !"\Y $ZY %"/0J=.N0 !8CTY>3G4 M ^P ! &P 48 " 'P '( H 0 "$ %0 M 0 ", #. 0 "8 #( !@ #0 $T !) 1@ M $( _ .P & -@ ,( "\ M@ *X "H H M < X !0 3H !6 3@ $8 0 !@ , !* ! M'@ 0( #F _( /K (0 _( /I "'DY6_[1(YP @ M< M0/_H<O\M0?_D<B M0?_@(&X "!(0+4#_\"U _]PM0/_L# $ +68*< %2 MK@ (+4#_\' (&X "! 0+T !%* ($#1_ 0$ @ )G8@RO , $ M9@9P,"U _^!P "!N @0$%*N @"@ \M0/_<< @;@ ($!!2@") T_P M $!$( "9R(@+O_<<@I.N0 !R !(04JX " *! #]"!+4#_W&#$ M(&X "! 0# +F9$4JX "$*N_^1P "!N @0$%* (D#3_ 0$0@ )G M(B N_^1R"DZY '( $A!2K@ ( H$ /T($M0/_D8,0@;@ ($! , !L M9@IP 5*N @M0/_L0J[_T' (&X "! 0<D@$@0 AK *&L+L8"&;P3OL8 M!@ &9@ )L 96 EX !G8 "3@ &-@ (H <V =( !O M8 !6 'A@ #< =6 #@ !D8 DJN_^QG#B)N ! @45B1+5#_ MS& ,(FX $"!16)$M4/_,2J[_S&HH< $M0/_H8"!*KO_L9PXB;@ 0(%%8D2U0 M_\Q@#")N ! @45B1+5#_S' ++4#__" N_\QR"DZY "U!__A*@6H$1*[_ M^%.N__P@+O_X!H P(B[__!V &+@@+O_,<@I.N0 M0/_,2J[_S&:\ M#*X !_^AF#E.N__P@+O_\';P +0BX0>[_N" N__S1P'(+DH M0?_T+4C_ MT& 71*KO_L9PXB;@ 0(%%8D2U0_\Q@#")N ! @45B1+5#_S' (+4#__%.N M__P@+O_, H /($#1_ @+O_\'9 (N" N_\SH@ * #____RU _\Q* MKO_,9LQ![O^X("[__-' <@B2@"U!__0M2/_08 ! $JN_^QG#B)N ! @45B1 M+5#_S& ,(FX $"!16)$M4/_,< LM0/_\4Z[__" N_\P"@ <&@ # B M+O_\'8 8N" N_\SF@ * '____RU _\Q*KO_,9LY![O^X("[__-' <@N2@"U! M__0M2/_08 C@RN_______D9@@M? ,C_Y")N ! @45B1(E M2?_0LOP M &8(+7P 0_]!"KO_T("[_]+"N_^1L4"!N_]#1P! 02@!G1%*N__1@Y$'N M_[AP 2U __0D;@ 0(E)8DB 1'4#_N"U(_]!@(' "+4#_U& 80J[_U& 2< $M M0/_48 IP $S?! !.7DYU2J[_T&< -)*KO_<9PH@+O_<L*[_]&P&+6[_]/_< M("[_])&N_]Q"KO_\2J[_\&=(("[_]%. +4#_]$J :Q@@;@ ,T>[__%*N__PB M;O_0$)%2KO_08-H@+O_<4X M0/_<2H!K7"!N S1[O_\4J[__" N_^ 0@&#> M("[_W%. +4#_W$J :Q0@;@ ,T>[__%*N__P@+O_@$(!@WB N__13@"U __1* M@&L8(&X #-'N__Q2KO_\(F[_T!"14J[_T&#:(&X %""N__P@;@ (4H@@"$S? M! !.7DYU#*[______^1F!G &+4#_Y RN %/_D;01P$V $("[_Y"U __12 M@ RN ?_45\%$ 4B!2,%(;O^X2&[_Z$AN_]@O 2\ (&X $"\03KD M3^\ &"!N !!0D$'N_[@B+O_8+4#_]"U!__PM2/_02H%J!$2N__P,K@ +_ MU&8:2J[_]&<.#*X &__QM!' 8 )P 2U _]1*KO_T9P13KO_8< M0/_\ M2J[_Z&<$4J[__$JN_]1G*B N_^12@"(N__S0@2U __Q*KO_8:P@@+O_8T:[_ M_$JN_^1G0%*N__Q@.B N_^1<@-&N__Q*KO_8:@@@+O_81(!@!" N_]@M0/_X M#( !C;P12KO_\#*X /G__AO!%*N__Q*KO_P9C0@+O_<L*[__&\J("[_ M_)&N_]P@+O_<4X M0/_<2H!K%"!N Q2K@ ,("[_X!" 4J[__&#>2J[_Z&<, M(&X #!"\ "U2K@ ,2J[_U&< 09*KO_8:G @;@ ,$+P ,%*($+P +E*(+4@ M#" N_^13@"U _^1*@&L >0@+O_84H M0/_82H!J#B!N P0O P4JX # M("[_]%. +4#_]$J :Q0@;O_0(FX #!*04J[_T%*N Q@LB!N P0O P4JX M#&"D("[_V%.N_]A*@&LP("[_]%. +4#_]$J :Q0@;O_0(FX #!*04J[_T%*N M Q@TB!N P0O P4JX #&#$2J[_Y&<,(&X #!"\ "Y2K@ ,("[_Y%. +4#_ MY$J :P !.B N__13@"U __1*@&L4(&[_T")N P2D%*N_]!2K@ ,8,X@;@ , M$+P ,%*N Q@P" N__13@"U __1*@&L4(&[_T")N P2D%*N_]!2K@ ,8 P@ M;@ ,$+P ,%*N P@;@ ,$+P +E*N P@+O_D4X M0/_D2H!K," N__13@"U M__1*@&L4(&[_T")N P2D%*N_]!2K@ ,8- @;@ ,$+P ,%*N Q@PB!N P0 MO !%4H@M2 ,2J[_V&H.$+P +5*N Q$KO_88 P@;@ ,$+P *U*N QP"RU M__13KO_T("[_V'(*3KD !H$ P("[_]!V!"+@@+O_8<@I.N0 M M0/_8#*X )__1NR$JN_]AFPB N__0,@ ML$E*N__0@;@ ,$+8(N%*N M Q@X@RN ?_P9C0@+O_<L*[__&\J("[__)&N_]P@+O_<4X M0/_<2H!K M%"!N Q2K@ ,("[_X!" 4J[__&#>(&X %""N__P@;@ (4H@@"$S?! !.7DYU M #[ , ? W@ (X !. @ #H -D "C@ 0 M ! '[ !]( (6 !Z ( !# \@ *( ! 1P M!/ #\@ ^H %,#$R,S0U-C<X.4%"0T1%1@ /R # MZ@ 0 #\@ ^D &83E;_R$AN_^1(;O_H M2&[_]$*G80 #UD_O !!(;O_8+R[_Y$AN_^A(;O_T80 %-D_O !!P "\ +P!( M;O_8< (O &$ ZA/[P 0("[_X$ZY "U _] M0?_4)#Q \ =@!.N0 M M0/_(("[_W"U!_\Q.N0 M0/_0+4'_U"0N_\@F+O_,3KD )#Q M\ =@!.N0 M0/_(("[_V"U!_\Q.N0 M0/_0+4'_U"0N_\@F+O_, M3KD )#Q \ =@!.N0 !.7DYU3E;_U$AN__!(;O_T0J=P 2\ 80 " M_D_O !!(;O_D+R[_\$AN__0O+@ (80 $7D_O ! @+O_D(&X """ 6(@@+O_H M((!8B" N_^P@@" N_^Q.N0 M0/_<+4'_X"0\0/ '8 3KD +4#_ MU" N_^@M0?_83KD +4#_W"U!_^ D+O_4)B[_V$ZY "0\0/ '8 M3KD +4#_U" N_^0M0?_83KD +4#_W"U!_^ D+O_4)B[_V$ZY M "0\0/ '8 3KD 3EY.=4Y6_]1(;O_D2&[_Z$AN__1"IV$ B)/[P 0 M2&[_V"\N_^1(;O_H2&[_]&$ X)/[P 0< O "\ 2&[_V' "+P!A 'T3^\ M$" N_]QR$"U _]3CH("N_^ "@'____].7DYU3E;_X$AN__!(;O_T0J=P 2\ M80 !P$_O !!(;O_D+R[_\$AN__0O+@ (80 #($_O ! @;@ ((*[_Y%B(("[_ MZ"" 6(@@+O_L(( @+O_H<A M0/_@XZ" KO_L H!_____3EY.=4Y6_]1(;O_D M2&[_Z$AN__1"IV$ 5Q/[P 02&[_V"\N_^1(;O_H2&[_]&$ KQ/[P 0< O M "\ 2&[_V' "+P!A $N3^\ $" N_]QR$"U _]3CH("N_^!.7DYU3E;_X$AN M__!(;O_T0J=P 2\ 80 ! $_O !!(;O_D+R[_\$AN__0O+@ (80 "8$_O ! @ M;@ ((*[_Y%B(("[_Z"" 6(@@+O_L(( @+O_H<A M0/_@XZ" KO_L3EY.=4Y6 M__1P$"(N C@H0*! #__RU!__0@+@ ( H /__+4#_^"U\ S#O_\< O M "\ +P!P!2\ 80 ?$_O !!P "\ +P!(;O_T< (O &$ &9/[P 03EY.=4Y6 M !P "\ +P O ' %+P!A !*3^\ $' +P O "\N AP!"\ 80 -$_O !!. M7DYU3E8 "!N C0_ ,(FX "-+\ !@O"2\(+RX "' #+P!A"$_O !!.7DYU M3E8 $CG "!P ! N L,@ 9D %,Y8!.^P@"8 %F %Q@ "L8 M@& ,1@ $((&X #""Y #%B((+D 06(@@N0 !0B;@ 0(KD 8 M6(DBN0 !Q8B2*Y ("1N !0DN0 "0M2 ,+4D $& /(@;@ 0(+D M 86(@@N0 !Q8B""Y (")N !0BN0 "0M2 08 QB!N ! CT M !A8B"/0 '%B((] @(FX %"/1 )"U( ! @;@ ,(] ,6(@C MT !!8B"/0 %"U( Q@?"/Y # C^0 ! $(_D 4 M ""!N PCT Q8B"/0 $%B((] 40_D ( E,WP0 3EY. M=7 %(\ 8(_P -[L '"/\ #F;0 "!P"R/ )& .2'D H M3KD 6(],WP0 3EY.=4Y6__!(YS (&X #" H @B;@ ((BD "$ZY M -"N !!T$"U __3DH * #__R0N__0"@@ __\M0/_P("@ !$ZY -"N M__!V$"U __CFH * #__R8N__@"@P __\M0/_P(!!.N0 #0KO_P H M#___+4#__" H @B*0 $3KD T(-V$"U __CFH * #__R8N__@"@P M__\M0/_P("@ !$ZY "(N__S2@-*N__ "@0 __\@$2U!__PB* (3KD M (B[__-* H$ /__ H$ /__(&X %""!(4, !"%" A,WP ,3EY.=0 M #[ $ N %5 "$ ] %3@ !48 4^ %- !2H M 48 %$@ !0H 4" $^ !/0 3N $Z@ !.0 3@ $U M!,P 3$ $M@ !*P 2D $G !(H 2 $> !' 1: $ M4 !$@ 1 $-@ !"X 0F ! #X &> !: ,( ", M !@ $$ &L !=@ 4 #0 F@ &0 & 0@ !C( M 82 %Z@ !<X 6F %? 8 !& !B 5( $J K M '8 !. _( /J $ M 4 -[L #F;0 L*7W9A;&)A;FLZ($EM<"X@17)R;W( /R M #Z0 #!(YS\ 0H=@"DCG/P N/( H @B$ !\O!(>?9P G"@ "(0 M'R\$@Y]F"B "(@._@& (8O DZY "@ *@$L B ?(@-.N0 F!C8" MED9L'D1##$, 0&T(( 0B!20&8$Y30^*(XI%1R__Z-@9@&&<4#$, 0&T$OX)@ M-%-#XHSBE5'+__HV K6&OX9K#M*%T81D&N*0XI%20V 2FH&9@&0("$, 'T2% M0(0@!"(%) -.N0 #9,WP#\3G4 /L P $4 "V 2@ #H M #\@ ^D -+P(O TJ!9R)*@&<<0H)V'^. XY*T@64(E('0O M %1R__N(@)@!$*!0H F'R0?3G4 _( /I $4CG/ J 6<R:@)$ M@2@ 9RAJ D2 0H)V'^. XY*T@64$E(%2@%'+__(B KF%:@)$@+.$:@A$@6 $ M0H%"@$S? #Q.=0 #\@ ^D H2.<_ "\" E=__X>?9A8O/ -. MN0 !/[P $0H!"@6!$+P "5W__@Y]G.B\"3KD * J 2P"(!\B TZY M ,5&E$9(1DA"O4)(0BP +@%"@$*!0H-A$" !80Q.N0 #9,WP#\3G4_ M/ @<@#CB4J#9@JXAF409@2ZAV4*FH>9AF0"4X-2@>.-XY3CDU-79MQ/[P " M3G4 ^P ! 1 !8 # 10 &0 !" ,@ M /R #Z0 Q(YW ) !G($J!9@1"@& 8)@#&P4A"Q,%(0D)"UH)(0<#! M2$!"0-"#3-\ #DYU /R #Z0 !%(YW@ * "SA$J 9S!J D2 ) !* M@68$0H!@(FH"1($F ,;!2$+$P4A"0D+6@DA!P,%(0$) T(-*A&H"1(!,WP > M3G4 _( /I !$Y6 C[@ ( '$Y>3G4 /L 0 $ M ( _( /I -B0 P+Q_____9@AP '( = !@(DA"2,+H0L2\ M@ '_Y1\ _\O G0*XXGCD%'*__H(P ?)!].=2\#+P"#GV=DE'P "TJ 9@@@ M 4*!E'P ("\ I__X 9R120N*(XI'BDR\ I__X 9NY*@VH.4H%D"E* M8-A30N.)XY ( 49_34? /_;QZT? ?_;"C O /___I2C\"0D)(0H1?2$* M@B8?3G4O/ %.N0 !P & 8+SP "3KD ,#Q_\$A"@$)(0$) M3^\ !'( 8,P ^P " 1 +X "N _( /I M!"\"0H%T'TZY -B0?3G4 /L 0 $4 ( _( /I M Y4Y0_^).40 2.=_,"1H @@&B(23KD 0FD "$)I 8O (.?9@XD M: <)B@ #%.#8 ^%)",T( !$A",T( "$)&-"D !&=<:A)60FL8"D( ]5I M 1A $ 8$AA $R4FD !F 2= 35:0 $80 ZF$ /)3:0 &2H!KQ%-I 3C MB>.08/)"0D)&+P"#GV<480 TDI&9@P,0@ !9@93:0 &8.P&!@ P$X8@"E)" MM'P %&O4=@$D* ,2J@ $&<.*#P !U&D !E-":SIX% Q" !)L,C@"&C$@ M"P8% 4,!0 Y;R(3O P( M2,2 *&C$H"E-":NA2:0 &4T-Z +JH !!G E*$ M)&@ '$?Q, H@!&<>4T0V! 1# !1K G@3%-M1S/_\2D-K"!3\ #!1R__Z)&@ M&$*22FD "&<"4Y(D: 40H$R*0 &2,$D@4S?#/Y.64Y83G7BB.*1E'P 6;V M3G5\ $CG, D "8!XXGCD..6XXGCD..6TH/1@F0 12AN.)XY#CEDS? Q. M=2\"= _/ ! XXGCD..2#$( "FT(!(( *4H%35V;H3^\ B0?3G5.4/_T M3E$ $CG?C!P '( ,T #- (S0 $,T !F$ 78,!@ P9@@ :2 1@ M[@P& "UF"@!I@ !&$ 5@,!@ P;3X,!@ Y;C@ :2 0S1@ */"D !IUI M (O *?\ &<&4FD F#.80#_.CPI H"A@ _2AD*&T89@N P& "YF M#$II 9F8E)I 9@I@P& $5G!@P& &5F4&$ /(,!@ K9PP,!@ M9@H :1 M 1A #<# 8 ,&TP# 8 .6XJ.BD .'I #AZ0 VVD .'I "1@ /W6D M QI#_\ &W,X.D &#R/RD ! )?( !F"B1H !1"DF ((T*0 /RD ! )? M$ !G D1"U6D B\ @Y]G5#-\ #\ $J :PKCB>.04VD &#R2FD F<@:Q1T M!-5I !A /Y:80#^8E-I )@UF$ _H12:0 "8,QT #0I _*0 $ E^ &<$ M",( 'TZY -B1H !@DP"2!)&@ %"2\ 7 ,"D "$S?!'Y.64Y83G4L M* (9PHA? "$YU2.?\X"1H !!.DCP 3-\'/S-& A3J ,9@@ :0@ M 1.=3\I 0"7P@ 9P)\_TYU /L @ $4 ,L %@ M /R #Z0 "A.5O_\+SP # 0J=.N0 $10CP* P "U __Q*@&8& M< !.7DYU2KD 9V)P7B\ 3KD 4<6(\,K@ ( #__&8$<$1@ G!#+P!. MN0 !1Q8CW *+P!.N0 !1Q8CT*N__P@+O_\L+D ;! O $ZY #CEB/ M4J[__&#D< O "\ 3KD 4(]@"" N__Q.7DYU3EY.=0 #[ 0 M G =@ %P !0 -@ $ S ; $ U B@ M $ !) *@ $ !+ #@ /R #Z@ $ # M\@ ^D !%2.<@ DSO 8 #"QY *$ZN_^),WT $3G4 "\.(B\ ""QY M *$ZN_]PL7TYU2.<P DSO X $"QY *$ZN_]9,WT ,3G4 $CG, ), M[P . ! L>0 "A.KO_03-] #$YU O#BQY *$ZN_\HL7TYU+PXL>0 M "A.KO_$+%].=4CG, ),[P . ! L>0 "A.KO^^3-] #$YU O#B(O @L M>0 "A.KO^X+%].=4CG( ),[P & PL>0 "A.KO^R3-] !$YU !(YR " M3.\ !@ ,+'D H3J[_K$S?0 1.=0 +PXL>0 "A.KO]\+%].=2\.(B\ M""QY *$ZN_SHL7TYU #[ P ! !" /0 #@ Q M *P "4 ? &P !8 / "0 , _ "7T1E M;&%Y\M0 $ E]);T5R<O+4 \ )?3&]C:_+4M@ -0 " M7U)E;F%M9?( "X U]$96QE=&5&:6QE\@ *0 "7U-E96ORU+8 M "( E]/=71P=73R > )?26YP=73RU &@ "7U=R:71E M\M0 !, E]296%D\M2V , )?0VQO<V7RU !P "7T]P M96[RU+8 _( /I 9B\.3.\ P (+'D D3J[_.BQ? M3G4 "\.(F\ "" O PL>0 "1.KO\N+%].=2\.(F\ ""QY )$ZN_MHL M7TYU+PY,[P # @L>0 "1.KO[.+%].=0 +PX@+P (+'D D3J[^MBQ? M3G4O#B O @L>0 "1.KOZP+%].=2\.(F\ ""QY )$ZN_IXL7TYU+PXB M;P (+'D D3J[^F"Q?3G4O#B!O @L>0 "1.KOZ,+%].=2\.(F\ ""QY M )$ZN_H8L7TYU+PX@;P (+'D D3J[^@"Q?3G4O#B)O @@+P ,+'D M D3J[^:"Q?3G4O#B)O @L>0 "1.KOYB+%].=2\.(&\ "$SO @$ #"(O M !0L>0 "1.KOY$+%].=0 +PXB;P (+'D D3J[^/BQ?3G4O#B)O @L M>0 "1.KOXX+%].=2\.(F\ ""QY )$ZN_C(L7TYU+PXB;P (+'D D M3J[^+"Q?3G4O#B)O @L>0 "1.KOX@+%].=0 ^P 3 0 8P M %X !9 5 $\ !)@ 0@ #T W ,@ "T H M (P !X 9 $X X ) H #\ )?06)O<G1) M3P 80 "7T-H96-K24\ %P E]396YD24_R !7 )?1&]) M3_+4M@ 4@ #7T-L;W-E1&5V:6-E !- -?3W!E;D1E=FEC9?( M $4 !%]#;&]S94QI8G)A<GGRU+8 $ U]/<&5N3&EB<F%R>0 M .@ #7U=A:710;W)T\M2V U -?4F5P;'E-<V?RU+8 # M E]'971-<V?R K )?4F5M4&]R= )@ "7T%D9%!O<G0 "$ M U]&<F5E4VEG;F%L\@ ' #7T%L;&]C4VEG;F%L 7 -? M4V5T4VEG;F%L\M0 !$ U]&:6YD5&%S:_+4M@ # "7T9R965- M96T 8 U]!;&QO8TUE;?+4M@ #\@ ^D %(&\ M!""(6)!"J $(4@ "$YU /P E].97=,:7-T /R M #Z0 #Q(YS\@*"\ (!8O "<O//____].N0 %PD !P"&@9T !0&#(+_ M____6(]F!G 8 <B\\ $ 4AX ").N0 D0,^*2H?/BE"/9A)T !0% M+P).N0 '!P %B/8$(E1 *%4, "15\ 0 "$(J X510 /0J=.N0 # E M0 02H18CV<,+PI.N0 (18CV ,2&H %$ZY %B/( I,WP3\3G5(YR @ M)&\ #$JJ IG"B\*3KD "86(\5? #_ AT_R5" !1T !0J \O DZY M<$AX "(O"DZY &$_O Q,WP0$3G4 /L " $L ^ % M 'H #6 5@ (P "Z X@ $ !, F@ /P M 2Y,.?( , 2Y,./( R 2Y,-_( !@ 2Y,-O( "4 M 2Y,-?( "( 2Y,-/( "@ 2Y,,_( !. 2Y,,O( M L 2Y,,?( "B 2Y,,3< "L 2Y,,38 "H 2Y, M,34 "P 2Y,,30 "V 2Y,,3, # 2Y,,3( #J M 2Y,,3$ $ 2Y,,3 U]$96QE=&50;W)T\@ *@ # M7T-R96%T95!O<G3R /R #Z0 !Q(YS )"\ #$J"9@1P M & P+SP 0 !2'@ ,$ZY "! QXA*@\>(4(]F!' 8! 1? % A"* ) M(4( #B (3-\ #$YU+P(@;P ($7P _P (=/\A0@ 4=/\A0@ 82'@ ,"\(3KD M 84(\D'TYU #[ ( !+ ' &8 #\ $N3#GR M ; $N3#CR ! $N3#?R $N3#;R " $N M3#7R $ $N3#3R , $N3#/R + $N3#+R # M $N3#'R 0 $N3#$R 2 $N3#$Q 1@ $N3#$P M3 -?1&5L971E4W1D24\ !& U]#<F5A=&53=&1)3P M #\@ ^D \+PY,[P, @@+P 0+'D H3J[_UBQ?3G4 "\.(&\ M""QY *$ZN_[XL7TYU+PX@;P (+'D H3J[_N"Q?3G5(YP B3.\' , M+'D H3J[_1DS?1 !.=0 +PX@;P (+'D H3J[_.BQ?3G4O#B!O @L M>0 "A.KO\T+%].=4CG "),[P< PL>0 "A.KO\B3-]$ $YU O#DSO M P ""QY *$ZN_O@L7TYU !(YS R(&\ &")O !PD;P @)F\ )" O "@B M+P L)"\ ,"8O #0L>0 "A.KOZD3-],#$YU #[ D $ X@ M *X "4 ? &@ !0 . "0 . _ #7T%U M=&]297%U97-T O 1?4V5T365N=5-T<FEP\M2V I 1?4F5F M<F5S:$=A9&=E='/R B -?3W!E;E=I;F1O=_( !T U]/<&5N M4V-R965N\@ & #7T]N1V%D9V5T\M2V 1 -?0VQO<V57:6YD M;W< P U]#;&]S95-C<F5E;@ !P #7T%D9$=A9&=E=/+4 ) /R end @@@End of ogre.uue -- Hobie Orris | SoftQuad Inc., Toronto, Ont. |"There'll be no more giant leeches {ihnp4 | decvax | ? }!utzoo!sq!hobie | When you find the good Lord Jesus"
hobie@sq.UUCP (02/22/87)
# Amiga Ogre Part 2: The source # This file contains: # README # linkfile - Alink WITH file # ogre.h ext.h # termcap.c initround.c main.c init.c help.c map.c move.c # attack.c resolve.c ogrecom.c ogrestat.c : To unbundle, sh this file echo x - README 1>&2 cat >README <<'@@@End of README' This file describes the programs comprising the Ogre game, and instructions for making it. For instructions on how to play it, read the file `Instructions'. Building the Ogre program: Compile the individual files, making sure that the compiler can find ext.h and ogre.h in the current directory. Link the files to form ogre by typing: 'lc:c/alink with linkfile', assuming your linker is on volume lc: and the modules to be linked are in the current directory. Type `ogre' to run the game, or use the icon. The Instructions menu will not work unless the Instructions file is on the volume `Ogre:'. The Files: ext.h - external variables such as the ogre and the friendly units. ogre.h - typedefs and defines of the global structures and constants. main.c - the main() routine. termcap.c - all console I/O routines for the Amiga. map.c - all the map handling routines for displaying units and craters, and stuff. Also contains the range calculating routine. attack.c - collect attack orders and display odds. Doesn't actually execute the attacks. init.c - initializes all the units and executes the initial deployment orders. A notable deviation from the original program is that I used the K&R shell sort, where the original used the Unix qsort(), for which I had no source. initround.c - does the initializations required every game turn, such as updating hexes, calculating ranges to the ogre and more. move.c - does the player's movements. ogrecom.c - the routines behind the ogre's "strategy". See below. ogrestat.c - handles the status display at the bottom of the screen. resolve.c - resolve all attacks and rammings. The Ogre's Strategy Movement: Weights are assigned to all the directions in which the ogre can move. The primary consideration is the distance to the CP; in the absence of other factors the Ogre will take the fastest route to it. However, it will crush any unit it can (best attacker first) and moves towards units that are in range of its missiles and batteries. It tries to weight so that dangerous, immobile units (howitzers) are attacked first. Fire: The basic strategy here is to fire at the next unit in range. Since the units are sorted by value, this will usually resuly in reasonable choices for targets, although the Ogre tends to overkill. Suggested improvements: ----------------------- Some things you may like to add to the game are additional units. The following are units from the game GEV: Mobile Howitzer (6/6 M1 D2) Ogre Mark IV ------------ Main Batteries: 1 (4/3 D4) Missile Racks: 3 (D4) Each contains 5 missiles and can be attacked instead of the missiles themselves Missiles: 15 (6/5) Only one missile per rack can be fired per turn Secondary Bats: 2 (3/2 D3) Anti-personnel: 8 (1/1 D1) Treads: 60 These treads are in groups of 4 instead of 3. The initial movement is 4, and is reduced by 1 per 15 treads destroyed. ----------------------------------------------------------------------------- Any comments, suggestions or enhancements are welcome. Hobie Orris 9 Ferrier Ave. Toronto, Ont., M4K 3H5 @@@End of README echo x - attack.c 1>&2 cat >attack.c <<'@@@End of attack.c' #include "ext.h" static OGRE allocated; #define PASS 'p' #define NOPASS '\0' #define RESOLVE 'r' #define MISSILE 'm' #define MAIN 'b' #define SECONDARY 's' #define AP 'a' #define TREAD 't' attack_def() { char moreunits; int i; moreunits = TRUE; zero(&allocated, sizeof(allocated)); init_def_attack(); while (moreunits) { moreunits = FALSE; for (i = 0; i < n_units; i++) { /* * Don't bother attacking if Ogre is immobile - H.O. */ if (ogre.movement == 0) check_over(); if (unit[i].status == OK && !unit[i].fired && unit[i].attack > 0 && unit[i].range_to_ogre <= unit[i].range) { describe_action("Fire",i); if (get_target(i) == PASS) moreunits = TRUE; else unit[i].fired = TRUE; } } } ogre_resolve(&allocated); } get_target(i) int i; { char action, invalid; movecur_unit(i); do { invalid = FALSE; action = Amiga_getchar(); switch (action) { case PASS: return(PASS); case MISSILE: if (ogre.missiles > 0) { allocated.missiles += unit[i].attack; update_odds(action); } else invalid = TRUE; break; case MAIN: if (ogre.main_bats > 0) { allocated.main_bats +=unit[i].attack; update_odds(action); } else invalid = TRUE; break; case SECONDARY: if (ogre.sec_bats > 0) { allocated.sec_bats +=unit[i].attack; update_odds(action); } else invalid = TRUE; break; case AP: if (ogre.ap > 0) { allocated.ap += unit[i].attack; update_odds(action); } else invalid = TRUE; break; case TREAD: if (ogre.treads > 0) { allocated.treads += unit[i].attack; update_odds(action); } else invalid = TRUE; if (invalid) break; ogre_resolve(&allocated); zero(&allocated,sizeof(allocated)); break; case RESOLVE: ogre_resolve(&allocated); zero(&allocated, sizeof(allocated)); return(PASS); break; default: invalid = TRUE; break; } } while (invalid); return(NOPASS); } zero(area, size) char *area; int size; { int i; for (i = 0; i < size; i++) area[i] = '\0'; } update_odds(weapon) char weapon; { char c[80]; static char blanks[10] = {" "}; char *odd_str(); switch (weapon) { case MAIN: movecur(18, 40); Amiga_puts(blanks); movecur(18, 40); sprintf(c,"%d %d (%s)",allocated.main_bats, DEF_MAIN, odd_str(allocated.main_bats, DEF_MAIN)); Amiga_puts(c); break; case SECONDARY: movecur(19, 40); Amiga_puts(blanks); movecur(19,40); sprintf(c,"%d %d (%s)",allocated.sec_bats, DEF_SECONDARY, odd_str(allocated.sec_bats, DEF_SECONDARY)); Amiga_puts(c); break; case MISSILE: movecur(20, 40); Amiga_puts(blanks); movecur(20,40); sprintf(c,"%s", odd_str(allocated.missiles, DEF_MISSILES)); Amiga_puts(c); break; case AP: movecur(21, 40); Amiga_puts(blanks); movecur(21,40); sprintf(c,"%s",odd_str(allocated.ap,DEF_AP)); Amiga_puts(c); break; case TREAD: movecur(22, 40); Amiga_puts(blanks); movecur(22,40); sprintf(c,"1/1 (%d) ", allocated.treads); Amiga_puts(c); break; } } @@@End of attack.c echo x - ext.h 1>&2 cat >ext.h <<'@@@End of ext.h' #include "ogre.h" #ifdef MAIN UNIT unit[N_UNITS]; OGRE ogre; int n_units; #else extern UNIT unit[N_UNITS]; extern OGRE ogre; extern int n_units; #endif @@@End of ext.h echo x - help.c 1>&2 cat >help.c <<'@@@End of help.c' #include <exec/types.h> #include <exec/io.h> #include <exec/exec.h> #include <libraries/dos.h> #include <libraries/dosextens.h> #include <devices/console.h> #include <devices/keymap.h> #include <intuition/intuition.h> #include <lattice/stdio.h> struct NewWindow hw = { 0, 0, 640, 200, 3, 1, NULL, ACTIVATE, 0, NULL,"Ogre Help", NULL, NULL, 100, 45, 640, 200, CUSTOMSCREEN }; #define FULLPAGE 21 #define NUMCHAR 100 extern struct Screen *scrn; struct IOStdReq *HelpMsg, *MoreMsg; struct MsgPort *HelpPort, *MorePort; struct Window *helpwin; char fname[] = "Ogre:Instructions"; char buf[NUMCHAR]; UBYTE response; /* Open a window and a console for printing game instructions, and * open the instructions file. Note that the game volume name MUST * be "Ogre" for this to work. */ get_help() { FILE *fp, *fopen(); int error; /* read, write ports for the help window */ /* Can't open it. Complain. */ HelpPort = CreatePort("con2.write",0); if (HelpPort == NULL) return(-1); HelpMsg = CreateStdIO(HelpPort); if (HelpMsg == NULL) return(-1); MorePort = CreatePort("con2.read",0); if (MorePort == NULL) return(-2); MoreMsg = CreateStdIO(MorePort); if (MoreMsg == NULL) return(-2); hw.Screen = scrn; helpwin = (struct Window *) OpenWindow(&hw); if (helpwin == NULL) return(-1); error = OpenConsole(HelpMsg, MoreMsg, helpwin); if (error != 0) { end_help(); return(-3); } QueueRead(MoreMsg, &response); /* open the instructions file */ if (Lock(fname, ACCESS_READ) == NULL) { ConPutStr(HelpMsg, "\nCan't open Ogre:Instructions. Check your volume name.\n"); Delay(250); error = end_help(); return(-4); } fp = fopen(fname,"r"); if (fp == NULL) { return(-4); } put_help(fp); error = end_help(); close(fp); return(error); } /* cleanup and exit */ int end_help() { int error; DeletePort(HelpPort); DeleteStdIO(HelpMsg); DeletePort(MorePort); DeleteStdIO(MoreMsg); error = CloseWindow(helpwin); return(error); } /* write help file to window and read for more */ put_help(fp) FILE *fp; { int nomore = 0, numlines = 0; while ((nomore = fgets(&buf[0], NUMCHAR, fp)) != NULL) { ConPutStr(HelpMsg, buf); numlines += 1; /* when a full page has been written, pause for a keystroke */ if (numlines == FULLPAGE) { response = ConGetChar(MorePort, MoreMsg, &response); numlines = 0; } } /* get one last key to clear the remaining text from the screen */ response = ConGetChar(MorePort, MoreMsg, &response); } @@@End of help.c echo x - init.c 1>&2 cat >init.c <<'@@@End of init.c' #include "ext.h" static char a,b; static int cp_set; static int infantry_points, armor_points; init_units(mark) { char s[80]; int i,j; int unitcmp(); a = b = 10; switch (mark) { case 3: armor_points = 16; infantry_points = 18; break; case 5: armor_points = 22; infantry_points = 27; break; } n_units = 0; cp_set = FALSE; while (armor_points > 0 || infantry_points > 0 || !cp_set) { sprintf(s, "left to place: %d armor, %d infantry%s", armor_points, infantry_points, (cp_set) ? "." : ", CP"); movecur(16,0); eeol(16); Amiga_puts(s); getunit(); } sort(&unit[0], n_units, sizeof(UNIT), unitcmp); } sort(unit, n, size, comp) UNIT *unit; int n, size; int (*comp)(); { int gap, i, j; UNIT tmp; for (gap = n/2; gap > 0; gap /= 2) for (i = gap; i < n; ++i) for (j = i - gap; j >= 0; j -= gap) { if ((*comp)(unit[j], unit[j + gap]) <= 0) break; tmp = unit[j]; unit[j] = unit[j + gap]; unit[j + gap] = tmp; } } getunit() { char no_new, bad_char; char olda, oldb; char dir; no_new = TRUE; bad_char = FALSE; movecur_hex(a, b); while (no_new) { olda = a; oldb = b; dir = Amiga_getchar(); switch (dir) { case RIGHT: --a; --b; break; case UPRIGHT: --a; break; case DOWNRIGHT: --b; break; case LEFT: ++a; ++b; break; case UPLEFT: ++b; break; case DOWNLEFT: ++a; break; case SIT: break; case CP: if (cp_set) bad_char = TRUE; else { add_unit(a, b, dir); no_new = FALSE; cp_set = TRUE; } break; case HVYTANK: case MSLTANK: case GEV: if (occupied(a,b) || blocked(a,b) || armor_points == 0) { bad_char = TRUE; break; } add_unit(a,b,dir); no_new = FALSE; --armor_points; break; case '1': case '2': case '3': if (occupied(a,b) || blocked(a,b) || infantry_points < (dir - '0')) { bad_char = TRUE; break; } add_unit(a, b, dir); no_new = FALSE; infantry_points -= (dir - '0'); break; case INFANTRY: if (occupied(a,b) || blocked(a,b) || infantry_points < 3) { bad_char = TRUE; break; } add_unit(a, b, '3'); no_new = FALSE; infantry_points -= 3; break; case HOWITZER: if (occupied(a,b) || blocked(a,b) || armor_points <= 1) { bad_char = TRUE; break; } add_unit(a,b,dir); no_new = FALSE; armor_points -= 2; break; default: bad_char = TRUE; break; } if (off_obstructed(a,b) || bad_char) { a = olda; b = oldb; bad_char = FALSE; } else movecur_hex(a,b); } /* while */ } add_unit(a, b, c) char a, b, c; { int i; i = n_units; ++n_units; switch (c) { case CP: unit[i].type = CP; unit[i].attack = 0; unit[i].range = 0; unit[i].defend = 0; unit[i].movement = 0; break; case HVYTANK: unit[i].type = HVYTANK; unit[i].attack = 4; unit[i].range = 2; unit[i].defend = 3; unit[i].movement = 3; break; case MSLTANK: unit[i].type = MSLTANK; unit[i].attack = 3; unit[i].range = 4; unit[i].defend = 2; unit[i].movement = 2; break; case GEV: unit[i].type = GEV; unit[i].attack = 2; unit[i].range = 2; unit[i].defend = 2; unit[i].movement = 4; break; case HOWITZER: unit[i].type = HOWITZER; unit[i].attack = 6; unit[i].range = 8; unit[i].defend = 1; unit[i].movement = 0; break; case INFANTRY: case '3': unit[i].type = INFANTRY; unit[i].attack = 3; unit[i].range = 1; unit[i].defend = 1; unit[i].movement = 2; break; case '1': unit[i].type = INFANTRY; unit[i].attack = 1; unit[i].range = 1; unit[i].defend = 1; unit[i].movement = 2; break; case '2': unit[i].type = INFANTRY; unit[i].attack = 2; unit[i].range = 1; unit[i].defend = 1; unit[i].movement = 2; break; } unit[i].range_to_ogre = 0; unit[i].fired = 0; unit[i].status = OK; unit[i].moves_left = 0; unit[i].l_hex = a; unit[i].r_hex = b; disp_unit(i); } occupied(a,b) char a,b; { int i; for (i = 0; i < n_units; ++i) if (unit[i].status != DESTROYED && unit[i].l_hex == a && unit[i].r_hex == b) return(TRUE); return(FALSE); } init_ogre(mark) int mark; { long lrand48(); ogre.l_hex = (char) lrand48() % 7 + 22; ogre.r_hex = 50 - ogre.l_hex; switch (mark) { case 3: ogre.treads = 45; ogre.init_treads = 45; ogre.movement = 3; ogre.missiles = 2; ogre.main_bats = 1; ogre.sec_bats = 4; ogre.ap = 8; break; case 5: ogre.treads = 60; ogre.init_treads = 60; ogre.movement = 3; ogre.missiles = 5; ogre.main_bats = 2; ogre.sec_bats = 6; ogre.ap = 10; break; } disp_ogre(); } unitcmp(u1, u2) UNIT *u1, *u2; { int cmp; switch(u1->type) { case CP: switch (u2->type) { case CP: cmp = 0; break; default: cmp = -1; break; } break; case HOWITZER: switch(u2->type) { case CP: cmp = 1; break; case HOWITZER: cmp = 0; break; default: cmp = -1; break; } break; case HVYTANK: switch (u2->type) { case CP: case HOWITZER: cmp = 1; break; case HVYTANK: cmp = 0; break; default: cmp = -1; break; } break; case MSLTANK: switch(u2->type) { case CP: case HOWITZER: case HVYTANK: cmp = 1; break; case MSLTANK: cmp = 0; break; default: cmp = -1; break; } break; case GEV: switch (u2->type) { case INFANTRY: cmp = -1; break; case GEV: cmp = 0; break; default: cmp = -1; break; } break; case INFANTRY: switch (u2->type) { case INFANTRY: cmp = 0; break; default: cmp = -1; break; } break; } return(cmp); } @@@End of init.c echo x - initround.c 1>&2 cat >initround.c <<'@@@End of initround.c' #include "ext.h" init_round() { int i; for (i = 0; i < n_units; ++i) { unit[i].moves_left = unit[i].movement; if (unit[i].status == DISABLED) { unit[i].status = OK; update_hex(unit[i].l_hex, unit[i].r_hex); } unit[i].range_to_ogre = range(ogre.l_hex, ogre.r_hex, unit[i].l_hex, unit[i].r_hex); } } init_move_ogre() { int i; for (i = 0; i < n_units; ++i) { unit[i].range_to_ogre = range(ogre.l_hex, ogre.r_hex, unit[i].l_hex, unit[i].r_hex); } } init_def_attack() { int i; for (i = 0; i < n_units; ++i) { if (unit[i].status == OK) { unit[i].fired = FALSE; unit[i].range_to_ogre = range(ogre.l_hex, ogre.r_hex, unit[i].l_hex, unit[i].r_hex); } } } init_ogre_attack() { int i; for (i = 0; i < n_units; ++i) { unit[i].fired = 0; unit[i].range_to_ogre = range(ogre.l_hex, ogre.r_hex, unit[i].l_hex, unit[i].r_hex); } } init_gev2() { int i; for (i = 0; i < n_units; ++i) if (unit[i].status == OK && unit[i].type == GEV) unit[i].moves_left = 3; } display_range(i) int i; { char c[80]; movecur(18,0); eeol(18); sprintf(c,"range from unit %d to Ogre %d.",i,unit[i].range_to_ogre); Amiga_puts(c); cycle(); } @@@End of initround.c echo x - main.c 1>&2 cat >main.c <<'@@@End of main.c' /* * OGRE - a tactical ground combat game set in 2086. * * Written by Michael Caplinger of Rice University 1982 * based on the Steve Jackson Microgame (c) 1977. * * Ported to Amiga from Unix by Hobie Orris, 1986 * (who was too lazy to type in all the comments. Sorry) */ #define MAIN 1 #include "ext.h" main(argc, argv) int argc; char **argv; { int mark; /* The original program set a trap here: signal(SIGINT, handler) * For Amiga, I've chosen to handle close window events instead * of breaks; see Amiga_getchar() in termcap.c - H.O. */ init_screen(); mark = get_mark(); init_units(mark); init_ogre(mark); disp_ogre_status(TRUE); while (1) { init_round(); /* the Ogre fires */ assign_fire_ogre(); check_over(); /* player moves and fires */ move_def(); attack_def(); check_over(); /* 2nd GEV move */ init_gev2(); move_def(); /* Ogre moves */ move_ogre(); check_over(); } } check_over() { char *message, c; int over,i; static char drawstring[] = "The Ogre self-destructs and destroys the CP. Draw!"; static char youstring[] = "You win!"; static char ogrestring[] = "The Ogre wins!"; over = FALSE; if (unit[0].status == DESTROYED) { message = &ogrestring[0]; over = TRUE; } /* if the Ogre is immobilized it is beaten */ else if (ogre.movement == 0 && unit[0].range_to_ogre < 5) { /* * Optional rule 8.05 - the Ogre can self-destruct, destroying * everything within 4 hexes, and armor at 5 hexes is disabled. * So, if CP is within 4 hexes, blow up - H.O. */ for (i = 0; i < n_units; ++i) { if (unit[i].range_to_ogre < 5) { unit[i].status = DESTROYED; disp_unit(i); } else if (unit[i].range_to_ogre == 5 && unit[i].status == OK && unit[i].type != CP && unit[i].type != INFANTRY) { unit[i].status = DISABLED; disp_unit(i); } } disp_hex(ogre.l_hex, ogre.r_hex, '*'); message = &drawstring[0]; over = TRUE; } else if (ogre.movement == 0 && unit[0].range_to_ogre > 4) { message = &youstring[0]; over = TRUE; } if (over) { puts(message); for (i = 16; i < 23; ++i) { movecur(i,1); eeol(i); } eeol(16); movecur(16,1); Amiga_puts(message); c = Amiga_getchar(); reset_term(); } } @@@End of main.c echo x - map.c 1>&2 cat >map.c <<'@@@End of map.c' #include "ext.h" #include <ctype.h> init_screen() { int a, b; char row, col; tc_setup(); for (a = 1; a <= 28; ++a) { for (b = 1; b <= 28; ++b) if (!off_map(a,b)) disp_hex(a, b, '7'); } disp_craters(); /* refresh the screen */ refresh(); } to_xy(lhex, rhex, row, col) char lhex, rhex, *row, *col; { *row = (lhex - rhex) + 7; *col = 50 - (lhex + rhex); } off_map(a, b) char a, b; { char row, col; to_xy(a, b, &row, &col); if (col < 0 || col > 38 || row < 0 || row > 14) return(TRUE); else return(FALSE); } off_obstructed(a, b) char a, b; { char row, col; to_xy(a, b, &row, &col); if (col < 10 || col > 38 || row < 0 || row > 14) return(TRUE); else return(FALSE); } disp_hex(a, b, c) char a, b, c; { char row, col; to_xy(a, b, &row, &col); movecur(row, col * 2 + 1); Amiga_putchar(c); } update_hex(a, b) char a, b; { int i; if (ogre.l_hex == a && ogre.r_hex == b) { disp_ogre(); return; } for (i = 0; i < n_units; ++i) if (unit[i].l_hex == a && unit[i].r_hex == b && unit[i].status != DESTROYED) { disp_unit(i); return; } if (blocked(a, b)) { disp_hex(a, b, '*'); return; } disp_hex(a, b, '7'); } disp_unit(i) int i; { char a, b; a = unit[i].l_hex; b = unit[i].r_hex; switch(unit[i].status) { case OK: switch (unit[i].type) { case INFANTRY: disp_hex(a, b, '0' + unit[i].attack); break; default: disp_hex(a, b, unit[i].type); break; } break; case DISABLED: disp_hex(a, b, tolower(unit[i].type)); break; case DESTROYED: disp_hex(a, b, '7'); break; } } disp_ogre(i) int i; { /* these are Amiga console control strings for changing colour */ static char black_on[] = { 0x9b, '1', ';', '3', '2', ';', '4', '0', 'm', '\0' }; static char black_off[] = { 0x9b, '0', ';', '3', '1', ';', '4', '0', 'm', '\0' }; char a, b; a = ogre.l_hex; b = ogre.r_hex; Amiga_puts(black_on); disp_hex(a, b, 'O'); Amiga_puts(black_off); } movecur_hex(a, b) char a, b; { char row, col; to_xy(a, b, &row, &col); movecur(row, col * 2 + 1); } movecur_unit(i) int i; { movecur_hex(unit[i].l_hex, unit[i].r_hex); } #define ABS(i) (((i) < 0) ? -(i) : (i)) #define BIGINT 32767 range(a1, b1, a2, b2) char a1, a2, b1, b2; { char diff1, diff2, temp; int subrange[3], min, i, rangesum; diff1 = a1 - b1; diff2 = a2 - b2; subrange[0] = ABS(a1 - a2); subrange[1] = ABS(b1 - b2); subrange[2] = ABS(diff1 - diff2); min = 0; for (i = 1; i < 3; ++i) if (subrange[i] < subrange[min]) min = i; rangesum = subrange[min]; temp = subrange[min]; subrange[min] = subrange[2]; subrange[2] = temp; min = 0; for (i = 1; i < 2; ++i) if (subrange[i] < subrange[min]) min = i; rangesum += subrange[min]; return(rangesum); } static struct { char l_hex, r_hex; } craters[] = { 17, 16, 19, 13, 13, 18, 14, 15, 13, 15, 15, 10, 9, 15, 10, 12, 7, 14, 11, 10, 14, 7, 12, 6, 7, 10, 8, 6, 4, 9, 9, 4, 9, 3, }; #define NCRATERS (sizeof(craters) / 2 * sizeof(char)) blocked(a, b) char a, b; { int i; for (i = 0; i < NCRATERS; ++i) if (craters[i].l_hex == a && craters[i].r_hex == b) return(TRUE); return(FALSE); } disp_craters() { int i; for (i = 0; i < NCRATERS; ++i) disp_hex(craters[i].l_hex, craters[i].r_hex, '*'); } describe_action(action, i) char *action; int i; { char c[80]; switch(unit[i].type) { case HOWITZER: movecur(16, 1); eeol(16); sprintf(c, "%s howitzer (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); Amiga_puts(c); break; case MSLTANK: movecur(16, 1); eeol(16); sprintf(c, "%s missile tank (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); Amiga_puts(c); break; case GEV: movecur(16, 1); eeol(16); sprintf(c, "%s GEV (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); Amiga_puts(c); break; case HVYTANK: movecur(16, 1); eeol(16); sprintf(c, "%s heavy tank (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); Amiga_puts(c); break; case INFANTRY: movecur(16, 1); eeol(16); sprintf(c, "%s infantry (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); Amiga_puts(c); break; } } /* routines display() and display_xy() have been removed */ @@@End of map.c echo x - move.c 1>&2 cat >move.c <<'@@@End of move.c' #include "ext.h" move_def() { int i; for (i = 0; i < n_units; ++i) if (unit[i].status == OK) { if (unit[i].moves_left > 0) describe_action("Move",i); while (unit[i].moves_left > 0 && unit[i].status == OK) getmove(i); } } getmove(i) int i; { char nomove, bad_char, a, b, dir, olda, oldb; nomove = TRUE; while (nomove) { a = unit[i].l_hex; b = unit[i].r_hex; movecur_hex(a, b); bad_char = FALSE; dir = Amiga_getchar(); switch (dir) { case RIGHT: --a; --b; break; case UPRIGHT: --a; break; case DOWNRIGHT: --b; break; case LEFT: ++a; ++b; break; case UPLEFT: ++b; break; case DOWNLEFT: ++a; break; case SIT: case ' ': unit[i].moves_left = 0; return(0); default: bad_char = TRUE; break; } if (off_map(a, b) || (occupied(a, b) && unit[i].moves_left == 1) || blocked(a, b) || bad_char) { bad_char = FALSE; } else { olda = unit[i].l_hex; oldb = unit[i].r_hex; unit[i].l_hex = a; unit[i].r_hex = b; update_hex(olda, oldb); nomove = FALSE; unit[i].moves_left -= 1; def_ram(i); update_hex(unit[i].l_hex, unit[i].r_hex); } } } @@@End of move.c echo x - ogre.h 1>&2 cat >ogre.h <<'@@@End of ogre.h' /* * ogre.h */ typedef struct { char type; char attack; char range; char defend; char movement; char range_to_ogre; char fired; char moves_left; char status; char l_hex; char r_hex; } UNIT; typedef struct { char missiles; char main_bats; char sec_bats; char ap; char treads; char movement; char moves_left; char l_hex; char r_hex; char init_treads; } OGRE; /* unit types */ #define CP 'C' #define HVYTANK 'T' #define MSLTANK 'M' #define GEV 'G' #define HOWITZER 'H' #define INFANTRY 'I' /* unit statuses */ #define OK 1 #define DISABLED 2 #define DESTROYED 3 /*directions */ #define RIGHT 'd' #define UPRIGHT 'e' #define DOWNRIGHT 'x' #define LEFT 'a' #define UPLEFT 'w' #define DOWNLEFT 'z' #define SIT 's' #define HELPKEY '?' #define TRUE 1 #define FALSE 0 #define N_UNITS 30 /* ogre weapon stats */ #define DEF_MISSILES 3 #define DEF_MAIN 4 #define DEF_SECONDARY 3 #define DEF_AP 1 #define ATK_MISSILES 6 #define ATK_MAIN 4 #define ATK_SECONDARY 3 #define ATK_AP 1 #define RANGE_MISSILES 5 #define RANGE_MAIN 3 #define RANGE_SECONDARY 2 #define RANGE_AP 1 @@@End of ogre.h echo x - ogrecom.c 1>&2 cat >ogrecom.c <<'@@@End of ogrecom.c' #include "ext.h" move_ogre() { init_move_ogre(); ogre.moves_left = ogre.movement; while (ogre.moves_left > 0) { move_ogre1(); ogre_ram(); cycle(); } } #define INFINITY 32767 move_ogre1() { int weight[7]; int i, max; char a, b, olda, oldb; a = ogre.l_hex; b = ogre.r_hex; weight[0] = - INFINITY; weight[1] = getweight(a - 1, b - 1); weight[2] = getweight(a - 1, b); weight[3] = getweight(a, b + 1); weight[4] = getweight(a + 1, b + 1); weight[5] = getweight(a + 1, b); weight[6] = getweight(a, b - 1); max = 0; for (i = 1; i < 7; ++i) if (weight[i] > weight[max]) max = i; switch (max) { case 0: break; case 1: --a; --b; break; case 2: --a; break; case 3: ++b; break; case 4: ++a; ++b; break; case 5: ++a; break; case 6: --b; break; } olda = ogre.l_hex; oldb = ogre.r_hex; ogre.l_hex = a; ogre.r_hex = b; update_hex(olda, oldb); disp_ogre(); ogre.moves_left -= 1; } getweight(a, b) char a, b; { int weight, total_attacks, to_target, i; weight = - range(a, b, unit[0].l_hex, unit[0].r_hex); total_attacks = ogre.missiles + ogre.main_bats + ogre.sec_bats; for (i = 0; i < n_units; ++i) { if (unit[i].status == DESTROYED) continue; to_target = range(a, b, unit[i].l_hex, unit[i].r_hex); if (to_target == 0) { if (unit[i].type == CP) weight = 50; else weight = 10 * unit[i].attack; break; } if (total_attacks <= 0) continue; if (to_target <= RANGE_MISSILES && ogre.missiles > 0) { weight += unit[i].attack; weight += 4 - unit[i].movement; total_attacks -= 1; continue; } if (to_target <= RANGE_MAIN && ogre.main_bats > 0) { weight += unit[i].attack; weight += 4 - unit[i].movement; total_attacks -= 1; continue; } if (to_target <= RANGE_SECONDARY && ogre.sec_bats > 0) { weight += unit[i].attack; weight += 4 - unit[i].movement; total_attacks -= 1; continue; } if (to_target <= RANGE_AP && ogre.ap > 0 && unit[i].type == INFANTRY || unit[i].type == CP) { weight += unit[i].attack; weight += 4 - unit[i].movement; total_attacks -= 1; continue; } } if (off_map(a, b) || blocked(a, b)) weight = - INFINITY; return(weight); } #define INCR(i) i = (i == n_units - 1) ? 0 : i + 1 #define MIN(a, b) (((a) > (b)) ? (a) : (b)) assign_fire_ogre() { int i, unitno, nmissiles; init_ogre_attack(); unitno = nextunit(RANGE_AP, 0); for (i = 0; i < ogre.ap; ++i) { if (unit[unitno].range_to_ogre <= RANGE_AP && (unit[unitno].type == CP || unit[unitno].type == INFANTRY)) { unit[unitno].fired += ATK_AP; display_attack("AP", unitno); } unitno = nextunit(RANGE_AP, unitno); } unitno = nextunit(RANGE_SECONDARY, unitno); for (i = 0; i < ogre.sec_bats; ++i) { if (unit[unitno].range_to_ogre <= RANGE_SECONDARY) { unit[unitno].fired += ATK_SECONDARY; display_attack("secondary battery", unitno); } unitno = nextunit(RANGE_SECONDARY, unitno); } unitno = nextunit(RANGE_MAIN, unitno); for (i = 0; i < ogre.main_bats; ++i) { if (unit[unitno].range_to_ogre <= RANGE_MAIN) { unit[unitno].fired += ATK_MAIN; display_attack("main battery", unitno); } unitno = nextunit(RANGE_MAIN, unitno); } unitno = nextunit(RANGE_MISSILES, unitno); nmissiles = ogre.missiles; for (i = 0; i < nmissiles; ++i) { if (unit[unitno].status != DESTROYED && unit[unitno].type != INFANTRY && unit[unitno].range_to_ogre <= RANGE_MISSILES) { unit[unitno].fired += ATK_MISSILES; ogre.missiles -= 1; display_attack("missile", unitno); disp_ogre_status(FALSE); } unitno = nextunit(RANGE_MISSILES, unitno); } } cycle() { Delay(60); } display_attack(weapon, target) char *weapon; int target; { char c[80]; if (unit[target].status == DESTROYED) return; sprintf(c, "Ogre fires %s at unit at hex %d%d ", weapon, unit[target].l_hex, unit[target].r_hex); movecur(16, 0); Amiga_puts(c); movecur_hex(unit[target].l_hex, unit[target].r_hex); cycle(); def_resolve(target); } nextunit(range, unitno) int range, unitno; { int start; start = unitno; INCR(unitno); while (unitno != start) { if (range == 1) { if (unit[unitno].status != DESTROYED && (unit[unitno].type == CP || unit[unitno].type == INFANTRY) && unit[unitno].range_to_ogre <= range) return(unitno); } else { if (unit[unitno].status != DESTROYED && unit[unitno].range_to_ogre <= range) return(unitno); } INCR(unitno); } return(unitno); } @@@End of ogrecom.c echo x - ogrestat.c 1>&2 cat >ogrestat.c <<'@@@End of ogrestat.c' #include "ext.h" disp_ogre_status(redraw) int redraw; { static OGRE last; char s[80]; if (redraw || last.main_bats != ogre.main_bats) if (ogre.main_bats > 0) { sprintf(s, "Main Batteries: %d (4/3 D4)", ogre.main_bats); movecur(18, 0); eeol(18); Amiga_puts(s); } else { movecur(18, 0); eeol(18); Amiga_puts(" "); } if (redraw || last.sec_bats != ogre.sec_bats) if (ogre.sec_bats > 0) { sprintf(s, "Secondary Batteries: %d (3/2 D3)", ogre.sec_bats); movecur(19, 0); eeol(19); Amiga_puts(s); } else { movecur(19, 0); eeol(19); Amiga_puts(" "); } if (redraw || last.missiles != ogre.missiles) if (ogre.missiles > 0) { sprintf(s, "Missiles: %d (6/5 D3)", ogre.missiles); movecur(20, 0); eeol(20); Amiga_puts(s); } else { movecur(20, 0); eeol(20); Amiga_puts(" "); } if (redraw || last.ap != ogre.ap) if (ogre.ap > 0) { sprintf(s, "Anti-Personnel: %d (1/1 D1)", ogre.ap); movecur(21, 0); eeol(21); Amiga_puts(s); } else { movecur(21, 0); eeol(21); Amiga_puts(" "); } if (redraw || last.treads != ogre.treads) if (ogre.treads > 0) { sprintf(s, "Treads: %d (1/* D1)", ogre.treads); movecur(22, 0); eeol(22); Amiga_puts(s); movecur(22, 40); sprintf(s, "Movement: %d",ogre.movement); Amiga_puts(s); } else { movecur(22, 0); eeol(22); Amiga_puts(" "); } /* if (redraw || last.movement != ogre.movement) { sprintf(s, "Movement: %d", ogre.movement); movecur(23, 0); eeol(23); Amiga_puts(s); } */ /* Lattice allows structure copying! */ last = ogre; } @@@End of ogrestat.c echo x - resolve.c 1>&2 cat >resolve.c <<'@@@End of resolve.c' #include "ext.h" static char *odd_names[] = { "0/1", "1/2", "1/1", "2/1", "3/1", "4/1", "+", }; static char crt[6][7] = { OK, OK, OK, OK, DISABLED, DISABLED, DESTROYED, OK, OK, OK, DISABLED, DISABLED, DESTROYED, DESTROYED, OK, OK, DISABLED, DISABLED, DESTROYED, DESTROYED, DESTROYED, OK, OK, DISABLED, DESTROYED, DESTROYED, DESTROYED, DESTROYED, OK, DISABLED, DESTROYED, DESTROYED, DESTROYED, DESTROYED, DESTROYED, OK, DESTROYED, DESTROYED, DESTROYED, DESTROYED, DESTROYED, DESTROYED, }; odds(attack, defend) int attack, defend; { int result; result = (defend > 0) ? attack / defend + 1 : 6; if (result > 6) result = 6; if (result == 1) result = (2 * attack < defend) ? 0 : 1; return(result); } char *odd_str(attack, defend) int attack, defend; { return(odd_names[odds(attack, defend)]); } ogre_resolve(allocations) OGRE *allocations; { static char blanks[12] = {" "}; eeol(16); Amiga_puts("Resolving..."); cycle(); if (allocations->missiles > 0) { if (crt[roll()][odds(allocations->missiles, DEF_MISSILES)] == DESTROYED) ogre.missiles -= 1; } if (allocations->main_bats > 0) { if (crt[roll()][odds(allocations->main_bats, DEF_MAIN)] == DESTROYED) ogre.main_bats -= 1; } if (allocations->sec_bats > 0) { if (crt[roll()][odds(allocations->sec_bats, DEF_SECONDARY)] == DESTROYED) ogre.sec_bats -= 1; } if (allocations->ap > 0) { if (crt[roll()][odds(allocations->ap, DEF_AP)] == DESTROYED) ogre.ap -= 1; } if (allocations->treads > 0) { if (crt[roll()][odds(1,1)] == DESTROYED) decrease_treads(allocations->treads); } movecur(18, 40); Amiga_puts(blanks); movecur(19, 40); Amiga_puts(blanks); movecur(19, 40); Amiga_puts(blanks); movecur(20, 40); Amiga_puts(blanks); movecur(21, 40); Amiga_puts(blanks); movecur(22, 40); Amiga_puts(blanks); disp_ogre_status(FALSE); } def_resolve(i) int i; { char result; if (unit[i].status != DESTROYED && unit[i].fired > 0) { result = crt[roll()][odds(unit[i].fired, unit[i].defend)]; if (unit[i].type == INFANTRY) if (result == DISABLED) { unit[i].attack -= 1; if (unit[i].attack == 0) unit[i].status = DESTROYED; update_hex(unit[i].l_hex, unit[i].r_hex); return; } switch (unit[i].status) { case OK: unit[i].status = result; break; case DISABLED: if (result != OK) unit[i].status = DESTROYED; break; } if (unit[i].status != OK) update_hex(unit[i].l_hex, unit[i].r_hex); } } roll() { long lrand48(), k = 0; while (k == 0) k = (lrand48()) % 6; return(k); } ogre_ram() { int i; for (i = 0; i < n_units; ++i) if (unit[i].l_hex == ogre.l_hex && unit[i].r_hex == ogre.r_hex && unit[i].status != DESTROYED) switch (unit[i].type) { case INFANTRY: if (ogre.ap > 0) { unit[i].attack -= 1; if (unit[i].attack == 0) unit[i].status = DESTROYED; } break; default: if (unit[i].movement == 0 || unit[i].status == DISABLED) { unit[i].status = DESTROYED; decrease_treads((unit[i].type == HVYTANK) ? 2 : 1); disp_ogre_status(FALSE); } else { unit[i].status = (roll() > 3) ? DESTROYED : DISABLED; decrease_treads((unit[i].type == HVYTANK) ? 2 : 1); disp_ogre_status(FALSE); } break; } } def_ram(i) int i; { if (unit[i].l_hex == ogre.l_hex && unit[i].r_hex == ogre.r_hex && unit[i].type != INFANTRY) { if (unit[i].type == HVYTANK) decrease_treads(2); else decrease_treads(1); unit[i].status = DESTROYED; disp_ogre_status(FALSE); } } decrease_treads(attack) int attack; { ogre.treads -= attack; ogre.movement = 0; if (ogre.treads > 0) ogre.movement = 1; if (ogre.treads > ogre.init_treads / 3) ogre.movement = 2; if (ogre.treads > 2 * ogre.init_treads / 3) ogre.movement = 3; } @@@End of resolve.c echo x - termcap.c 1>&2 cat >termcap.c <<'@@@End of termcap.c' /* * This file contains all the console I/O stuff, most of which is cribbed * from the ROM Kernel Manual. Some of the routines here are not used, like * clear_screen() and the cursor movement defines. The idea behind the * apparently redundant routines Amiga_putchar(), Amiga_getchar(), etc, is * to avoid having external pointers to windows and message ports in all the * other files. */ #include <exec/types.h> #include <exec/io.h> #include <exec/exec.h> #include <exec/memory.h> #include <graphics/gfx.h> #include <hardware/dmabits.h> #include <hardware/custom.h> #include <hardware/blit.h> #include <graphics/gfxmacros.h> #include <graphics/copper.h> #include <graphics/view.h> #include <graphics/gels.h> #include <graphics/regions.h> #include <graphics/clip.h> #include <graphics/text.h> #include <graphics/gfxbase.h> #include <libraries/dos.h> #include <devices/console.h> #include <devices/keymap.h> #include <intuition/intuition.h> #define HELPKEY '?' struct TextAttr MyFont = { "topaz.font", TOPAZ_EIGHTY, FS_NORMAL,FPF_ROMFONT }; struct NewWindow nw = { 0, 0, 640, 200, 3, 1, CLOSEWINDOW|MENUPICK|GADGETUP|GADGETDOWN, WINDOWCLOSE|SMART_REFRESH|ACTIVATE|GIMMEZEROZERO|BORDERLESS, 0, NULL,"Ogre 2.0 by Hobie Orris", NULL, NULL, 100, 45, 640, 200, CUSTOMSCREEN }; struct NewScreen ns = { 0, 0, 640, 200, 2, 0, 1, HIRES, CUSTOMSCREEN, &MyFont, NULL, 0, 0 }; extern struct MsgPort *CreatePort(); extern struct IOStdReq *CreateStdIO(); struct Screen *scrn; struct Window *w; struct RastPort *rp; struct IOStdReq *WriteMsg, *ReadMsg; struct MsgPort *WritePort, *ReadPort; struct IntuiMessage *Imsg; ULONG DosBase, GfxBase, IntuitionBase; /************************************************************************/ /* */ /* Gadget Stuff */ /* */ /************************************************************************/ /* The gadgets look like this: * * Gadget0 Gadget1 * Gadget2 Gadget6 Gadget3 * Gadget4 Gadget5 * * All have plane 0 as below, and plane 1 as zeroes. */ /* offsets of gadget 0 from the window top left */ #define BASEPTX 450 /* x offset */ #define BASEPTY 123 /* y offset */ /* the pictures themselves */ USHORT Imgadget0[36] = { 0xffff, 0xf000, 0x8000, 0x1000, 0xbff0, 0x1000, 0xbfe0, 0x1000, 0xbfc0, 0x1000, 0xbf80, 0x1000, 0xbfc0, 0x1000, 0xbfe0, 0x1000, 0xbbf0, 0x1000, 0xb1f8, 0x1000, 0xa0fc, 0x1000, 0x807e, 0x1000, 0x803f, 0x1000, 0x801f, 0x9000, 0x800f, 0x1000, 0x8006, 0x1000, 0x8000, 0x1000, 0xffff, 0xf000 }; USHORT Imgadget1[36] = { 0xffff, 0xf000, 0x8000, 0x1000, 0x80ff, 0xd000, 0x807f, 0xd000, 0x803f, 0xd000, 0x801f, 0xd000, 0x803f, 0xd000, 0x807f, 0xd000, 0x80fd, 0xd000, 0x81f8, 0xd000, 0x83f0, 0x5000, 0x87e0, 0x1000, 0x8fc0, 0x1000, 0x9f80, 0x1000, 0x8f00, 0x1000, 0x8600, 0x1000, 0x8000, 0x1000, 0xffff, 0xf000 }; USHORT Imgadget2[36] = { 0xffff, 0xf000, 0x8000, 0x1000, 0x8080, 0x1000, 0x8180, 0x1000, 0x8380, 0x1000, 0x8700, 0x1000, 0x8fff, 0xd000, 0x9fff, 0xd000, 0xbfff, 0xd000, 0x9fff, 0xd000, 0x8fff, 0xd000, 0x8700, 0x1000, 0x8380, 0x1000, 0x8180, 0x1000, 0x8080, 0x1000, 0x8000, 0x1000, 0x8000, 0x1000, 0xffff, 0xf000 }; USHORT Imgadget3[36] = { 0xffff, 0xf000, 0x8000, 0x1000, 0x8010, 0x1000, 0x8018, 0x1000, 0x801c, 0x1000, 0x801e, 0x1000, 0xbfff, 0x1000, 0xbfff, 0x9000, 0xbfff, 0xd000, 0xbfff, 0x9000, 0xbfff, 0x1000, 0x801e, 0x1000, 0x801c, 0x1000, 0x8018, 0x1000, 0x8010, 0x1000, 0x8000, 0x1000, 0x8000, 0x1000, 0xffff, 0xf000, }; USHORT Imgadget4[36] = { 0xffff, 0xf000, 0x8000, 0x1000, 0x8006, 0x1000, 0x800f, 0x1000, 0x801f, 0x9000, 0x803f, 0x1000, 0x807e, 0x1000, 0xa0fc, 0x1000, 0xb1f8, 0x1000, 0xbbf0, 0x1000, 0xbfe0, 0x1000, 0xbfc0, 0x1000, 0xbf80, 0x1000, 0xbfc0, 0x1000, 0xbfe0, 0x1000, 0xbff0, 0x1000, 0x8000, 0x1000, 0xffff, 0xf000 }; USHORT Imgadget5[36] = { 0xffff, 0xf000, 0x8000, 0x1000, 0x8600, 0x1000, 0x8f00, 0x1000, 0x9f80, 0x1000, 0x8fc0, 0x1000, 0x87e0, 0x1000, 0x83f0, 0x5000, 0x81f8, 0xd000, 0x80fd, 0xd000, 0x807f, 0xd000, 0x803f, 0xd000, 0x801f, 0xd000, 0x803f, 0xd000, 0x807f, 0xd000, 0x80ff, 0xd000, 0x8000, 0x1000, 0xffff, 0xf000 }; USHORT Imgadget6[36] = { 0xffff, 0xf000, 0x8000, 0x1000, 0x81fc, 0x1000, 0x83fe, 0x1000, 0x8706, 0x1000, 0x8e00, 0x1000, 0x8c00, 0x1000, 0x8e00, 0x1000, 0x87fc, 0x1000, 0x83fe, 0x1000, 0x8007, 0x1000, 0x8003, 0x1000, 0x8007, 0x1000, 0x860e, 0x1000, 0x87fc, 0x1000, 0x83f8, 0x1000, 0x8000, 0x1000, 0xffff, 0xf000 }; #define PLNUM 0x01 /* number of planes in image */ #define PLPICK 0x02 /* display in plane 1 */ #define PLOFF 0x01 /* plane 0 turned on */ struct Image Gadgpic[7] = { /* image 0 */ 0, 0, 20, 18, PLNUM, &Imgadget0[0], PLPICK, PLOFF, NULL, /* image 1 */ 0, 0, 20, 18, PLNUM, &Imgadget1[0], PLPICK, PLOFF, NULL, /* image 2 */ 0, 0, 20, 18, PLNUM, &Imgadget2[0], PLPICK, PLOFF, NULL, /* image 3 */ 0, 0 , 20, 18, PLNUM, &Imgadget3[0], PLPICK, PLOFF, NULL, /* image 4 */ 0, 0, 20, 18, PLNUM, &Imgadget4[0], PLPICK, PLOFF, NULL, /* image 5 */ 0, 0, 20, 18, PLNUM, &Imgadget5[0], PLPICK, PLOFF, NULL, /* image 6 */ 0, 0, 20, 18, PLNUM, &Imgadget6[0], PLPICK, PLOFF, NULL }; struct Gadget Arrow[7] = { /* Up left arrow 0 */ NULL, BASEPTX, BASEPTY, 20, 18, GADGHCOMP|GADGIMAGE, GADGIMMEDIATE|RELVERIFY, BOOLGADGET, &Gadgpic[0], NULL, NULL, NULL, NULL, NULL, NULL, /* Up right arrow 1 */ NULL, BASEPTX + 20, BASEPTY, 20, 18, GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE, BOOLGADGET, &Gadgpic[1], NULL, NULL, NULL, NULL, NULL, NULL, /* left arrow 2 */ NULL, BASEPTX - 10, BASEPTY + 18, 20, 18, GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE, BOOLGADGET, &Gadgpic[2], NULL, NULL, NULL, NULL, NULL, NULL, /* right arrow 3 */ NULL, BASEPTX + 30, BASEPTY + 18, 20, 18, GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE, BOOLGADGET, &Gadgpic[3], NULL, NULL, NULL, NULL, NULL, NULL, /* down left arrow 4 */ NULL, BASEPTX, BASEPTY + 36, 20, 18, GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE, BOOLGADGET, &Gadgpic[4], NULL, NULL, NULL, NULL, NULL, NULL, /* down right arrow 5 */ NULL, BASEPTX + 20, BASEPTY + 36, 20, 18, GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE, BOOLGADGET, &Gadgpic[5], NULL, NULL, NULL, NULL, NULL, NULL, /* sit 6 */ NULL, BASEPTX + 10, BASEPTY + 18, 20, 18, GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE, BOOLGADGET, &Gadgpic[6], NULL, NULL, NULL, NULL, NULL, NULL, }; /* These are the command characters returned to Amiga_getchar() * when a gadget is selected. */ char Gadtbl[] = { 'w', 'e', 'a', 'd', 'z', 'x', 's', '\0' }; /*************************************************************************/ /* */ /* Menu Stuff */ /* */ /*************************************************************************/ /* Main menu structure which has three entries: Deploy, Target and Help */ #define WID 112 #define WID2 130 struct Menu mymenu[3] = { NULL, 1, 0, WID, 0, MENUENABLED, NULL, NULL, 0, 0, 0, 0, NULL, WID + 1, 0, WID, 0, MENUENABLED, NULL, NULL, 0, 0, 0, 0, NULL, WID * 2 + 2, 0, WID, 0, MENUENABLED, NULL, NULL, 0, 0, 0, 0 }; /* Menu entries for the Deploy menu */ struct MenuItem Menu1[6] = { /* 1st item */ NULL, 0, 0, WID, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0, /* 2nd item */ NULL, 0, 10, WID, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0, /* 3rd item */ NULL, 0, 20, WID, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0, /* 4th item */ NULL, 0, 30, WID, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0, /* 5th item */ NULL, 0, 40, WID, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0, /* 6th item */ NULL, 0, 50, WID, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0 }; struct MenuItem Menu2[7] = { NULL, 0, 0, WID2, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0, /* 2nd item */ NULL, 0, 10, WID2, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0,0,0, /* 3rd item */ NULL, 0, 20, WID2, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0, /* 4th item */ NULL, 0, 30, WID2, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0, /* 5th item */ NULL, 0, 40, WID2, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0, /* 6th item */ NULL, 0, 50, WID2, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0, /* 7th item */ NULL, 0, 60, WID2, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0 }; struct MenuItem Menu3[1] = { /* 1st item */ NULL, 0, 0, WID2, 8, ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0 }; /* deploy menu titles */ UBYTE *Depstr[6] = { "C Command Post", "H Howitzer", "T Heavy Tank", "M Missile Tank", "G GEV", "I Infantry" }; /* target menu titles */ UBYTE *Tarstr[7] = { "t Treads", "b Main Battery", "s Secondary Batt", "m Missile", "a Anti-Personnel", "p Pass now", "r Resolve now" }; /* help menu title */ UBYTE *Helpstr = "? Instructions"; /* Menu strip titles */ UBYTE *Titles[] = { "Deploy", "Target", "Help" }; /* Menu item text message descriptors */ struct IntuiText MenuText[14] = {3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0, 3, 0, JAM1, 0, 0, &MyFont, 0, 0 }; /* These are the command characters associated with menu selections */ char Mentbl[3][7] = { {'C', 'H', 'T', 'M', 'G', 'I', '\0'}, /* deploy cmds */ {'t', 'b', 's', 'm', 'a', 'p', 'r'}, /* target cmds */ {'?', '\0', '\0', '\0', '\0', '\0', '\0'} /* help */ }; /***********************************************************************/ /* */ /* Requester Stuff */ /* */ /***********************************************************************/ char BodyText[] = "Choose an Ogre type"; char PosText[] = "Mark III"; char NegText[] = "Mark V"; struct IntuiText Body = { 3, 1, JAM1, 60, 10, NULL, &BodyText[0], NULL }; struct IntuiText Pos = { 3, 1, JAM1, 7, 4, NULL, &PosText[0], NULL }; struct IntuiText Neg = { 3, 1, JAM1, 7, 4, NULL, &NegText[0], NULL }; /***********************************************************************/ /* */ /* Toys Code */ /* */ /***********************************************************************/ /* getevent pulls a message off the program's message queue and checks if * it's a menu-related or gadget-related message. If it is, the appropriate * handler is called. */ char getevent() { char GadgetServe(), MenuServe(), result; struct IntuiMessage *GetMsg(), Tmpmsg; /* check queue for incoming messages */ Imsg = GetMsg(w->UserPort); if (Imsg == NULL) return('\0'); else Tmpmsg = *Imsg; ReplyMsg(Imsg); /* if message available, decode it */ if (Tmpmsg.Class != 0) { switch (Tmpmsg.Class) { /* could be a close window event */ case CLOSEWINDOW: endit(); break; /* or a menu selection */ case MENUPICK: result = MenuServe(&Tmpmsg); return(result); break; case GADGETUP: result = GadgetServe(&Tmpmsg); return (result); break; /* if no selection was made, return a null */ default: return('\0'); break; } } } /* checkmenu */ /* This routine invokes the requester that asks for Ogre type */ int get_mark() { int x; x = AutoRequest(w, &Body, &Pos, &Neg, 0L, 0L, 300L, 60L); if (x) x = 3; else x = 5; return(x); } /* Initmenu sets up the menus at the start of the program. * Nobody said this would be easy. */ InitMenu() { int i; /* link the three menus */ mymenu[0].NextMenu = &mymenu[1]; mymenu[1].NextMenu = &mymenu[2]; mymenu[2].NextMenu = NULL; /* point to first items on the menus */ mymenu[0].FirstItem = &Menu1[0]; mymenu[1].FirstItem = &Menu2[0]; mymenu[2].FirstItem = &Menu3[0]; /* initialize titles */ mymenu[0].MenuName = Titles[0]; mymenu[1].MenuName = Titles[1]; mymenu[2].MenuName = Titles[2]; /* link menu items */ for (i = 0; i < 6; ++i) Menu1[i].NextItem = &Menu1[i + 1]; Menu1[5].NextItem = NULL; for (i = 0; i < 7; ++i) Menu2[i].NextItem = &Menu2[i + 1]; Menu2[6].NextItem = NULL; Menu3[0].NextItem = NULL; /* link item names to text descriptors */ for (i = 0; i < 6; ++i) MenuText[i].IText = Depstr[i]; for (i = 0; i < 7; ++i) MenuText[6 + i].IText = Tarstr[i]; MenuText[13].IText = Helpstr; /* link text descriptors to item structures */ for (i = 0; i < 6; ++i) Menu1[i].ItemFill = &MenuText[i]; for (i = 0; i < 7; ++i) Menu2[i].ItemFill = &MenuText[6 + i]; Menu3[0].ItemFill = &MenuText[13]; SetMenuStrip(w, &mymenu[0]); } /* InitGad sets up the gadgets before the game starts */ InitGad() { int i; /* link Image structures to Gadget structures */ for (i = 0; i < 6; ++i) Arrow[i].GadgetRender = (APTR) &Gadgpic[i]; /* link image data to Image structures */ Gadgpic[0].ImageData = &Imgadget0[0]; Gadgpic[1].ImageData = &Imgadget1[0]; Gadgpic[2].ImageData = &Imgadget2[0]; Gadgpic[3].ImageData = &Imgadget3[0]; Gadgpic[4].ImageData = &Imgadget4[0]; Gadgpic[5].ImageData = &Imgadget5[0]; Gadgpic[6].ImageData = &Imgadget6[0]; Arrow[6].NextGadget = NULL; } refresh() { int i; RefreshGadgets(&Arrow[0], w, NULL); /* Add the gadgets to the window's gadget list and activate them */ for (i = 0; i < 7; ++i) { AddGadget(w, &Arrow[i], -1); OnGadget(&Arrow[i], w, NULL); } } /* MenuServe decodes menu request messages and translates them into the * proper character to hand to main program. */ char MenuServe(Menmsg) struct IntuiMessage *Menmsg; { USHORT menusel, itemsel; /* menu and item selected */ char selection; /* extract the menu and item numbers */ menusel = MENUNUM(Menmsg->Code); itemsel = ITEMNUM(Menmsg->Code); if (menusel == MENUNULL) return(NULL); /* get the command character from the table */ selection = Mentbl[menusel][itemsel]; return(selection); } /* GadgetServe translates a gadget selection into a command character * and returns that character. */ char GadgetServe(GadMsg) struct IntuiMessage *GadMsg; { int i; for (i = 0; i < 7; ++i) if (GadMsg->IAddress == (APTR) &Arrow[i]) break; return (Gadtbl[i]); } /* * These are the calls known to the rest of the Ogre program */ tc_setup() { make_console(); } /* This is not a true erase to end of line routine, since we want * to preserve the gadget display. It erases to column 55. */ eeol(row) int row; { static char s[55] = {" "}; movecur(row,0); Amiga_puts(s); movecur(row,0); } clear_screen() { static char ff = 0x0c; ConPutChar(WriteMsg,&ff); } /* * Move the cursor to row, col by building a CSI sequence */ movecur(row, col) int row, col; { char seq[8]; int n,i; row += 1; /* Kludge city! The Amiga display is shorter than a terminal */ /* CSI character */ seq[0] = 0x9b; /* convert row to ASCII */ n = stci_d(&seq[1], row, 4); i = n + 1; /* field separator */ seq[i] = 0x3b; i++; /* convert column to ASCII */ n = stci_d(&seq[i], col, 4); i += n; /* terminator */ seq[i] = 0x48; seq[i+1] = '\0'; ConPutStr(WriteMsg, &seq[0]); } set_term() { cursoff(WriteMsg); } reset_term() { endit(); } /* * These are mine. They insulate the rest of the files from knowing anything * about message ports and other messy stuff. */ Amiga_puts(s) char *s; { ConPutStr(WriteMsg, s); } /* Put a single char out. This is weird: take away the static, and it no * longer works! */ Amiga_putchar(c) char c; { static char x; x = c; ConPutChar(WriteMsg, &x); } /* Get a character from the keyboard or a close window event from the * mouse. A close window event ends the program. * If you want to add menus then this is the place to do it. */ char Amiga_getchar() { static char c; BYTE MayGetChar(); struct IntuiMessage *GetMsg(); char checkmenu(), event; BYTE ret; FOREVER { ret = 0; /* first, check for keyboard input */ ret = MayGetChar(ReadPort, ReadMsg, &c); if (ret != -1) { /* Trap help requests here, so that help can be obtained * from anywhere in the program. */ if (ret == HELPKEY) ret = get_help(); else return((char) ret); } /* if no keyboard chars are ready, check our message port for * menus and gadgets. */ if ((event = getevent()) != '\0') { if (event == HELPKEY) ret = get_help(); else return(event); } } } endit() { err(7); exit(0); } /* * This stuff is from the ROM Kernel Manual */ make_console() { int error; UBYTE c; if ((DosBase = OpenLibrary("dos.library", 0)) == NULL) err(1); if ((IntuitionBase = OpenLibrary("intuition.library", 0)) == NULL) err(2); if ((GfxBase = OpenLibrary("graphics.library", 0)) == NULL) err(3); WritePort = CreatePort("con1.write", 0); if (WritePort == 0) err(4); WriteMsg = CreateStdIO(WritePort); if (WriteMsg == 0) err(19); ReadPort = CreatePort("con1.read", 0); if (ReadPort == 0) err(5); ReadMsg = CreateStdIO(ReadPort); if (ReadMsg == 0) err(12); scrn = (struct Screen *) OpenScreen(&ns); if (scrn == NULL) { printf("Can't open window"); exit(20); } nw.Screen = scrn; w = (struct Window *) OpenWindow(&nw); if (w == NULL) err(6); /* link gadgets into window */ InitGad(); /* link menus into window */ InitMenu(); error = OpenConsole(WriteMsg, ReadMsg, w); if (error != 0) err(7); QueueRead(ReadMsg, &c); c = CheckIO(ReadMsg); if (c == FALSE) AbortIO(ReadMsg); else GetMsg(ReadPort); } /* * This routine is ugly. Please fix it. */ static err(n) int n; { switch (n) { case 7: CloseDevice(WriteMsg); case 6: CloseWindow(w); case 10: CloseScreen(scrn); case 5: DeletePort(ReadPort); case 12: DeleteStdIO(ReadMsg); case 4: DeletePort(WritePort); case 19: DeleteStdIO(WriteMsg); case 3: CloseLibrary(GfxBase); case 2: CloseLibrary(IntuitionBase); case 1: CloseLibrary(DosBase); } exit(n); /* return error code to CLI */ } OpenConsole(wreq, rreq, win) struct IOStdReq *wreq, *rreq; struct Window *win; { int error; wreq->io_Data = (APTR) win; wreq->io_Length = sizeof(*win); error = OpenDevice("console.device", 0, wreq, 0); rreq->io_Device = wreq->io_Device; rreq->io_Unit = wreq->io_Unit; return(error); } ConPutChar(request, ch) struct IOStdReq *request; char *ch; { request->io_Command = CMD_WRITE; request->io_Data = ch; request->io_Length = 1; DoIO(request); return(0); } ConWrite(request, string, len) struct IOStdReq *request; char *string; int len; { request->io_Command = CMD_WRITE; request->io_Data = (APTR) string; request->io_Length = len; DoIO(request); return(0); } ConPutStr(request, string) struct IOStdReq *request; char *string; { request->io_Command = CMD_WRITE; request->io_Data = (APTR) string; request->io_Length = -1; DoIO(request); return(0); } QueueRead(request, buf) struct IOStdReq *request; UBYTE *buf; { request->io_Command = CMD_READ; request->io_Data = (APTR)buf; request->io_Length = 1; SendIO(request); return(0); } char ConGetChar(console, request, buf) struct IOStdReq *request; struct MsgPort *console; char *buf; { char temp; while ((GetMsg(console) == NULL)) WaitPort(console); QueueRead(request, buf); temp = *buf; return(temp); } BYTE MayGetChar(console,rreq, buf) struct IOStdReq *rreq; struct MsgPort *console; char *buf; { register BYTE *temp; if (GetMsg(console) == NULL) return(-1); temp = (char *) rreq->io_Data; QueueRead(rreq, buf); return(*temp); } @@@End of termcap.c echo x - linkfile 1>&2 cat >linkfile <<'@@@End of linkfile' from lc:lib/Lstartup.obj termcap.o map.o resolve.o attack.o move.o * help.o init.o ogrecom.o initround.o ogrestat.o main.o to ogre library lc:lib/lc.lib lc:lib/amiga.lib @@@End of linkfile -- Hobie Orris | SoftQuad Inc., Toronto, Ont. |"There'll be no more giant leeches {ihnp4 | decvax | ? }!utzoo!sq!hobie | When you find the good Lord Jesus"
mwm@eris.UUCP (02/24/87)
In article <1987Feb22.120108.9220@sq.uucp> hobie@sq.uucp (Hobie Orris) writes: >I would also like it if someone who knows the commercial version >would mail me a comparative review. I'd like to know if we both used the same >source code as a basis. I looked at your version long enough to decide you probably started with the Unix version that I hacked on 3 or 4 years ago (and you started with the original! Gack! Lots of missing, near vital features). I've also got the Origin Systems game. I haven't played your version, so I a comparative review isn't in the works. If it shows up on a Fish disk, I'll do one. In any case, Origin Systems Inc. probably didn't start with the Unix source code. They are much truer to the original Ogre: same board, infantry handled correctly, etc. If they did start with the Unix source code, they did far more work turning it into what they're selling (besides the misfeature fixes, they also put in good graphics & sound effects) than any of the three people who worked on the latest version to be found on the net (not including Hobie's, which I haven't looked at). I meant to post a review of the game, recommending it. The _only_ flaw is that it's copy-protected. Would-be-nice things they left out are optional features from the game (where's my mobil command post!?!?). <mike But I'll survive, no you won't catch me, Mike Meyer I'll resist the urge that is tempting me, ucbvax!mwm I'll avert my eyes, keep you off my knee, mwm@berkeley.edu But it feels so good when you talk to me. mwm@ucbjade.BITNET