Rev 216 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "../StdAfx.h"
#include "CustomiseTurret.h"
#include "CustomiseShip.h"
namespace Creator {
String ^CustomiseTurret::GetPosition(int dir)
{
return ((CustomiseShip ^)m_pParent)->GetPosition(dir);
}
void CustomiseTurret::SetupControlsEnd()
{
this->ComboGameCockpit->SelectedIndex = 0;
}
void CustomiseTurret::SetupControls()
{
// fill to tab
this->PanelCockpit->Enabled = false;
this->Dock = System::Windows::Forms::DockStyle::Fill;
// adjust the game list
this->ComboGameCockpit->Items->Clear();
this->ComboGameCockpit->Items->Add("- Default -");
// cockpit combo selection
this->ComboCockpit->Items->Clear();
if (!_pModels || _pModels->empty())
{
// if no scene file
if ( m_pShipData->lTurrets.size() )
{
STurretEntry *t = m_pShipData->lTurrets[0];
this->ComboCockpit->Items->Add("No Scene File Loaded!! (" + _US(t->sModel) + ":" + Convert::ToString(t->iTurret) + ")");
}
else
this->ComboCockpit->Items->Add("No Scene File Loaded!!");
this->ComboCockpit->Enabled = false;
this->ComboCockpit->SelectedIndex = 0;
}
// otherwise, fill in the data
else
{
this->ComboCockpit->Enabled = true;
int i = 0;
for(auto itr = _pModels->begin(); itr != _pModels->end(); itr++)
{
String ^entry = _US((*itr)->str) + ":" + Convert::ToString(i);
this->ComboCockpit->Items->Add(entry);
++i;
}
}
this->UpdateTurrets();
}
void CustomiseTurret::UpdateDisplay()
{
if (_pModels && !_pModels->empty())
this->ComboCockpit->SelectedIndex = m_pShipData->lTurrets.Get(0)->iSceneNode;
}
void CustomiseTurret::UpdateCockpits()
{
this->ComboCockpitStd->Items->Clear();
CGameDirectories *gameDir = ((CustomiseShip ^)m_pParent)->gameDirectories();
for(Utils::WString cockpit = gameDir->firstCockpit(); !cockpit.empty(); cockpit = gameDir->nextCockpit()) {
this->ComboCockpitStd->Items->Add(_US(cockpit));
}
this->ComboCockpitCustom->Items->Clear();
for ( SCockpit *c = m_pShipFile->GetCockpits()->First(); c; c = m_pShipFile->GetCockpits()->Next() )
this->ComboCockpitCustom->Items->Add(_US(c->sCockpit.token(L";", 19)));
}
void CustomiseTurret::UpdateTurrets()
{
this->ListTurret->Items->Clear();
int i = 0;
for ( STurretEntry *t = m_pShipData->lTurrets.First(); t; t = m_pShipData->lTurrets.Next() )
{
if ( t == m_pShipData->lTurrets.Front()->Data() ) continue; // skip the first entry (its the cockpit not a turret
ListViewItem ^item = this->ListTurret->Items->Add(gcnew ListViewItem(Convert::ToString(t->iIndex - 1)));
if (m_pShipData->cockpits[t->iTurret - 1].sCockpit.empty())
item->SubItems->Add(Convert::ToString(m_pShipData->cockpits[t->iTurret - 1].iCockpit));
else
item->SubItems->Add(_US(m_pShipData->cockpits[t->iTurret - 1].sCockpit));
item->SubItems->Add(this->GetPosition(m_pShipData->cockpits[t->iTurret - 1].iPos));
item->SubItems->Add(_US(t->sModel) + ":" + Convert::ToString(t->iSceneNode));
item->ImageKey = "turret";
++i;
item->Tag = i;
}
this->ListTurret->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
this->UpdateCockpitDisplay();
((CustomiseShip ^)m_pParent)->UpdateGunTurrets();
}
void CustomiseTurret::UpdateCockpitDisplay()
{
this->RadioCockpitCustom->Enabled = (this->ComboCockpitCustom->Items->Count) ? true : false;
this->GroupCockpit->Enabled = (this->ListTurret->SelectedItems->Count) ? true : false;
if ( this->ListTurret->SelectedItems->Count )
{
ListViewItem ^item = this->ListTurret->SelectedItems[0];
if ( _WS(item->SubItems[1]->Text).isNumber() && Convert::ToInt32(item->SubItems[1]->Text) < this->ComboCockpitStd->Items->Count )
{
this->RadioCockpitStd->Checked = true;
this->ComboCockpitStd->SelectedIndex = Convert::ToInt32(item->SubItems[1]->Text);
}
else
{
this->RadioCockpitCustom->Checked = true;
this->ComboCockpitCustom->Text = item->SubItems[1]->Text;
this->UpdateCockpitDisplay2();
}
}
else
{
this->ComboCockpitStd->SelectedIndex = -1;
}
}
void CustomiseTurret::UpdateCockpitDisplay2()
{
m_pCurrentCockpit = m_pShipFile->findCockpit(_WS(ComboCockpitCustom->Text));
if ( m_pCurrentCockpit )
{
this->TextCockpitScene->Text = _US(m_pCurrentCockpit->sCockpit.token(L";", 8));
this->UpdateCockpitWeaponsList();
}
}
void CustomiseTurret::UpdateCockpitWeaponsList()
{
this->ListWeaponCockpit->Items->Clear();
if ( !m_pCurrentCockpit )
return;
bool oldUpdate = m_bUpdateing;
m_bUpdateing = true;
bool added = false;
Utils::WStringList List;
int mask = -1;
if ( this->ComboGameCockpit->SelectedIndex > 0 )
{
this->CheckWeaponDefaultCockpit->Visible = true;
for ( SWeaponMask *m = m_pCurrentCockpit->lWeaponMask.First(); m; m = m_pCurrentCockpit->lWeaponMask.Next() )
{
if ( m->iGame == this->ComboGameCockpit->SelectedIndex )
{
mask = m->iMask;
break;
}
}
this->CheckWeaponDefaultCockpit->Checked = (mask == -1) ? true : false;
}
else
{
mask = m_pCurrentCockpit->sCockpit.token(L";", 9);
this->CheckWeaponDefaultCockpit->Visible = false;
this->CheckWeaponDefaultCockpit->Checked = false;
}
if ( mask == -1 ) mask = 0;
if ( this->ComboGameCockpit->SelectedIndex > 0 )
{
CGameDirectories *gameDir = ((CustomiseShip ^)m_pParent)->gameDirectories();
gameDir->setSelectedGameDirectory(this->ComboGameCockpit->SelectedIndex, true);
for ( std::pair<Utils::WString, Utils::WString> laser = gameDir->firstLaser(); !laser.first.empty(); laser = gameDir->nextLaser() ) {
Utils::WString group = laser.first.token(L";", 6);
Utils::WStringNode *found = List[group];
if ( found ) {
found->data += L", ";
found->data += laser.second;
}
else
List.pushBack(group, laser.second);
}
gameDir->reselectTemporaryDirectory();
}
for (size_t i = 0; i < 32; i++ )
{
if ( List.size() > i )
{
ListViewItem ^item = gcnew ListViewItem(_US(List[i]->str));
item->SubItems->Add(_US(List[i]->data));
this->ListWeaponCockpit->Items->Add(item);
item->Tag = i;
if ( mask & (1 << i) )
item->Checked = true;
added = true;
}
if ( !added )
{
ListViewItem ^added;
added = this->ListWeaponCockpit->Items->Add("LASERGROUP_" + Convert::ToString(i + 1));
added->Tag = i;
if ( mask & (1 << i) )
added->Checked = true;
}
}
this->ListWeaponCockpit->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
m_bUpdateing = oldUpdate;
}
void CustomiseTurret::EditTurret(ListViewItem ^item)
{
String ^str = this->EditTurret(Convert::ToInt32(item->Tag));
if ( str )
item->SubItems[3]->Text = str;
}
String ^CustomiseTurret::EditTurret(int id)
{
if (!_pModels) return nullptr;
InputBox ^input = gcnew InputBox("Select the model entry to use for the cockpit (Turret: " + Convert::ToString(id) + ")");
int i = 0;
for(auto itr = _pModels->begin(); itr != _pModels->end(); itr++)
{
input->AddItem(_US((*itr)->str) + ":" + Convert::ToString(i));
++i;
}
input->SetSelectedOption(m_pShipData->lTurrets.Get(id)->iSceneNode);
if ( input->ShowDialog(this) == Windows::Forms::DialogResult::OK )
{
String ^str = input->GetInput();
i = input->GetInputSelected();
m_pShipData->lTurrets.Get(id)->iSceneNode = i;
m_pShipData->lTurrets.Get(id)->sModel = _WS(str).token(L":", 1);
return str;
}
return nullptr;
}
void CustomiseTurret::SaveCockpitWeaponsList()
{
if ( m_bUpdateing )
return;
if ( !m_pCurrentCockpit )
return;
// compute the mask
int mask = 0;
for ( int i = 0; i < this->ListWeaponCockpit->Items->Count; i++ )
{
ListViewItem ^item = this->ListWeaponCockpit->Items[i];
if ( !item->Checked )
continue;
mask += (1 << Convert::ToInt32(item->Tag));
}
// edit the default lasers
if ( !this->ComboGameCockpit->SelectedIndex )
m_pCurrentCockpit->sCockpit = m_pCurrentCockpit->sCockpit.replaceToken(L";", 9, (long)mask);
// otherwise adjust for the game
else
{
bool found = false;
for ( SWeaponMask *m = m_pCurrentCockpit->lWeaponMask.First(); m; m = m_pCurrentCockpit->lWeaponMask.Next() )
{
if ( m->iGame == this->ComboGameCockpit->SelectedIndex )
{
m->iMask = mask;
found = true;
break;
}
}
if ( !found )
{
SWeaponMask *m = new SWeaponMask;
m->iGame = this->ComboGameCockpit->SelectedIndex;
m->iMask = mask;
m_pCurrentCockpit->lWeaponMask.push_back(m);
}
}
}
};