Subversion Repositories spk

Rev

Rev 211 | Go to most recent revision | 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(_S(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);
                        }
                }
        }

};