/* * 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 : OU_CART.CPP // Description : Explosive Cart #include // --------- define constant --------// #define EXPLODE_RANGE 1 #define EXPLODE_DAMAGE 50 #define CHAIN_TRIGGER_RANGE 2 UnitExpCart::UnitExpCart() : Unit() { triggered = 0; } UnitExpCart::~UnitExpCart() { } int UnitExpCart::process_die() { if(triggered && cur_frame == 3) { short x, y; short x1 = next_x_loc(); short x2 = x1; short y1 = next_y_loc(); short y2 = y1; x1 -= CHAIN_TRIGGER_RANGE; x2 += CHAIN_TRIGGER_RANGE; y1 -= CHAIN_TRIGGER_RANGE; y2 += CHAIN_TRIGGER_RANGE; if(x1 < 0) x1 = 0; if(x2 >= world.max_x_loc) x2 = world.max_x_loc-1; if(y1 < 0) y1 = 0; if(y2 >= world.max_y_loc) y2 = world.max_y_loc-1; for( y = y1; y <= y2; ++y) { for( x = x1; x <= x2; ++x) { Location *locPtr = world.get_loc(x,y); if( locPtr->has_unit(UNIT_LAND) ) { Unit *unitPtr = unit_array[locPtr->unit_recno(UNIT_LAND)]; if( unitPtr->unit_id == UNIT_EXPLOSIVE_CART ) ((UnitExpCart *)unitPtr)->trigger_explode(); } } } } if(triggered && (cur_frame == 3 || cur_frame == 7) ) { short x, y; short x1 = next_x_loc(); short x2 = x1; short y1 = next_y_loc(); short y2 = y1; x1 -= EXPLODE_RANGE; x2 += EXPLODE_RANGE; y1 -= EXPLODE_RANGE; y2 += EXPLODE_RANGE; if(x1 < 0) x1 = 0; if(x2 >= world.max_x_loc) x2 = world.max_x_loc-1; if(y1 < 0) y1 = 0; if(y2 >= world.max_y_loc) y2 = world.max_y_loc-1; if( cur_frame == 3) { for( y = y1; y <= y2; ++y) { for( x = x1; x <= x2; ++x) { Location *locPtr = world.get_loc(x,y); if( locPtr->has_unit(UNIT_LAND) ) { hit_target(this, unit_array[locPtr->unit_recno(UNIT_LAND)], (float) EXPLODE_DAMAGE); } else if( locPtr->has_unit(UNIT_SEA) ) { hit_target(this, unit_array[locPtr->unit_recno(UNIT_SEA)], (float) EXPLODE_DAMAGE); } else if( locPtr->is_wall() ) { hit_wall(this, x, y, (float) EXPLODE_DAMAGE); } else if( locPtr->is_plant() ) { locPtr->remove_plant(); world.plant_count--; } else { hit_building(this, x, y, (float) EXPLODE_DAMAGE); } } } } else if(cur_frame == 7) { for( y = y1; y <= y2; ++y) { for( x = x1; x <= x2; ++x) { Location *locPtr = world.get_loc(x,y); // ##### begin Gilbert 30/10 ######// int fl = (abs(x - next_x_loc()) + abs(y - next_y_loc())) * -30 + 80; if( locPtr->can_set_fire() && locPtr->fire_str() < fl ) locPtr->set_fire_str(fl); if( locPtr->fire_src() > 0 ) locPtr->set_fire_src(1); // such that the fire will be put out quickly // ##### end Gilbert 30/10 ######// } } } } return Unit::process_die(); } void UnitExpCart::trigger_explode() { if( hit_points > 0) // so dying cart cannot be triggered { triggered = 1; hit_points = (float) 0; } }