// EditEntityDlg.cpp : implementation file // #include "stdafx.h" #include "mw4gameed.h" #include "EditEntityDlg.h" #include #include #include #include #include "GenericTextDlg.h" #include #include #include #include #include #define __mbsrchr(s,c) (char*)_mbsrchr((const unsigned char*)(s),(c)) extern CMW4GameEdApp theApp; ///////////////////////////////////////////////////////////////////////////// // EditEntityDlg dialog EditEntityDlg::EditEntityDlg(CWnd* pParent, Entity *entity,int type,void* data) : CDialog(EditEntityDlg::IDD, pParent), modelUndoChain(NULL), damageUndoChain(NULL) { //{{AFX_DATA_INIT(EditEntityDlg) //}}AFX_DATA_INIT selectedEntity = entity; m_Title.LoadString(IDS_EDITENTITYWINDOWTITLE); needsSave = false; newGameModel = false; dlgType = type; exData = data; } EditEntityDlg::~EditEntityDlg() { } void EditEntityDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(EditEntityDlg) DDX_Control(pDX, IDC_GAMEMODELEDIT, m_gameModelEdit); DDX_Control(pDX, IDC_ENTITYEDITBOX, m_floatingEdit); DDX_Control(pDX, IDC_EntityValues, m_entityValueList); DDX_Control(pDX, IDCANCEL, m_CancelBtn); DDX_Control(pDX, IDC_EntityProperties, m_entityPropertiesList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(EditEntityDlg, CDialog) //{{AFX_MSG_MAP(EditEntityDlg) ON_LBN_DBLCLK(IDC_EntityProperties, OnDblclkEntityProperties) ON_LBN_SELCHANGE(IDC_EntityProperties, OnSelchangeEntityProperties) ON_LBN_SELCHANGE(IDC_EntityValues, OnSelchangeEntityValues) ON_WM_TIMER() ON_BN_CLICKED(IDC_GAMEMODELSAVEBTN, OnGamemodelsavebtn) ON_EN_CHANGE(IDC_ENTITYEDITBOX, OnChangeEntityeditbox) ON_EN_KILLFOCUS(IDC_ENTITYEDITBOX, OnKillfocusEntityeditbox) ON_WM_SIZE() ON_LBN_DBLCLK(IDC_EntityValues, OnDblclkEntityProperties) ON_BN_CLICKED(IDMYOK, OnMyok) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // EditEntityDlg message handlers BOOL EditEntityDlg::OnInitDialog() { CDialog::OnInitDialog(); m_floatingEdit.ShowWindow(SW_HIDE); SetWindowText(m_Title); //Need to update the list here! if(selectedEntity) { switch (dlgType) { case EDIT_GAME_MODEL: InitGameModel(); break; case EDIT_DAMAGE_OBJECTARMOR: InitDamageObjectArmor(); break; case EDIT_DAMAGE_OBJECTINTERNAL: InitDamageObjectInternal(); break; } } else if (dlgType == EDIT_SUBSYSTEM) { InitSubsystem(); } RECT pr,vr,cr; GetClientRect(&cr); m_entityPropertiesList.GetWindowRect(&pr); ScreenToClient(&pr); m_entityValueList.GetWindowRect(&vr); ScreenToClient(&vr); m_entityPropertiesList.SetWindowPos(NULL,pr.left,pr.top,pr.right - pr.left,cr.bottom - pr.top - 6,SWP_NOZORDER); m_entityValueList.SetWindowPos(NULL,vr.left,vr.top,vr.right - vr.left,cr.bottom - vr.top - 6,SWP_NOZORDER); timer = SetTimer(2,25,NULL); warned = false; ShowWindow(SW_SHOW); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void EditEntityDlg::InitGameModel() { Check_Object(selectedEntity); const Entity__GameModel *model = selectedEntity->GetGameModel(); Check_Object(model); Entity::ClassData *class_data; class_data = selectedEntity->GetClassData(); Check_Object(class_data); TableIteratorOf iterator(&class_data->gameModelAttributeTable.attributesByID); ModelAttributeEntry *attrib_entry; int attribute_count = iterator.GetSize(); for(int i=Entity__GameModel::AnyAttributeID + 1; i < attribute_count; i++) { attrib_entry = class_data->gameModelAttributeTable.GetAttributeEntry(i); Check_Object(attrib_entry); m_entityPropertiesList.AddString(attrib_entry->attributeName); } char *attribute_text; attribute_text = new char[128]; Register_Pointer(attribute_text); char *attribute_name; attribute_name = new char[MAX_PATH]; Register_Pointer(attribute_name); for(i=0; i < m_entityPropertiesList.GetCount(); i++) { m_entityPropertiesList.GetText(i,attribute_name); attrib_entry = class_data->gameModelAttributeTable.GetAttributeEntry(attribute_name); Check_Object(attrib_entry); (*class_data->modelWriteToText)((Entity__GameModel *)model, attrib_entry, &attribute_text); m_entityValueList.AddString(attribute_text); UndoGameModelChanges* ugmc = new UndoGameModelChanges; ugmc->attribute_name = attribute_name; ugmc->attribute_value = attribute_text; modelUndoChain.Add(ugmc); } Unregister_Pointer(attribute_name); delete [] attribute_name; Unregister_Pointer(attribute_text); delete [] attribute_text; } void EditEntityDlg::InitDamageObjectArmor() { Check_Object(selectedEntity); GetDlgItem(IDC_EDITRESINSTRUCTIONS)->SetWindowText("Double-Click on the value you wish to change."); GetDlgItem(IDC_RESOURCENAMETEXT)->ShowWindow(SW_HIDE); GetDlgItem(IDC_GAMEMODELEDIT)->ShowWindow(SW_HIDE); GetDlgItem(IDC_GAMEMODELSAVEBTN)->ShowWindow(SW_HIDE); SortedChainOf *chain = NULL; if (selectedEntity->IsDerivedFrom(MechWarrior4::Vehicle::DefaultData)) { MechWarrior4::Vehicle* vehicle = Cast_Object(MechWarrior4::Vehicle*,selectedEntity); chain = &vehicle->damageObjects; } /* else if (selectedEntity->IsDerivedFrom(Building::DefaultData)) { Building* building = Cast_Object(Building*,selectedEntity); chain = &building->damageObjects; } */ else { MessageBox("You cannot edit the armor on this object","Object cannot be edited"); return; } Check_Object(chain); SortedChainIteratorOf iterator(chain); DamageObject* damObj; char damVal[MAX_PATH]; int index; while ((damObj = iterator.ReadAndNext()) != NULL) { char name[128]; sprintf(name,"%s_Max",(char *)damObj->damageObjectName); index = m_entityPropertiesList.AddString(name); sprintf(damVal,"%3.0f",damObj->baseArmorValue); m_entityValueList.InsertString(index,damVal); UndoDamageObjectChanges* udoc = new UndoDamageObjectChanges; udoc->name= name; udoc->value = damObj->baseArmorValue; damageUndoChain.Add(udoc); sprintf(name,"%s_Current",(char *)damObj->damageObjectName); index = m_entityPropertiesList.AddString(name); sprintf(damVal,"%3.0f",damObj->currentArmorValue); m_entityValueList.InsertString(index,damVal); udoc = new UndoDamageObjectChanges; udoc->name = name; udoc->value = damObj->currentArmorValue; damageUndoChain.Add(udoc); } } void EditEntityDlg::InitDamageObjectInternal() { Check_Object(selectedEntity); GetDlgItem(IDC_EDITRESINSTRUCTIONS)->SetWindowText("Double-Click on the value you wish to change."); GetDlgItem(IDC_RESOURCENAMETEXT)->ShowWindow(SW_HIDE); GetDlgItem(IDC_GAMEMODELEDIT)->ShowWindow(SW_HIDE); GetDlgItem(IDC_GAMEMODELSAVEBTN)->ShowWindow(SW_HIDE); SortedChainOf *chain = NULL; if (selectedEntity->IsDerivedFrom(MechWarrior4::Vehicle::DefaultData)) { MechWarrior4::Vehicle* vehicle = Cast_Object(MechWarrior4::Vehicle*,selectedEntity); chain = &vehicle->damageObjects; } /* else if (selectedEntity->IsDerivedFrom(Building::DefaultData)) { Building* building = Cast_Object(Building*,selectedEntity); chain = &building->damageObjects; } */ else { MessageBox("You cannot edit the internal structure on this object","Object cannot be edited"); return; } Check_Object(chain); SortedChainIteratorOf iterator(chain); // DamageObject* damObj; // char damVal[MAX_PATH]; // int index; // while ((damObj = iterator.ReadAndNext()) != NULL) // { // char name[128]; // sprintf(name,"%s_Max",(char *)damObj->damageObjectName); // index = m_entityPropertiesList.AddString(name); // sprintf(damVal,"%3.0f",damObj->baseInternalDamage); // sprintf(damVal,"%3.0f",damObj->baseInternalDamage); // m_entityValueList.InsertString(index,damVal); // sprintf(name,"%s_Current",(char *)damObj->damageObjectName); // index = m_entityPropertiesList.AddString(name); // sprintf(damVal,"%3.0f",damObj->currentInternalDamage); // m_entityValueList.InsertString(index,damVal); // } } void EditEntityDlg::InitSubsystem() { GetDlgItem(IDC_EDITRESINSTRUCTIONS)->SetWindowText("Double-Click on the value you wish to change."); GetDlgItem(IDC_RESOURCENAMETEXT)->ShowWindow(SW_HIDE); GetDlgItem(IDC_GAMEMODELEDIT)->ShowWindow(SW_HIDE); GetDlgItem(IDC_GAMEMODELSAVEBTN)->ShowWindow(SW_HIDE); char path[MAX_PATH]; sprintf(path,"%s",(char*)exData); Resource subsystem(path); Verify(subsystem.DoesResourceExist()); Resource gameModelResource; Entity::GetGameModelResourceFromDataListID(&gameModelResource,subsystem.GetResourceID()); Entity__GameModel *model = Cast_Pointer(Entity__GameModel*,gameModelResource.GetPointer()); Entity::ClassID class_id = Entity::GetClassIDFromDataListID(subsystem.GetResourceID()); Entity__ClassData* class_data = (Entity__ClassData*)Entity::FindClassData(class_id); TableIteratorOf iterator(&class_data->gameModelAttributeTable.attributesByID); ModelAttributeEntry *attrib_entry; int attribute_count = iterator.GetSize(); for(int i=Entity__GameModel::AnyAttributeID + 1; i < attribute_count; i++) { attrib_entry = class_data->gameModelAttributeTable.GetAttributeEntry(i); Check_Object(attrib_entry); m_entityPropertiesList.AddString(attrib_entry->attributeName); } char *attribute_text; attribute_text = new char[128]; Register_Pointer(attribute_text); char *attribute_name; attribute_name = new char[MAX_PATH]; Register_Pointer(attribute_name); for(i=0; i < m_entityPropertiesList.GetCount(); i++) { m_entityPropertiesList.GetText(i,attribute_name); attrib_entry = class_data->gameModelAttributeTable.GetAttributeEntry(attribute_name); Check_Object(attrib_entry); (*class_data->modelWriteToText)((Entity__GameModel *)model, attrib_entry, &attribute_text); m_entityValueList.AddString(attribute_text); UndoGameModelChanges* ugmc = new UndoGameModelChanges; ugmc->attribute_name = attribute_name; ugmc->attribute_value = attribute_text; modelUndoChain.Add(ugmc); } Unregister_Pointer(attribute_name); delete [] attribute_name; Unregister_Pointer(attribute_text); delete [] attribute_text; } void EditEntityDlg::OnDblclkEntityProperties() { switch (dlgType) { case EDIT_GAME_MODEL: { Check_Object(selectedEntity); char* p = __mbsrchr(selectedEntity->GetModelName(),'\\'); if (!p) p = (char*) selectedEntity->GetModelName(); if (!strchr(p,'_')) { if (!warned) { if (MessageBox("This appears to be a default resource. Are you really sure you want to change this, DOES SEAN KNOW YOU'RE DOING THIS?", "Hey! This is default data you're messing with!",MB_YESNO) == IDNO) return; warned = true; } } break; } case EDIT_DAMAGE_OBJECTARMOR: { Check_Object(selectedEntity); break; } case EDIT_DAMAGE_OBJECTINTERNAL: { Check_Object(selectedEntity); break; } default: break; } char buffer[64]; m_entityValueList.GetText(m_entityValueList.GetCurSel(),buffer); RECT r; m_entityValueList.GetItemRect(m_entityValueList.GetCurSel(),&r); m_entityValueList.ClientToScreen(&r); ScreenToClient(&r); m_floatingEdit.SetWindowPos(&wndTop,r.left,r.top - 3,r.right - r.left,r.bottom - r.top + 6,SWP_NOZORDER | SWP_SHOWWINDOW); m_floatingEdit.SetWindowText(buffer); m_floatingEdit.SetFocus(); m_floatingEdit.SetSel(0,-1); } void EditEntityDlg::OnSelchangeEntityProperties() { m_entityValueList.SetCurSel(m_entityPropertiesList.GetCurSel()); } void EditEntityDlg::OnSelchangeEntityValues() { m_entityPropertiesList.SetCurSel(m_entityValueList.GetCurSel()); } void EditEntityDlg::OnTimer(UINT nIDEvent) { static int propLast = 0; static int valLast = 0; static int propTop = 0; static int valTop = 0; int caret = m_entityPropertiesList.GetCaretIndex(); if (caret != propLast) m_entityValueList.SetCurSel(caret); else { caret = m_entityValueList.GetCaretIndex(); if (caret != valLast) m_entityPropertiesList.SetCurSel(caret); } int top = m_entityPropertiesList.GetTopIndex(); if (top != propTop) m_entityValueList.SetTopIndex(top); else { top = m_entityValueList.GetTopIndex(); if (top != valTop) m_entityPropertiesList.SetTopIndex(top); } propLast = valLast = caret; propTop = valTop = top; CDialog::OnTimer(nIDEvent); } void EditEntityDlg::OnOK() { // someone in MFC thought it would be a good idea to have this function get called everytime // the ENTER key is pressed. OnKillfocusEntityeditbox(); } void EditEntityDlg::OnCancel() { KillTimer(2); switch (dlgType) { case EDIT_GAME_MODEL: { Check_Object(selectedEntity); UndoGameModelChanges* ugmc; ChainIteratorOf iterator(&modelUndoChain); while((ugmc = iterator.ReadAndNext()) != NULL) { const Entity__GameModel *model = selectedEntity->GetGameModel(); Check_Object(model); Entity::ClassData *class_data; class_data = selectedEntity->GetClassData(); Check_Object(class_data); ModelAttributeEntry *attrib_entry; attrib_entry = class_data->gameModelAttributeTable.GetAttributeEntry(ugmc->attribute_name.GetBuffer(MAX_PATH)); Check_Object(attrib_entry); char *error_message; error_message = new char[256]; Register_Pointer(error_message); (*class_data->modelVerifier)((Entity__GameModel *)model, attrib_entry, ugmc->attribute_value.GetBuffer(MAX_PATH), &error_message,255); Unregister_Pointer(error_message); delete [] error_message; } break; } case EDIT_DAMAGE_OBJECTARMOR: { Check_Object(selectedEntity); UndoDamageObjectChanges* udoc; ChainIteratorOf undoIterator(&damageUndoChain); while((udoc = undoIterator.ReadAndNext()) != NULL) { SortedChainOf *chain = NULL; if (selectedEntity->IsDerivedFrom(MechWarrior4::Vehicle::DefaultData)) { MechWarrior4::Vehicle* vehicle = Cast_Object(MechWarrior4::Vehicle*,selectedEntity); chain = &vehicle->damageObjects; } /* else if (selectedEntity->IsDerivedFrom(Building::DefaultData)) { Building* building = Cast_Object(Building*,selectedEntity); chain = &building->damageObjects; } */ Check_Object(chain); SortedChainIteratorOf iterator(chain); DamageObject* damObj; bool max = false; char buffer[256],*p; strcpy(buffer,udoc->name.GetBuffer(255)); if (strstr(buffer,"Max")) max = true; p = strrchr(buffer,'_'); *p = 0; while ((damObj = iterator.ReadAndNext()) != NULL) { if (!strcmp(damObj->damageObjectName,buffer)) break; } Check_Object(damObj); if (max) { damObj->baseArmorValue = udoc->value; } else { damObj->currentArmorValue = udoc->value; } } break; } case EDIT_DAMAGE_OBJECTINTERNAL: { Check_Object(selectedEntity); UndoDamageObjectChanges* udoc; ChainIteratorOf undoIterator(&damageUndoChain); while((udoc = undoIterator.ReadAndNext()) != NULL) { SortedChainOf *chain = NULL; if (selectedEntity->IsDerivedFrom(MechWarrior4::Vehicle::DefaultData)) { MechWarrior4::Vehicle* vehicle = Cast_Object(MechWarrior4::Vehicle*,selectedEntity); chain = &vehicle->damageObjects; } /* else if (selectedEntity->IsDerivedFrom(Building::DefaultData)) { Building* building = Cast_Object(Building*,selectedEntity); chain = &building->damageObjects; } */ Check_Object(chain); SortedChainIteratorOf iterator(chain); DamageObject* damObj; bool max = false; char buffer[256],*p; strcpy(buffer,udoc->name.GetBuffer(255)); if (strstr(buffer,"Max")) max = true; p = strrchr(buffer,'_'); *p = 0; while ((damObj = iterator.ReadAndNext()) != NULL) { if (!strcmp(damObj->damageObjectName,buffer)) break; } Check_Object(damObj); if (max) { // damObj->baseInternalDamage = udoc->value; } else { // damObj->currentInternalDamage = udoc->value; } } break; } case EDIT_SUBSYSTEM: { UndoGameModelChanges* ugmc; ChainIteratorOf iterator(&modelUndoChain); while((ugmc = iterator.ReadAndNext()) != NULL) { char path[MAX_PATH]; sprintf(path,"%s",(char*)exData); Resource subsystem(path); Verify(subsystem.DoesResourceExist()); Resource gameModelResource; Entity::GetGameModelResourceFromDataListID(&gameModelResource,subsystem.GetResourceID()); Entity__GameModel *model = Cast_Pointer(Entity__GameModel*,gameModelResource.GetPointer()); Check_Object(model); Entity::ClassID class_id = Entity::GetClassIDFromDataListID(subsystem.GetResourceID()); Entity__ClassData* class_data = (Entity__ClassData*)Entity::FindClassData(class_id); Check_Object(class_data); ModelAttributeEntry *attrib_entry; attrib_entry = class_data->gameModelAttributeTable.GetAttributeEntry(ugmc->attribute_name.GetBuffer(MAX_PATH)); Check_Object(attrib_entry); char *error_message; error_message = new char[256]; Register_Pointer(error_message); (*class_data->modelVerifier)((Entity__GameModel *)model, attrib_entry, ugmc->attribute_value.GetBuffer(MAX_PATH), &error_message,255); Unregister_Pointer(error_message); delete [] error_message; } break; } } CDialog::OnCancel(); } void EditEntityDlg::OnGamemodelsavebtn() { MessageBox("Not yet implemented.","Not Yet Implimented"); } void EditEntityDlg::OnChangeEntityeditbox() { switch (dlgType) { case EDIT_GAME_MODEL: { Check_Object(selectedEntity); int id = m_entityPropertiesList.GetCaretIndex(); char *attribute_name; attribute_name = new char[MAX_PATH]; Register_Pointer(attribute_name); m_entityPropertiesList.GetText(id, attribute_name); const Entity__GameModel *model = selectedEntity->GetGameModel(); Check_Object(model); Entity::ClassData *class_data; class_data = selectedEntity->GetClassData(); Check_Object(class_data); ModelAttributeEntry *attrib_entry; attrib_entry = class_data->gameModelAttributeTable.GetAttributeEntry(attribute_name); Check_Object(attrib_entry); CString data; m_floatingEdit.GetWindowText(data); char *error_message; error_message = new char[256]; Register_Pointer(error_message); if(!(*class_data->modelVerifier)((Entity__GameModel *)model, attrib_entry, data.GetBuffer(MAX_PATH), &error_message,255)) { char error[256]; sprintf( error, "Error with %s: %s", (char *)attrib_entry->attributeName, error_message ); char buffer[64]; m_entityValueList.GetText(m_entityValueList.GetCurSel(),buffer); m_floatingEdit.SetWindowText(buffer); m_floatingEdit.ShowWindow(SW_HIDE); Invalidate(); AfxMessageBox(error, MB_OK); } Unregister_Pointer(attribute_name); delete [] attribute_name; Unregister_Pointer(error_message); delete [] error_message; break; } case EDIT_DAMAGE_OBJECTARMOR: { Check_Object(selectedEntity); char buffer[256],*p; m_floatingEdit.GetWindowText(buffer,255); Scalar value = (Scalar) atof(buffer); SortedChainOf *chain = NULL; if (selectedEntity->IsDerivedFrom(MechWarrior4::Vehicle::DefaultData)) { MechWarrior4::Vehicle* vehicle = Cast_Object(MechWarrior4::Vehicle*,selectedEntity); chain = &vehicle->damageObjects; } /* else if (selectedEntity->IsDerivedFrom(Building::DefaultData)) { Building* building = Cast_Object(Building*,selectedEntity); chain = &building->damageObjects; } */ Check_Object(chain); SortedChainIteratorOf iterator(chain); DamageObject* damObj; bool max = false; m_entityPropertiesList.GetText(m_entityPropertiesList.GetCurSel(),buffer); if (strstr(buffer,"Max")) max = true; p = strrchr(buffer,'_'); *p = 0; while ((damObj = iterator.ReadAndNext()) != NULL) { if (!strcmp(damObj->damageObjectName,buffer)) break; } Check_Object(damObj); if (max) { damObj->baseArmorValue = value; } else { damObj->currentArmorValue = value; } break; } case EDIT_DAMAGE_OBJECTINTERNAL: { Check_Object(selectedEntity); char buffer[256],*p; m_floatingEdit.GetWindowText(buffer,255); // Scalar value = (Scalar) atof(buffer); SortedChainOf *chain = NULL; if (selectedEntity->IsDerivedFrom(MechWarrior4::Vehicle::DefaultData)) { MechWarrior4::Vehicle* vehicle = Cast_Object(MechWarrior4::Vehicle*,selectedEntity); chain = &vehicle->damageObjects; } /* else if (selectedEntity->IsDerivedFrom(Building::DefaultData)) { Building* building = Cast_Object(Building*,selectedEntity); chain = &building->damageObjects; } */ Check_Object(chain); SortedChainIteratorOf iterator(chain); DamageObject* damObj; bool max = false; m_entityPropertiesList.GetText(m_entityPropertiesList.GetCurSel(),buffer); if (strstr(buffer,"Max")) max = true; p = strrchr(buffer,'_'); *p = 0; while ((damObj = iterator.ReadAndNext()) != NULL) { if (!strcmp(damObj->damageObjectName,buffer)) break; } Check_Object(damObj); if (max) { // damObj->baseInternalDamage = value; } else { // damObj->currentInternalDamage = value; } break; } case EDIT_SUBSYSTEM: { char path[MAX_PATH]; sprintf(path,"%s",(char*)exData); Resource subsystem(path); Verify(subsystem.DoesResourceExist()); Resource gameModelResource; Entity::GetGameModelResourceFromDataListID(&gameModelResource,subsystem.GetResourceID()); Entity__GameModel *model = Cast_Pointer(Entity__GameModel*,gameModelResource.GetPointer()); Check_Object(model); Entity::ClassID class_id = Entity::GetClassIDFromDataListID(subsystem.GetResourceID()); Entity__ClassData* class_data = (Entity__ClassData*)Entity::FindClassData(class_id); Check_Object(class_data); int id = m_entityPropertiesList.GetCaretIndex(); char *attribute_name; attribute_name = new char[MAX_PATH]; Register_Pointer(attribute_name); m_entityPropertiesList.GetText(id, attribute_name); ModelAttributeEntry *attrib_entry; attrib_entry = class_data->gameModelAttributeTable.GetAttributeEntry(attribute_name); Check_Object(attrib_entry); CString data; m_floatingEdit.GetWindowText(data); char *error_message; error_message = new char[256]; Register_Pointer(error_message); if(!(*class_data->modelVerifier)((Entity__GameModel *)model, attrib_entry, data.GetBuffer(MAX_PATH), &error_message,255)) { char error[256]; sprintf( error, "Error with %s: %s", (char *)attrib_entry->attributeName, error_message ); char buffer[64]; m_entityValueList.GetText(m_entityValueList.GetCurSel(),buffer); m_floatingEdit.SetWindowText(buffer); m_floatingEdit.ShowWindow(SW_HIDE); Invalidate(); AfxMessageBox(error, MB_OK); } Unregister_Pointer(attribute_name); delete [] attribute_name; Unregister_Pointer(error_message); delete [] error_message; break; } } } void EditEntityDlg::OnKillfocusEntityeditbox() { switch (dlgType) { case EDIT_GAME_MODEL: case EDIT_SUBSYSTEM: { CString data; m_floatingEdit.GetWindowText(data); int index = m_entityValueList.GetCurSel(); m_entityValueList.DeleteString(index); m_entityValueList.InsertString(index,LPCTSTR(data)); m_entityValueList.SetCurSel(index); } case EDIT_DAMAGE_OBJECTARMOR: case EDIT_DAMAGE_OBJECTINTERNAL: { char buffer[256]; m_floatingEdit.GetWindowText(buffer,255); Scalar value = (Scalar) atof(buffer); sprintf(buffer,"%3.0f",value); int index = m_entityValueList.GetCurSel(); m_entityValueList.DeleteString(index); m_entityValueList.InsertString(index,buffer); break; } } m_floatingEdit.ShowWindow(SW_HIDE); Invalidate(); } void EditEntityDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if (m_entityPropertiesList.m_hWnd) { RECT pr,vr; m_entityPropertiesList.GetWindowRect(&pr); ScreenToClient(&pr); m_entityValueList.GetWindowRect(&vr); ScreenToClient(&vr); m_entityPropertiesList.SetWindowPos(NULL,pr.left,pr.top,pr.right - pr.left,cy - pr.top - 6,SWP_NOZORDER); m_entityValueList.SetWindowPos(NULL,vr.left,vr.top,vr.right - vr.left,cy - vr.top - 6,SWP_NOZORDER); } } void EditEntityDlg::OnMyok() { switch (dlgType) { case EDIT_GAME_MODEL: { Resource* resource = selectedEntity->GetDataListResource(); PlugOf *plug = new PlugOf(resource); theApp.dirtyGameModelResources.Add(plug); break; } case EDIT_DAMAGE_OBJECTARMOR: case EDIT_DAMAGE_OBJECTINTERNAL: { /* char path[MAX_PATH],string[256]; sprintf(path,"Content\\Mechs\\Damage\\Mech%d.damage",theApp.nextDamageFileID++); FILE* file; file = fopen(path,"w"); Register_Pointer(file); ChainOf *chain = NULL; if (selectedEntity->IsDerivedFrom(Vehicle::DefaultData)) { Vehicle* vehicle = Cast_Object(Vehicle*,selectedEntity); chain = &vehicle->damageObjects; } // else if (selectedEntity->IsDerivedFrom(Building::DefaultData)) // { // Building* building = Cast_Object(Building*,selectedEntity); // chain = &building->damageObjects; // } Check_Object(chain); ChainIteratorOf iterator(chain); DamageObject* damObj; while ((damObj = iterator.ReadAndNext()) != NULL) { sprintf(string,"[%s]\n",(char*)damObj->damageObjectName); fputs(string,file); sprintf(string,"BaseInternalDamage=%f\n",damObj->baseInternalDamage); fputs(string,file); sprintf(string,"BaseArmorValue=%f\n",damObj->baseArmorValue); fputs(string,file); sprintf(string,"CurrentInternalDamage=%f\n",damObj->currentInternalDamage); fputs(string,file); sprintf(string,"CurrentArmorValue=%f\n",damObj->currentArmorValue); fputs(string,file); for (int i = 0; i < damObj->damageEffects.GetLength(); i++) { sprintf(string,"DamageEffect=%s,%f\n","ugh",damObj->damageEffects[0].armorPercent); fputs(string,file); } const char* mode = NULL; DamageObject::DamageModeTextToAscii(mode); sprintf(string,"DamageMode=%s\n",mode); fputs(string,file); } Unregister_Pointer(file); */ break; } case EDIT_SUBSYSTEM: { Resource* subsystem = NULL; subsystem = new Resource((const char*)exData); Check_Object(subsystem); PlugOf *plug = new PlugOf(subsystem); theApp.dirtyGameModelResources.Add(plug); theApp.WriteDirtyGameModels(); break; } } KillTimer(2); CDialog::OnOK(); }