1   import java.util.*;
2   import java.awt.*;
3   import java.awt.event.*;
4   import java.applet.*;
5   import java.awt.geom.*;
6   import java.awt.image.*;
7   
8   /**
9    * Defines the Shop where the Player can buy Items, Save
10   * Heal his Monsters, and Switch Monsters from Home to his Hand.
11   * 
12   * @see ShopEndEvent
13   * @see SaveEvent
14   * @see Player
15   * @author Matt, Sam
16   * @version 4.5.7.8
17   */
18  
19  public class Shop extends Component 
20  {
21      /**
22       * The Player to work with
23       */
24      Player p;
25      /**
26       * The Image of the Shop
27       */
28      Image bg;
29  
30      /**
31       * The Listeners for ShopEndEvent
32       */
33      Vector shopEndListeners;
34      /**
35       * The listeners for SaveEvent
36       */
37      Vector saveGameListeners;
38  
39      // The positions for drawing
40      /**
41       * The starting x-position
42       */
43      private static final int XST = 47;
44      /**
45       * The starting y-position for shelf 1
46       */
47      private static final int YST = 43;
48      /**
49       * The starting y-position for shelf 2
50       */
51      private static final int YST2 = 121;
52      /**
53       * The width of the Items plus change
54       */
55      private static final int XWT = 54;
56      /**
57       * The x temporal transition
58       */
59      private static final int XTT = 27;
60      /**
61       * The y height for items
62       */
63      private static final int YWT = 50;
64      // The Prices for items
65      /**
66       * The price for HP Up Full
67       */
68      private static final int HPUPF = 500;
69      /**
70       * The price for HP Up Half
71       */
72      private static final int HPUPH = 250;
73      /**
74       * The price for HP Up Third
75       */
76      private static final int HPUPT = 167;
77      /**
78       * The price for Defense Up
79       */
80      private static final int DEFUP = 200;
81      /**
82       * The price for Attack Up
83       */
84      private static final int ATTUP = 200;
85      /**
86       * The price for Normal MonsterBalls
87       */
88      private static final int NORMA = 150;
89      /**
90       * The price for Master MonsterBalls
91       */
92      private static final int MASTE = 300;
93  
94      // What is being done.
95      /**
96       * Constant for buying
97       */
98      private static final int BUY = 0;
99      /**
100      * Constant for Shopping
101      */
102     private static final int SHOP = 1;
103     /**
104      * onstant for Switching
105      */
106     private static final int SWITCH = 2;
107     /**
108      * Constant for Healing
109      */
110     private static final int HEAL = 3;
111     /**
112      * Constant for Saving
113      */
114     private static final int SAVE = 4;
115     /**
116      * Constant for Leaving
117      */
118     private static final int LEAVE = 5;
119     /**
120      * Constant for Switching Hand Portion
121      */
122     private static final int SWITCHH = 6;
123 
124     /**
125      * Many int needed to speciy drawing regions
126      */
127     int shelf, sel, sel2, xs, ys, ys2, op, start, start2;
128     /**
129      * What is displayed to Player
130      */
131     String[] disp;
132     /**
133      * The Options for the Player
134      */
135     String[] ops;
136 
137     /**
138      * Construct a Shop Object with a Player and an Image.
139      * 
140      * @param p the Player to use
141      * @param bg the Image of the Shop
142      */
143     public Shop(Player p, Image bg)
144     {
145         this.p = p;
146         this.bg = bg;
147         sel = 0;
148         shelf = 0;
149         op = 0;
150         start = 0;
151         xs = XST;
152         ys = YST;
153 
154         disp = new String[2];
155         disp[0] = "Howdy partner!";
156         disp[1] = "How may I help you?";
157 
158         ops = new String[5];
159         ops[0] = "Buy";
160         ops[1] = "Heal";
161         ops[2] = "Switch";
162         ops[3] = "Save";
163         ops[4] = "Leave";
164 
165         enableEvents(AWTEvent.KEY_EVENT_MASK);
166     }
167 
168     /**
169      * Handle Events that are passed into this.
170      * Overrides implementation for KeyEvent.KEY_PRESSED
171      * and KeyEvent.KEY_RELEASED, allows super to deal with the rest
172      * 
173      * @param e the AWTEvent to handle
174      * @see AWTEvent
175      */
176     public void processEvent(AWTEvent e)
177     {
178         if(e.getID() == KeyEvent.KEY_PRESSED)
179         {
180             switch(((KeyEvent)e).getKeyCode())
181             {
182                 case KeyEvent.VK_LEFT:
183                 {
184                     if(op == BUY)
185                     {
186                         if(sel != 0)
187                         {
188                             sel--;
189                             xs += XWT + XTT;
190                             repaint(7, 343, 600, 100);
191                         }
192                         else
193                         {
194                             sel = ops.length-1;
195                             xs = XST;
196                             repaint(7, 343, 600, 100);
197                         }
198                     }
199                     else if(op == SWITCH || op == SWITCHH)
200                     {
201                         if(sel == 0)
202                         {
203                             if(start == 0)
204                             {
205                                 if(ops.length - 5 >= 0)
206                                     start = ops.length-5;
207                                 else
208                                     start = 0;
209                                 sel = ops.length-1-start;
210                             }
211                             else if( (start - 5) >= 0)
212                             {
213                                 start -= 5;
214                                 sel = 0;
215                             }
216                             else
217                             {
218                                 start = 0;
219                                 sel = 0;
220                             }
221                             xs = XST;
222                         }
223                         else
224                         {
225                             sel--;
226                             xs += XWT + XTT;
227                         }
228                         repaint(7, 343, 600, 100);
229                     }
230                     else if(op == SHOP)
231                     {
232                         if(shelf == 0)
233                         {
234                             if(sel == 0)
235                             {
236                                 sel = 4;
237                                 repaint(xs, ys, XWT+XTT, YWT+7);
238                                 xs = (XST + (XWT + XTT) * 4);
239                                 repaint(xs, ys, XWT+XTT, YWT+7);
240                             }
241                             else
242                             {
243                                 sel--;
244                                 repaint(xs, ys, XWT+XTT, YWT+7);
245                                 xs -= XWT + XTT;
246                                 repaint(xs, ys, XWT+XTT, YWT+7);
247                             }
248                         }
249                         else
250                         {
251                             if(sel == 0)
252                             {
253                                 sel = 1;
254                                 repaint(xs, ys, XWT+XTT, YWT+7);
255                                 xs = XST + XWT + XTT;
256                                 repaint(xs, ys, XWT+XTT, YWT+7);
257                             }
258                             else
259                             {
260                                 sel--;
261                                 repaint(xs, ys, XWT+XTT, YWT+7);
262                                 xs = XST;
263                                 repaint(xs, ys, XWT+XTT, YWT+7);
264                             }
265                         }
266                     }
267                     break;
268                 }
269                 case KeyEvent.VK_RIGHT:
270                 {
271                     if(op == BUY)
272                     {
273                         if(sel == ops.length-1)
274                         {
275                             start = 0;
276                             sel = 0;
277                         }
278                         else
279                         {
280                             sel++;
281                         }
282                         repaint(7, 343, 600, 100);
283                     }
284                     else if(op == SWITCH || op == SWITCHH)
285                     {
286                         if((sel+start) == ops.length-1)
287                         {
288                             start = 0;
289                             sel = 0;
290                         }
291                         else if(sel == 4)
292                         {
293                             if((start+5) < ops.length)
294                             {
295                                 start += 5;
296                                 sel = 0;
297                             }
298                             else
299                             {
300                                 start = ops.length-5;
301                                 sel = 0;
302                             }
303                         }
304                         else
305                             sel++;
306                         repaint(7, 343, 600, 100);
307                     }
308                     else if(op == SHOP)
309                     {
310                         if(shelf == 0)
311                         {
312                             if(sel == 4)
313                             {
314                                 sel = 0;
315                                 repaint(xs, ys, XWT+XTT, YWT+7);
316                                 xs = XST;
317                                 repaint(xs, ys, XWT+XTT, YWT+7);
318                             }
319                             else
320                             {
321                                 sel++;
322                                 repaint(xs, ys, XWT+XTT, YWT+7);
323                                 xs += XWT + XTT;
324                                 repaint(xs, ys, XWT+XTT, YWT+7);
325                             }
326                         }
327                         else
328                         {
329                             if(sel == 1)
330                             {
331                                 sel = 0;
332                                 repaint(xs, ys, XWT+XTT, YWT+7);
333                                 xs = XST;
334                                 repaint(xs, ys, XWT+XTT, YWT+7);
335                             }
336                             else
337                             {
338                                 sel++;
339                                 repaint(xs, ys, XWT+XTT, YWT+7);
340                                 xs = XST + XWT + XTT;
341                                 repaint(xs, ys, XWT+XTT, YWT+7);
342                             }
343                         }
344                     }
345                     break;
346                 }
347                 case KeyEvent.VK_DOWN:
348                 {
349                     if(op == SHOP)
350                     {
351                         sel = 0;
352                         if(shelf == 0)
353                         {
354                             shelf++;
355                             repaint(xs, ys, XWT+XTT, YWT+7);
356                             xs = XST;
357                             ys = YST2;
358                             repaint(xs, ys, XWT+XTT, YWT+7);
359                         }
360                         else
361                         {
362                             shelf = 0;
363                             repaint(xs, ys, XWT+XTT, YWT+7);
364                             xs = XST;
365                             ys = YST;
366                             repaint(xs, ys, XWT+XTT, YWT+7);
367                         }
368                     }
369                     break;
370                 }
371                 case KeyEvent.VK_UP:
372                 {
373                     if(op == SHOP)
374                     {
375                         sel = 0;
376                         if(shelf == 1)
377                         {
378                             shelf--;
379                             repaint(xs, ys, XWT+XTT, YWT+7);
380                             xs = XST;
381                             ys = YST;
382                             repaint(xs, ys, XWT+XTT, YWT+7);
383                         }
384                         else
385                         {
386                             shelf = 1;
387                             repaint(xs, ys, XWT+XTT, YWT+7);
388                             xs = XST;
389                             ys = YST2;
390                             repaint(xs, ys, XWT+XTT, YWT+7);
391                         }
392                     }
393                     break;
394                 }
395                 case KeyEvent.VK_ENTER:
396                 case KeyEvent.VK_SPACE:
397                 {
398                     repaint(xs, ys, XWT+XTT, YWT+7);
399                     if(op == BUY)
400                     {
401                         if(sel == 4)
402                             fireEvent(p);
403                         else if(sel == 0)
404                         {
405                             shelf = 0;
406                             sel = 0;
407                             start = 0;
408                             disp = new String[2];
409                             disp[0] = "Please Choose a Selection.";
410                             disp[1] = "You have: $" + p.getMoney();
411                             ops = new String[1];
412                             ops[0] = "";
413                             op = SHOP;
414                         }
415                         else if(sel == 1)
416                         {
417                             p.healAllMonsters();
418                             disp = new String[2];
419                             disp[0] = "All Your Monsters have been healed";
420                             disp[1] = "Good Luck Pardner.";
421                             ops = new String[1];
422                             ops[0] = "";
423                             op = HEAL;
424                         }
425                         else if(sel == 2)
426                         {
427                             int num = p.getNumberOfMonstersAtHome();
428                             if(num > 0)
429                             {
430                                 sel = 0;
431                                 shelf = 0;
432                                 start = 0;
433                                 disp = new String[2];
434                                 disp[0] = "Please choose the Monster from";
435                                 disp[1] = "home to switch into your hand";
436                                 ops = new String[num];
437                                 System.out.println(num);
438                                 for(int i = 0; i < num; i++)
439                                 {
440                                     ops[i] = p.getMonsterAtHome(i).getName();
441                                 }
442                                 op = SWITCH;
443                             }
444                             else
445                             {
446                                 sel = 0;
447                                 shelf = 0;
448                                 start = 0;
449                                 xs = XST;
450                                 ys = YST;
451 
452                                 disp = new String[2];
453                                 disp[0] = "Howdy partner!";
454                                 disp[1] = "How may I help you?";
455 
456                                 ops = new String[5];
457                                 ops[0] = "Buy";
458                                 ops[1] = "Heal";
459                                 ops[2] = "Switch";
460                                 ops[3] = "Save";
461                                 ops[4] = "Leave";
462                                 op = BUY;
463                             }
464                         }
465                         else if(sel == 3)
466                         {
467                             fireSaveEvent(p);
468 
469                             sel = 0;
470                             shelf = 0;
471                             start = 0;
472                             xs = XST;
473                             ys = YST;
474 
475                             disp = new String[2];
476                             disp[0] = "Howdy partner!";
477                             disp[1] = "How may I help you?";
478 
479                             ops = new String[5];
480                             ops[0] = "Buy";
481                             ops[1] = "Heal";
482                             ops[2] = "Switch";
483                             ops[3] = "Save";
484                             ops[4] = "Leave";
485                             op = BUY;
486                         }
487                     }
488                     else if(op == HEAL)
489                     {
490                         sel = 0;
491                         shelf = 0;
492                         start = 0;
493                         xs = XST;
494                         ys = YST;
495 
496                         disp = new String[2];
497                         disp[0] = "Howdy partner!";
498                         disp[1] = "How may I help you?";
499 
500                         ops = new String[5];
501                         ops[0] = "Buy";
502                         ops[1] = "Heal";
503                         ops[2] = "Switch";
504                         ops[3] = "Save";
505                         ops[4] = "Leave";
506                         op = BUY;
507                     }
508                     else if(op == SWITCH)
509                     {
510                         sel2 = start + sel;
511                         sel = 0;
512                         start = 0;
513                         disp = new String[2];
514                         disp[0] = "Please choose the Monster from";
515                         disp[1] = "your hand to send home";
516                         int num = p.getNumberOfMonsters();
517                         if(num > 0)
518                         {
519                             ops = new String[num];
520                             for(int i = 0; i < num; i++)
521                             {
522                                 ops[i] = p.getMonster(i).getName();
523                             }
524                             op = SWITCHH;
525                         }
526                         else
527                         {
528                             shelf = 0;
529                             xs = XST;
530                             ys = YST;
531 
532                             disp = new String[2];
533                             disp[0] = "Howdy partner!";
534                             disp[1] = "How may I help you?";
535 
536                             ops = new String[5];
537                             ops[0] = "Buy";
538                             ops[1] = "Heal";
539                             ops[2] = "Switch";
540                             ops[3] = "Save";
541                             ops[4] = "Leave";
542                             op = BUY;
543                         }
544                     }
545                     else if(op == SWITCHH)
546                     {
547                         p.switchMonster(p.getMonster(sel), p.getMonsterAtHome(sel2));
548                         sel = 0;
549                         sel2 = 0;
550                         shelf = 0;
551                         start = 0;
552                         xs = XST;
553                         ys = YST;
554 
555                         disp = new String[2];
556                         disp[0] = "Howdy partner!";
557                         disp[1] = "How may I help you?";
558 
559                         ops = new String[5];
560                         ops[0] = "Buy";
561                         ops[1] = "Heal";
562                         ops[2] = "Switch";
563                         ops[3] = "Save";
564                         ops[4] = "Leave";
565                         op = BUY;
566                     }
567                     else if(op == SHOP)
568                     {
569                         if(checkMoney())
570                         {
571                             sel = 0;
572                             shelf = 0;
573                             start = 0;
574                             xs = XST;
575                             ys = YST;
576 
577                             disp = new String[2];
578                             disp[0] = "Howdy partner!";
579                             disp[1] = "How may I help you?";
580 
581                             ops = new String[5];
582                             ops[0] = "Buy";
583                             ops[1] = "Heal";
584                             ops[2] = "Switch";
585                             ops[3] = "Save";
586                             ops[4] = "Leave";
587                             op = BUY;
588                         }
589                         else
590                         {
591                             disp = new String[3];
592                             disp[0] = "Now See Here!";
593                             disp[1] = "Ya'all ain't got enough money, partner.";
594                             disp[2] = "Press escape to continue.";
595                         }
596                     }
597                     repaint(7, 343, 600, 100);
598                     break;
599                 }
600                 case KeyEvent.VK_ESCAPE:
601                 {
602                     repaint(xs, ys, XWT+XTT, YWT+7);
603                     sel = 0;
604                     sel2 = 0;
605                     shelf = 0;
606                     start = 0;
607                     xs = XST;
608                     ys = YST;
609                     op = BUY;
610 
611                     disp = new String[2];
612                     disp[0] = "Howdy partner!";
613                     disp[1] = "How may I help you?";
614 
615                     ops = new String[5];
616                     ops[0] = "Buy";
617                     ops[1] = "Heal";
618                     ops[2] = "Switch";
619                     ops[3] = "Save";
620                     ops[4] = "Leave";
621                     repaint(7, 343, 600, 100);
622                     break;
623                 }
624             }
625         }
626         super.processEvent(e);
627     }
628 
629     /**
630      * Overriden to only call paint without first
631      * painting a background first, removes the flicker effect
632      * 
633      * @param g the Graphics
634      */
635     public void update(Graphics g)
636     {
637         paint(g);
638     }
639     /**
640      * Draw the Shop, and handle selection highlighting
641      * 
642      * @param g the Graphics
643      */
644     public void paint(Graphics g)
645     {
646         g.setColor(Color.white);
647         g.fillRect(0, 0, 640, 450);
648         g.drawImage(bg, 0, 0, this);
649 
650         drawText(g);
651 
652         if(op == SHOP)
653         {
654             g.setColor(Color.red);
655             g.drawRect(xs, ys, XWT, YWT);
656         }
657     }
658 
659     /**
660      * Draws the text that is presented to the Player
661      * 
662      * @param g the Graphics
663      */
664     private void drawText(Graphics g)
665     {
666         int xp = 7;
667         int yp = 343;
668 
669         g.setColor(Color.white);
670         g.fillRect(xp, yp, 600, 100);
671 
672         g.setColor(Color.black);
673         int ym = yp+20;
674         for(int i = 0; i < disp.length; i++)
675         {
676             g.drawString(disp[i], xp+8, ym+8);
677             ym += g.getFontMetrics().getHeight();
678         }
679         for(int i = start, j = 0, xm = xp+10; i < ops.length && j < 5; i++, j++)
680         {
681             if(i == sel+start)
682                 g.setColor(Color.red);
683             else
684                 g.setColor(Color.black);
685             g.drawString(ops[i], xm+8, ym+8);
686             xm += g.getFontMetrics().stringWidth(ops[i]) + 10;
687         }
688     }
689 
690     /**
691      * Add a Class to fire ShopEndEvents into
692      * 
693      * @param bl the Class that wishes to be informed
694      * @see ShopEndListener
695      * @see ShopEndEvent
696      */
697     public void addShopEndListener(ShopEndListener bl)
698     {
699         if ( shopEndListeners == null )
700             shopEndListeners = new Vector();
701         shopEndListeners.addElement( bl );
702     }
703     /**
704      * Removes a Class to fire ShopEndEvents into
705      * 
706      * @param bl the Class that wishes to not be informed anymore
707      * @see ShopEndListener
708      * @see ShopEndEvent
709      */
710     public void removeShopListener(ShopEndListener bl)
711     {
712         if ( shopEndListeners != null )
713             shopEndListeners.removeElement( bl );
714     }
715     /**
716      * Add a Class to fire SaveEvent into
717      * 
718      * @param bl the Class that wishes to be informed
719      * @see SaveListener
720      * @see SaveEvent
721      */
722     public void addSaveListener(SaveListener bl)
723     {
724         if ( saveGameListeners == null )
725             saveGameListeners = new Vector();
726         saveGameListeners.addElement( bl );
727     }
728     /**
729      * Removes a Class to fire SaveEvent into
730      * 
731      * @param bl the Class that wishes to not be informed anymore
732      * @see SaveListener
733      * @see SaveEvent
734      */
735     public void removeSaveListener(SaveEvent bl)
736     {
737         if ( saveGameListeners != null )
738             saveGameListeners.removeElement( bl );
739     }
740     /**
741      * Fires the ShopEndEvent to all listeners
742      * 
743      * @param p the Player to pass to listeners
744      */
745     private void fireEvent(Player p) 
746     {
747         if ( shopEndListeners == null )
748             return;
749         ShopEndEvent event = new ShopEndEvent(this, ShopEndEvent.SHOP_ENDED, p);
750         for (Enumeration e = shopEndListeners.elements(); e.hasMoreElements(); )
751             ((ShopEndListener)e.nextElement()).shopEnd( event );
752     }
753 
754     /**
755      * Fires the SaveEvent to all listeners
756      * 
757      * @param p the Player to pass to listeners
758      */
759     private void fireSaveEvent(Player p)
760     {
761         if ( saveGameListeners == null )
762             return;
763         SaveEvent event = new SaveEvent(this, SaveEvent.SAVE_GAME, p);
764         for (Enumeration e = saveGameListeners.elements(); e.hasMoreElements(); )
765             ((SaveListener)e.nextElement()).saveGame( event );
766     }
767     /**
768      * Determines if the Player has enough money
769      * to buy the Item selected.
770      * 
771      * @return true iff Player has enough money for Item selected
772      */
773     private boolean checkMoney()
774     {
775         int mon = p.getMoney();
776         switch(shelf)
777         {
778             case 0: // Add a potion
779             {
780                 switch(sel)
781                 {
782                     case 0:
783                     {
784                         if(mon >= HPUPF)
785                         {
786                             p.setMoney(mon - HPUPF);
787                             p.addItem(new PotionItem("HP Up Full", PotionItem.HPUPFULL));
788                             return true;
789                         }
790                         return false;
791                     }
792                     case 1:
793                     {
794                         if(mon >= HPUPH)
795                         {
796                             p.setMoney(mon - HPUPH);
797                             p.addItem(new PotionItem("HP Up Half", PotionItem.HPUPHALF));
798                             return true;
799                         }
800                         return false;
801                     }
802                     case 2:
803                     {
804                         if(mon >= HPUPT)
805                         {
806                             p.setMoney(mon- HPUPT);
807                             p.addItem(new PotionItem("HP Up Third", PotionItem.HPUPTHIRD));
808                             return true;
809                         }
810                         return false;
811                     }
812                     case 3:
813                     {
814                         if(mon >= ATTUP)
815                         {
816                             p.setMoney(mon - ATTUP);
817                             p.addItem(new PotionItem("Attack Up", PotionItem.ATTUP));
818                             return true;
819                         }
820                         return false;
821                     }
822                     case 4:
823                     {
824                         if(mon >= DEFUP)
825                         {
826                             p.setMoney(mon - DEFUP);
827                             p.addItem(new PotionItem("Defense Up", PotionItem.DEFUP));
828                             return true;
829                         }
830                         return false;
831                     }
832                 }
833                 break;
834             }
835             case 1: // Add a Ball
836             {
837                 switch(sel)
838                 {
839                     case 0:
840                     {
841                         if(mon >= NORMA)
842                         {
843                             p.setMoney(mon - NORMA);
844                             p.addItem(new MonsterBallItem("Normal MonsterBall", MonsterBallItem.NORMAL));
845                             return true;
846                         }
847                         return false;
848                     }
849                     case 1:
850                     {
851                         if(mon >= MASTE)
852                         {
853                             p.setMoney(mon - MASTE);
854                             p.addItem(new MonsterBallItem("Master MonsterBall", MonsterBallItem.MASTER));
855                             return true;
856                         }
857                         return false;
858                     }
859                 }
860                 break;
861             }
862         }
863         return false;
864     }
865 }