1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
/*
* File: cloud.cc
* Summary: Functions related to clouds.
* Written by: Brent Ross
*
* Creating a cloud module so all the cloud stuff can be isolated.
*
* Change History (most recent first):
*
* <1> Oct 1/2001 BWR Created
*/
#include "AppHdr.h"
#include "externs.h"
#include "cloud.h"
#include "stuff.h"
void delete_cloud( int cloud )
{
if (env.cloud[ cloud ].type != CLOUD_NONE)
{
const int cloud_x = env.cloud[ cloud ].x;
const int cloud_y = env.cloud[ cloud ].y;
env.cloud[ cloud ].type = CLOUD_NONE;
env.cloud[ cloud ].decay = 0;
env.cloud[ cloud ].x = 0;
env.cloud[ cloud ].y = 0;
env.cgrid[ cloud_x ][ cloud_y ] = EMPTY_CLOUD;
env.cloud_no--;
}
}
static void new_cloud( int cloud, int type, int x, int y, int decay )
{
ASSERT( env.cloud[ cloud ].type == CLOUD_NONE );
env.cloud[ cloud ].type = type;
env.cloud[ cloud ].decay = decay;
env.cloud[ cloud ].x = x;
env.cloud[ cloud ].y = y;
env.cgrid[ x ][ y ] = cloud;
env.cloud_no++;
}
// The current use of this function is for shifting in the abyss, so
// that clouds get moved along with the rest of the map.
void move_cloud( int cloud, int new_x, int new_y )
{
if (cloud != EMPTY_CLOUD)
{
const int old_x = env.cloud[ cloud ].x;
const int old_y = env.cloud[ cloud ].y;
env.cgrid[ new_x ][ new_y ] = cloud;
env.cloud[ cloud ].x = new_x;
env.cloud[ cloud ].y = new_y;
env.cgrid[ old_x ][ old_y ] = EMPTY_CLOUD;
}
}
// Places a cloud with the given stats. May delete old clouds to make way
// if there are too many (MAX_CLOUDS == 30) on level. Will overwrite an old
// cloud under some circumstances.
void place_cloud(unsigned char cl_type, unsigned char ctarget_x,
unsigned char ctarget_y, unsigned char cl_range)
{
int cl_new = -1;
// more compact {dlb}
const unsigned char target_cgrid = env.cgrid[ctarget_x][ctarget_y];
// that is, another cloud already there {dlb}
if (target_cgrid != EMPTY_CLOUD)
{
if ((env.cloud[ target_cgrid ].type >= CLOUD_GREY_SMOKE
&& env.cloud[ target_cgrid ].type <= CLOUD_STEAM)
|| env.cloud[ target_cgrid ].type == CLOUD_STINK
|| env.cloud[ target_cgrid ].type == CLOUD_BLACK_SMOKE
|| env.cloud[ target_cgrid ].decay <= 20) //soon gone
{
cl_new = env.cgrid[ ctarget_x ][ ctarget_y ];
delete_cloud( env.cgrid[ ctarget_x ][ ctarget_y ] );
}
else
{
return;
}
}
// too many clouds
if (env.cloud_no >= MAX_CLOUDS)
{
// default to random in case there's no low quality clouds
int cl_del = random2( MAX_CLOUDS );
for (int ci = 0; ci < MAX_CLOUDS; ci++)
{
if ((env.cloud[ ci ].type >= CLOUD_GREY_SMOKE
&& env.cloud[ ci ].type <= CLOUD_STEAM)
|| env.cloud[ ci ].type == CLOUD_STINK
|| env.cloud[ ci ].type == CLOUD_BLACK_SMOKE
|| env.cloud[ ci ].decay <= 20) //soon gone
{
cl_del = ci;
break;
}
}
delete_cloud( cl_del );
cl_new = cl_del;
}
// create new cloud
if (cl_new != -1)
new_cloud( cl_new, cl_type, ctarget_x, ctarget_y, cl_range * 10 );
else
{
// find slot for cloud
for (int ci = 0; ci < MAX_CLOUDS; ci++)
{
if (env.cloud[ci].type == CLOUD_NONE) // ie is empty
{
new_cloud( ci, cl_type, ctarget_x, ctarget_y, cl_range * 10 );
break;
}
}
}
} // end place_cloud();
|