Project

General

Profile

Statistics
| Revision:

root / proj / src / proj.c @ 345

History | View | Annotate | Download (32.4 KB)

1
#include <lcom/lcf.h>
2
#include <lcom/proj.h>
3
#include <lcom/liblm.h>
4
#include <math.h>
5

    
6
#include "proj_macros.h"
7
#include "proj_func.h"
8

    
9
#include "graph.h"
10
#include "menu.h"
11
#include "rtc.h"
12
#include "hltp.h"
13
#include "interrupts_func.h"
14
#include "makecode_map.h"
15

    
16
#include "graph.h"
17

    
18
#include "rectangle.h"
19
#include "font.h"
20

    
21
#include "crosshair.h"
22
#include "shooter.h"
23
#include "zombie.h"
24
#include "pistol.h"
25
#include "nothing.h"
26
#include "bullet.h"
27
#include "map1.h"
28

    
29
#include "errors.h"
30

    
31
#include "list.h"
32

    
33
#include "proj.h"
34

    
35
int main(int argc, char* argv[]) {
36

    
37
    lcf_set_language("EN-US");
38

    
39
    lcf_trace_calls("/home/lcom/labs/proj/trace.txt");
40

    
41
    lcf_log_output("/home/lcom/labs/proj/output.txt");
42

    
43
    if (lcf_start(argc, argv)) return 1;
44

    
45
    lcf_cleanup();
46

    
47
    return 0;
48
}
49

    
50

    
51

    
52
static int (singleplayer)(void);
53
static int (multiplayer)(void);
54
static int (chat)(void);
55
int(proj_main_loop)(int argc, char *argv[]) {
56
    (void)argc; (void)argv;
57

    
58
    int r;
59

    
60
    if(font_init()){ printf("Failed to initialize fonts\n"); return 1; }
61

    
62
    /// subscribe interrupts
63
    if (subscribe_all()) { return 1; }
64

    
65
    /// initialize graphics
66
    if(graph_init(GRAPH_MODE)){
67
        printf("%s: failed to initalize graphics.\n", __func__);
68
        if (cleanup()) printf("%s: failed to cleanup.\n", __func__);
69
        return 1;
70
    }
71

    
72
    /// Load stuff
73
    {
74
        graph_clear_screen();
75
        text_t *txt = text_ctor(font_get_default(), "Loading...");
76
        text_set_pos(txt, graph_get_XRes()/2, graph_get_YRes()/2);
77
        text_set_valign(txt, text_valign_center);
78
        text_set_halign(txt, text_halign_center);
79
        text_set_color(txt, TEXT_COLOR);
80
        text_draw(txt);
81
        text_dtor(txt);
82
        graph_draw();
83

    
84
        bsp_crosshair = get_crosshair(); if(bsp_crosshair == NULL) printf("Failed to get crosshair\n");
85
        bsp_shooter   = get_shooter  (); if(bsp_shooter   == NULL) printf("Failed to get shooter\n");
86
        bsp_zombie    = get_zombie   (); if(bsp_zombie    == NULL) printf("Failed to get zombie\n");
87
        bsp_pistol    = get_pistol   (); if(bsp_pistol    == NULL) printf("Failed to get pistol\n");
88
        bsp_nothing   = get_nothing  (); if(bsp_nothing   == NULL) printf("Failed to get nothing\n");
89
        bsp_bullet    = get_bullet   (); if(bsp_bullet    == NULL) printf("Failed to get bullet\n");
90
        map1          = get_map1     (); if(map1          == NULL) printf("Failed to get map1\n");
91

    
92
        sp_crosshair = sprite_ctor(bsp_crosshair); if(sp_crosshair == NULL) printf("Failed to get crosshair sprite\n");
93
    }
94

    
95
    menu_t *main_menu = menu_ctor(font_get_default());
96
    menu_add_item(main_menu, "Single player");
97
    menu_add_item(main_menu, "Multiplayer");
98
    menu_add_item(main_menu, "Chat");
99
    menu_add_item(main_menu, "Exit");
100

    
101
    //uint32_t refresh_count_value = sys_hz() / REFRESH_RATE;
102
    uint8_t last_lb = 0;
103
    struct packet pp;
104
    keys_t *keys = get_key_presses();
105

    
106
    /// loop stuff
107
    int click = 0;
108
    uint64_t int_vector = 0;
109
    int good = true;
110
    while (good) {
111
        /* Get a request message. */
112
        if((r = get_interrupts_vector(&int_vector))) return r;
113
        uint32_t n = 1;
114
        for (uint8_t i = 0; i < 32; i++, n <<= 1) {
115
            if (int_vector & n) {
116
                interrupt_handler(i);
117
                switch (i) {
118
                    case TIMER0_IRQ:
119

    
120
                    graph_clear_screen();
121
                    switch(menu_update_state(main_menu, click)){
122
                        case -1: break;
123
                        case  0: singleplayer(); break; //campaign(); break;
124
                        case  1: multiplayer() ; break;
125
                        case  2: chat(); break;
126
                        case  3: good = false; break;
127
                    }
128
                    menu_draw(main_menu);
129

    
130
                    click = 0;
131

    
132
                    sprite_set_pos(sp_crosshair, *get_mouse_X(), *get_mouse_Y());
133
                    sprite_draw(sp_crosshair);
134
                    graph_draw();
135

    
136
                    break;
137
                    case KBC_IRQ:
138
                    if (keyboard_get_scancode()[0] == ESC_BREAK_CODE) good = false;
139
                    case MOUSE_IRQ:
140
                    if (mouse_get_counter_mouse_ih() >= 3) {
141
                        mouse_parse_packet(mouse_get_packet_mouse_ih(), &pp);
142
                        update_mouse(&pp);
143
                        if (!click) click = last_lb ^ keys->lb_pressed && keys->lb_pressed;
144
                        last_lb = keys->lb_pressed;
145
                        mouse_set_counter_mouse_ih(0);
146
                    }
147
                    break;
148
                    case COM1_IRQ: nctp_ih(); break;
149
                }
150
            }
151
        }
152
    }
153

    
154
    basic_sprite_dtor      (bsp_crosshair); bsp_crosshair = NULL;
155
    basic_sprite_dtor      (bsp_shooter  ); bsp_shooter   = NULL;
156
    basic_sprite_dtor      (bsp_zombie   ); bsp_zombie    = NULL;
157
    sprite_dtor            (sp_crosshair ); sp_crosshair  = NULL;
158
    basic_sprite_dtor      (bsp_pistol   ); bsp_pistol    = NULL;
159
    basic_sprite_dtor      (bsp_nothing  ); bsp_nothing   = NULL;
160
    map_dtor               (map1         ); map1          = NULL;
161
    font_free();
162

    
163
    // Unsubscribe interrupts
164
    if (unsubscribe_all()) {
165
        if (cleanup())
166
        printf("%s: failed to cleanup.\n", __func__);
167
        return 1;
168
    }
169

    
170
    if (cleanup()) {
171
        printf("%s: failed to cleanup.\n", __func__);
172
        return 1;
173
    }
174

    
175
    return 0;
176
}
177

    
178
static host_info_t     *host_info   = NULL;
179
static remote_info_t   *remote_info = NULL;
180
static bullet_info_t   *bullet_info = NULL;
181

    
182
static void multiplayer_process(const uint8_t *p, const size_t sz) {
183
    void *dest = NULL;
184
    hltp_type tp = hltp_interpret(p, sz, &dest);
185
    if (dest == NULL) return;
186
    switch(tp){
187
        case hltp_type_host:
188
            host_info = (host_info_t*)dest;
189
            break;
190
        case hltp_type_remote:
191
            remote_info = (remote_info_t*)dest;
192
            break;
193
        case hltp_type_bullet:
194
            bullet_info = (bullet_info_t*)dest;
195
            break;
196
        case hltp_type_invalid: break;
197
        case hltp_type_string : break;
198
    }
199
}
200
static int (multiplayer_host)(void);
201
static int (multiplayer_remote)(void);
202
static int (multiplayer)(void) {
203
    int r;
204

    
205
    menu_t *main_menu = menu_ctor(font_get_default());
206
    menu_add_item(main_menu, "Create");
207
    menu_add_item(main_menu, "Connect");
208
    menu_add_item(main_menu, "Back");
209

    
210
    //uint32_t refresh_count_value = sys_hz() / REFRESH_RATE;
211
    uint8_t last_lb = 0;
212
    struct packet pp;
213
    keys_t *keys = get_key_presses();
214

    
215
    /// loop stuff
216
    int click = 0;
217
    uint64_t int_vector = 0;
218
    int good = true;
219
    while (good) {
220
        /* Get a request message. */
221
        if((r = get_interrupts_vector(&int_vector))) return r;
222
        uint32_t n = 1;
223
        for (uint8_t i = 0; i < 32; i++, n <<= 1) {
224
            if (int_vector & n) {
225
                interrupt_handler(i);
226
                switch (i) {
227
                    case TIMER0_IRQ:
228

    
229
                    graph_clear_screen();
230
                    switch(menu_update_state(main_menu, click)){
231
                        case -1: break;
232
                        case  0: multiplayer_host(); break;
233
                        case  1: multiplayer_remote(); break;
234
                        case  2: good = false; break;
235
                    }
236
                    menu_draw(main_menu);
237

    
238
                    click = 0;
239

    
240
                    sprite_set_pos(sp_crosshair, *get_mouse_X(), *get_mouse_Y());
241
                    sprite_draw(sp_crosshair);
242
                    graph_draw();
243

    
244
                    break;
245
                    case KBC_IRQ:
246
                    if (keyboard_get_scancode()[0] == ESC_BREAK_CODE) good = false;
247
                    case MOUSE_IRQ:
248
                    if (mouse_get_counter_mouse_ih() >= 3) {
249
                        mouse_parse_packet(mouse_get_packet_mouse_ih(), &pp);
250
                        update_mouse(&pp);
251
                        if (!click) click = last_lb ^ keys->lb_pressed && keys->lb_pressed;
252
                        last_lb = keys->lb_pressed;
253
                        mouse_set_counter_mouse_ih(0);
254
                    }
255
                    break;
256
                    case COM1_IRQ: nctp_ih(); break;
257
                }
258
            }
259
        }
260
    }
261
    return 0;
262
}
263

    
264
static int (multiplayer_host)(void) {
265
    int r;
266

    
267
    nctp_dump();
268
    nctp_set_processor(multiplayer_process);
269

    
270
    ent_set_scale(DEFAULT_SCALE);
271
    text_timer_t *in_game_timer = text_timer_ctor(font_get_default());
272

    
273
    list_t *shooter_list = list_ctor();
274

    
275
    gunner_t *shooter1 = gunner_ctor(bsp_shooter, bsp_pistol, GUNNER_PLAYER, 1); if(shooter1 == NULL) printf("Failed to get shooter1\n");
276
    gunner_set_spawn(shooter1, 75, 75);
277

    
278
    gunner_t *shooter2 = gunner_ctor(bsp_shooter, bsp_pistol, GUNNER_PLAYER, 2); if(shooter2 == NULL) printf("Failed to get shooter2\n");
279
    gunner_set_spawn(shooter2, 975, 75);
280

    
281
    list_insert(shooter_list, list_end(shooter_list), shooter1);
282
    list_insert(shooter_list, list_end(shooter_list), shooter2);
283

    
284
    do {
285
        get_random_spawn(map1, shooter1, shooter_list);
286
        get_random_spawn(map1, shooter2, shooter_list);
287
    } while (gunner_distance(shooter1, shooter2) < 500);
288

    
289
    host_info = host_info_ctor(shooter1, shooter2);
290
    remote_info = remote_info_ctor();
291
    bullet_info = bullet_info_ctor();
292

    
293
    list_t *bullet_list  = list_ctor();
294

    
295
    ent_set_origin(gunner_get_x(shooter1)-ent_get_XLength()/2.0,
296
    gunner_get_y(shooter1)-ent_get_YLength()/2.0);
297

    
298
    //uint32_t refresh_count_value = sys_hz() / REFRESH_RATE;
299
    uint8_t last_lb = 0;
300
    struct packet pp;
301
    keys_t *keys = get_key_presses();
302
    /// loop stuff
303
    uint64_t int_vector = 0;
304
    int good = true;
305
    int state = 0; // -1 for remote win, 0 for draw, 1 for host win
306
    list_node_t *p1, *p2; // player states
307
    int state_1, state_2;
308
    while (good) {
309
        if ((r = get_interrupts_vector(&int_vector))) return r;
310
        uint32_t n = 1;
311
        for (uint8_t i = 0; i < 32; i++, n <<= 1) {
312
            if (int_vector & n) {
313
                interrupt_handler(i);
314
                switch (i) {
315
                    case TIMER0_IRQ:
316
                    if (timer_get_no_interrupts() % 60 == 0) text_timer_update(in_game_timer);
317
                    update_movement(map1, shooter1, keys, shooter_list);
318
                    update_movement(map1, shooter2, &(remote_info->remote_keys_pressed), shooter_list);
319

    
320
                    update_game_state(map1, shooter_list, bullet_list);
321

    
322
                    p1 = list_find(shooter_list, shooter1);
323
                    p2 = list_find(shooter_list, shooter2);
324

    
325
                    if ((state_1 = (p1 == list_end(shooter_list))) || (state_2 = (p2 == list_end(shooter_list)))) {
326
                        state = state_1 - state_2;
327
                        good = false;
328
                        break;
329
                    }
330

    
331
                    double angle = get_mouse_angle(shooter1);
332
                    gunner_set_angle(shooter1, angle - M_PI_2);
333

    
334
                    ent_set_origin(gunner_get_x(shooter1)-ent_get_XLength()/2.0,
335
                                   gunner_get_y(shooter1)-ent_get_YLength()/2.0);
336

    
337
                    gunner_set_angle(shooter2, remote_info->remote_angle);
338
                    if (timer_get_no_interrupts() % 6 == 0) {
339
                        build_host_structure(host_info, shooter1, shooter2);
340

    
341
                        hltp_send_host_info(host_info);
342
                    }
343

    
344
                    graph_clear_screen();
345
                    map_draw   (map1);
346
                    bullet_draw_list(bullet_list);
347
                    gunner_draw_list(shooter_list);
348

    
349
                    text_draw(in_game_timer->text);
350

    
351
                    sprite_set_pos(sp_crosshair, *get_mouse_X(), *get_mouse_Y());
352
                    sprite_draw(sp_crosshair);
353
                    graph_draw();
354

    
355
                    break;
356
                    case KBC_IRQ:
357
                    if (keyboard_get_scancode()[0] == ESC_BREAK_CODE) {
358
                        good = false;
359
                    }
360
                    break;
361
                    case MOUSE_IRQ:
362
                    if (mouse_get_counter_mouse_ih() >= 3) {
363
                        mouse_parse_packet(mouse_get_packet_mouse_ih(), &pp);
364
                        update_mouse(&pp);
365
                        if (last_lb ^ keys->lb_pressed && keys->lb_pressed)
366
                        shoot_bullet(shooter1, bullet_list, bsp_bullet);
367
                        last_lb = keys->lb_pressed;
368
                        mouse_set_counter_mouse_ih(0);
369
                    }
370
                    break;
371

    
372
                    case COM1_IRQ:
373
                        nctp_ih();
374
                        if (bullet_info->new_bullet) {
375
                            shoot_bullet(shooter2, bullet_list, bsp_bullet);
376
                            bullet_info->new_bullet = false;
377
                        }
378
                        break;
379
                }
380
            }
381
        }
382
    }
383

    
384
    while(list_size(shooter_list) > 0){
385
        gunner_t *p = list_erase(shooter_list, list_begin(shooter_list));
386
        gunner_dtor(p);
387
    }
388
    if(list_dtor(shooter_list)) printf("COULD NOT DESTRUCT SHOOTER LIST\n");
389

    
390
    while(list_size(bullet_list) > 0){
391
        bullet_t *p = (bullet_t*)list_erase(bullet_list, list_begin(bullet_list));
392
        bullet_dtor(p);
393
    }
394
    if(list_dtor(bullet_list)) printf("COULD NOT DESTRUCT BULLET LIST\n");
395

    
396
    host_info_dtor(host_info);
397
    remote_info_dtor(remote_info);
398
    bullet_info_dtor(bullet_info);
399

    
400
    nctp_set_processor(NULL);
401

    
402
    text_timer_dtor(in_game_timer); in_game_timer = NULL;
403

    
404
    return 0;
405
}
406
static int (multiplayer_remote)(void) {
407
    int r;
408

    
409
    nctp_dump();
410
    nctp_set_processor(multiplayer_process);
411

    
412
    ent_set_scale(DEFAULT_SCALE);
413
    text_timer_t *in_game_timer = text_timer_ctor(font_get_default());
414

    
415
    list_t *shooter_list = list_ctor();
416

    
417
    gunner_t *shooter1 = gunner_ctor(bsp_shooter, bsp_pistol, GUNNER_PLAYER, 2); if(shooter1 == NULL) printf("Failed to get shooter1\n");
418
    gunner_set_spawn(shooter1, 75, 75);
419

    
420
    gunner_t *shooter2 = gunner_ctor(bsp_shooter, bsp_pistol, GUNNER_PLAYER, 1); if(shooter2 == NULL) printf("Failed to get shooter2\n");
421
    gunner_set_spawn(shooter2, 975, 75);
422

    
423
    list_insert(shooter_list, list_end(shooter_list), shooter1);
424
    list_insert(shooter_list, list_end(shooter_list), shooter2);
425

    
426
    host_info = host_info_ctor(shooter2, shooter1);
427
    remote_info = remote_info_ctor();
428
    bullet_info = bullet_info_ctor();
429

    
430
    list_t *bullet_list  = list_ctor();
431

    
432
    ent_set_origin(gunner_get_x(shooter1)-ent_get_XLength()/2.0,
433
    gunner_get_y(shooter1)-ent_get_YLength()/2.0);
434

    
435
    //uint32_t refresh_count_value = sys_hz() / REFRESH_RATE;
436
    uint8_t last_lb = 0;
437
    struct packet pp;
438
    keys_t *keys = get_key_presses();
439

    
440
    /// loop stuff
441
    uint64_t int_vector = 0;
442
    int good = true;
443
    while (good) {
444
        if ((r = get_interrupts_vector(&int_vector))) return r;
445
        uint32_t n = 1;
446
        for (uint8_t i = 0; i < 32; i++, n <<= 1) {
447
            if (int_vector & n) {
448
                interrupt_handler(i);
449
                switch (i) {
450
                    case TIMER0_IRQ:
451
                    if (timer_get_no_interrupts() % 60 == 0) text_timer_update(in_game_timer);
452

    
453
                    double angle = get_mouse_angle(shooter1) - M_PI_2;
454

    
455
                    build_remote_structure(remote_info, keys, angle);
456

    
457

    
458
                    //hltp_send_remote_info(remote_info);
459
                    gunner_set_pos(shooter1, (double)host_info->remote_x, (double)host_info->remote_y);
460
                    gunner_set_angle(shooter1, (double)host_info->remote_angle);
461
                    gunner_set_health(shooter1, (double)host_info->remote_health);
462
                    gunner_set_curr_health(shooter1, (double)host_info->remote_current_health);
463

    
464
                    gunner_set_pos(shooter2, (double)host_info->host_x, (double)host_info->host_y);
465
                    gunner_set_angle(shooter2, (double)host_info->host_angle);
466
                    gunner_set_health(shooter2, (double)host_info->host_health);
467
                    gunner_set_curr_health(shooter2, (double)host_info->host_current_health);
468

    
469
                    ent_set_origin(gunner_get_x(shooter1)-ent_get_XLength()/2.0,
470
                                   gunner_get_y(shooter1)-ent_get_YLength()/2.0);
471

    
472
                    /*
473
                    for (size_t j = 0; j < host_info->no_bullets; j++) {
474
                        if (host_info->bullets_shooter[j]) { // remote
475
                            bullet_t *bullet = bullet_ctor(shooter1, bsp_bullet, (double)host_info->bullets_x[j], (double)host_info->bullets_y[j], (double)host_info->bullets_vx[j], (double)host_info->bullets_vy[j]);
476
                            list_insert(bullet_list, list_end(bullet_list), bullet);
477
                        } else { // host
478
                            bullet_t *bullet = bullet_ctor(shooter2, bsp_bullet, (double)host_info->bullets_x[j], (double)host_info->bullets_y[j], (double)host_info->bullets_vx[j], (double)host_info->bullets_vy[j]);
479
                            list_insert(bullet_list, list_end(bullet_list), bullet);
480
                        }
481
                    }*/
482

    
483
                    graph_clear_screen();
484
                    map_draw   (map1);
485
                    bullet_draw_list(bullet_list);
486
                    gunner_draw_list(shooter_list);
487

    
488
                    text_draw(in_game_timer->text);
489

    
490
                    sprite_set_pos(sp_crosshair, *get_mouse_X(), *get_mouse_Y());
491
                    sprite_draw(sp_crosshair);
492
                    graph_draw();
493
                    /*
494
                    while(list_size(bullet_list) > 0){
495
                        bullet_t *p = (bullet_t*)list_erase(bullet_list, list_begin(bullet_list));
496
                        bullet_dtor(p);
497
                    }
498
                    */
499

    
500
                    break;
501
                    case KBC_IRQ:
502
                    if (keyboard_get_scancode()[0] == ESC_BREAK_CODE) {
503
                        good = false;
504
                    }
505
                    break;
506
                    case MOUSE_IRQ:
507
                    if (mouse_get_counter_mouse_ih() >= 3) {
508
                        mouse_parse_packet(mouse_get_packet_mouse_ih(), &pp);
509
                        update_mouse(&pp);
510
                        if (last_lb ^ keys->lb_pressed && keys->lb_pressed) {
511
                            bullet_info->new_bullet = true;
512
                            //hltp_send_bullet_info(bullet_info);
513
                        }
514
                        last_lb = keys->lb_pressed;
515
                        mouse_set_counter_mouse_ih(0);
516
                    }
517
                    break;
518

    
519
                    case COM1_IRQ:
520
                        nctp_ih();
521
                        break;
522
                }
523
            }
524
        }
525
    }
526

    
527
    while(list_size(shooter_list) > 0){
528
        gunner_t *p = list_erase(shooter_list, list_begin(shooter_list));
529
        gunner_dtor(p);
530
    }
531
    if(list_dtor(shooter_list)) printf("COULD NOT DESTRUCT SHOOTER LIST\n");
532

    
533
    while(list_size(bullet_list) > 0){
534
        bullet_t *p = (bullet_t*)list_erase(bullet_list, list_begin(bullet_list));
535
        bullet_dtor(p);
536
    }
537
    if(list_dtor(bullet_list)) printf("COULD NOT DESTRUCT BULLET LIST\n");
538

    
539
    host_info_dtor(host_info);
540
    remote_info_dtor(remote_info);
541
    bullet_info_dtor(bullet_info);
542

    
543
    nctp_set_processor(NULL);
544

    
545
    text_timer_dtor(in_game_timer); in_game_timer = NULL;
546

    
547
    return 0;
548
}
549

    
550
static int (campaign)(void);
551
#include "zombies.h"
552
static int (singleplayer)(void) {
553

    
554
    int r;
555

    
556
    menu_t *main_menu = menu_ctor(font_get_default());
557
    menu_add_item(main_menu, "Campaign");
558
    menu_add_item(main_menu, "Zombies");
559
    menu_add_item(main_menu, "Back");
560

    
561
    //uint32_t refresh_count_value = sys_hz() / REFRESH_RATE;
562
    uint8_t last_lb = 0;
563
    struct packet pp;
564
    keys_t *keys = get_key_presses();
565

    
566
    /// loop stuff
567
    int click = 0;
568
    uint64_t int_vector = 0;
569
    int good = true;
570
    while (good) {
571
        /* Get a request message. */
572
        if((r = get_interrupts_vector(&int_vector))) return r;
573
        uint32_t n = 1;
574
        for (uint8_t i = 0; i < 32; i++, n <<= 1) {
575
            if (int_vector & n) {
576
                interrupt_handler(i);
577
                switch (i) {
578
                    case TIMER0_IRQ:
579

    
580
                    graph_clear_screen();
581
                    switch(menu_update_state(main_menu, click)){
582
                        case -1: break;
583
                        case  0: campaign(); break;
584
                        case  1: zombies(); break;
585
                        case  2: good = false; break;
586
                    }
587
                    menu_draw(main_menu);
588

    
589
                    click = 0;
590

    
591
                    sprite_set_pos(sp_crosshair, *get_mouse_X(), *get_mouse_Y());
592
                    sprite_draw(sp_crosshair);
593
                    graph_draw();
594

    
595
                    break;
596
                    case KBC_IRQ:
597
                    if (keyboard_get_scancode()[0] == ESC_BREAK_CODE) good = false;
598
                    case MOUSE_IRQ:
599
                    if (mouse_get_counter_mouse_ih() >= 3) {
600
                        mouse_parse_packet(mouse_get_packet_mouse_ih(), &pp);
601
                        update_mouse(&pp);
602
                        if (!click) click = last_lb ^ keys->lb_pressed && keys->lb_pressed;
603
                        last_lb = keys->lb_pressed;
604
                        mouse_set_counter_mouse_ih(0);
605
                    }
606
                    break;
607
                    case COM1_IRQ: nctp_ih(); break;
608
                }
609
            }
610
        }
611
    }
612

    
613
    return 0;
614
}
615

    
616
static int (campaign)(void){
617

    
618
    int r;
619

    
620
    ent_set_scale(DEFAULT_SCALE);
621
    text_timer_t *in_game_timer = text_timer_ctor(font_get_default());
622

    
623
    list_t *shooter_list = list_ctor();
624

    
625
    gunner_t *shooter1 = gunner_ctor(bsp_shooter, bsp_pistol, GUNNER_PLAYER, 1); if(shooter1 == NULL) printf("Failed to get shooter1\n");
626
    gunner_set_spawn(shooter1, 75, 75);
627
    gunner_set_pos(shooter1, 75, 75);
628

    
629
    gunner_t *shooter2 = gunner_ctor(bsp_shooter, bsp_nothing, GUNNER_PLAYER, 2);
630
    gunner_set_spawn(shooter2, 975, 75);
631
    gunner_set_pos(shooter2, 775, 75);
632

    
633
    list_insert(shooter_list, list_end(shooter_list), shooter1);
634
    list_insert(shooter_list, list_end(shooter_list), shooter2);
635

    
636
    list_t *bullet_list  = list_ctor();
637

    
638
    ent_set_origin(gunner_get_x(shooter1)-ent_get_XLength()/2.0,
639
    gunner_get_y(shooter1)-ent_get_YLength()/2.0);
640

    
641
    //uint32_t refresh_count_value = sys_hz() / REFRESH_RATE;
642
    uint8_t last_lb = 0;
643
    struct packet pp;
644
    keys_t *keys = get_key_presses();
645

    
646
    /// loop stuff
647
    uint64_t int_vector = 0;
648
    int good = true;
649
    while (good) {
650
        /* Get a request message. */
651
        if((r = get_interrupts_vector(&int_vector))) return r;
652
        uint32_t n = 1;
653
        for (uint8_t i = 0; i < 32; i++, n <<= 1) {
654
            if(!good) break;
655
            if (int_vector & n) {
656
                interrupt_handler(i);
657
                switch (i) {
658
                    case TIMER0_IRQ:
659

    
660
                    if (timer_get_no_interrupts() % 60 == 0) text_timer_update(in_game_timer);
661
                    update_movement(map1, shooter1, keys, shooter_list);
662

    
663
                    update_game_state(map1, shooter_list, bullet_list);
664

    
665
                    //update_scale();
666
                    double angle = get_mouse_angle(shooter1);
667
                    gunner_set_angle(shooter1, angle - M_PI_2);
668

    
669
                    ent_set_origin(gunner_get_x(shooter1)-ent_get_XLength()/2.0,
670
                    gunner_get_y(shooter1)-ent_get_YLength()/2.0);
671

    
672
                    graph_clear_screen();
673
                    map_draw   (map1);
674
                    bullet_draw_list(bullet_list);
675
                    gunner_draw_list(shooter_list);
676

    
677
                    text_draw(in_game_timer->text);
678

    
679
                    sprite_set_pos(sp_crosshair, *get_mouse_X(), *get_mouse_Y());
680
                    sprite_draw(sp_crosshair);
681
                    graph_draw();
682

    
683
                    break;
684
                    case KBC_IRQ:
685
                    if (keyboard_get_scancode()[0] == ESC_BREAK_CODE) {
686
                        good = false;
687
                    }
688
                    break;
689
                    case MOUSE_IRQ:
690
                    if (mouse_get_counter_mouse_ih() >= 3) {
691
                        mouse_parse_packet(mouse_get_packet_mouse_ih(), &pp);
692
                        update_mouse(&pp);
693
                        if (last_lb ^ keys->lb_pressed && keys->lb_pressed)
694
                        shoot_bullet(shooter1, bullet_list, bsp_bullet);
695
                        last_lb = keys->lb_pressed;
696
                        mouse_set_counter_mouse_ih(0);
697

    
698
                    }
699
                    break;
700
                    case COM1_IRQ: nctp_ih(); break;
701
                }
702
            }
703
        }
704
    }
705

    
706
    while(list_size(shooter_list) > 0){
707
        gunner_t *p = list_erase(shooter_list, list_begin(shooter_list));
708
        gunner_dtor(p);
709
    }
710
    if(list_dtor(shooter_list)) printf("COULD NOT DESTRUCT SHOOTER LIST\n");
711

    
712
    while(list_size(bullet_list) > 0){
713
        bullet_t *p = (bullet_t*)list_erase(bullet_list, list_begin(bullet_list));
714
        bullet_dtor(p);
715
    }
716
    if(list_dtor(bullet_list)) printf("COULD NOT DESTRUCT BULLET LIST\n");
717

    
718
    text_timer_dtor(in_game_timer); in_game_timer = NULL;
719

    
720
    return SUCCESS;
721
}
722

    
723

    
724

    
725
#define CHAT_MAX_SIZE   75
726
#define CHAT_MAX_NUM    19
727
static text_t      *t_text[CHAT_MAX_NUM] = {NULL};
728
static rectangle_t *r_text               =  NULL;
729
static void chat_process(const uint8_t *p, const size_t sz){
730
    char buffer2[CHAT_MAX_NUM+3];
731
    void *dest = NULL;
732
    hltp_type tp = hltp_interpret(p, sz, &dest);
733
    switch(tp){
734
        case hltp_type_string:
735
        strcpy(buffer2, dest);
736
        strncat(buffer2, " <", 2);
737
        for(size_t i = CHAT_MAX_NUM-1; i; --i)
738
        text_set_string(t_text[i], text_get_string(t_text[i-1]));
739
        text_set_string(t_text[0], buffer2);
740
        for(size_t i = 0; i < CHAT_MAX_NUM; ++i){
741
            if(text_get_string(t_text[i])[0] == '>'){
742
                text_set_pos(t_text[i], rectangle_get_x(r_text)+50, text_get_y(t_text[i]));
743
                text_set_halign(t_text[i], text_halign_left);
744
            }else{
745
                text_set_pos(t_text[i], rectangle_get_x(r_text)+rectangle_get_w(r_text)-50, text_get_y(t_text[i]));
746
                text_set_halign(t_text[i], text_halign_right);
747
            }
748
        }
749
        break;
750
        case hltp_type_invalid: break;
751
        case hltp_type_bullet : break;
752
        case hltp_type_host   : break;
753
        case hltp_type_remote : break;
754
    }
755
}
756
static int (chat)(void){
757
    int r;
758

    
759
    nctp_dump();
760
    nctp_set_processor(chat_process);
761

    
762
    struct packet pp;
763

    
764
    char buffer[CHAT_MAX_SIZE] = "";
765
    rectangle_t *r_buffer = NULL; {
766
        r_buffer = rectangle_ctor(0,0,900,70);
767
        rectangle_set_pos(r_buffer, graph_get_XRes()/2  -rectangle_get_w(r_buffer)/2,
768
        (int16_t)(graph_get_YRes()*0.87-rectangle_get_h(r_buffer)/2));
769
        rectangle_set_fill_color   (r_buffer, GRAPH_BLACK);
770
        rectangle_set_outline_width(r_buffer, 2);
771
        rectangle_set_outline_color(r_buffer, GRAPH_WHITE);
772
        rectangle_set_fill_trans(r_buffer, GRAPH_TRANSPARENT);
773
    }
774
    text_t      *t_buffer = NULL; {
775
        t_buffer = text_ctor(font_get_default(), "");
776
        text_set_pos(t_buffer, rectangle_get_x(r_buffer)+50,
777
        rectangle_get_y(r_buffer)+rectangle_get_h(r_buffer)/2);
778
        text_set_halign(t_buffer, text_halign_left);
779
        text_set_valign(t_buffer, text_valign_center);
780
        text_set_color (t_buffer, TEXT_COLOR);
781
    }
782
    text_t      *t_size   = NULL; {
783
        t_size = text_ctor(font_get_default(), "");
784
        text_set_pos(t_size, rectangle_get_x(r_buffer)+rectangle_get_w(r_buffer)-5,
785
        rectangle_get_y(r_buffer)+rectangle_get_h(r_buffer)-5);
786
        text_set_halign(t_size, text_halign_right);
787
        text_set_valign(t_size, text_valign_bottom);
788
        text_set_color (t_size, TEXT_COLOR);
789
        text_set_size  (t_size, 18);
790
        char buffer2[20];
791
        sprintf(buffer2, "%d/%d", strlen(buffer), CHAT_MAX_SIZE);
792
        text_set_string(t_size, buffer2);
793
    }
794

    
795
    /** r_text */ {
796
    r_text = rectangle_ctor(0,0,900,550);
797
    rectangle_set_pos(r_text, graph_get_XRes()/2  -rectangle_get_w(r_buffer)/2,
798
    (int16_t)(graph_get_YRes()*0.09));
799
    rectangle_set_fill_color   (r_text, GRAPH_BLACK);
800
    rectangle_set_outline_width(r_text, 2);
801
    rectangle_set_outline_color(r_text, GRAPH_WHITE);
802
    rectangle_set_fill_trans(r_text, GRAPH_TRANSPARENT);
803
    }
804
    /** t_text */ {
805
    for(uint16_t i = 0; i < CHAT_MAX_NUM; ++i){
806
        t_text[i] = text_ctor(font_get_default(), " ");
807
        text_set_pos(t_text[i], rectangle_get_x(r_text)+50,
808
        rectangle_get_y(r_text)+rectangle_get_h(r_text)-30-25*i);
809
        text_set_halign(t_text[i], text_halign_left);
810
        text_set_valign(t_text[i], text_valign_bottom);
811
        text_set_color (t_text[i], TEXT_COLOR);
812
    }
813
}
814

    
815
/// loop stuff
816
uint64_t int_vector = 0;
817
int good = true;
818
while (good) {
819
    /* Get a request message. */
820
    if((r = get_interrupts_vector(&int_vector))) return r;
821
    uint32_t n = 1;
822
    for (uint8_t i = 0; i < 32; i++, n <<= 1) {
823
        if (int_vector & n) {
824
            interrupt_handler(i);
825
            switch (i) {
826
                case TIMER0_IRQ:
827
                graph_clear_screen();
828
                sprite_set_pos(sp_crosshair, *get_mouse_X(), *get_mouse_Y());
829

    
830
                rectangle_draw(r_buffer);
831
                text_draw(t_buffer);
832
                text_draw(t_size);
833

    
834
                rectangle_draw(r_text);
835
                for(size_t j = 0; j < CHAT_MAX_NUM; ++j) text_draw(t_text[j]);
836

    
837
                sprite_draw(sp_crosshair);
838
                graph_draw();
839
                break;
840
                case KBC_IRQ:
841
                if      (keyboard_get_scancode()[0] == ESC_BREAK_CODE) good = false;
842
                else if (keyboard_get_scancode()[0] == ENTER_MAKE_CODE) {
843
                    hltp_send_string(buffer);
844
                    char buffer2[CHAT_MAX_SIZE+3] = "> ";
845
                    strncat(buffer2, buffer, strlen(buffer));
846
                    for(size_t j = CHAT_MAX_NUM-1; j; --j) text_set_string(t_text[i], text_get_string(t_text[i-1]));
847
                    text_set_string(t_text[0], buffer2);
848
                    for(size_t j = 0; j < CHAT_MAX_NUM; ++j){
849
                        if(text_get_string(t_text[j])[0] == '>'){
850
                            text_set_pos(t_text[j], rectangle_get_x(r_text)+50, text_get_y(t_text[j]));
851
                            text_set_halign(t_text[j], text_halign_left);
852
                        }else{
853
                            text_set_pos(t_text[j], rectangle_get_x(r_text)+rectangle_get_w(r_text)-50, text_get_y(t_text[j]));
854
                            text_set_halign(t_text[j], text_halign_right);
855
                        }
856
                    }
857
                    buffer[0] = '\0';
858
                } else if(keyboard_get_scancode()[0] == BACKSPACE_MAKE_CODE){
859
                    buffer[strlen(buffer)-1] = '\0';
860
                } else {
861
                    char c = map_makecode(keyboard_get_scancode()[0]);
862
                    if (c == ERROR_CODE) break;
863
                    if(strlen(buffer) < CHAT_MAX_SIZE) strncat(buffer, &c, 1);
864
                    else                               printf("Char limit exceeded\n");
865
                }
866
                text_set_string(t_buffer, buffer);
867
                char buffer2[20];
868
                sprintf(buffer2, "%d/%d", strlen(buffer), CHAT_MAX_SIZE);
869
                text_set_string(t_size, buffer2);
870
                case MOUSE_IRQ:
871
                if (mouse_get_counter_mouse_ih() >= 3) {
872
                    mouse_parse_packet(mouse_get_packet_mouse_ih(), &pp);
873
                    update_mouse(&pp);
874
                    mouse_set_counter_mouse_ih(0);
875
                }
876
                break;
877
                case COM1_IRQ: nctp_ih(); break;
878
            }
879
        }
880
    }
881
}
882

    
883
rectangle_dtor(r_buffer);
884
text_dtor     (t_buffer);
885

    
886
rectangle_dtor(r_text);
887
for(size_t i = 0; i < CHAT_MAX_NUM; ++i) text_dtor(t_text[i]);
888

    
889
nctp_set_processor(NULL);
890

    
891
return SUCCESS;
892
}