home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / macabuse / src / statbar.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  8.4 KB  |  353 lines

  1. #include "sbar.hpp"
  2. #include "view.hpp"
  3. #include "lisp.hpp"
  4. #include "cache.hpp"
  5. #include "demo.hpp"
  6. #include "chars.hpp"
  7. #include "objects.hpp"
  8. #include "game.hpp"
  9. #include "clisp.hpp"
  10. #include "dprint.hpp"
  11.  
  12. status_bar sbar;
  13.  
  14. status_bar::status_bar()
  15. {
  16.   v=NULL;
  17.   need_rf=1;
  18.   changed_cursor=0;
  19.   icon_in_selection=-1;  // the weapon the mouse cursor is on top of, -1 if none
  20.   currently_selected_weapon=-1;
  21. }
  22.  
  23. // defined in dev.c
  24. void scale_put_trans(image *im, image *screen, int x, int y, short new_width, short new_height);
  25. void scale_put(image *im, image *screen, int x, int y, short new_width, short new_height);
  26. extern image *small_render;
  27.  
  28.  
  29. void status_bar::load()
  30. {
  31.   char sbname[100];
  32.   char iname[20];
  33.   void *l_name=make_find_symbol("sbar_file");
  34.   if (symbol_value(l_name)!=l_undefined)
  35.     strcpy(sbname,lstring_value(symbol_value(l_name)));
  36.   else strcpy(sbname,"art/statbar.spe");
  37.  
  38.   int i;
  39.   for (i=0;i<TOTAL_WEAPONS;i++)
  40.   {
  41.     sprintf(iname,"bweap%04d.pcx",i+1);
  42.     bweap[i]=cash.reg(sbname,iname,SPEC_IMAGE);
  43.  
  44.     sprintf(iname,"dweap%04d.pcx",i+1);
  45.     dweap[i]=cash.reg(sbname,iname,SPEC_IMAGE);    
  46.   }
  47.  
  48.   for (i=0;i<30;i++)
  49.   {
  50.     sprintf(iname,"bnum%02d",i);
  51.     bnum[i]=cash.reg(sbname,iname,SPEC_IMAGE);
  52.   }
  53.  
  54.   
  55.   sbar=cash.reg(sbname,"sbar",SPEC_IMAGE);
  56.   sbar_select=cash.reg(sbname,"sbar_select",SPEC_IMAGE);
  57.   sbar_numpad=cash.reg(sbname,"sbar_numpad",SPEC_IMAGE);
  58. }
  59.  
  60. void status_bar::draw_num(image *screen, int x, int y, int num, int *offset)
  61. {
  62.   if (num<0 || num>999)
  63.   {
  64.     dprintf("bad number for statbar\n");
  65.     return ; 
  66.   }
  67.  
  68.   image *im=cash.img(*offset);
  69.   int dw=small_render ? im->width()*2 : im->width();
  70.   int dh=small_render ? im->height()*2 : im->height();
  71.  
  72.   int n=num/100;    
  73.   scale_put(cash.img(offset[n]),screen,x,y,dw,dh);
  74.   num-=n*100;
  75.  
  76.   x+=dw; n=num/10;
  77.   scale_put(cash.img(offset[n]),screen,x,y,dw,dh);
  78.   num-=n*10;
  79.  
  80.   x+=dw;
  81.   scale_put(cash.img(offset[num]),screen,x,y,dw,dh);
  82. }
  83.  
  84.  
  85. void status_bar::redraw(image *screen)
  86. {
  87.   if (xres>320)
  88.     return ;
  89.  
  90.   need_rf=0;
  91.   if (!v) return ;
  92.  
  93.   if (total_weapons)
  94.   {
  95.     if (!playing_state(the_game->state)) return ;
  96.  
  97.     image *sb=cash.img(sbar);
  98.     
  99.     // status bar width & height
  100.     int sb_w=(small_render ? sb->width()*2 : sb->width()),
  101.     sb_h=(small_render ? sb->height()*2 : sb->height());
  102.  
  103.     // status bar x & y position
  104.     int sx=xres/2-sb_w/2,sy=yres-sb_h;
  105.  
  106.     // weapon x offset, and x add increment
  107.     int wx=small_render ? 80 : 40,wa=small_render ? 34*2 : 34;    
  108.  
  109.     // weapon icon width & height
  110.     int ww=small_render ? cash.img(bweap[0])->width()*2 : cash.img(bweap[0])->width();
  111.     int wh=small_render ? cash.img(bweap[0])->height()*2 : cash.img(bweap[0])->height();
  112.     
  113.  
  114.     // numpad y offset
  115.     int np_yo=small_render ? 42 : 21;
  116.     int np_w=small_render ? cash.img(sbar_numpad)->width()*2 : cash.img(sbar_numpad)->width();
  117.     int np_h=small_render ? cash.img(sbar_numpad)->height()*2 : cash.img(sbar_numpad)->height();
  118.  
  119.     // selection bar width * height
  120.     int sel_w=small_render ? cash.img(sbar_select)->width()*2 : cash.img(sbar_select)->width();
  121.     int sel_h=small_render ? cash.img(sbar_select)->height()*2 : cash.img(sbar_select)->height();
  122.  
  123.     int sel_off=small_render ?  8 : 4; 
  124.     scale_put(sb,screen,sx,sy,sb_w,sb_h);
  125.  
  126.     if (v->focus)
  127.       draw_num(screen,sx+(small_render ? 17*2 : 17),sy+(small_render ? 11*2 : 11),v->focus->hp(),bnum);
  128.  
  129.     int ammo_x,ammo_y;
  130.     if (small_render)
  131.     {
  132.       ammo_x=sx+52*2;
  133.       ammo_y=sy+25*2;
  134.     } else {ammo_x=sx+52; ammo_y=sy+25; }
  135.     
  136.     int i,x_on=sx+wx,t=TOTAL_WEAPONS;
  137.     if (t>=total_weapons) t=total_weapons;
  138.     for (i=0;i<t;i++,x_on+=wa,ammo_x+=wa)
  139.     {
  140.       if (v->has_weapon(i))
  141.       {
  142.     if (v->current_weapon==i)
  143.         scale_put_trans(cash.img(bweap[i]),screen,x_on,sy,ww,wh);
  144.     else
  145.         scale_put_trans(cash.img(dweap[i]),screen,x_on,sy,ww,wh);
  146.     
  147.     scale_put_trans(cash.img(sbar_numpad),screen,x_on-2,sy+np_yo,np_w,np_h);
  148.  
  149.     if (v->current_weapon==i)
  150.           draw_num(screen,ammo_x,ammo_y,v->weapon_total(i),bnum+20);
  151.     else
  152.           draw_num(screen,ammo_x,ammo_y,v->weapon_total(i),bnum+10);
  153.         
  154.     if (i==icon_in_selection)
  155.         scale_put_trans(cash.img(sbar_select),screen,x_on+sel_off,sy,sel_w,sel_h);
  156.       }
  157.     }
  158.   }
  159. }
  160.  
  161. void status_bar::area(int &x1, int &y1, int &x2, int &y2)
  162. {
  163.   if (sbar<=0 || !total_weapons)
  164.   {
  165.     x2=xres;
  166.     y2=yres;
  167.     x1=x2;
  168.     y1=y2;
  169.     return ;
  170.   }
  171.  
  172.   image *sb=cash.img(sbar);  
  173.  
  174.   // status bar width & height
  175.   int sb_w=sb->width(),
  176.       sb_h=sb->height();
  177.  
  178.   if (small_render) { sb_w*=2; sb_h*=2; }
  179.  
  180.   x1=xres/2-sb_w/2;
  181.   x2=xres/2+sb_w/2;
  182.   y1=yres-sb_h;
  183.   y2=yres;
  184. }
  185.  
  186.  
  187. void status_bar::draw_health(image *screen,int amount)
  188. {
  189.   if (total_weapons)
  190.   {
  191.     int x1,y1,x2,y2;
  192.     area(x1,y1,x2,y2);
  193.     draw_num(screen,x1+(small_render ? 17*2 : 17),y1+(small_render ? 11*2 : 11),amount,bnum);  
  194.   }
  195. }
  196.  
  197.  
  198. void status_bar::draw_ammo(image *screen, int weapon_num, int amount, int light)
  199. {
  200.   if (total_weapons)
  201.   {
  202.     int x1,y1,x2,y2;
  203.     area(x1,y1,x2,y2);
  204.     draw_num(screen,
  205.         x1+(small_render ? 52*2+weapon_num*34*2 : 52+weapon_num*34),
  206.         y1+(small_render ? 25*2 : 25),amount,bnum+(light ? 20 : 10));  
  207.   }
  208. }
  209.  
  210.  
  211. int status_bar::mouse_in_area()
  212. {
  213.   if (!v) return 0;
  214.   int x1,y1,x2,y2;
  215.   area(x1,y1,x2,y2);
  216.  
  217.   int mx,my;
  218.   if (small_render)
  219.   {
  220.     mx=(v->pointer_x-v->cx1)*2+v->cx1;
  221.     my=(v->pointer_y-v->cy1)*2+v->cy1;
  222.   } else
  223.   {
  224.     mx=v->pointer_x;
  225.     my=v->pointer_y;
  226.   }
  227.  
  228.   if (mx>=x1 && my>=y1 && mx<=x2 && my<=y2)
  229.     return 1;
  230.   else return 0;
  231. }
  232.  
  233.  
  234. void status_bar::draw_update()
  235. {
  236.   if (total_weapons && v)
  237.   {
  238.     if (DEFINEDP(symbol_value(l_mouse_can_switch)) && symbol_value(l_mouse_can_switch) &&
  239.     mouse_in_area())
  240.     {
  241.       if ((current_level->tick_counter()&4)==0)
  242.         eh->set_mouse_shape(cash.img(c_mouse1)->copy(),4,4);
  243.       else eh->set_mouse_shape(cash.img(c_mouse2)->copy(),4,4);   
  244.       changed_cursor=1;
  245.     } else if (changed_cursor)
  246.     {
  247.       if (!(dev&EDIT_MODE))
  248.         eh->set_mouse_shape(cash.img(c_target)->copy(),8,8);
  249.       else
  250.         eh->set_mouse_shape(cash.img(c_normal)->copy(),1,1);
  251.       changed_cursor=0;      
  252.     }
  253.  
  254.     if (need_rf)
  255.       redraw(screen);
  256.   }
  257. }
  258.  
  259.  
  260. void status_bar::step()
  261. {
  262.   if (!v) return ;
  263.   if (!DEFINEDP(symbol_value(l_mouse_can_switch)) || !symbol_value(l_mouse_can_switch)) return ;
  264.   
  265.   int sb_w,sb_h;
  266.   if (sbar>0 && total_weapons)
  267.   {
  268.     image *sb=cash.img(sbar);  
  269.  
  270.     // status bar width & height
  271.     sb_w=sb->width();
  272.     sb_h=sb->height();
  273.   }
  274.  
  275.   // see if the mouse is in the sbar region (demo_x already corrected for small_render)
  276.   int sx1,sy1,sx2,sy2;
  277.   area(sx1,sy1,sx2,sy2);
  278.  
  279.   int view_y2=small_render ? (v->cy2-v->cy1+1)*2+v->cy1 : v->cy2;
  280.   if (sy1<view_y2)     // tell view to shrink if it is overlapping the status bar
  281.   {
  282.     /*    v->suggest.send_view=1;
  283.     v->suggest.cx1=v->cx1;
  284.     v->suggest.cy1=v->cy1;
  285.     v->suggest.cx2=v->cx2;
  286.     v->suggest.cy2=small_render ? (sy1-v->cy1-2)/2+v->cy1 : sy1-2;     */
  287.   }
  288.  
  289.   if (sbar<=0 || !total_weapons) return ;
  290.  
  291.  
  292.   int mx=small_render ? (last_demo_mx-v->cx1)*2+v->cx1 : last_demo_mx;
  293.   int my=small_render ? (last_demo_my-v->cy1)*2+v->cy1 : last_demo_my;
  294.  
  295.  
  296.   if (mx>sx1 && my>sy1 && mx<sx2 && my<sy2)
  297.   {
  298.  
  299.     int new_target;
  300.  
  301.     mx-=sx1;    
  302.     if (small_render) mx/=2;
  303.  
  304.  
  305.     mx-=47;
  306.     if (mx<0) new_target=0;
  307.     else
  308.     {
  309.       new_target=mx/33;
  310.       if (new_target>=TOTAL_WEAPONS)
  311.         new_target=TOTAL_WEAPONS-1; 
  312.       if (new_target>=total_weapons)
  313.         new_target=total_weapons-1;
  314.     }      
  315.  
  316.     if (v->has_weapon(new_target) && new_target!=icon_in_selection)
  317.     {
  318.       icon_in_selection=new_target;
  319.       need_refresh();
  320.     }
  321.     
  322.     if (last_demo_mbut==2 && icon_in_selection!=v->current_weapon &&
  323.     icon_in_selection!=-1) // the user requested a weapon change
  324.     {
  325.       v->suggest.send_weapon_change=1;
  326.       v->suggest.new_weapon=icon_in_selection;
  327.     }
  328.  
  329.   } else
  330.   {
  331.     if (icon_in_selection!=-1)
  332.     {
  333.       icon_in_selection=-1;
  334.       need_refresh();
  335.     }
  336.   }
  337.  
  338.   // see if a new weapon has been selected other than the one
  339.   // we think is selected, if so redraw the status bar
  340.   if (currently_selected_weapon!=v->current_weapon)
  341.   {
  342.     currently_selected_weapon=v->current_weapon;
  343.     need_refresh();
  344.   }
  345.   
  346.   
  347. }
  348.  
  349.  
  350.  
  351.  
  352.  
  353.