/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
// Filename : OB_PROJ.CPP
// Description : header file for Projectile
// Owner : Gilbert
#include
// the height of projectile is as follow :
// z = z_coff * (cur_step+1) * (total_step+1 - cur_step ));
// the gradient of projectile is
// dz/d(cur_step) = z_coff * (total_step - 2 * (cur_step) );
// if dz/d(cur_step) >= 10.0 use upward frame,
// if dz/d(cur_step) <= -10.0 use downward frame,
// actual bullet (x,y,z) is drawn at (x, y - z)
// shadow is drawn at set_cur(x - z/8, y - z/6);
// --------- Begin of function Projectile::Projectile --------//
Projectile::Projectile() : Bullet(), act_bullet(), bullet_shadow()
{
act_bullet.sprite_recno = 0;
bullet_shadow.sprite_recno = 0;
}
// --------- End of function Projectile::Projectile --------//
// --------- Begin of function Projectile::~Projectile --------//
Projectile::~Projectile()
{
deinit();
}
// --------- End of function Projectile::~Projectile --------//
// --------- Begin of function Projectile::init --------//
//### begin alex 3/5 ###//
void Projectile::init(char parentType, short parentRecno, short targetXLoc, short targetYLoc, char targetMobileType)
{
Bullet::init(parentType, parentRecno, targetXLoc, targetYLoc, targetMobileType);
//#### end alex 3/5 ####//
short spriteId = sprite_info->get_sub_sprite_info(1)->sprite_id;
act_bullet.init( spriteId, cur_x_loc(), cur_y_loc() );
short shadowSpriteId = sprite_info->get_sub_sprite_info(2)->sprite_id;
bullet_shadow.init( shadowSpriteId, cur_x_loc(), cur_y_loc() );
// calculate z_coff;
z_coff = (float)1.0;
/*
float dz = z_coff * total_step;
if( dz >= 10.0)
cur_dir = cur_dir & 7 | 8; // pointing up
else if( dz <= -10.0)
cur_dir = cur_dir & 7 | 16; // pointing down
else
cur_dir &= 7;
*/
// --------- recalcuate spriteFrame pointer ----------//
SpriteFrame* spriteFrame = cur_sprite_frame();
}
// --------- End of function Projectile::init --------//
// --------- Begin of function Projectile::deinit --------//
void Projectile::deinit()
{
}
// --------- End of function Projectile::deinit --------//
// --------- Begin of function Projectile::draw --------//
void Projectile::draw()
{
short z = short(z_coff * (cur_step+1) * (total_step+1 - cur_step ));
if(z < 0)
z = 0;
// does not draw itself but the shadow and the actual bullet
if( cur_action == SPRITE_MOVE )
{
// -------- update cur_frame ----------//
float dz = z_coff * (total_step - 2 * (cur_step) );
if( dz >= 10.0)
final_dir = (final_dir & 7 )| 8; // pointing up
else if( dz <= -10.0)
final_dir = (final_dir & 7 )| 16; // pointing down
else
final_dir &= 7;
// ------- update bullet_shadow coordinate --------//
err_when((bullet_shadow.sprite_info)->need_turning);
bullet_shadow.set_dir(final_dir);
bullet_shadow.cur_frame = cur_frame;
bullet_shadow.cur_action = SPRITE_MOVE;
bullet_shadow.set_cur(cur_x - z / 8, cur_y - z / 6);
// ------- update act_bullet coordinate --------//
err_when((act_bullet.sprite_info)->need_turning);
act_bullet.set_dir(final_dir);
act_bullet.cur_frame = cur_frame;
act_bullet.cur_action = SPRITE_MOVE;
act_bullet.set_cur(cur_x, cur_y - z);
bullet_shadow.draw();
act_bullet.draw();
// restore cur_dir
set_dir((final_dir&7));
}
else
{
// ###### begin Gilbert 17/10 #########//
char finalDirBackup = final_dir;
if( cur_action == SPRITE_DIE )
set_dir((final_dir & 7) | 16); // downward direction
Bullet::draw();
if( cur_action == SPRITE_DIE )
set_dir(finalDirBackup); // downward direction
// ###### end Gilbert 17/10 #########//
}
}
// --------- End of function Projectile::draw --------//
// --------- Begin of function Projectile::display_layer --------//
char Projectile::display_layer()
{
//### begin alex 3/5 ###//
if(mobile_type == UNIT_AIR || target_mobile_type==UNIT_AIR)
//#### end alex 3/5 ####//
return 8;
else
return 2;
}
// --------- End of function Projectile::display_layer --------//