- when you swittch off the ai in a scenario the faction does not consume consumable ressources anymore ( food ..)

- gui bugfix commands are no more canceled when any unit dies
This commit is contained in:
Titus Tscharntke 2010-03-20 15:02:52 +00:00
parent 64513cdf90
commit d4202298fd
2 changed files with 231 additions and 20 deletions

View File

@ -0,0 +1,207 @@
// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2001-2008 Marti<74>o Figueroa
//
// You can redistribute this code 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
// ==============================================================
#include "selection.h"
#include <algorithm>
#include "unit_type.h"
#include "gui.h"
#include "leak_dumper.h"
using namespace std;
namespace Glest{ namespace Game{
// =====================================================
// class Selection
// =====================================================
void Selection::init(Gui *gui, int factionIndex){
this->factionIndex= factionIndex;
this->gui= gui;
}
Selection::~Selection(){
clear();
}
void Selection::select(Unit *unit){
//check size
if(selectedUnits.size()>=maxUnits){
return;
}
//check if already selected
for(int i=0; i<selectedUnits.size(); ++i){
if(selectedUnits[i]==unit){
return;
}
}
//check if dead
if(unit->isDead()){
return;
}
//check if multisel
if(!unit->getType()->getMultiSelect() && !isEmpty()){
return;
}
//check if enemy
if(unit->getFactionIndex()!=factionIndex && !isEmpty()){
return;
}
//check existing enemy
if(selectedUnits.size()==1 && selectedUnits.front()->getFactionIndex()!=factionIndex){
clear();
}
//check existing multisel
if(selectedUnits.size()==1 && !selectedUnits.front()->getType()->getMultiSelect()){
clear();
}
unit->addObserver(this);
selectedUnits.push_back(unit);
gui->onSelectionChanged();
}
void Selection::select(const UnitContainer &units){
//add units to gui
for(UnitIterator it= units.begin(); it!=units.end(); ++it){
select(*it);
}
}
void Selection::unSelect(const UnitContainer &units){
//add units to gui
for(UnitIterator it= units.begin(); it!=units.end(); ++it){
for(int i=0; i<selectedUnits.size(); ++i){
if(selectedUnits[i]==*it){
unSelect(i);
}
}
}
}
void Selection::unSelect(int i){
//remove unit from list
selectedUnits.erase(selectedUnits.begin()+i);
gui->onSelectionChanged();
}
void Selection::clear(){
//clear list
selectedUnits.clear();
}
bool Selection::isUniform() const{
if(selectedUnits.empty()){
return true;
}
const UnitType *ut= selectedUnits.front()->getType();
for(int i=0; i<selectedUnits.size(); ++i){
if(selectedUnits[i]->getType()!=ut){
return false;
}
}
return true;
}
bool Selection::isEnemy() const{
return selectedUnits.size()==1 && selectedUnits.front()->getFactionIndex()!=factionIndex;
}
bool Selection::isComandable() const{
return
!isEmpty() &&
!isEnemy() &&
!(selectedUnits.size()==1 && !selectedUnits.front()->isOperative());
}
bool Selection::isCancelable() const{
return
selectedUnits.size()>1 ||
(selectedUnits.size()==1 && selectedUnits[0]->anyCommand());
}
bool Selection::isMeetable() const{
return
isUniform() &&
isComandable() &&
selectedUnits.front()->getType()->getMeetingPoint();
}
Vec3f Selection::getRefPos() const{
return getFrontUnit()->getCurrVector();
}
bool Selection::hasUnit(const Unit* unit) const{
return find(selectedUnits.begin(), selectedUnits.end(), unit)!=selectedUnits.end();
}
void Selection::assignGroup(int groupIndex){
//clear group
groups[groupIndex].clear();
//assign new group
for(int i=0; i<selectedUnits.size(); ++i){
groups[groupIndex].push_back(selectedUnits[i]);
}
}
void Selection::recallGroup(int groupIndex){
clear();
for(int i=0; i<groups[groupIndex].size(); ++i){
select(groups[groupIndex][i]);
}
}
void Selection::unitEvent(UnitObserver::Event event, const Unit *unit){
if(event==UnitObserver::eKill){
//remove from selection
for(int i=0; i<selectedUnits.size(); ++i){
if(selectedUnits[i]==unit){
selectedUnits.erase(selectedUnits.begin()+i);
break;
}
}
//remove from groups
for(int i=0; i<maxGroups; ++i){
for(int j=0; j<groups[i].size(); ++j){
if(groups[i][j]==unit){
groups[i].erase(groups[i].begin()+j);
break;
}
}
}
//notify gui only if no more units to execute the command
//of course the selection changed, but this doesn't matter in this case.
if( selectedUnits.size()<1 ){
gui->onSelectionChanged();
}
}
}
}}//end namespace

View File

@ -294,27 +294,31 @@ void Faction::applyCostsOnInterval(){
}
}
}
//decrement consumables
for(int j=0; j<getUnitCount(); ++j){
Unit *unit= getUnit(j);
if(unit->isOperative()){
for(int k=0; k<unit->getType()->getCostCount(); ++k){
const Resource *resource= unit->getType()->getCost(k);
if(resource->getType()->getClass()==rcConsumable && resource->getAmount()>0){
incResourceAmount(resource->getType(), -resource->getAmount());
//decrease unit hp
if(getResource(resource->getType())->getAmount()<0){
resetResourceAmount(resource->getType());
bool decHpResult=unit->decHp(unit->getType()->getMaxHp()/3);
if(decHpResult){
world->getStats()->die(unit->getFactionIndex());
scriptManager->onUnitDied(unit);
}
StaticSound *sound= unit->getType()->getFirstStOfClass(scDie)->getSound();
if(sound!=NULL && thisFaction){
SoundRenderer::getInstance().playFx(sound);
if(!getCpuControl() ||
getCpuControl() && !scriptManager->getPlayerModifiers(this->thisFaction)->getAiEnabled())
{
for(int j=0; j<getUnitCount(); ++j){
Unit *unit= getUnit(j);
if(unit->isOperative()){
for(int k=0; k<unit->getType()->getCostCount(); ++k){
const Resource *resource= unit->getType()->getCost(k);
if(resource->getType()->getClass()==rcConsumable && resource->getAmount()>0){
incResourceAmount(resource->getType(), -resource->getAmount());
//decrease unit hp
if(getResource(resource->getType())->getAmount()<0){
resetResourceAmount(resource->getType());
bool decHpResult=unit->decHp(unit->getType()->getMaxHp()/3);
if(decHpResult){
world->getStats()->die(unit->getFactionIndex());
scriptManager->onUnitDied(unit);
}
StaticSound *sound= unit->getType()->getFirstStOfClass(scDie)->getSound();
if(sound!=NULL && thisFaction){
SoundRenderer::getInstance().playFx(sound);
}
}
}
}