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

Last change on this file since 655 was 655, checked in by Sam Hocevar, 12 years ago

imlib: refactor a few image methods so that they use vec2i.

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