source: trunk/tools/neercs/term/term.cpp @ 2020

Last change on this file since 2020 was 2020, checked in by sam, 8 years ago

neercs: F3 toggles fancy shit drawing.

File size: 8.5 KB
Line 
1//
2// Neercs
3//
4
5#if defined HAVE_CONFIG_H
6#   include "config.h"
7#endif
8
9#if defined _XBOX
10#   define _USE_MATH_DEFINES /* for M_PI */
11#   include <xtl.h>
12#elif defined _WIN32
13#   define _USE_MATH_DEFINES /* for M_PI */
14#   define WIN32_LEAN_AND_MEAN
15#   include <windows.h>
16#endif
17
18#include "core.h"
19
20using namespace std;
21using namespace lol;
22
23#include "../neercs.h"
24#include "term.h"
25
26extern bool g_setup;
27
28Term::Term(ivec2 size)
29  : m_pty(0),
30    m_caca(caca_create_canvas(size.x, size.y)),
31    m_size(size),
32    m_title(0),
33    m_time(0.f),
34    m_debug(false)
35{
36#if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H
37    m_pty = new Pty();
38    char const *shell = getenv("SHELL");
39    if (!shell)
40        shell = "/bin/sh";
41    m_pty->Run(shell, size);
42#endif
43}
44
45void Term::TickGame(float seconds)
46{
47    Entity::TickGame(seconds);
48
49#if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H
50    if (!g_setup)
51    {
52        bool have_ctrl = Input::GetStatus(Key::LeftCtrl)
53                          || Input::GetStatus(Key::RightCtrl);
54        bool have_shift = Input::GetStatus(Key::LeftShift)
55                           || Input::GetStatus(Key::RightShift);
56
57        /* Check for standard ASCII keys */
58        for (int i = 0x0; i < 0x7f; ++i)
59        {
60            if (Input::WasPressed((Key::Value)i))
61            {
62                if (have_ctrl && i >= 'a' && i <= 'z')
63                {
64                    char c = i + 1 - 'a';
65                    m_pty->WriteData(&c, 1);
66                }
67                else if (have_shift && i >= 'a' && i <= 'z')
68                {
69                    char c = i + 'A' - 'a';
70                    m_pty->WriteData(&c, 1);
71                }
72                else
73                {
74                    char c = i;
75                    m_pty->WriteData(&c, 1);
76                }
77            }
78        }
79
80        /* Check for special keys */
81        static struct { Key::Value k; char const *str; int len; } const lut[] =
82        {
83            { Key::Up, "\033OA", 3 },
84            { Key::Down, "\033OB", 3 },
85            { Key::Right, "\033OC", 3 },
86            { Key::Left, "\033OD", 3 },
87            { Key::PageUp, "\033[5~", 4 },
88            { Key::PageDown, "\033[6~", 4 },
89            { Key::Home, "\033[1~", 4 },
90            { Key::Insert, "\033[2~", 4 },
91            { Key::Delete, "\033[3~", 4 },
92            { Key::End, "\033[4~", 4 },
93#if 0 /* FIXME: disabled for now (used by the theme system */
94            { Key::F1, "\033[11~", 5 },
95            { Key::F2, "\033[12~", 5 },
96            { Key::F3, "\033[13~", 5 },
97            { Key::F4, "\033[14~", 5 },
98            { Key::F5, "\033[15~", 5 },
99            { Key::F6, "\033[17~", 5 },
100            { Key::F7, "\033[18~", 5 },
101            { Key::F8, "\033[19~", 5 },
102            { Key::F9, "\033[20~", 5 },
103            { Key::F10, "\033[21~", 5 },
104            { Key::F11, "\033[23~", 5 },
105            { Key::F12, "\033[24~", 5 },
106#endif
107        };
108
109        for (size_t i = 0; i < sizeof(lut) / sizeof(*lut); i++)
110        {
111            if (!have_ctrl && !have_shift)
112                if (Input::WasPressed(lut[i].k))
113                    m_pty->WriteData(lut[i].str, lut[i].len);
114        }
115    }
116
117    m_time += seconds;
118
119    if (m_pty->IsEof())
120    {
121        /* FIXME: we could do more interesting things here… */
122        Ticker::Shutdown();
123    }
124
125    m_pty->SetWindowSize(ivec2(caca_get_canvas_width(m_caca),
126                               caca_get_canvas_height(m_caca)));
127
128    /* This is the real terminal code */
129    size_t total = 0;
130    for (;;)
131    {
132        char buf[BUFSIZ];
133        size_t current = m_pty->ReadData(buf, BUFSIZ);
134        if (current <= 0)
135            break;
136        total += current;
137        size_t processed = ReadAnsi(buf, current);
138        if (processed < current)
139            m_pty->UnreadData(buf + processed, current - processed);
140        if (current < BUFSIZ)
141            break;
142//        if (total > 10000)
143//            break;
144    }
145
146    /* Some fancy shit if we press F3 */
147    if (Input::WasPressed(Key::F3))
148        m_debug = !m_debug;
149
150    if (m_debug)
151    {
152        m_time += seconds;
153        DrawFancyShit();
154    }
155#else
156    /* Unsupported platform - draw some fancy shit instead */
157    m_time += seconds;
158    DrawFancyShit();
159#endif
160}
161
162void Term::TickDraw(float seconds)
163{
164    Entity::TickDraw(seconds);
165}
166
167Term::~Term()
168{
169#if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H
170    delete m_pty;
171#endif
172    caca_free_canvas(m_caca);
173}
174
175/*
176 * XXX: fancy shit below
177 */
178
179static uint32_t hex_color(float r, float g, float b)
180{
181    return ((uint32_t)(r * 15.99f) << 8) |
182           ((uint32_t)(g * 15.99f) << 4) |
183           (uint32_t)(b * 15.99f);
184}
185
186void Term::DrawFancyShit()
187{
188    /* draw something awesome */
189    int bg_color = 0x222;
190    int w = caca_get_canvas_width(m_caca);
191    int h = caca_get_canvas_height(m_caca);
192
193    caca_set_color_argb(m_caca, 0xfff, bg_color);
194    caca_clear_canvas(m_caca);
195
196    caca_set_color_argb(m_caca, 0xfff, bg_color);
197    for(int i = 0; i < h; i++)
198    {
199        float a = M_PI / 180 * i * 16 + m_time * 4;
200        float b = M_PI / 180 * i * 12;
201        int x = w / 2  - 14 + w / 4 * lol::cos(a) + w / 4 * lol::sin(b);
202        caca_put_str(m_caca, x, i, "LOL WUT! NEERCS SI TEH RULEZ");
203    }
204
205    caca_set_color_argb(m_caca, 0x444, bg_color);
206    for(int i = 0; i < w; i++)
207    {
208        float a = m_time * 1 + M_PI / 180 * i * 8;
209        float b = m_time * -2 + M_PI / 180 * i * 5;
210        int y = h / 2 + h / 4 * lol::cos(a) + h / 4 * lol::sin(b);
211        caca_set_color_argb(m_caca, hex_color(0.25f + 0.5f / w * i - 0.25f / h * y, 0.25f, 0.25f + 0.25f / w * i + 0.25f / h * y), bg_color);
212        caca_draw_line(m_caca, i, y - 1, i, y + 1,'%');
213    }
214
215/* __  _________ ______ ______ ______ ______
216  /  \/  /  __  >  __  >  __  >  ___//  ___/ \x0a9
217 /      /  ____/  ____/  __  <  <____\___  \
218/__/\__/\_______________/  \________________\ */
219
220    int logo_x = (w - 46) / 2;
221    int logo_y = h / 2 - 2;
222
223    caca_set_color_argb(m_caca, 0xbac, bg_color);
224    //caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3               ), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3               )), bg_color);
225    caca_put_str(m_caca, logo_x + 3, logo_y    ,"__  _________ ______ ______ ______ ______");
226    //caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 1), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 1)), bg_color);
227    caca_put_str(m_caca, logo_x + 2, logo_y + 1, "/  \\/  /  __  >  __  >  __  >  ___//  ___/ \x0a9");
228    //caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 2), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 2)), bg_color);
229    caca_put_str(m_caca, logo_x + 1, logo_y + 2, "/      /  ____/  ____/  __  <  <____\\___  \\");
230    //caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 3), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 3)), bg_color);
231    caca_put_str(m_caca, logo_x    , logo_y + 3, "/__/\\__/\\_______________/  \\________________\\");
232    caca_set_color_argb(m_caca, 0x269, bg_color);
233    caca_put_str(m_caca, logo_x + 5, logo_y + 5, "ALL YOUR TERMINALS ARE BELONG TO US");
234
235    caca_set_color_argb(m_caca, 0x777, bg_color);
236    caca_printf(m_caca, 2, h - 3, "W=%i", w);
237    caca_printf(m_caca, 2, h - 2, "H=%i", h);
238
239    caca_set_color_argb(m_caca, hex_color(0.6f + 0.4f * lol::cos(m_time * 2), 0.2f, 0.2f), bg_color);
240    caca_put_str(m_caca, w - 12, h - 2, "CACA RULEZ");
241
242/*_______
243 /      /|
244/______/ |
245|      | |
246|  :D  | /
247|______|/
248*/
249
250    int lolcube_x = w / 2 - 5 + (w - 10) * lol::cos(m_time / 2);
251    int lolcube_y = h - 5 - abs ((h - 5) * lol::sin(m_time * 4));
252
253    caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::sin(m_time * 2), 0.5f + 0.5f * lol::cos(m_time * 3), 0.5f + 0.5f * lol::sin(m_time * 5)), bg_color);
254    caca_put_str(m_caca, lolcube_x + 2, lolcube_y    , "_______");
255    caca_put_str(m_caca, lolcube_x + 1, lolcube_y + 1, "/      /|");
256    caca_put_str(m_caca, lolcube_x    , lolcube_y + 2, "/______/ |");
257    caca_put_str(m_caca, lolcube_x    , lolcube_y + 3, "|      | |");
258    caca_put_str(m_caca, lolcube_x    , lolcube_y + 4, "|  :D  | /");
259    caca_put_str(m_caca, lolcube_x    , lolcube_y + 5, "|______|/");
260
261    caca_set_color_argb(m_caca, 0x777, bg_color);
262    caca_put_str(m_caca, 0, 0, "rez@lol:~/ sudo -s");
263    caca_put_str(m_caca, 0, 1, "[sudo] password for rez:");
264    caca_put_str(m_caca, 0, 2, "root@lol:~/ echo LOL");
265    caca_put_str(m_caca, 0, 3, "LOL");
266    caca_put_str(m_caca, 0, 4, "root@lol:~/");
267}
Note: See TracBrowser for help on using the repository browser.