bool CEditorAction::Valid(CApplication* pApp) { // if the user removes an object sometimes the conditions / actions can still refer to the removed object // and this causes a headache // uberhack: set global filter removed if (oid == -1 && actID == 7) return false; CObjType* objecttype = pApp->FindObjTypeFromNumber(oid); if(objecttype ) { if(mid < -1) { //check that the effect still exists if(!objecttype->GetEffect(mid * -1)) return false; } if(mid > -1) { if(!objecttype->GetBehaviorByUniqueID(mid)) return false; } // loop each param; for(int p = 0; p < params.size(); p++) { CEditorParam* param = params.at(p); if(param->m_type == 14) //variable { // lookup the variable if(!objecttype->GetPrivateVariable(atoi(param->CreateParamString(pApp)))) return false; } if(param->m_type == 13) //global { if(!pApp->GetGlobalVariable(atoi(param->CreateParamString(pApp)))) return false; } if(param->m_type == EDITORPARAM_OBJECT) { CString stparam = param->CreateParamString(pApp); int o = atoi(stparam); if(o == 0 && stparam != "0") return true; //attribute if(!pApp->FindObjTypeFromNumber( o)) return false; } if(pApp) param->CreateParamString(pApp); //Calling this function updates valid...terrible design but meh if(param->valid == false) return false; } return true; } return false; }
bool CEditorCondition::Serialize(CArchive &ar, CChronoEventEditor* Ed) { CString ExpectedName = "CEditorCondition"; int Version = 2; if (!SerializeClassHeader(ExpectedName, Version, ar)) return false; if( ar.IsLoading()) { m_visible = true; m_Valid = true; ar >> mid; ar >> cndID; ar >> oid; if(Ed) Ed->RegisterObjectID(oid, ar); ar >> m_Negate; ar >> m_Family >> m_FamilyName; ar >> m_rect_default; ar >> m_select_default; ar >> m_select_default; ar >> m_Anim.Space; ar // //m_Text - note: must call EventSheetEditor::ReformatCondition >> m_Object >> m_Script; m_Anim.m_bDestroyed = false; m_Text = ""; int size = 0; ar >> size; for (int i = 0; i < size; i++) { CEditorParam* Param = new CEditorParam; Param->Serialize(ar, Ed); params.push_back(Param); } if (oid != -1) { CString name = ""; ar >> name; OINFO* o = GetOINFO(name); if (!o) { CErrorDlg Dlg; Dlg.Error("Error in condition.", "An invalid object in a condition was referenced."); return false; } DLLIndex = o->oID; }
bool CEditorAction::Serialize(CArchive &ar, CChronoEventEditor* Ed ) { CString ExpectedName = "CEditorAction"; int Version = 2; if (!SerializeClassHeader(ExpectedName, Version, ar)) return false; if(ar.IsLoading()) { m_visible = true; m_Valid = true; ar >> m_Family >> m_FamilyName; ar >> actID; ar >> oid; if(Ed) Ed->RegisterObjectID(oid, ar); ar >> m_rect_default; ar >> m_select_default; ar >> m_Anim.Space; m_Anim.m_bDestroyed = false; ar //>> m_Text - note: must call EventSheetEditor::ReformatAction >> m_Object >> m_Script; ar >> mid; m_Text = ""; int size = 0; ar >> size; for (int i = 0; i < size; i++) { CEditorParam* Param = new CEditorParam; Param->Serialize(ar, Ed); params.push_back(Param); } CString name = ""; ar >> name; OINFO* o = GetOINFO(name); if(o) DLLIndex = o->oID; else DLLIndex = -1; if(Version >= 2) ar >> m_bEnabled; else