unitloader.cpp
来自「这是整套横扫千军3D版游戏的源码」· C++ 代码 · 共 494 行 · 第 1/2 页
CPP
494 行
// UnitLoader.cpp: implementation of the CUnitLoader class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "UnitLoader.h"
#include "Unit.h"
#include "UnitDefHandler.h"
#include "UnitTypes/Builder.h"
#include "UnitTypes/ExtractorBuilding.h"
#include "UnitTypes/Factory.h"
#include "UnitTypes/TransportUnit.h"
#include "COB/CobEngine.h"
#include "COB/CobFile.h"
#include "COB/CobInstance.h"
#include "CommandAI/AirCAI.h"
#include "CommandAI/BuilderCAI.h"
#include "CommandAI/CommandAI.h"
#include "CommandAI/FactoryCAI.h"
#include "CommandAI/MobileCAI.h"
#include "CommandAI/TransportCAI.h"
#include "Game/GameHelper.h"
#include "Map/Ground.h"
#include "Map/MapDamage.h"
#include "Platform/errorhandler.h"
#include "Rendering/UnitModels/3DModelParser.h"
#include "Sim/MoveTypes/AirMoveType.h"
#include "Sim/MoveTypes/groundmovetype.h"
#include "Sim/MoveTypes/TAAirMoveType.h"
#include "Sim/Weapons/BeamLaser.h"
#include "Sim/Weapons/bombdropper.h"
#include "Sim/Weapons/Cannon.h"
#include "Sim/Weapons/DGunWeapon.h"
#include "Sim/Weapons/EmgCannon.h"
#include "Sim/Weapons/FlameThrower.h"
#include "Sim/Weapons/LaserCannon.h"
#include "Sim/Weapons/LightingCannon.h"
#include "Sim/Weapons/MeleeWeapon.h"
#include "Sim/Weapons/MissileLauncher.h"
#include "Sim/Weapons/NoWeapon.h"
#include "Sim/Weapons/PlasmaRepulser.h"
#include "Sim/Weapons/Rifle.h"
#include "Sim/Weapons/StarburstLauncher.h"
#include "Sim/Weapons/TorpedoLauncher.h"
#include "Sim/Weapons/WeaponDefHandler.h"
#include "Sound.h"
#include "myMath.h"
#include "LogOutput.h"
#include "TimeProfiler.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUnitLoader unitLoader;
CUnitLoader::CUnitLoader()
{
CGroundMoveType::CreateLineTable();
}
CUnitLoader::~CUnitLoader()
{
CGroundMoveType::DeleteLineTable();
}
CUnit* CUnitLoader::LoadUnit(const string& name, float3 pos, int side,
bool build, int facing, const CUnit* builder)
{
CUnit* unit;
SCOPED_TIMER("Unit loader");
const UnitDef* ud = unitDefHandler->GetUnitByName(name);
if(!ud) {
throw content_error("Couldn't find unittype " + name);
}
string type = ud->type;
if(!build){
pos.y=ground->GetHeight2(pos.x,pos.z);
if(ud->floater && pos.y<0)
pos.y = -ud->waterline;
}
bool blocking = false; //Used to tell if ground area shall be blocked of not.
//unit = SAFE_NEW CUnit(pos, side);
if (side < 0) {
side = MAX_TEAMS - 1; // FIXME use gs->gaiaTeamID ? (once it is always enabled)
}
if (type == "GroundUnit"){
unit = SAFE_NEW CUnit;
blocking = true;
} else if (type == "Transport"){
unit = SAFE_NEW CTransportUnit;
blocking = true;
} else if (type == "Building"){
unit = SAFE_NEW CBuilding;
blocking = true;
} else if (type == "Factory"){
unit = SAFE_NEW CFactory;
blocking = true;
} else if (type == "Builder"){
unit = SAFE_NEW CBuilder;
blocking = true;
} else if (type == "Bomber" || type == "Fighter"){
unit = SAFE_NEW CUnit;
} else if (type == "MetalExtractor") {
unit = SAFE_NEW CExtractorBuilding;
blocking = true;
} else {
logOutput << "Unknown unit type " << type.c_str() << "\n";
return NULL;
}
unit->UnitInit (ud, side, pos);
unit->beingBuilt=build;
unit->xsize = ((facing & 1) == 0) ? ud->xsize : ud->ysize;
unit->ysize = ((facing & 1) == 1) ? ud->xsize : ud->ysize;
unit->buildFacing = facing;
unit->power = ud->power;
unit->maxHealth = ud->health;
unit->health = ud->health;
//unit->metalUpkeep = ud->metalUpkeep*16.0f/GAME_SPEED;
//unit->energyUpkeep = ud->energyUpkeep*16.0f/GAME_SPEED;
unit->controlRadius = (int)(ud->controlRadius / SQUARE_SIZE);
unit->losHeight = ud->losHeight;
unit->metalCost = ud->metalCost;
unit->energyCost = ud->energyCost;
unit->buildTime = ud->buildTime;
unit->aihint = ud->aihint;
unit->tooltip = ud->humanName + " - " + ud->tooltip;
unit->armoredMultiple = max(0.0001f, ud->armoredMultiple); //armored multiple of 0 will crash spring
unit->wreckName = ud->wreckName;
unit->realLosRadius = (int) (ud->losRadius);
unit->realAirLosRadius = (int) (ud->airLosRadius);
unit->upright = ud->upright;
unit->radarRadius = ud->radarRadius / (SQUARE_SIZE * 8);
unit->sonarRadius = ud->sonarRadius / (SQUARE_SIZE * 8);
unit->jammerRadius = ud->jammerRadius / (SQUARE_SIZE * 8);
unit->sonarJamRadius = ud->sonarJamRadius / (SQUARE_SIZE * 8);
unit->seismicRadius = ud->seismicRadius / (SQUARE_SIZE * 8);
unit->seismicSignature = ud->seismicSignature;
unit->hasRadarCapacity = unit->radarRadius || unit->sonarRadius ||
unit->jammerRadius || unit->sonarJamRadius ||
unit->seismicRadius;
unit->stealth = ud->stealth;
unit->category = ud->category;
unit->armorType = ud->armorType;
unit->floatOnWater =
ud->floater || (ud->movedata && ((ud->movedata->moveType == MoveData::Hover_Move) ||
(ud->movedata->moveType == MoveData::Ship_Move)));
unit->maxSpeed = ud->speed / 30.0f;
unit->decloakDistance = ud->decloakDistance;
unit->flankingBonusMode = ud->flankingBonusMode;
unit->flankingBonusDir = ud->flankingBonusDir;
unit->flankingBonusMobility = ud->flankingBonusMobilityAdd * 1000;
unit->flankingBonusMobilityAdd = ud->flankingBonusMobilityAdd;
unit->flankingBonusAvgDamage = (ud->flankingBonusMax + ud->flankingBonusMin) * 0.5f;
unit->flankingBonusDifDamage = (ud->flankingBonusMax - ud->flankingBonusMin) * 0.5f;
if(ud->highTrajectoryType==1)
unit->useHighTrajectory=true;
if(ud->noAutoFire)
unit->fireState=0;
if(build){
unit->ChangeLos(1,1);
unit->health=0.1f;
} else {
unit->ChangeLos((int)(ud->losRadius),(int)(ud->airLosRadius));
}
if (type == "GroundUnit") {
SAFE_NEW CMobileCAI(unit);
}
else if (type == "Transport") {
SAFE_NEW CTransportCAI(unit);
}
else if (type == "Factory") {
SAFE_NEW CFactoryCAI(unit);
}
else if (type == "Builder") {
SAFE_NEW CBuilderCAI(unit);
}
else if (type == "Bomber") {
if (ud->hoverAttack) {
SAFE_NEW CMobileCAI(unit);
} else {
SAFE_NEW CAirCAI(unit);
}
}
else if(type == "Fighter"){
if (ud->hoverAttack) {
SAFE_NEW CMobileCAI(unit);
} else {
SAFE_NEW CAirCAI(unit);
}
}
else {
SAFE_NEW CCommandAI(unit);
}
if (ud->canmove && !ud->canfly && type!="Factory") {
CGroundMoveType* mt = SAFE_NEW CGroundMoveType(unit);
mt->maxSpeed=ud->speed/GAME_SPEED;
mt->maxWantedSpeed=ud->speed/GAME_SPEED;
mt->turnRate=ud->turnRate;
mt->baseTurnRate=ud->turnRate;
if (!mt->accRate)
logOutput << "acceleration of " << ud->name.c_str() << " is zero!!\n";
mt->moveType=ud->moveType;
mt->accRate=ud->maxAcc;
mt->floatOnWater=ud->movedata->moveType==MoveData::Hover_Move || ud->movedata->moveType==MoveData::Ship_Move;
if(!unit->beingBuilt)
unit->mass=ud->mass; //otherwise set this when finished building instead
unit->moveType=mt;
//Ground-mobility
unit->mobility = SAFE_NEW CMobility();
unit->mobility->canFly = false;
unit->mobility->subMarine = false; //Not always correct, as submarines are treated as ships.
unit->mobility->maxAcceleration = ud->maxAcc;
unit->mobility->maxBreaking = -3*ud->maxAcc;
unit->mobility->maxSpeed = ud->speed / GAME_SPEED;
unit->mobility->maxTurnRate = (short int) ud->turnRate;
unit->mobility->moveData = ud->movedata;
} else if(ud->canfly) {
//Air-mobility
unit->mobility = SAFE_NEW CMobility();
unit->mobility->canFly = true;
unit->mobility->subMarine = false;
unit->mobility->maxAcceleration = ud->maxAcc;
unit->mobility->maxBreaking = -3*ud->maxAcc; //Correct?
unit->mobility->maxSpeed = ud->speed / GAME_SPEED;
unit->mobility->maxTurnRate = (short int) ud->turnRate;
unit->mobility->moveData = ud->movedata;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?