]> icculus.org git repositories - btb/d2x.git/blob - main/concntl.c
start to simplify console controls by implementing directly in kconfig.
[btb/d2x.git] / main / concntl.c
1 #ifdef HAVE_CONFIG_H
2 #include <conf.h>
3 #endif
4
5 #include <string.h>
6
7 #include "console.h"
8 #include "timer.h"
9 #include "inferno.h"
10
11
12 typedef struct _console_control_info {
13         ubyte state;
14         fix   time_went_down;
15         fix   time_held_down;
16         uint  down_count;
17         uint  up_count;
18 } console_control_info;
19
20 console_control_info Console_controls[CONCNTL_NUM_CONTROLS];
21
22 void concntl_cmd_lookdown_on(int argc, char **argv)     { console_control_set_state(CONCNTL_LOOKDOWN,   1); }
23 void concntl_cmd_lookdown_off(int argc, char **argv)    { console_control_set_state(CONCNTL_LOOKDOWN,   0); }
24 void concntl_cmd_lookup_on(int argc, char **argv)       { console_control_set_state(CONCNTL_LOOKUP,     1); }
25 void concntl_cmd_lookup_off(int argc, char **argv)      { console_control_set_state(CONCNTL_LOOKUP,     0); }
26 void concntl_cmd_left_on(int argc, char **argv)         { console_control_set_state(CONCNTL_LEFT,       1); }
27 void concntl_cmd_left_off(int argc, char **argv)        { console_control_set_state(CONCNTL_LEFT,       0); }
28 void concntl_cmd_right_on(int argc, char **argv)        { console_control_set_state(CONCNTL_RIGHT,      1); }
29 void concntl_cmd_right_off(int argc, char **argv)       { console_control_set_state(CONCNTL_RIGHT,      0); }
30 void concntl_cmd_strafe_on(int argc, char **argv)       { console_control_set_state(CONCNTL_STRAFE,     1); }
31 void concntl_cmd_strafe_off(int argc, char **argv)      { console_control_set_state(CONCNTL_STRAFE,     0); }
32 void concntl_cmd_moveleft_on(int argc, char **argv)     { console_control_set_state(CONCNTL_MOVELEFT,   1); }
33 void concntl_cmd_moveleft_off(int argc, char **argv)    { console_control_set_state(CONCNTL_MOVELEFT,   0); }
34 void concntl_cmd_moveright_on(int argc, char **argv)    { console_control_set_state(CONCNTL_MOVERIGHT,  1); }
35 void concntl_cmd_moveright_off(int argc, char **argv)   { console_control_set_state(CONCNTL_MOVERIGHT,  0); }
36 void concntl_cmd_moveup_on(int argc, char **argv)       { console_control_set_state(CONCNTL_MOVEUP,     1); }
37 void concntl_cmd_moveup_off(int argc, char **argv)      { console_control_set_state(CONCNTL_MOVEUP,     0); }
38 void concntl_cmd_movedown_on(int argc, char **argv)     { console_control_set_state(CONCNTL_MOVEDOWN,   1); }
39 void concntl_cmd_movedown_off(int argc, char **argv)    { console_control_set_state(CONCNTL_MOVEDOWN,   0); }
40 void concntl_cmd_bank_on(int argc, char **argv)         { console_control_set_state(CONCNTL_BANK,       1); }
41 void concntl_cmd_bank_off(int argc, char **argv)        { console_control_set_state(CONCNTL_BANK,       0); }
42 void concntl_cmd_bankleft_on(int argc, char **argv)     { console_control_set_state(CONCNTL_BANKLEFT,   1); }
43 void concntl_cmd_bankleft_off(int argc, char **argv)    { console_control_set_state(CONCNTL_BANKLEFT,   0); }
44 void concntl_cmd_bankright_on(int argc, char **argv)    { console_control_set_state(CONCNTL_BANKRIGHT,  1); }
45 void concntl_cmd_bankright_off(int argc, char **argv)   { console_control_set_state(CONCNTL_BANKRIGHT,  0); }
46 void concntl_cmd_forward_on(int argc, char **argv)      { console_control_set_state(CONCNTL_FORWARD,    1); }
47 void concntl_cmd_forward_off(int argc, char **argv)     { console_control_set_state(CONCNTL_FORWARD,    0); }
48 void concntl_cmd_back_on(int argc, char **argv)         { console_control_set_state(CONCNTL_BACK,       1); }
49 void concntl_cmd_back_off(int argc, char **argv)        { console_control_set_state(CONCNTL_BACK,       0); }
50 void concntl_cmd_cruiseup_on(int argc, char **argv)     { console_control_set_state(CONCNTL_CRUISEUP,   1); }
51 void concntl_cmd_cruiseup_off(int argc, char **argv)    { console_control_set_state(CONCNTL_CRUISEUP,   0); }
52 void concntl_cmd_cruisedown_on(int argc, char **argv)   { console_control_set_state(CONCNTL_CRUISEDOWN, 1); }
53 void concntl_cmd_cruisedown_off(int argc, char **argv)  { console_control_set_state(CONCNTL_CRUISEDOWN, 0); }
54 void concntl_cmd_cruiseoff_on(int argc, char **argv)    { console_control_set_state(CONCNTL_CRUISEOFF,  1); }
55 void concntl_cmd_cruiseoff_off(int argc, char **argv)   { console_control_set_state(CONCNTL_CRUISEOFF,  0); }
56 void concntl_cmd_nrgshield_on(int argc, char **argv)    { console_control_set_state(CONCNTL_NRGSHIELD,  1); }
57 void concntl_cmd_nrgshield_off(int argc, char **argv)   { console_control_set_state(CONCNTL_NRGSHIELD,  0); }
58
59 /* select / toggle weapons */
60 void concntl_cmd_weapon(int argc, char **argv)
61 {
62         int n;
63
64         if (argc < 2 || !stricmp(argv[1], "-h")) {
65                 con_printf(CON_NORMAL, "%s <num>\n", argv[0]);
66                 con_printf(CON_NORMAL, "    select or toggle weapon <num>\n");
67                 return;
68         }
69
70         n = atoi(argv[1]);
71         if (n == 0)
72                 n = 10;
73         if (n < 1 || n > 10)
74                 return;
75
76         do_weapon_select((n-1) % 5, (n-1) / 5);
77 }
78
79
80 // Returns the number of seconds this 'button' has been down since last call.
81 fix console_control_down_time(console_control control)
82 {
83         fix time_down, time;
84
85         if (!Console_controls[control].state) {
86                 time_down = Console_controls[control].time_held_down;
87                 Console_controls[control].time_held_down = 0;
88         } else {
89                 time = timer_get_fixed_seconds();
90                 time_down = time - Console_controls[control].time_went_down;
91                 Console_controls[control].time_went_down = time;
92         }
93         
94         return time_down;
95 }
96
97 unsigned int console_control_down_count(console_control control)
98 {
99         int n;
100
101         n = Console_controls[control].down_count;
102         Console_controls[control].down_count = 0;
103         
104         return n;
105 }
106
107 unsigned int console_control_up_count(console_control control)
108 {
109         int n;
110
111         n = Console_controls[control].up_count;
112         Console_controls[control].up_count = 0;
113
114         return n;
115 }
116
117
118 // Returns 1 if this control is currently down
119 unsigned int console_control_state(console_control control)
120 {
121         return Console_controls[control].state;
122 }
123
124
125 void console_control_set_state(console_control control, int state)
126 {
127         console_control_info *ctl = &Console_controls[control];
128
129         if (state) {
130                 ctl->down_count++;
131                 ctl->state = 1;
132                 ctl->time_went_down = timer_get_fixed_seconds();
133         } else {
134                 ctl->up_count++;
135                 ctl->state = 0;
136                 ctl->time_held_down += timer_get_fixed_seconds() - ctl->time_went_down;
137         }
138 }
139
140
141 void console_control_init(void)
142 {
143         memset(Console_controls, 0, sizeof(console_control_info) * CONCNTL_NUM_CONTROLS);
144
145         cmd_addcommand("+lookdown",     concntl_cmd_lookdown_on);
146         cmd_addcommand("-lookdown",     concntl_cmd_lookdown_off);
147         cmd_addcommand("+lookup",       concntl_cmd_lookup_on);
148         cmd_addcommand("-lookup",       concntl_cmd_lookup_off);
149         cmd_addcommand("+left",         concntl_cmd_left_on);
150         cmd_addcommand("-left",         concntl_cmd_left_off);
151         cmd_addcommand("+right",        concntl_cmd_right_on);
152         cmd_addcommand("-right",        concntl_cmd_right_off);
153         cmd_addcommand("+strafe",       concntl_cmd_strafe_on);
154         cmd_addcommand("-strafe",       concntl_cmd_strafe_off);
155         cmd_addcommand("+moveleft",     concntl_cmd_moveleft_on);
156         cmd_addcommand("-moveleft",     concntl_cmd_moveleft_off);
157         cmd_addcommand("+moveright",    concntl_cmd_moveright_on);
158         cmd_addcommand("-moveright",    concntl_cmd_moveright_off);
159         cmd_addcommand("+moveup",       concntl_cmd_moveup_on);
160         cmd_addcommand("-moveup",       concntl_cmd_moveup_off);
161         cmd_addcommand("+movedown",     concntl_cmd_movedown_on);
162         cmd_addcommand("-movedown",     concntl_cmd_movedown_off);
163         cmd_addcommand("+bank",         concntl_cmd_bank_on);
164         cmd_addcommand("-bank",         concntl_cmd_bank_off);
165         cmd_addcommand("+bankleft",     concntl_cmd_bankleft_on);
166         cmd_addcommand("-bankleft",     concntl_cmd_bankleft_off);
167         cmd_addcommand("+bankright",    concntl_cmd_bankright_on);
168         cmd_addcommand("-bankright",    concntl_cmd_bankright_off);
169         cmd_addcommand("+forward",      concntl_cmd_forward_on);
170         cmd_addcommand("-forward",      concntl_cmd_forward_off);
171         cmd_addcommand("+back",         concntl_cmd_back_on);
172         cmd_addcommand("-back",         concntl_cmd_back_off);
173         cmd_addcommand("+cruiseup",     concntl_cmd_cruiseup_on);
174         cmd_addcommand("-cruiseup",     concntl_cmd_cruiseup_off);
175         cmd_addcommand("+cruisedown",   concntl_cmd_cruisedown_on);
176         cmd_addcommand("-cruisedown",   concntl_cmd_cruisedown_off);
177         cmd_addcommand("+cruiseoff",    concntl_cmd_cruiseoff_on);
178         cmd_addcommand("-cruiseoff",    concntl_cmd_cruiseoff_off);
179         cmd_addcommand("+nrgshield",    concntl_cmd_nrgshield_on);
180         cmd_addcommand("-nrgshield",    concntl_cmd_nrgshield_off);
181
182         cmd_addcommand("weapon", concntl_cmd_weapon);
183 }