Subversion Repositories spk

Rev

Rev 1 | Rev 170 | 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 ( !m_pModels || m_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!! (" + SystemStringFromCyString(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 ( SStringList *str = m_pModels->Head(); str; str = str->next )
                        {
                                String ^entry = SystemStringFromCyString(str->str) + ":" + Convert::ToString(i);
                                this->ComboCockpit->Items->Add(entry);
                                ++i;
                        }
                }

                this->UpdateTurrets();
        }

        void CustomiseTurret::UpdateDisplay()
        {
                if ( m_pModels && !m_pModels->Empty() )
                        this->ComboCockpit->SelectedIndex = m_pShipData->lTurrets.Get(0)->iSceneNode;
        }

        void CustomiseTurret::UpdateCockpits()
        {
                this->ComboCockpitStd->Items->Clear();
                
                CyStringList *list = ((CustomiseShip ^)m_pParent)->GetCockpits();
                if ( list || !list->Empty() )
                {
                        for ( SStringList *str = list->Head(); str; str = str->next )
                                this->ComboCockpitStd->Items->Add(SystemStringFromCyString(str->data));
                }

                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(";", 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(SystemStringFromCyString(m_pShipData->cockpits[t->iTurret - 1].sCockpit));
                        item->SubItems->Add(this->GetPosition(m_pShipData->cockpits[t->iTurret - 1].iPos));
                        item->SubItems->Add(SystemStringFromCyString(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 ( CyStringFromSystemString(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 = SystemStringFromCyString(m_pCurrentCockpit->sCockpit.token(";", 8));
                        this->UpdateCockpitWeaponsList();
                }
        }

        void CustomiseTurret::UpdateCockpitWeaponsList()
        {
                this->ListWeaponCockpit->Items->Clear();

                if ( !m_pCurrentCockpit )
                        return;

                bool oldUpdate = m_bUpdateing;
                m_bUpdateing = true;

                bool added = false;

                CyStringList List;
                CyStringList *list = NULL;
                int mask = -1;
                if ( this->ComboGameCockpit->SelectedIndex > 0 )
                {
                        this->CheckWeaponDefaultCockpit->Visible = true;
                        list = ((CustomiseShip ^)m_pParent)->GetLasers(this->ComboGameCockpit->SelectedIndex);
                        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(";", 9);
                        this->CheckWeaponDefaultCockpit->Visible = false;
                        this->CheckWeaponDefaultCockpit->Checked = false;
                }
                if ( mask == -1 ) mask = 0;
                if ( list )
                {
                        for ( SStringList *strNode = list->Head(); strNode; strNode = strNode->next )
                        {
                                CyString id = strNode->str.GetToken(";", 6, 6);
                                SStringList *found = List.FindString(id);
                                CyString str = (strNode->data.Empty()) ? strNode->str.GetToken(";", 23, 23) : strNode->data;
                                if ( found )
                                {
                                        found->data += ", ";
                                        found->data += str;
                                }
                                else
                                        List.PushBack(id, str);
                        }
                }

                for ( int i = 0; i < 32; i++ )
                {
                        if ( List.Count() > i )
                        {
                                ListViewItem ^item = gcnew ListViewItem(SystemStringFromCyString(List.GetAt(i)->str));
                                item->SubItems->Add(SystemStringFromCyString(List.GetAt(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 ( !m_pModels ) return nullptr;
                 InputBox ^input = gcnew InputBox("Select the model entry to use for the cockpit (Turret: " + Convert::ToString(id) + ")");
                 int i = 0;
                 for ( SStringList *str = m_pModels->Head(); str; str = str->next )
                 {
                         input->AddItem(SystemStringFromCyString(str->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 = CyStringFromSystemString(str).GetToken(":", 1, 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(";", 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);
                        }
                }
        }

};