Project

General

Profile

Revision 346

added more files

View differences:

proj.c
49 49

  
50 50

  
51 51

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

  
......
546 546

  
547 547
    return 0;
548 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
}

Also available in: Unified diff