home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Atomic_Tanks / Atomic-Tanks-5.1.exe / src / client.cpp < prev    next >
C/C++ Source or Header  |  2010-04-08  |  15KB  |  517 lines

  1. #ifdef NETWORK
  2.  
  3. #include "menu.h"
  4. #include "button.h"
  5. #include "team.h"
  6. #include "files.h"
  7. #include "satellite.h"
  8. #include "update.h"
  9. #include "network.h"
  10. #include "client.h"
  11. #include "beam.h"
  12. #include "explosion.h"
  13. #include "missile.h"
  14. #include "teleport.h"
  15. #include "floattext.h"
  16.  
  17. #include "sky.h"
  18. #ifdef THREADS
  19. #include <pthread.h>
  20. #endif
  21.  
  22.  
  23.  
  24.  
  25.  
  26. // Here we try to match the buffer with an action. We then attempt to
  27. // perform the action. Remember, this is a command from the server, so
  28. // it is either giving us some info or telling us to create something.
  29. int Parse_Client_Data(GLOBALDATA *global, ENVIRONMENT *env, char *buffer)
  30. {
  31.    char args[CLIENT_ARGS][BUFFER_SIZE];
  32.    char letter;
  33.    int dest_string;
  34.    int line_length = strlen(buffer);
  35.    int source_index = 0, dest_index = 0;
  36.   
  37.    // clear buffers
  38.    for (dest_string = 0; dest_string < CLIENT_ARGS; dest_string++)
  39.        memset(args[dest_string], '\0', BUFFER_SIZE);
  40.  
  41.    dest_string = 0; 
  42.    // copy buffer into cmd and argument variables
  43.    while ( ( source_index < line_length ) && (dest_string < CLIENT_ARGS) )
  44.    { 
  45.        letter = buffer[source_index];
  46.        if ( letter == ' ' )
  47.        {
  48.            letter = '\0';
  49.            args[dest_string][dest_index] = letter;
  50.            dest_index = 0;
  51.            dest_string++;
  52.        }
  53.        else
  54.        {
  55.           args[dest_string][dest_index] = letter;
  56.           dest_index++;
  57.        }
  58.        source_index++;
  59.    }
  60.   
  61.    // let us see what we have
  62.    if (! strcmp(args[0], "SERVERVERSION") )
  63.    {
  64.        if (! strcmp(args[1], VERSION) )
  65.           printf("Server version matchs us. OK.\n");
  66.        else
  67.           printf("Server version is %s, we are %s. This is likely to cause problems.\n",
  68.                  args[1], VERSION);
  69.        return TRUE;
  70.    }
  71.    else if (! strcmp(args[0], "CURRENTPOSITION") )
  72.    {
  73.       if ( (global->client_player) && (global->client_player->tank) )
  74.       {
  75.           sscanf(args[1], "%lf", &(global->client_player->tank->x));
  76.           sscanf(args[2], "%lf", &(global->client_player->tank->y));
  77.       }
  78.    }
  79.    else if (! strcmp(args[0], "BEAM") )
  80.    {
  81.       double my_x, my_y;
  82.       int my_angle, my_type;
  83.       BEAM *new_beam;
  84.       sscanf(args[1], "%lf", &my_x);
  85.       sscanf(args[2], "%lf", &my_y);
  86.       sscanf(args[3], "%d", &my_angle);
  87.       sscanf(args[4], "%d", &my_type);
  88.       new_beam = new BEAM(global, env, my_x, my_y, my_angle, my_type);
  89.    }
  90.    else if (! strcmp(args[0], "BOXED"))
  91.    {
  92.        int got_box;
  93.        sscanf(args[1], "%d", &got_box);
  94.        if (got_box)
  95.            global->bIsBoxed = true;
  96.        else
  97.            global->bIsBoxed = false;
  98.        return TRUE;
  99.    }
  100.    else if (! strcmp(args[0], "EXPLOSION") )
  101.    {
  102.         double my_x, my_y;
  103.         int my_type;
  104.         EXPLOSION *explosion;
  105.         sscanf(args[1], "%lf", &my_x);
  106.         sscanf(args[2], "%lf", &my_y);
  107.         sscanf(args[3], "%d", &my_type);
  108.         explosion = new EXPLOSION(global, env, my_x, my_y, my_type);
  109.         return FALSE;
  110.    }
  111.    else if (! strcmp(args[0], "ITEM"))
  112.    {
  113.        int item_index, amount;
  114.        sscanf(args[1], "%d", &item_index);
  115.        sscanf(args[2], "%d", &amount);
  116.        if ( (item_index >= 0) && (item_index < ITEMS) &&
  117.             (amount >= 0) && (amount <= 99) )
  118.        {
  119.           global->client_player->ni[item_index] = amount;
  120.        }
  121.        if (item_index == (ITEMS - 1) )
  122.           return TRUE;
  123.    }
  124.    else if (! strcmp(args[0], "HEALTH") )
  125.    {
  126.        int tank_index;
  127.        int health, shield, shield_type;
  128.        char some_text[32];
  129.  
  130.        sscanf(args[1], "%d", &tank_index);
  131.        if (tank_index >= 0)
  132.        {
  133.           sscanf(args[2], "%d", &health );
  134.           sscanf(args[3], "%d", &shield );
  135.           sscanf(args[4], "%d", &shield_type);
  136.           global->players[tank_index]->tank->l = health;
  137.           global->players[tank_index]->tank->sh = shield;
  138.           global->players[tank_index]->tank->sht = shield_type;
  139.           // set the text over the tank
  140.           sprintf(some_text, "%d", health);
  141.           global->players[tank_index]->tank->healthText->set_text(some_text);
  142.           global->players[tank_index]->tank->healthText->set_color(global->players[tank_index]->color);
  143.           sprintf(some_text, "%d", shield);
  144.           global->players[tank_index]->tank->shieldText->set_text(some_text);
  145.           global->players[tank_index]->tank->healthText->set_color(global->players[tank_index]->color);
  146.        }
  147.        if (tank_index == (global->numPlayers - 1) )
  148.           return TRUE;
  149.        else
  150.           return FALSE;
  151.    }
  152.    else if (! strcmp(args[0], "WIND") )
  153.    {
  154.        sscanf(args[1], "%lf", & (env->wind) );
  155.        return TRUE;
  156.    }
  157.    else if (! strcmp(args[0], "MISSILE") )
  158.    {
  159.        int my_type;
  160.        double my_x, my_y, delta_x, delta_y;
  161.        MISSILE *missile;
  162.        sscanf(args[1], "%lf", &my_x);
  163.        sscanf(args[2], "%lf", &my_y);
  164.        sscanf(args[3], "%lf", &delta_x);
  165.        sscanf(args[4], "%lf", &delta_y);
  166.        sscanf(args[5], "%d", &my_type);
  167.        missile = new MISSILE(global, env, my_x, my_y, delta_x, delta_y, my_type);
  168.        if (! missile)
  169.          printf("Attempted to create missile failed in client code.\n");
  170.        return FALSE;
  171.    }
  172.    else if (! strcmp(args[0], "NUMPLAYERS") )
  173.    {
  174.       int counter;
  175.       sscanf(args[1], "%d", & (global->numPlayers) );
  176.       // create the players in question
  177.       for (counter = 0; counter < global->numPlayers; counter++)
  178.       {
  179.           global->players[counter] = new PLAYER(global, env);
  180.           global->players[counter]->tank = new TANK(global, env);
  181.           global->players[counter]->tank->player = global->players[counter];
  182.           global->players[counter]->tank->initialise();
  183.           global->players[counter]->tank->nameText->set_text("");
  184.       }
  185.       return TRUE;
  186.    }
  187.    // ping is a special case where we do not do anything it is just
  188.    // making sure we are still here because we are not talking
  189.    else if (! strcmp(args[0], "PING"))
  190.    {
  191.        return FALSE;
  192.    }
  193.    else if (! strcmp(args[0], "PLAYERNAME") )
  194.    {
  195.        int number;
  196.        sscanf(args[1], "%d", &number);
  197.        if ( (number < global->numPlayers) && (number >= 0) )
  198.            global->players[number]->setName(args[2]);
  199.        if (number == (global->numPlayers - 1) )
  200.           return TRUE;    
  201.    }
  202.    else if (! strcmp(args[0], "REMOVETANK") )
  203.    {
  204.        int index;
  205.        sscanf(args[1], "%d", &index);
  206.        if ( (index >= 0) && (index < global->numPlayers) )
  207.        {
  208.            // make sure this tank exists before we get rid of it
  209.            if ( global->players[index]->tank )
  210.            {
  211.                delete global->players[index]->tank;
  212.                global->players[index]->tank = NULL;
  213.            }
  214.        }
  215.    }
  216.    else if (! strcmp(args[0], "ROUNDS") )
  217.    {
  218.        sscanf(args[1], "%lf", &global->rounds);
  219.        sscanf(args[2], "%d", &global->currentround);
  220.        return TRUE;
  221.    }
  222.    else if (! strcmp(args[0], "SURFACE") )
  223.    {
  224.        int x, y;
  225.        int index;
  226.        int colour_change = 0;
  227.        int green = 150;
  228.        int my_height;
  229.  
  230.        sscanf(args[1], "%d", &x);
  231.        sscanf(args[2], "%d", &y);
  232.        env->surface[x] = y;
  233.        my_height = global->screenHeight - y;
  234.        my_height = my_height / 50;      // ratio of change
  235.        // fill in terrain...
  236.        for (index = y; index < global->screenHeight; index++)
  237.        {
  238.            putpixel(env->terrain, x, index, makecol(0, green, 0));
  239.            colour_change++;
  240.            if (colour_change >= my_height)
  241.            {
  242.               colour_change = 0;
  243.               green--;
  244.            }
  245.        }
  246.        if (x >= (global->screenWidth - 1) )
  247.          return TRUE;
  248.    }
  249.    else if (! strcmp(args[0], "SCREEN") )
  250.    {
  251.        int width, height;
  252.  
  253.        sscanf(args[1], "%d", &width);
  254.        sscanf(args[2], "%d", &height);
  255.        if ( (width == global->screenWidth) &&
  256.             (height == global->screenHeight) )
  257.            printf("Host's screen resolution matches ours.\n");
  258.        else
  259.        {
  260.            printf("Host's screen resolution is %d by %d.\n", width, height);
  261.            printf("Ours is %d by %d. This is going to cause problems!\n",
  262.                   global->screenWidth, global->screenHeight);
  263.         }
  264.        return TRUE;
  265.    }
  266.    else if (! strcmp(args[0], "TANKPOSITION") )
  267.    {
  268.        int player_number, x, y;
  269.        PLAYER *my_player;
  270.  
  271.        sscanf(args[1], "%d", &player_number);
  272.        my_player = global->players[player_number];
  273.        if ( (my_player) && (my_player->tank) )
  274.        {
  275.            sscanf(args[2], "%d", &x);
  276.            sscanf(args[3], "%d", &y);
  277.            my_player->tank->x = x;
  278.            my_player->tank->y = y;
  279.        }
  280.        if (player_number == (global->numPlayers - 1))
  281.          return TRUE;
  282.    }
  283.    else if (! strcmp(args[0], "TEAM") )
  284.    {
  285.        int player_number, colour;
  286.        double the_team;
  287.        sscanf(args[1], "%d", &player_number);
  288.        sscanf(args[2], "%lf", & the_team);
  289.        if ( (the_team < global->numPlayers) && (the_team >= 0) )
  290.        {
  291.             global->players[player_number]->team = the_team;
  292.             if (the_team == TEAM_JEDI)
  293.                 colour = makecol(0, 255, 0);
  294.             else if (the_team == TEAM_SITH)
  295.                 colour = makecol(255, 0, 255);
  296.             else if (the_team == TEAM_NEUTRAL)
  297.                 colour = makecol(0, 0, 255);
  298.             if (global->players[player_number] == global->client_player)
  299.                 colour = makecol(255, 0, 0);
  300.             global->players[player_number]->color = colour;
  301.        }
  302.        if (player_number == (global->numPlayers - 1) )
  303.           return TRUE; 
  304.    }
  305.    else if (! strcmp(args[0], "TELEPORT") )
  306.    {
  307.        int player_num;
  308.        int new_x, new_y;
  309.        TELEPORT *my_teleport;
  310.  
  311.        sscanf(args[1], "%d", &player_num);
  312.        sscanf(args[2], "%d", &new_x);
  313.        sscanf(args[3], "%d", &new_y);
  314.        if ( (player_num >= 0) && (player_num < global->numPlayers) &&
  315.             (global->players[player_num]->tank) )
  316.        {
  317.           my_teleport = new TELEPORT(global, env, global->players[player_num]->tank,
  318.                             new_x, new_y, TANKHEIGHT * 4 + GUNLENGTH, 120);
  319.        }
  320.            
  321.    }
  322.    else if (! strcmp(args[0], "WALLTYPE"))
  323.    {
  324.         sscanf(args[1], "%d", &(env->current_wallType));
  325.         switch (env->current_wallType)
  326.         {
  327.            case WALL_RUBBER:
  328.            env->wallColour = makecol(0, 255, 0); // GREEN;
  329.            break;
  330.            case WALL_STEEL:
  331.            env->wallColour = makecol(255, 0, 0); // RED;
  332.            break;
  333.            case WALL_SPRING:
  334.            env->wallColour = makecol(0, 0, 255); //BLUE;
  335.            break;
  336.            case WALL_WRAP:
  337.            env->wallColour = makecol(255, 255, 0); // YELLOW;
  338.            break;
  339.         }
  340.        return TRUE;
  341.    }
  342.    else if (! strcmp(args[0], "WEAPON") )
  343.    {
  344.        int weapon_index, amount;
  345.        sscanf(args[1], "%d", &weapon_index);
  346.        sscanf(args[2], "%d", &amount);
  347.        if ( (weapon_index >= 0) && (weapon_index < WEAPONS) &&
  348.             (amount >= 0) && (amount <= 99) )
  349.        {
  350.             global->client_player->nm[weapon_index] = amount;
  351.        }
  352.        if (weapon_index == (WEAPONS - 1))
  353.           return TRUE;
  354.    }
  355.    else if (! strcmp(args[0], "YOUARE") )
  356.    {
  357.        int index;
  358.        sscanf(args[1], "%d", &index );
  359.        if ( (index >= 0) && (index < global->numPlayers) )
  360.        {
  361.           global->client_player = global->players[index];
  362.           global->currTank = global->client_player->tank;
  363.        }
  364.        return TRUE;
  365.    }
  366.  
  367.    return FALSE;
  368. }
  369.  
  370.  
  371.  
  372.  
  373. void Create_Sky(ENVIRONMENT *env, GLOBALDATA *global)
  374. {
  375.  if ( (env->custom_background) && (env->bitmap_filenames) )
  376.   {
  377.      if ( env->sky) destroy_bitmap(env->sky);
  378.      env->sky = load_bitmap( env->bitmap_filenames[ rand() % env->number_of_bitmaps ], NULL);
  379.   }
  380.  
  381.     if ( (! env->custom_background) || (! env->sky) )
  382.     {
  383.       if ( env->sky ) destroy_bitmap(env->sky);
  384. #ifdef THREADS
  385.       if (env->waiting_sky)
  386.       {
  387.            env->sky = env->waiting_sky;
  388.            env->waiting_sky = NULL;
  389.       }
  390.       else
  391.       {
  392. #endif
  393.       env->sky = create_bitmap( global->screenWidth, global->screenHeight - MENUHEIGHT);
  394.       generate_sky (global, env->sky, sky_gradients[global->cursky],
  395.                    (global->ditherGradients ? GENSKY_DITHERGRAD : 0 ) |
  396.                    (global->detailedSky ? GENSKY_DETAILED : 0 )  );
  397. #ifdef THREADS
  398.       }
  399. #endif
  400.   }
  401.  
  402. }         // end of create sky function
  403.  
  404.  
  405.  
  406. // Send a shot command to the server
  407. int Client_Fire(PLAYER *my_player, int my_socket)
  408. {
  409.    char buffer[256];
  410.  
  411.    if (!my_player) return FALSE;
  412.    if (! my_player->tank) return FALSE;
  413.  
  414.    sprintf(buffer, "FIRE %d %d %d", my_player->tank->cw, my_player->tank->a,
  415.                    my_player->tank->p);
  416.    write(my_socket, buffer, strlen(buffer));
  417.    return TRUE;
  418. }
  419.  
  420.  
  421. // Adjust our power on the client side
  422. int Client_Power(PLAYER *my_player, int more_or_less)
  423. {
  424.     if ( (my_player) && (my_player->tank) )
  425.     {
  426.         if ( (more_or_less == CLIENT_UP) && (my_player->tank->p < 1996) )
  427.            my_player->tank->p += 5;
  428.         else if ( (more_or_less == CLIENT_DOWN) && (my_player->tank->p > 5) )
  429.            my_player->tank->p -= 5;
  430.         return TRUE;
  431.     }
  432.     return FALSE;
  433. }
  434.  
  435.  
  436.  
  437. int Client_Angle(PLAYER *my_player, int left_or_right)
  438. {
  439.     if (! my_player) return FALSE;
  440.     if (! my_player->tank) return FALSE;
  441.  
  442.     if ( (left_or_right == CLIENT_LEFT) && (my_player->tank->a < 270) )
  443.          my_player->tank->a++;
  444.     else if ( (left_or_right == CLIENT_RIGHT) && (my_player->tank->a > 90) )
  445.          my_player->tank->a--;
  446.     return TRUE;
  447. }
  448.  
  449.  
  450. int Client_Cycle_Weapon(PLAYER *my_player, int forward_or_back)
  451. {
  452.    bool found = false;
  453.  
  454.    if (! my_player->tank)
  455.        return FALSE;
  456.  
  457.    while (! found)
  458.    {
  459.         if (forward_or_back == CYCLE_FORWARD)
  460.             my_player->tank->cw++;
  461.         else 
  462.             my_player->tank->cw--;
  463.  
  464.         if (my_player->tank->cw >= THINGS)
  465.            my_player->tank->cw = 0;
  466.         else if (my_player->tank->cw < 0)
  467.            my_player->tank->cw = THINGS - 1;
  468.  
  469.         // check if we have found a weapon
  470.         if (my_player->tank->cw < WEAPONS)
  471.         {
  472.              if (my_player->nm[my_player->tank->cw])
  473.                  found = true;
  474.         }
  475.         else      // an item
  476.         {
  477.              if ( (item[my_player->tank->cw - WEAPONS].selectable) &&
  478.                   (my_player->ni[my_player->tank->cw - WEAPONS]) )
  479.                  found = true;
  480.         }
  481.    }
  482.    return TRUE;
  483. }
  484.  
  485.  
  486.  
  487. // This function takes an error number and returns a string
  488. // which contains useful information about that error.
  489. // On success, a pointer to char is returned.
  490. // On failure, a NULL is returned.
  491. // The returned pointer does NOT need to be freed.
  492. char *Explain_Error(GLOBALDATA *global, int error_code)
  493. {
  494.     char *my_message = NULL;
  495.  
  496.     switch (error_code)
  497.     {
  498.        case CLIENT_ERROR_VERSION:
  499.            my_message = global->ingame->complete_text[77];
  500.        break;
  501.        case CLIENT_ERROR_SCREENSIZE:
  502.            my_message = global->ingame->complete_text[78];
  503.        break;
  504.        case CLIENT_ERROR_DISCONNECT:
  505.            my_message = global->ingame->complete_text[79];
  506.        break;
  507.     }
  508.  
  509.     return my_message;
  510. }
  511.  
  512.  
  513.  
  514.  
  515. #endif
  516.  
  517.