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 / teleport.cpp < prev    next >
C/C++ Source or Header  |  2009-11-01  |  6KB  |  212 lines

  1. /*
  2.  * atanks - obliterate each other with oversize weapons
  3.  * Copyright (C) 2003  Thomas Hudson
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  * */
  19.  
  20.  
  21. #include "environment.h"
  22. #include "globaldata.h"
  23. #include "teleport.h"
  24.  
  25. TELEPORT::~TELEPORT ()
  26. {
  27.   requireUpdate();
  28.   update();
  29.   _env->make_bgupdate (_current.x, _current.y, _current.w, _current.h);
  30.   _env->make_bgupdate (_old.x, _old.y, _old.w, _old.h);
  31.   _env->removeObject (this);
  32.   _env        = NULL;
  33.   _global     = NULL;
  34.   object      = NULL;
  35.   remote      = NULL;
  36. }
  37.  
  38. TELEPORT::TELEPORT (GLOBALDATA *global, ENVIRONMENT *env, VIRTUAL_OBJECT *targetObj, int destinationX, int destinationY,
  39.                     int objRadius, int duration):VIRTUAL_OBJECT(),clock(duration),startClock(duration),peaked(0),
  40.                                                                   object(NULL),remote(NULL)
  41. {
  42.   setEnvironment (env);
  43.   player = NULL;
  44.   _align = LEFT;
  45.   _global = global;
  46.   object = targetObj;
  47.   radius = objRadius;
  48.   remote = new TELEPORT (global, env, this, destinationX, destinationY);
  49.   if (!remote)
  50.     {
  51.       perror ( "teleport.cc: Failed allocating memory for remote in TELEPORT::TELEPORT");
  52.     }
  53.   play_sample ((SAMPLE *) _global->sounds[item[ITEM_TELEPORT].sound], 255, 128, 1000, 0);
  54.  
  55.   #ifdef NETWORK
  56.   // this seems to be the teleport we usually use
  57.   char buffer[64];
  58.   int player_index = 0;
  59.   bool found = false;
  60.   TANK *the_tank = (TANK*) targetObj;
  61.   // match the player with the tank
  62.   while ( (player_index < global->numPlayers) && (! found) )
  63.   {
  64.       if ( ( global->players[player_index]->tank ) && (global->players[player_index]->tank == the_tank) )
  65.         found = true;
  66.      else
  67.         player_index++;
  68.   }
  69.   if (found)
  70.   {
  71.      sprintf(buffer, "TELEPORT %d %d %d", player_index, destinationX, destinationY);
  72.      global->Send_To_Clients(buffer);
  73.   }
  74.   #endif
  75. }
  76.  
  77.  
  78.  
  79.  
  80. TELEPORT::TELEPORT (GLOBALDATA *global, ENVIRONMENT *env, TELEPORT *remoteEnd, int destX, int destY):VIRTUAL_OBJECT(),
  81.                     clock(remoteEnd->startClock),startClock(remoteEnd->startClock),peaked(0)
  82. {
  83.   remote = remoteEnd;
  84.   setEnvironment (env);
  85.   player = NULL;
  86.   _align = LEFT;
  87.   _global = global;
  88.   object = NULL;
  89.   x = destX;
  90.   y = destY;
  91.   radius = remote->radius;
  92. }
  93.  
  94. void TELEPORT::initialise ()
  95. {
  96.   VIRTUAL_OBJECT::initialise ();
  97.   peaked = 0;
  98.   clock = startClock;
  99. }
  100.  
  101. int TELEPORT::applyPhysics ()
  102. {
  103.   if (object)
  104.     {
  105.       x = object->x;
  106.       y = object->y;
  107.     }
  108.   else
  109.     {
  110.       clock = remote->clock;
  111.     }
  112.   if (clock < 1)
  113.     {
  114.       if (clock == 0)
  115.         {
  116.           if (object)
  117.             {
  118.               object->x = remote->x;
  119.               object->y = remote->y;
  120.               remote->object = object;
  121.               object = NULL;
  122.               remote->clock--;
  123.             }
  124.         }
  125.       if (clock < -startClock / 2)
  126.         destroy = TRUE;
  127.     }
  128.   clock--;
  129.   return (0);
  130. }
  131.  
  132.  
  133. // new telport version
  134. void TELEPORT::draw (BITMAP *dest)
  135. {
  136.   BITMAP *tempBitmap;
  137.   double pClock = clock;
  138.   int blobSize, pRadius, maxblobs;
  139.  
  140.   if (pClock < 1.0)
  141.     pClock = 1.0 + (1.0 - (pClock * 2.0));
  142.   blobSize = 8 - (int)round(8 / (startClock / pClock)) + 1;
  143.   pRadius  = radius - (int)round(radius / (startClock / pClock)) + 1;
  144.   maxblobs = 1 + (pRadius * 4);
  145.  
  146.   tempBitmap = create_bitmap (radius * 2, radius * 2);
  147.   blit (dest, tempBitmap, remote->x - radius, remote->y - radius, 0, 0, radius * 2, radius * 2);
  148.  
  149.   if (object)
  150.     remote->draw(dest);
  151.  
  152.   drawing_mode (DRAW_MODE_TRANS, NULL, 0, 0);
  153.   set_trans_blender (0, 0, 0, 255 - (int)((pClock / startClock) * 255));
  154.   for (int count = (int)round(maxblobs + pClock); count > pClock; count--)
  155.     {
  156.       int xOff = (int)(perlin2DPoint (1.0, 200, 1278 + x + count * 100, pClock, 0.25, 6) * pRadius);
  157.       int yOff = (int)(perlin2DPoint (1.0, 200, 9734 + y + count * 100, pClock, 0.25, 6) * pRadius);
  158.       circlefill (dest, x + xOff, y + yOff, blobSize, getpixel (tempBitmap, pRadius + xOff, pRadius + yOff));
  159.     }
  160.   drawing_mode (DRAW_MODE_SOLID, NULL, 0, 0);
  161.   setUpdateArea (x - pRadius - blobSize, y - pRadius - blobSize, (pRadius + blobSize) * 2, (pRadius + blobSize) * 2);
  162.   requireUpdate ();
  163.  
  164.   destroy_bitmap (tempBitmap);
  165. }
  166.  
  167.  
  168. /*
  169.  * Old version
  170. void TELEPORT::draw (BITMAP *dest)
  171. {
  172.   BITMAP *tempBitmap;
  173.   int blobSize = 8;
  174.   int pClock = clock;
  175.   if (pClock < 0)
  176.     {
  177.       pClock = 0;
  178.       blobSize = (startClock / 2) / -clock;
  179.     }
  180.  
  181.   tempBitmap = create_bitmap (radius * 2, radius * 2);
  182.   blit (_env->db, tempBitmap, (int)remote->x - radius, (int)remote->y - radius, 0, 0, radius * 2, radius * 2);
  183.  
  184.   if (object)
  185.     remote->draw (dest);
  186.  
  187.   drawing_mode (DRAW_MODE_TRANS, NULL, 0, 0);
  188.   set_trans_blender (0, 0, 0, 255 - (int)((pClock / startClock) * 255));
  189.   for (int count = (radius * radius * 4 / (8 * 8)); count > pClock; count--)
  190.     {
  191.       int xOff = (int)(perlin2DPoint (1.0, 200, 1278 + (int)x + count * 100, clock, 0.25, 6) * (radius));
  192.       int yOff = (int)(perlin2DPoint (1.0, 200, 9734 + (int)y + count * 100, clock, 0.25, 6) * (radius));
  193.       circlefill (dest, (int)x + xOff, (int)y + yOff, blobSize, getpixel (tempBitmap, radius + xOff, radius + yOff));
  194.     }
  195.   drawing_mode (DRAW_MODE_SOLID, NULL, 0, 0);
  196.   setUpdateArea ((int)x - radius - blobSize, (int)y - radius - blobSize, (radius + blobSize) * 2, (radius + blobSize) * 2);
  197.   requireUpdate ();
  198.  
  199.   destroy_bitmap (tempBitmap);
  200. }
  201. */
  202.  
  203.  
  204. int TELEPORT::isSubClass (int classNum)
  205. {
  206.   if (classNum == TELEPORT_CLASS)
  207.     return (TRUE);
  208.   else
  209.     return (FALSE);
  210.   //return (PHYSICAL_OBJECT::isSubClass (classNum));
  211. }
  212.