source: abuse/trunk/src/console.cpp @ 555

Last change on this file since 555 was 555, checked in by Sam Hocevar, 11 years ago

ps3: make everything compile on the PS3. Of course, nothing links yet
because so much support is missing.

File size: 4.0 KB
RevLine 
[56]1/*
2 *  Abuse - dark 2D side-scrolling platform game
3 *  Copyright (c) 1995 Crack dot Com
[494]4 *  Copyright (c) 2005-2011 Sam Hocevar <sam@hocevar.net>
[56]5 *
6 *  This software was released into the Public Domain. As with most public
[555]7 *  domain software, no warranty is made or implied by Crack dot Com, by
8 *  Jonathan Clark, or by Sam Hocevar.
[56]9 */
10
[555]11#if defined HAVE_CONFIG_H
12#   include "config.h"
13#endif
[56]14
15#include <ctype.h>
16#include <stdarg.h>
[131]17#include <string.h>
[56]18
[512]19#include "common.h"
20
[481]21#include "game.h"
[88]22
[481]23#include "linked.h"
24#include "console.h"
[2]25
[39]26void console::put_string(char const *st)
[2]27{
28  while (*st)
29  {
30    put_char(*st);
31    st++;
32  }
33}
34
35void console::redraw()
36{
37  if (con_win)
38  {
39    con_win->clear();
40    char *s=screen;
41    int dx,dy,xa=fnt->width(),ya=fnt->height(),i,j;
[494]42    for (j=0,dy=wy(); j<h; j++,dy+=ya)
[2]43    {
[494]44      for (i=0,dx=wx(); i<w; i++,s++,dx+=xa)
[2]45      {
[124]46    if (*s)
47      fnt->put_char(con_win->screen,dx,dy,*s);
[2]48      }
49    }
50    fnt->put_char(con_win->screen,wx()+cx*xa,wy()+cy*ya,'_');
51  }
52}
53
54void console::show()
55{
56  if (!con_win)
57  {
58    con_win=wm->new_window(lastx,lasty,screen_w(),screen_h(),NULL,name);
59    redraw();
[518]60    con_win->screen->SetClip(con_win->x1(),con_win->y1(),con_win->x2()+1,con_win->y2()+1);
[2]61  }
62}
63
64void console::hide()
65{
66  if (con_win)
67  {
68    lastx=con_win->x;
69    lasty=con_win->y;
70    wm->close_window(con_win);
71    con_win=NULL;
72  }
73}
74
75console::~console()
76{
77  hide();
[129]78  free(screen);
79  free(name);
[2]80}
81
[106]82console::console(JCFont *font, int width, int height, char const *Name)
[2]83{
84  con_win=NULL;
85  w=width;
86  h=height;
[129]87  screen=(char *)malloc(w*h);
[2]88  memset(screen,' ',w*h);
89  cx=cy=0;
90  fnt=font;
91  lastx=xres/2-screen_w()/2;
92  lasty=yres/2-screen_h()/2;
[131]93  name = strdup(Name);
[2]94}
95
96
97void console::draw_cursor()
98{
99  if (con_win)
100    fnt->put_char(con_win->screen,cx*fnt->width()+wx(),cy*fnt->height()+wy(),'_');
101}
102
103
104void console::draw_char(int x, int y, char ch)
105{
106  if (con_win)
107  {
108    int fw=fnt->width(),fh=fnt->height();
109    int dx=wx()+x*fw,dy=wy()+y*fh;
110    con_win->screen->bar(dx,dy,dx+fw-1,dy+fh-1,wm->black());
[124]111    fnt->put_char(con_win->screen,dx,dy,ch);
[2]112  }
113}
114
115void console::do_cr()
116{
117  if (cx<w && cy<h)  draw_char(cx,cy,screen[cy*w+cx]);
118  cx=0;
[124]119  cy++;
[2]120  if (cy>=h)
121  {
122    cy=h-1;
123    if (con_win)
124    {
125      memmove(screen,screen+w,w*(h-1));
126      memset(screen+w*(h-1),' ',w);
127      redraw();
[106]128      wm->flush_screen();
[2]129    }
[124]130  } else draw_cursor();
[2]131}
132
133void console::put_char(char ch)
134{
135
[124]136
[2]137  switch (ch)
138  {
139    case JK_BACKSPACE :
140    {
141      if (cx)
142      {
[124]143    if (con_win)
144      draw_char(cx,cy,screen[cy*w+cx]);
145    cx--;
146    if (con_win)
147      draw_cursor();
[2]148      }
149    } break;
150    case '\n' :
151    case JK_ENTER :
152    {
153      do_cr();
154    } break;
155    default :
156    {
157      screen[cy*w+cx]=ch;
158      if (con_win)
159        draw_char(cx,cy,ch);
160      cx++;
[124]161      if (cx>=w) do_cr(); else
[2]162      if (con_win) draw_cursor();
163    }
[124]164  }
[2]165}
166
167
168void console::print_f( const char *format, ...)
169{
170  char st[300];
171  va_list ap;
172  va_start(ap, format);
173  vsprintf(st,format,ap);
174  va_end(ap);
175  put_string(st);
176}
177
178
[106]179shell_term::shell_term(JCFont *font, int width, int height, char const *Name) :
180  console(font,width,height,Name)
[2]181{
182  shcmd[0]=0;
183  prompt();
184}
185
186void shell_term::prompt()
187{
188  put_string("(?=help)>");
189}
190
[39]191void shell_term::execute(char const *st)
[2]192{
193  put_string(st);
194  put_string(" : unhandled\n");
195}
196
[106]197int shell_term::handle_event(event &ev)
[2]198{
199  if (ev.window==con_win && con_win)
200  {
201    switch (ev.type)
202    {
203      case EV_KEY :
204      {
[124]205    switch (ev.key)
206    {
207      case JK_BACKSPACE:
208      {
209        if (shcmd[0]!=0)
210        {
211          shcmd[strlen(shcmd)-1]=0;
212          put_char(ev.key);
213        }
214      } break;
215      case JK_ENTER :
216      {
217        put_char(ev.key);
218        execute(shcmd);
219        prompt();
220        shcmd[0]=0;
221      } break;
222      default :
223      {
224        if (ev.key<256 && isprint(ev.key))
225        {
226          int x=strlen(shcmd);
227          shcmd[x+1]=0;
228          shcmd[x]=ev.key;
229          put_char(ev.key);
230        }
231      } break;
232    } break;
[2]233      }
234    }
235    return 1;
[124]236  }
[2]237  return 0;
238}
239
Note: See TracBrowser for help on using the repository browser.