Posted to tcl by hypnotoad at Tue Dec 09 22:18:29 GMT 2014view raw
- /*
- ** This file is machine generated. Changes will
- ** be overwritten on the next run of cstruct.tcl
- */
- #include "sim.h"
- void compartment_export_nmalloc(Tcl_Interp *interp) {
- #if IRM_MEM_DEBUG
- Tcl_LinkVar(interp, "module_malloc(cstruct_compartment)", (char*)&nMalloc,
- TCL_LINK_INT | TCL_LINK_READ_ONLY);
- #endif
- }
- /* Structure Compartment */
- const struct IrmParamNameMap Compartment_paramNameMap[] = {
- { "accessible", CSTRUCT_COMPARTMENT_ACCESSIBLE, PTYPE_INT },
- { "agent_suppression", CSTRUCT_COMPARTMENT_AGENT_SUPPRESSION, PTYPE_INT },
- { "airlock_open", CSTRUCT_COMPARTMENT_AIRLOCK_OPEN, PTYPE_INT },
- { "chrr", CSTRUCT_COMPARTMENT_CHRR, PTYPE_FLOAT },
- { "collapse", CSTRUCT_COMPARTMENT_COLLAPSE, PTYPE_FLOAT },
- { "cten", CSTRUCT_COMPARTMENT_CTEN, PTYPE_INT },
- { "ctrans", CSTRUCT_COMPARTMENT_CTRANS, PTYPE_INT },
- { "cvis", CSTRUCT_COMPARTMENT_CVIS, PTYPE_FLOAT },
- { "fire_size", CSTRUCT_COMPARTMENT_FIRE_SIZE, PTYPE_FLOAT },
- { "flooding", CSTRUCT_COMPARTMENT_FLOODING, PTYPE_FLOAT },
- { "has_abandon", CSTRUCT_COMPARTMENT_HAS_ABANDON, PTYPE_INT },
- { "has_debris", CSTRUCT_COMPARTMENT_HAS_DEBRIS, PTYPE_INT },
- { "has_exception", CSTRUCT_COMPARTMENT_HAS_EXCEPTION, PTYPE_INT },
- { "has_fire", CSTRUCT_COMPARTMENT_HAS_FIRE, PTYPE_INT },
- { "has_flood", CSTRUCT_COMPARTMENT_HAS_FLOOD, PTYPE_INT },
- { "has_hot", CSTRUCT_COMPARTMENT_HAS_HOT, PTYPE_INT },
- { "has_investigation", CSTRUCT_COMPARTMENT_HAS_INVESTIGATION, PTYPE_INT },
- { "has_pda", CSTRUCT_COMPARTMENT_HAS_PDA, PTYPE_INT },
- { "has_smoke", CSTRUCT_COMPARTMENT_HAS_SMOKE, PTYPE_INT },
- { "has_steam", CSTRUCT_COMPARTMENT_HAS_STEAM, PTYPE_INT },
- { "has_suppression", CSTRUCT_COMPARTMENT_HAS_SUPPRESSION, PTYPE_INT },
- { "inescapable", CSTRUCT_COMPARTMENT_INESCAPABLE, PTYPE_INT },
- { "is_airlock", CSTRUCT_COMPARTMENT_IS_AIRLOCK, PTYPE_INT },
- { "is_passage", CSTRUCT_COMPARTMENT_IS_PASSAGE, PTYPE_INT },
- { "is_void", CSTRUCT_COMPARTMENT_IS_VOID, PTYPE_INT },
- { "is_weather", CSTRUCT_COMPARTMENT_IS_WEATHER, PTYPE_INT },
- { "soot", CSTRUCT_COMPARTMENT_SOOT, PTYPE_FLOAT },
- { "suppression_junction", CSTRUCT_COMPARTMENT_SUPPRESSION_JUNCTION, PTYPE_INT },
- { "temperature", CSTRUCT_COMPARTMENT_TEMPERATURE, PTYPE_FLOAT },
- };
- const struct IrmParamNameMap Compartment_canonicalNameMap[] = {
- { "accessible", CSTRUCT_COMPARTMENT_ACCESSIBLE, PTYPE_INT },
- { "agent_suppression", CSTRUCT_COMPARTMENT_AGENT_SUPPRESSION, PTYPE_INT },
- { "airlock_open", CSTRUCT_COMPARTMENT_AIRLOCK_OPEN, PTYPE_INT },
- { "chrr", CSTRUCT_COMPARTMENT_CHRR, PTYPE_FLOAT },
- { "collapse", CSTRUCT_COMPARTMENT_COLLAPSE, PTYPE_FLOAT },
- { "cten", CSTRUCT_COMPARTMENT_CTEN, PTYPE_INT },
- { "ctrans", CSTRUCT_COMPARTMENT_CTRANS, PTYPE_INT },
- { "cvis", CSTRUCT_COMPARTMENT_CVIS, PTYPE_FLOAT },
- { "exception", CSTRUCT_COMPARTMENT_HAS_EXCEPTION, PTYPE_INT },
- { "fire_size", CSTRUCT_COMPARTMENT_FIRE_SIZE, PTYPE_FLOAT },
- { "flooding", CSTRUCT_COMPARTMENT_FLOODING, PTYPE_FLOAT },
- { "has_abandon", CSTRUCT_COMPARTMENT_HAS_ABANDON, PTYPE_INT },
- { "has_debris", CSTRUCT_COMPARTMENT_HAS_DEBRIS, PTYPE_INT },
- { "has_exception", CSTRUCT_COMPARTMENT_HAS_EXCEPTION, PTYPE_INT },
- { "has_fire", CSTRUCT_COMPARTMENT_HAS_FIRE, PTYPE_INT },
- { "has_flood", CSTRUCT_COMPARTMENT_HAS_FLOOD, PTYPE_INT },
- { "has_hot", CSTRUCT_COMPARTMENT_HAS_HOT, PTYPE_INT },
- { "has_investigation", CSTRUCT_COMPARTMENT_HAS_INVESTIGATION, PTYPE_INT },
- { "has_pda", CSTRUCT_COMPARTMENT_HAS_PDA, PTYPE_INT },
- { "has_smoke", CSTRUCT_COMPARTMENT_HAS_SMOKE, PTYPE_INT },
- { "has_steam", CSTRUCT_COMPARTMENT_HAS_STEAM, PTYPE_INT },
- { "has_suppression", CSTRUCT_COMPARTMENT_HAS_SUPPRESSION, PTYPE_INT },
- { "inescapable", CSTRUCT_COMPARTMENT_INESCAPABLE, PTYPE_INT },
- { "is_airlock", CSTRUCT_COMPARTMENT_IS_AIRLOCK, PTYPE_INT },
- { "is_passage", CSTRUCT_COMPARTMENT_IS_PASSAGE, PTYPE_INT },
- { "is_void", CSTRUCT_COMPARTMENT_IS_VOID, PTYPE_INT },
- { "is_weather", CSTRUCT_COMPARTMENT_IS_WEATHER, PTYPE_INT },
- { "soot", CSTRUCT_COMPARTMENT_SOOT, PTYPE_FLOAT },
- { "suppression_junction", CSTRUCT_COMPARTMENT_SUPPRESSION_JUNCTION, PTYPE_INT },
- { "temperature", CSTRUCT_COMPARTMENT_TEMPERATURE, PTYPE_FLOAT },
- };
- /*
- ** Code for managing compartments in the simulator. This information
- ** is used to compute crew escape.
- */
- /*
- ** Routines from simnode.c that we need access to
- */
- int SimLink_CalculateThermalEndurance(Roid id,double rTemp,double rFire);
- /*
- ** All compartments indexed by Compartment.id
- */
- static inline int ifHigher(int oldvalue,int newvalue) {
- if(newvalue>oldvalue) {
- return newvalue;
- }
- return oldvalue;
- }
- static void CompartmentComputeAccessible(Compartment *p) {
- int lastAccess = p->public_accessible;
- p->public_accessible=0;
- /* If a compartment is not passable, it accessible = 3 */
- /*
- ** RULE: compartment-has_pda-0001
- ** A [cstruct compartment] in state [cstruct compartment field has_pda]=1 is
- ** considered to be on fire and it's decking destroyed. This is intended to model
- ** a strike from a missile or other explosive.
- **
- ** RULE: compartment-has_pda-0002
- ** A [cstruct compartment] in state [cstruct compartment field has_pda]=2 is
- ** is in the area that would be affected by a shock event, and while likely to
- ** contain damaged equipment, will not impede crew movement
- */
- if (p->public_has_pda==1) {
- p->public_accessible=ifHigher(p->public_accessible,CurrentSim->public_crew_trans_pda);
- }
- if (p->public_has_flood) {
- p->public_accessible=ifHigher(p->public_accessible,CurrentSim->public_crew_trans_flood);
- }
- if (p->public_has_abandon) {
- p->public_accessible=ifHigher(p->public_accessible,CurrentSim->public_crew_trans_abandon);
- }
- if (p->public_has_smoke) {
- p->public_accessible=ifHigher(p->public_accessible,CurrentSim->public_crew_trans_smoke);
- }
- if (p->public_has_fire) {
- p->public_accessible=ifHigher(p->public_accessible,CurrentSim->public_crew_trans_fire);
- } else if (p->public_has_hot==2) {
- p->public_accessible=ifHigher(p->public_accessible,2);
- } else if (p->public_has_hot==3) {
- p->public_accessible=ifHigher(p->public_accessible,3);
- }
- /* If FSSMIX is running use its scores for cten and ctrans */
- if(p->public_cten || p->public_ctrans) {
- if(p->public_ctrans > 1) {
- p->public_accessible=ifHigher(p->public_accessible,1);
- }
- if (p->public_cten > 1) {
- p->public_accessible=ifHigher(p->public_accessible,p->public_cten);
- }
- }
- if(lastAccess != p->public_accessible) {
- p->changed=1;
- }
- }
- /*
- ** Functions provided by the template
- */
- Compartment *Compartment_ById(Roid id, int createFlag) {
- /*
- ** Return a pointer to a Compartment with the given ID. Return NULL
- ** if there is no such portal. Create a new one if the createFlag
- ** is true and the portal does not previously exist.
- */
- Tcl_HashEntry *pEntry;
- int isNew;
- Compartment *p;
- pEntry=Tcl_FindHashEntry(&CurrentSim->CompartmentIdSet,(char *)id);
- if(pEntry) {
- return (Compartment*)Tcl_GetHashValue(pEntry);
- }
- if(!createFlag) {
- return NULL;
- }
- pEntry = Tcl_CreateHashEntry(&CurrentSim->CompartmentIdSet,(char *)id, &isNew);
- p = (Compartment *)local_Alloc( sizeof(*p) );
- p->id = id;
- p->public_cvis = 2000.0;
- if(!CurrentSim->GlobalSim) {
- p->pType=Entity_ById('c',p->id,1);
- } else {
- p->pType=Entity_ById('c',p->id,0);
- }
- Tcl_SetHashValue(pEntry,(ClientData)p);
- Compartment_StructAlloc(p);
- Compartment_Index(CurrentSim,p);
- return p;
- }
- Compartment *Compartment_ByName(char *idstring, int createFlag) {
- Roid i=-1;
- i=Irm_RoidFromString(idstring,'c');
- if(i<0) {
- return NULL;
- }
- return Compartment_ById(i,createFlag);
- }
- Tcl_HashEntry *Compartment_First(Simulator *sim,Tcl_HashSearch *search) {
- /*
- ** Return the first compartment in a list of them all
- */
- return Tcl_FirstHashEntry(&CurrentSim->CompartmentIdSet,search);
- }
- Tcl_Obj *Compartment_GroupToTclObj(Compartment *pNode) {
- Roid groupid;
- if(!pNode) {
- return Tcl_NewBooleanObj(0);
- }
- groupid=Compartment_StructGetGroup(pNode);
- if(!groupid) {
- return Tcl_NewBooleanObj(0);
- }
- return Tcl_NewWideIntObj(groupid);
- }
- Tcl_Obj *Compartment_Identify(Compartment *pNode) {
- if(!pNode) {
- return Tcl_NewWideIntObj(0);
- }
- return Tcl_NewWideIntObj(pNode->id);
- }
- Compartment *Compartment_Index_First(Simulator *sim) {
- return sim->Compartment_IndexAll;
- }
- Tcl_Obj *Compartment_PublicId(Compartment *pNode) {
- char idstring[64];
- if(!pNode) {
- return Tcl_NewWideIntObj(0);
- }
- if(pNode->pType) {
- if(pNode->pType->name) {
- return Irm_NewStringObj(pNode->pType->name);
- }
- }
- sprintf(idstring,"c%d",pNode->id);
- return Irm_NewStringObj(idstring);
- }
- Tcl_Obj *Compartment_StructDictGet(Compartment *p,Tcl_Obj* key,int nulltype) {
- return Entity_ExportField(p->pType,NULL,Tcl_GetString(key),nulltype);
- }
- Tcl_Obj *Compartment_StructGet(
- Compartment *pNode,
- int field
- ) {
- switch (field) {
- case CSTRUCT_COMPARTMENT_ACCESSIBLE: return Tcl_NewIntObj(pNode->public_accessible);
- case CSTRUCT_COMPARTMENT_HAS_EXCEPTION: return Tcl_NewIntObj(pNode->public_has_exception);
- case CSTRUCT_COMPARTMENT_IS_PASSAGE: return Tcl_NewIntObj(pNode->public_is_passage);
- case CSTRUCT_COMPARTMENT_COLLAPSE: {
- return IRM_NewFuzzyObj(pNode->public_collapse);
- }
- case CSTRUCT_COMPARTMENT_IS_VOID: return Tcl_NewIntObj(pNode->public_is_void);
- case CSTRUCT_COMPARTMENT_CHRR: {
- return IRM_NewFuzzyObj(pNode->public_chrr);
- }
- case CSTRUCT_COMPARTMENT_FLOODING: {
- return IRM_NewFuzzyObj(pNode->public_flooding);
- }
- case CSTRUCT_COMPARTMENT_CVIS: {
- return IRM_NewFuzzyObj(pNode->public_cvis);
- }
- case CSTRUCT_COMPARTMENT_INESCAPABLE: return Tcl_NewIntObj(pNode->public_inescapable);
- case CSTRUCT_COMPARTMENT_IS_WEATHER: return Tcl_NewIntObj(pNode->public_is_weather);
- case CSTRUCT_COMPARTMENT_IS_AIRLOCK: return Tcl_NewIntObj(pNode->public_is_airlock);
- case CSTRUCT_COMPARTMENT_CTEN: return Tcl_NewIntObj(pNode->public_cten);
- case CSTRUCT_COMPARTMENT_HAS_SUPPRESSION: return Tcl_NewIntObj(pNode->public_has_suppression);
- case CSTRUCT_COMPARTMENT_HAS_INVESTIGATION: return Tcl_NewIntObj(pNode->public_has_investigation);
- case CSTRUCT_COMPARTMENT_SOOT: {
- return IRM_NewFuzzyObj(pNode->public_soot);
- }
- case CSTRUCT_COMPARTMENT_SUPPRESSION_JUNCTION: return Tcl_NewIntObj(pNode->public_suppression_junction);
- case CSTRUCT_COMPARTMENT_HAS_ABANDON: return Tcl_NewIntObj(pNode->public_has_abandon);
- case CSTRUCT_COMPARTMENT_CTRANS: return Tcl_NewIntObj(pNode->public_ctrans);
- case CSTRUCT_COMPARTMENT_AGENT_SUPPRESSION: return Tcl_NewIntObj(pNode->public_agent_suppression);
- case CSTRUCT_COMPARTMENT_HAS_FIRE: return Tcl_NewIntObj(pNode->public_has_fire);
- case CSTRUCT_COMPARTMENT_HAS_DEBRIS: return Tcl_NewIntObj(pNode->public_has_debris);
- case CSTRUCT_COMPARTMENT_HAS_PDA: return Tcl_NewIntObj(pNode->public_has_pda);
- case CSTRUCT_COMPARTMENT_HAS_STEAM: return Tcl_NewIntObj(pNode->public_has_steam);
- case CSTRUCT_COMPARTMENT_HAS_HOT: return Tcl_NewIntObj(pNode->public_has_hot);
- case CSTRUCT_COMPARTMENT_AIRLOCK_OPEN: return Tcl_NewIntObj(pNode->public_airlock_open);
- case CSTRUCT_COMPARTMENT_TEMPERATURE: {
- return IRM_NewFuzzyObj(pNode->public_temperature);
- }
- case CSTRUCT_COMPARTMENT_FIRE_SIZE: {
- return IRM_NewFuzzyObj(pNode->public_fire_size);
- }
- case CSTRUCT_COMPARTMENT_HAS_FLOOD: return Tcl_NewIntObj(pNode->public_has_flood);
- case CSTRUCT_COMPARTMENT_HAS_SMOKE: return Tcl_NewIntObj(pNode->public_has_smoke);
- }
- return NULL;
- }
- Entity *Compartment_StructGetType(Compartment *p) {
- if(p->pType) {
- return Entity_StructGetType(p->pType);
- }
- return NULL;
- }
- Tcl_Obj *Compartment_StructToDict(Tcl_Interp *interp,Compartment *p,int virtual) {
- Tcl_Obj *pResult=NULL;
- int i;
- if (virtual) {
- pResult=Entity_GetDict(p->pType,NULL);
- }
- if(!pResult) {
- pResult=Tcl_NewObj();
- }
- /* Finaly, Add the Tcl Data */
- for(i=0;i<CSTRUCT_COMPARTMENT_Count;i++) {
- Tcl_Obj *newElement=Compartment_StructGet(p,i);
- Irm_DictObjPut(interp,pResult,Compartment_paramNameMap[i].zName,newElement);
- }
- if(virtual) {
- Compartment_StructAddLocation(interp,p,pResult);
- }
- return pResult;
- }
- Tcl_Obj *Compartment_TypeToTclObj(Compartment *pNode) {
- Entity *pType;
- if(!pNode) {
- return Tcl_NewBooleanObj(0);
- }
- pType=Compartment_StructGetType(pNode);
- if(!pType) {
- return Tcl_NewBooleanObj(0);
- }
- return Tcl_NewWideIntObj(pType->id);
- }
- void Compartment_ApplySettings(Compartment *p) {
- int exception=0;
- double tempC;
- p->changed=0;
- if (p->public_is_void) {
- p->public_accessible=3;
- p->public_has_exception=exception;
- return;
- }
- if(p->public_fire_size > 0.0 && p->public_has_fire < 1) {
- int fueltype=TypeSpec_GetInt(p->pType,"fssim_fuel_type");
- if(fueltype<0) {
- p->public_has_fire=0;
- } else if (fueltype>0) {
- p->public_has_fire=2;
- } else {
- p->public_has_fire=1;
- }
- }
- if(p->public_flooding > 0.2) {
- p->public_has_flood=1;
- }
- if(p->public_cvis < CurrentSim->public_crew_detect_smoke) {
- p->public_has_smoke=1;
- } else {
- p->public_has_smoke=0;
- }
- tempC=p->public_temperature-273.15;
- if(tempC > CurrentSim->public_crew_detect_hot_3) {
- p->public_has_hot=3;
- exception=1;
- } else if (tempC > CurrentSim->public_crew_detect_hot_2) {
- p->public_has_hot=2;
- exception=1;
- } else if (tempC > CurrentSim->public_crew_detect_hot_1) {
- p->public_has_hot=1;
- exception=1;
- } else {
- p->public_has_hot=0;
- }
- CompartmentComputeAccessible(p);
- if(p->public_accessible != p->delta->public_accessible) {
- p->changed=1;
- }
- if(p->public_temperature != p->delta->public_temperature) {
- p->changed=1;
- }
- if(p->public_fire_size != p->delta->public_fire_size) {
- p->changed=1;
- }
- if(p->public_cvis != p->delta->public_cvis) {
- p->changed=1;
- }
- if(p->changed) {
- exception=1;
- }
- if(!p->public_is_void && p->public_accessible) {
- exception=1;
- }
- if(p->public_inescapable) exception=1;
- if(p->public_has_pda) exception=1;
- if(p->public_has_flood) exception=1;
- if(p->public_has_fire) exception=1;
- if(p->public_has_smoke) exception=1;
- if(p->public_has_abandon) exception=1;
- if(p->public_has_investigation) exception=1;
- if(p->public_has_steam) exception=1;
- if(p->public_cten > 0) exception=1;
- if(p->public_ctrans > 0) exception=1;
- if(p->public_chrr > 0.0 ) exception=1;
- if(p->public_has_suppression) exception=1;
- p->public_has_exception=exception;
- }
- int Compartment_Compare(Compartment *a,Compartment *b) {
- if(!a && !b) {
- return 0;
- }
- if(!b) {
- return 1;
- }
- if(!a) {
- return -1;
- }
- if(b->id>a->id) {
- return -1;
- }
- if(a->id>b->id) {
- return 1;
- }
- return 0;
- }
- int Compartment_FromTclObj(Tcl_Interp *interp, Tcl_Obj *pObj, Compartment **ppCompartment) {
- /*
- ** Find a Compartment given a Tcl_Obj that contains the Compartment ID.
- ** Leave an error message in interp and return TCL_ERROR if anything
- ** goes wrong.
- */
- Roid i=-1;
- i=Irm_RoidFromString(Tcl_GetString(pObj),'c');
- if(i<0) {
- if(interp) {
- Tcl_AppendResult(interp, "no such Compartment: ",
- Tcl_GetStringFromObj(pObj, 0), 0);
- }
- }
- *ppCompartment = Compartment_ById(i, 0);
- if( *ppCompartment==0 ){
- if(interp) {
- Tcl_AppendResult(interp, "no such Compartment: ",
- Tcl_GetStringFromObj(pObj, 0), 0);
- }
- return TCL_ERROR;
- }
- return TCL_OK;
- }
- void Compartment_Index(Simulator *sim,Compartment *p) {
- Compartment *i,*iPrev;
- p->pNextAll=NULL;
- /*
- ** Index the node
- */
- if(!sim->Compartment_IndexAll) {
- /*
- ** Perform a head insertion if the list is empty
- */
- p->pNextAll=sim->Compartment_IndexAll;
- sim->Compartment_IndexAll=p;
- return;
- }
- if(Compartment_Compare(p,sim->Compartment_IndexAll)<0) {
- /*
- ** Perform a head insertion if this node
- ** is less than the head node
- */
- p->pNextAll=sim->Compartment_IndexAll;
- sim->Compartment_IndexAll=p;
- return;
- }
- iPrev=sim->Compartment_IndexAll;
- for(i=iPrev;i;i=i->pNextAll) {
- if(Compartment_Compare(i,p)>0) {
- p->pNextAll=i;
- iPrev->pNextAll=p;
- return;
- }
- iPrev=i;
- }
- /*
- ** If we have gotten this far, do a tail
- ** insertion
- */
- iPrev->pNextAll=p;
- }
- void Compartment_Index_Rebuild(Simulator *sim) {
- Tcl_HashSearch search;
- Tcl_HashEntry *i;
- CurrentSim->Compartment_IndexAll=NULL;
- for(i=Compartment_First(CurrentSim,&search); i ; i = Tcl_NextHashEntry(&search)) {
- Compartment *p = (Compartment *)Tcl_GetHashValue(i);
- p->pNextAll=NULL;
- }
- for(i=Compartment_First(CurrentSim,&search); i ; i = Tcl_NextHashEntry(&search)) {
- Compartment *p = (Compartment *)Tcl_GetHashValue(i);
- Compartment_Index(CurrentSim,p);
- }
- }
- void Compartment_Module_Advance(Simulator *ActiveSim,int clocktime) {
- Tcl_HashSearch search;
- Tcl_HashEntry *i;
- for(i=Compartment_First(ActiveSim,&search); i ; i = Tcl_NextHashEntry(&search)) {
- Compartment *p = (Compartment *)Tcl_GetHashValue(i);
- memcpy(p->delta,p,sizeof(*p));
- }
- }
- void Compartment_Module_Free(Simulator *sim) {
- /*
- ** Reset the compartment map
- */
- Tcl_HashSearch searchPtr;
- Tcl_HashEntry *i;
- if(!sim->module_compartment) return;
- for(i=Compartment_First(sim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Compartment *p = (Compartment*)Tcl_GetHashValue(i);
- if(p->kidlist) {
- local_Free((char *)p->kidlist);
- }
- Compartment_StructFree(p);
- local_Free((char *)p);
- }
- for(i=Portal_First(sim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Portal *p = (Portal*)Tcl_GetHashValue(i);
- Portal_StructFree(p);
- local_Free((char *)p);
- }
- Tcl_DeleteHashTable(&sim->PortalIdSet);
- Tcl_DeleteHashTable(&sim->CompartmentIdSet);
- sim->Compartment_IndexAll=NULL;
- sim->module_compartment=0;
- }
- void Compartment_Module_Init(Simulator *sim) {
- Compartment *external;
- if(sim->module_compartment) return;
- Tcl_InitHashTable(&sim->CompartmentIdSet, TCL_ONE_WORD_KEYS);
- /* Build an entry for external */
- Tcl_InitHashTable(&sim->PortalIdSet, TCL_ONE_WORD_KEYS);
- sim->NextHoleId=SYNTHETIC_START;
- sim->pSubcompt = 0;
- sim->Compartment_IndexAll=NULL;
- external=Compartment_ById(-1,1);
- external->public_is_weather=1;
- sim->module_compartment=0;
- }
- void Compartment_Module_Rewind(Simulator *sim) {
- Tcl_HashSearch searchPtr;
- Tcl_HashEntry *i;
- Compartment *pCompt;
- for(i=Portal_First(sim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Portal *p = (Portal*)Tcl_GetHashValue(i);
- Portal_Repair(p,1);
- }
- Compartment_Index_Rebuild(sim);
- for(pCompt=sim->Compartment_IndexAll; pCompt ; pCompt=pCompt->pNextAll) {
- Compartment_Repair(pCompt,1);
- }
- }
- void Compartment_Node_GetLink(Tcl_Obj *pResult,Compartment *pNode,char *linktype) {
- if(linktype==NULL) {
- if(pNode->pType->pType) {
- Tcl_ListObjAppendElement(NULL, pResult, Irm_NewStringObj("type"));
- Tcl_ListObjAppendElement(NULL, pResult, Entity_Identify(pNode->pType->pType));
- }
- if(pNode->pType->gType) {
- Tcl_ListObjAppendElement(NULL, pResult, Irm_NewStringObj("group"));
- Tcl_ListObjAppendElement(NULL, pResult, Entity_Identify(pNode->pType->gType));
- }
- }
- }
- int Compartment_nodeeval(Tcl_Interp *interp,Compartment *p,Tcl_Obj *body,int writeback) {
- Tcl_Obj *id;
- //Tcl_Obj *pValueDict;
- int i;
- Tcl_Obj **varv;
- int varc,result;
- Compartment_StructWith(interp,p,1);
- /*
- if (Tcl_ListObjGetElements(interp, pValueDict, &varc, &varv) != TCL_OK) {
- return TCL_ERROR;
- }
- for(i=0;i<varc;i+=2) {
- //Tcl_IncrRefCount(varv[i+1]);
- Tcl_ObjSetVar2(interp, varv[i], (Tcl_Obj *)NULL, varv[i+1], 0);
- }
- */
- id=Compartment_Identify(p);
- Tcl_ObjSetVar2(interp,Irm_NewStringObj("id"),NULL,id,0);
- Tcl_ObjSetVar2(interp,Irm_NewStringObj("typeid"),NULL,Compartment_TypeToTclObj(p),0);
- Tcl_ObjSetVar2(interp,Irm_NewStringObj("groupid"),NULL,Compartment_GroupToTclObj(p),0);
- /*Tcl_ObjSetVar2(interp,Irm_NewStringObj("config_dict"),NULL,Tcl_DuplicateObj(pValueDict),0);*/
- result=Tcl_EvalObjEx(interp, body, 0);
- if(result!=TCL_OK) {
- #ifdef NEVER
- if(pValueDict) {
- Tcl_DecrRefCount(pValueDict);
- }
- #endif
- return result;
- }
- #ifdef NEVER
- if(writeback){
- /*
- ** Read values back into the dict
- ** For now, we limit writeback to state variables
- ** And we don't care about garbage values
- */
- for(i=0;i<varc;i+=2) {
- Tcl_Obj *newValue;
- int offset;
- int type;
- newValue=Tcl_ObjGetVar2(interp,varv[i],(Tcl_Obj*)NULL,0);
- if(newValue==varv[i+1]) {
- /* Undocumented, unsanctioned, but it works in practice
- ** If the pointer hasn't changed, neither has the value
- */
- continue;
- }
- if(!newValue) {
- /* Variable must have been unset... move along */
- continue;
- }
- if( Compartment_StructValueOffset(0, varv[i], &offset, &type) == TCL_OK ) {
- Compartment_StructSet(interp,p,offset,newValue);
- } else {
- Compartment_SpecDictPut(p,varv[i],newValue);
- }
- }
- Compartment_ApplySettings(p);
- }
- if(pValueDict) {
- Tcl_DecrRefCount(pValueDict);
- }
- #endif
- return TCL_OK;
- }
- void Compartment_Repair(Compartment *p, int revert) {
- p->public_airlock_open=0;
- p->public_chrr=0.0;
- p->public_collapse=0.0;
- p->public_ctrans=0;
- p->public_cten=0;
- p->public_cvis=2000;
- p->public_fire_size=0.0;
- p->public_flooding=0.0;
- p->public_has_abandon=0;
- p->public_has_fire=0;
- p->public_has_flood=0;
- p->public_has_hot=0;
- p->public_has_investigation=0;
- p->public_has_pda=0;
- p->public_inescapable=0;
- p->public_has_smoke=0;
- p->public_has_suppression=0;
- p->public_has_steam=0;
- p->public_soot=0.0;
- p->public_suppression_junction=0;
- p->public_temperature=300.0;
- CompartmentComputeAccessible(p);
- }
- void Compartment_Rewind(Compartment *p, int revert) {
- }
- void Compartment_SpecDictClear(Compartment *p,Tcl_Obj *key,Tcl_Obj *value) {
- if(p->pType) {
- Irm_DictFree(p->pType->infoDict);
- p->pType->infoDict=NULL;
- }
- }
- void Compartment_SpecDictPut(Compartment *p,Tcl_Obj *key,Tcl_Obj *value) {
- if(p->pType) {
- Irm_DictPut(&p->pType->infoDict,Tcl_GetString(key),value);
- }
- }
- /*
- ** Add a key/value list describing the location of this object
- */
- IRM_INLINE void Compartment_StructAddLocation(
- Tcl_Interp *interp,Compartment *pNode, Tcl_Obj *pValueDict
- ) {
- /* Default empty implementation from generic template */
- }
- void Compartment_StructAlloc(Compartment *p) {
- if (!p->delta) {
- p->delta=(Compartment *) local_Alloc(sizeof(*p));
- memcpy(p->delta,p,sizeof(*p));
- }
- }
- int Compartment_StructChanged(Compartment *pNode,int field, int embargo, int force) {
- if(field < 0) return 0;
- if(field > CSTRUCT_COMPARTMENT_Count)
- return 0;
- if(!pNode->delta) force=1;
- /* No Photo, no comment */
- switch (field) {
- case CSTRUCT_COMPARTMENT_ACCESSIBLE:
- if (force || pNode->public_accessible != pNode->delta->public_accessible) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_IS_PASSAGE:
- if (force || pNode->public_is_passage != pNode->delta->public_is_passage) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_COLLAPSE:
- if(force) {
- return !IRM_Real_Is_Zero(pNode->public_collapse);
- } else {
- if(pNode->public_collapse != pNode->delta->public_collapse) {
- return 1;
- }
- return 0;
- }
- case CSTRUCT_COMPARTMENT_IS_VOID:
- if (force || pNode->public_is_void != pNode->delta->public_is_void) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_CHRR:
- if(force) {
- return !IRM_Real_Is_Zero(pNode->public_chrr);
- } else {
- if(pNode->public_chrr != pNode->delta->public_chrr) {
- return 1;
- }
- return 0;
- }
- case CSTRUCT_COMPARTMENT_FLOODING:
- if(force) {
- return !IRM_Real_Is_Zero(pNode->public_flooding);
- } else {
- if(pNode->public_flooding != pNode->delta->public_flooding) {
- return 1;
- }
- return 0;
- }
- case CSTRUCT_COMPARTMENT_CVIS:
- if(force) {
- return !IRM_Real_Is_Zero(pNode->public_cvis);
- } else {
- if(pNode->public_cvis != pNode->delta->public_cvis) {
- return 1;
- }
- return 0;
- }
- case CSTRUCT_COMPARTMENT_INESCAPABLE:
- if (force || pNode->public_inescapable != pNode->delta->public_inescapable) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_IS_WEATHER:
- if (force || pNode->public_is_weather != pNode->delta->public_is_weather) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_IS_AIRLOCK:
- if (force || pNode->public_is_airlock != pNode->delta->public_is_airlock) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_CTEN:
- if (force || pNode->public_cten != pNode->delta->public_cten) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_SUPPRESSION:
- if (force || pNode->public_has_suppression != pNode->delta->public_has_suppression) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_INVESTIGATION:
- if (force || pNode->public_has_investigation != pNode->delta->public_has_investigation) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_SOOT:
- if(force) {
- return !IRM_Real_Is_Zero(pNode->public_soot);
- } else {
- if(pNode->public_soot != pNode->delta->public_soot) {
- return 1;
- }
- return 0;
- }
- case CSTRUCT_COMPARTMENT_SUPPRESSION_JUNCTION:
- if (force || pNode->public_suppression_junction != pNode->delta->public_suppression_junction) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_ABANDON:
- if (force || pNode->public_has_abandon != pNode->delta->public_has_abandon) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_CTRANS:
- if (force || pNode->public_ctrans != pNode->delta->public_ctrans) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_AGENT_SUPPRESSION:
- if (force || pNode->public_agent_suppression != pNode->delta->public_agent_suppression) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_FIRE:
- if (force || pNode->public_has_fire != pNode->delta->public_has_fire) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_DEBRIS:
- if (force || pNode->public_has_debris != pNode->delta->public_has_debris) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_PDA:
- if (force || pNode->public_has_pda != pNode->delta->public_has_pda) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_STEAM:
- if (force || pNode->public_has_steam != pNode->delta->public_has_steam) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_HOT:
- if (force || pNode->public_has_hot != pNode->delta->public_has_hot) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_AIRLOCK_OPEN:
- if (force || pNode->public_airlock_open != pNode->delta->public_airlock_open) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_TEMPERATURE:
- if(force) {
- return !IRM_Real_Is_Zero(pNode->public_temperature);
- } else {
- if(pNode->public_temperature != pNode->delta->public_temperature) {
- return 1;
- }
- return 0;
- }
- case CSTRUCT_COMPARTMENT_FIRE_SIZE:
- if(force) {
- return !IRM_Real_Is_Zero(pNode->public_fire_size);
- } else {
- if(pNode->public_fire_size != pNode->delta->public_fire_size) {
- return 1;
- }
- return 0;
- }
- case CSTRUCT_COMPARTMENT_HAS_FLOOD:
- if (force || pNode->public_has_flood != pNode->delta->public_has_flood) {
- return 1;
- }
- return 0;
- case CSTRUCT_COMPARTMENT_HAS_SMOKE:
- if (force || pNode->public_has_smoke != pNode->delta->public_has_smoke) {
- return 1;
- }
- return 0;
- }
- return 0;
- }
- void Compartment_StructFree(Compartment *p) {
- if (p->delta) {
- IRM_Free((char *)p->delta);
- p->delta=NULL;
- }
- }
- /*
- ** Free memory the was allocated internally by the data
- ** structure
- */
- IRM_INLINE void Compartment_StructFree_Private(
- Compartment *p
- ) {
- }
- Roid Compartment_StructGetGroup(Compartment *p) {
- if(p->pType) {
- return Entity_StructGetGroup(p->pType);
- }
- return 0;
- }
- void Compartment_StructLocation(Irm_Location *lstruct,Compartment *p) {
- CrewRoute_ComptCenter(p->id,0,lstruct);
- }
- int Compartment_StructSet(
- Tcl_Interp *interp,
- Compartment *pNode,
- int field,
- Tcl_Obj *value
- ) {
- if(field < 0 ) {
- return TCL_ERROR;
- }
- switch (field) {
- case CSTRUCT_COMPARTMENT_ACCESSIBLE: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_accessible=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_EXCEPTION: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_exception=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_IS_PASSAGE: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_is_passage=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_COLLAPSE: {
- double floatValue;
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- pNode->public_collapse=(IrmReal)floatValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_IS_VOID: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_is_void=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_CHRR: {
- double floatValue;
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- pNode->public_chrr=(IrmReal)floatValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_FLOODING: {
- double floatValue;
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- pNode->public_flooding=(IrmReal)floatValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_CVIS: {
- double floatValue;
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- pNode->public_cvis=(IrmReal)floatValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_INESCAPABLE: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_inescapable=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_IS_WEATHER: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_is_weather=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_IS_AIRLOCK: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_is_airlock=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_CTEN: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_cten=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_SUPPRESSION: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_suppression=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_INVESTIGATION: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_investigation=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_SOOT: {
- double floatValue;
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- pNode->public_soot=(IrmReal)floatValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_SUPPRESSION_JUNCTION: {
- Tcl_WideInt wideValue;
- if(Tcl_GetWideIntFromObj(interp,value,&wideValue)) return TCL_ERROR;
- pNode->public_suppression_junction=(Roid)wideValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_ABANDON: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_abandon=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_CTRANS: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_ctrans=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_AGENT_SUPPRESSION: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_agent_suppression=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_FIRE: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_fire=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_DEBRIS: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_debris=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_PDA: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_pda=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_STEAM: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_steam=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_HOT: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_hot=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_AIRLOCK_OPEN: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_airlock_open=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_TEMPERATURE: {
- double floatValue;
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- pNode->public_temperature=(IrmReal)floatValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_FIRE_SIZE: {
- double floatValue;
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- pNode->public_fire_size=(IrmReal)floatValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_FLOOD: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_flood=intValue;
- return TCL_OK;
- }
- case CSTRUCT_COMPARTMENT_HAS_SMOKE: {
- int intValue;
- double floatValue;
- if(Tcl_GetIntFromObj(interp,value,&intValue)) {
- Tcl_ResetResult(interp);
- if(Tcl_GetDoubleFromObj(interp,value,&floatValue)) return TCL_ERROR;
- intValue=(int)floatValue;
- }
- pNode->public_has_smoke=intValue;
- return TCL_OK;
- }
- }
- return TCL_OK;
- }
- void Compartment_StructSetGroup(Compartment *p,Roid groupid) {
- Entity_StructSetGroup(p->pType,groupid);
- }
- void Compartment_StructSetType(Compartment *p,Entity *pType) {
- if(!p->pType) {
- return;
- }
- Entity_StructSetType(p->pType,pType);
- }
- IRM_INLINE int Compartment_StructValueOffset(
- Tcl_Interp *interp,
- Tcl_Obj *pObj,
- int *pIndex,
- int *pType
- ) {
- /*
- ** Given the name of one of the arState[] values in the Compartment structure,
- ** return the index of the particular arState[]. Return TCL_OK.
- **
- ** Leave an error message in interp and return TCL_ERROR if
- ** anything goes wrong.
- */
- int lo, hi, mid, c, max, i;
- int nName;
- const char *zName;
- const struct IrmParamNameMap *aParam = Compartment_canonicalNameMap;
- lo = 0;
- hi = max = CSTRUCT_COMPARTMENT_AliasCount - 1;
- zName = Tcl_GetStringFromObj(pObj, &nName);
- mid = (lo+hi)/2;
- if(nName>32) {
- nName=32;
- }
- while( lo<=hi ){
- mid = (lo+hi)/2;
- c = strncmp(zName, aParam[mid].zName, nName);
- if( c<0 ){
- hi = mid-1;
- }else if( c>0 ){
- lo = mid+1;
- }else if(
- (mid>0 && strncmp(zName, aParam[mid-1].zName, nName)==0) ||
- (mid<max && strncmp(zName, aParam[mid+1].zName, nName)==0)
- ){
- i = mid;
- while( i>0 && strncmp(zName, aParam[i-1].zName, nName)==0 ){
- i--;
- }
- if( strlen(aParam[i].zName)==nName ){
- *pIndex = aParam[i].iCode;
- *pType = aParam[i].pType;
- return TCL_OK;
- }
- if(interp) {
- Tcl_AppendResult(interp, "ambiguous parameter:", 0);
- do{
- Tcl_AppendResult(interp, " ", aParam[i++].zName, 0);
- }while( i<=max && strncmp(zName, aParam[i].zName, nName)==0 );
- }
- return TCL_ERROR;
- }else{
- *pIndex = aParam[mid].iCode;
- *pType = aParam[mid].pType;
- return TCL_OK;
- }
- }
- if(interp) {
- Tcl_AppendResult(interp, "unknown parameter \"", zName,
- "\" - nearby choices:", 0);
- for(i=mid-3; i<mid+3; i++){
- if( i<0 || i>max ) continue;
- Tcl_AppendResult(interp, " ", aParam[i].zName, 0);
- }
- }
- return TCL_ERROR;
- }
- void Compartment_StructWith(Tcl_Interp *interp,Compartment *p,int virtual) {
- int i;
- if (virtual) {
- Entity_With(interp,p->pType,NULL);
- }
- /* Finaly, Add the Tcl Data */
- for(i=0;i<CSTRUCT_COMPARTMENT_Count;i++) {
- Tcl_Obj *newElement=Compartment_StructGet(p,i);
- Tcl_ObjSetVar2(interp,Irm_NewStringObj(Compartment_paramNameMap[i].zName),NULL,newElement,0);
- }
- if(virtual) {
- Compartment_StructWithLocation(interp,p);
- }
- }
- IRM_INLINE void Compartment_StructWithLocation(
- Tcl_Interp *interp,Compartment *pNode
- ) {
- /* Default empty implementation from generic template */
- }
- static int Compartment_method_add (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Roid id;
- Compartment *p;
- Entity *pType=NULL;
- if( objc!=2 && objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?typeid?");
- return TCL_ERROR;
- }
- if( Tcl_GetIntFromObj(interp, objv[1], &id) ) return TCL_ERROR;
- if( id<=0 ){
- Tcl_AppendResult(interp, "compartment ID must be 1 or greater", 0);
- return TCL_ERROR;
- }
- p=Compartment_ById(id,1);
- if(objc==3) {
- if( SimType_FromTclObj(interp, objv[2], &pType) ) return TCL_ERROR;
- Compartment_StructSetType(p,pType);
- }
- Compartment_Repair(p,1);
- return TCL_OK;
- }
- static int Compartment_method_cid (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc!=2 ) {
- Tcl_WrongNumArgs(interp, 1, objv, "ID");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) {
- Tcl_ResetResult(interp);
- Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
- return TCL_OK;
- }
- Tcl_SetObjResult(interp, Tcl_NewIntObj(p->id));
- return TCL_OK;
- }
- static int Compartment_method_condition (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_Obj *pResult;
- if( objc!=2 ) {
- Tcl_WrongNumArgs(interp, 1, objv, "ID");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- pResult=Tcl_NewObj();
- CompartmentComputeAccessible(p);
- Tcl_ListObjAppendElement(interp,pResult,Tcl_NewIntObj(p->public_accessible));
- if(p->public_is_void) {
- Tcl_ListObjAppendElement(interp, pResult, Irm_NewStringObj("void"));
- }
- if(p->public_has_pda) {
- Tcl_ListObjAppendElement(interp, pResult, Irm_NewStringObj("pda"));
- }
- if(p->public_has_flood) {
- Tcl_ListObjAppendElement(interp, pResult, Irm_NewStringObj("flood"));
- }
- if(p->public_has_fire>0 && p->public_has_fire<8 ) {
- Tcl_ListObjAppendElement(interp, pResult, Irm_NewStringObj("fire"));
- }
- if(p->public_has_smoke) {
- Tcl_ListObjAppendElement(interp, pResult, Irm_NewStringObj("smoke"));
- }
- if(p->public_has_abandon) {
- Tcl_ListObjAppendElement(interp, pResult, Irm_NewStringObj("abandon"));
- }
- if(p->public_cten > 1) {
- Tcl_ListObjAppendElement(interp, pResult, Irm_NewStringObj("cten"));
- }
- if(p->public_ctrans > 1) {
- Tcl_ListObjAppendElement(interp, pResult, Irm_NewStringObj("ctrans"));
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_count (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_HashSearch search;
- Tcl_HashEntry *i;
- int count=0;
- for(i=Compartment_First(CurrentSim,&search); i ; i = Tcl_NextHashEntry(&search)) {
- count++;
- }
- Tcl_SetObjResult(interp, Tcl_NewIntObj(count));
- return TCL_OK;
- }
- static int Compartment_method_exists (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_Obj *pResult;
- char name[64];
- if( objc!=2 && objc!=3 && objc!=4 ) {
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?idvar? ?namevar?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) {
- Tcl_ResetResult(interp);
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
- return TCL_OK;
- }
- sprintf(name,"c%d",p->id);
- pResult=Tcl_NewStringObj(name,-1);
- if(objc>2) {
- Tcl_ObjSetVar2(interp, objv[2], NULL, Tcl_NewIntObj(p->id), 0);
- }
- if(objc==4) {
- Tcl_ObjSetVar2(interp, objv[3], NULL, pResult, 0);
- }
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1));
- return TCL_OK;
- }
- static int Compartment_method_flooding (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- double rFlow = 0.0;
- int comptid_valid = 0;
- Roid comptid=-1;
- Roid min_comptid;
- SimNode *pNode;
- if( objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "COMPTID");
- return TCL_ERROR;
- }
- if( Tcl_GetIntFromObj(interp, objv[1], &min_comptid) ) return TCL_ERROR;
- for(pNode=SimNode_Index_First(CurrentSim); pNode; pNode=pNode->pNextAll) {
- if( pNode->public_compartment<min_comptid ||
- (comptid_valid && pNode->public_compartment>comptid) ) continue;
- if( pNode->public_compartment!=comptid ){
- comptid = pNode->public_compartment;
- comptid_valid = 1;
- rFlow = 0.0;
- }
- rFlow += pNode->public_water_to_deck;
- rFlow += pNode->public_fuel_to_deck;
- }
- if( comptid_valid && rFlow != 0.0){
- Tcl_Obj *pResult = Tcl_NewObj();
- Tcl_ListObjAppendElement(0, pResult, Tcl_NewWideIntObj(comptid));
- Tcl_ListObjAppendElement(0, pResult, Tcl_NewDoubleObj(rFlow));
- Tcl_SetObjResult(interp, pResult);
- }
- return TCL_OK;
- }
- static int Compartment_method_for (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_HashSearch *searchPtr;
- Tcl_HashEntry *i;
- int searchresult=TCL_OK;
- Tcl_Obj *keyvar;
- Tcl_Obj *infovar=NULL;
- Tcl_Obj *body;
- if( objc != 3 && objc != 4){
- Tcl_WrongNumArgs(interp, 1, objv, "keyvar ?valvar? body");
- return TCL_ERROR;
- }
- keyvar=objv[1];
- if (objc == 4) {
- infovar=objv[2];
- body=objv[3];
- } else {
- body=objv[3];
- }
- Tcl_IncrRefCount(keyvar);
- Tcl_IncrRefCount(body);
- if(infovar) {
- Tcl_IncrRefCount(infovar);
- }
- searchresult=TCL_OK;
- searchPtr=(Tcl_HashSearch *)local_Alloc(sizeof(Tcl_HashSearch));
- for(i=Compartment_First(CurrentSim,searchPtr); i ; i = Tcl_NextHashEntry(searchPtr)) {
- Compartment *p = (Compartment *)Tcl_GetHashValue(i);
- Tcl_ObjSetVar2(interp, keyvar, (Tcl_Obj *)NULL, Compartment_Identify(p), 0);
- if(infovar) {
- Tcl_ObjSetVar2(interp, infovar, (Tcl_Obj *)NULL, Compartment_StructToDict(interp,p,1), 0);
- }
- searchresult=Tcl_EvalObjEx(interp,body,0);
- if (searchresult !=TCL_OK && searchresult!=TCL_CONTINUE) {
- break;
- }
- }
- Tcl_DecrRefCount(keyvar);
- if(infovar) {
- Tcl_DecrRefCount(infovar);
- }
- Tcl_DecrRefCount(body);
- Tcl_Free((char *)searchPtr);
- return searchresult;
- }
- static int Compartment_method_foreach (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_HashSearch *searchPtr;
- Tcl_HashEntry *i;
- int searchresult=TCL_OK;
- Tcl_Obj *body;
- if( objc != 2){
- Tcl_WrongNumArgs(interp, 1, objv, "body");
- return TCL_ERROR;
- }
- body=objv[1];
- searchPtr=(Tcl_HashSearch *)local_Alloc(sizeof(Tcl_HashSearch));
- for(i=Compartment_First(CurrentSim,searchPtr); i ; i = Tcl_NextHashEntry(searchPtr)) {
- Compartment *p = (Compartment *)Tcl_GetHashValue(i);
- searchresult=Compartment_nodeeval(interp,p,body,0);
- if (searchresult !=TCL_OK && searchresult!=TCL_CONTINUE) {
- Tcl_Free((char *)searchPtr);
- return searchresult;
- }
- }
- Tcl_Free((char *)searchPtr);
- return TCL_OK;
- }
- static int Compartment_method_groupid (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Roid groupid=0;
- if( objc!=2 && objc != 3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?groupid?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) {
- Tcl_ResetResult(interp);
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
- return TCL_OK;
- }
- if(objc==3) {
- if(Tcl_GetIntFromObj(interp,objv[2],&groupid)) {
- return TCL_ERROR;
- }
- Compartment_StructSetGroup(p,groupid);
- }
- groupid=Compartment_StructGetGroup(p);
- if(groupid>0) {
- Tcl_SetObjResult(interp, Tcl_NewWideIntObj(groupid));
- } else {
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
- }
- return TCL_OK;
- }
- static int Compartment_method_kidlist (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc!=2 && objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?LISTOFKIDS?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- /* Ensure we have a list of integers */
- if(objc==2 && p->kidlist) {
- Tcl_Obj *pResult=Tcl_NewObj();
- int i;
- for(i=1;i<=p->kidlist[0];i++) {
- Tcl_ListObjAppendList(interp,pResult,Tcl_NewIntObj(p->kidlist[i]));
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- if(objc==3) {
- int i,n;
- Tcl_Obj *element;
- if(Tcl_ListObjLength(interp,objv[2],&n)) return TCL_ERROR;
- if(n==0) {
- /* If zero, empty our list */
- if(p->kidlist) {
- local_Free((char *)p->kidlist);
- p->kidlist=NULL;
- }
- return TCL_OK;
- }
- if(p->kidlist) {
- p->kidlist=(Roid *)Tcl_Realloc((char *)p->kidlist,sizeof(Roid)*(n+1));
- } else {
- p->kidlist=(Roid *)local_Alloc(sizeof(Roid)*(n+1));
- }
- p->kidlist[0]=n;
- for(i=0;i<n;i++) {
- int j=i+1;
- int value;
- if(Tcl_ListObjIndex(interp, objv[2], i, &element)) return TCL_ERROR;
- if(Tcl_GetIntFromObj(interp,element,&value)) return TCL_ERROR;
- p->kidlist[j]=(Roid)value;
- }
- Tcl_SetObjResult(interp, Tcl_NewIntObj(n));
- }
- return TCL_OK;
- }
- static int Compartment_method_list (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_Obj *pResult = Tcl_NewObj();
- Tcl_HashSearch search;
- Tcl_HashEntry *i;
- for(i=Compartment_First(CurrentSim,&search); i ; i = Tcl_NextHashEntry(&search)) {
- Compartment *p = (Compartment *)Tcl_GetHashValue(i);
- Tcl_ListObjAppendElement(interp, pResult, Compartment_Identify(p));
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_list_changed (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_HashSearch searchPtr;
- Tcl_HashEntry *i;
- Tcl_Obj *pResult=Tcl_NewObj();
- for(i=Compartment_First(CurrentSim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Compartment *p = (Compartment*)Tcl_GetHashValue(i);
- if(p->changed) {
- Tcl_ListObjAppendElement(interp, pResult, Compartment_Identify(p));
- }
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_list_crew (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Roid comptid;
- Tcl_HashSearch searchPtr;
- Tcl_HashEntry *i;
- int exception=0;
- Tcl_Obj *pResult=Tcl_NewObj();
- if( objc!=2 && objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "COMPTID ?only_exceptional?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) {
- return TCL_ERROR;
- }
- comptid=p->id;
- if(objc==3) {
- if( Tcl_GetIntFromObj(interp, objv[2], &exception) ) return TCL_ERROR;
- }
- for(i=Crew_First(CurrentSim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Crew *pNode = (Crew*)Tcl_GetHashValue(i);
- if( pNode->public_compartment != comptid && pNode->public_compartment_entering != comptid) continue;
- if( exception && !pNode->public_has_exception ) {
- continue;
- }
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewWideIntObj(pNode->id));
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_list_detectors (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Roid comptid;
- Compartment *p;
- SimNode *pNode;
- Tcl_Obj *pResult=Tcl_NewObj();
- if( objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "COMPTID");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) {
- return TCL_ERROR;
- }
- comptid=p->id;
- for(pNode=SimNode_Index_First(CurrentSim); pNode; pNode=pNode->pNextAll) {
- if( !pNode->isDetector || pNode->public_compartment != comptid ) continue;
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewWideIntObj(pNode->id));
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_list_eqpt (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- int exception=0;
- Roid comptid;
- Compartment *p;
- SimNode *pNode;
- Tcl_Obj *pResult=Tcl_NewObj();
- if( objc!=2 && objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "COMPTID ?only_exceptional?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) {
- return TCL_ERROR;
- }
- comptid=p->id;
- if(objc==3) {
- if( Tcl_GetIntFromObj(interp, objv[1], &exception) ) return TCL_ERROR;
- }
- for(pNode=SimNode_Index_First(CurrentSim); pNode; pNode=pNode->pNextAll) {
- if( pNode->public_compartment != comptid ) continue;
- if( exception && !pNode->public_has_exception ) continue;
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewWideIntObj(pNode->id));
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_list_exception (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_HashSearch searchPtr;
- Tcl_HashEntry *i;
- Tcl_Obj *pResult=Tcl_NewObj();
- for(i=Compartment_First(CurrentSim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Compartment *p = (Compartment*)Tcl_GetHashValue(i);
- if(p->public_has_exception || p->public_accessible!=p->delta->public_accessible) {
- Tcl_ListObjAppendElement(interp, pResult, Compartment_Identify(p));
- }
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_list_portal (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *pCompt,*pComptTo=NULL;
- int from, to=0;
- Tcl_Obj *pResult=Tcl_NewObj();
- Tcl_HashSearch searchPtr;
- Tcl_HashEntry *i;
- if( objc !=2 && objc !=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "CID ?CID2?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &pCompt) ) return TCL_ERROR;
- from=pCompt->id;
- if( objc==3 ) {
- if( Compartment_FromTclObj(interp, objv[2], &pComptTo) ) return TCL_ERROR;
- to=pComptTo->id;
- }
- for(i=Portal_First(CurrentSim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Portal *p = (Portal*)Tcl_GetHashValue(i);
- if(p->public_fromid==p->public_toid) continue;
- if( p->public_fromid!=from && p->public_toid!=from ) continue;
- if(objc==3) {
- if( p->public_fromid!=to && p->public_toid!=to ) continue;
- Tcl_ListObjAppendElement(interp, pResult, Portal_Identify(p));
- } else {
- Tcl_ListObjAppendElement(interp, pResult, Portal_Identify(p));
- if(p->public_fromid==from) {
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewIntObj(p->public_toid));
- } else {
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewIntObj(p->public_fromid));
- }
- }
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_list_sorted (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_Obj *pResult = Tcl_NewObj();
- Compartment *p;
- if(!CurrentSim->Compartment_IndexAll) {
- Compartment_Index_Rebuild(CurrentSim);
- }
- for(p=CurrentSim->Compartment_IndexAll;p;p=p->pNextAll) {
- Tcl_ListObjAppendElement(interp, pResult, Compartment_Identify(p));
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_list_weather (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_HashSearch searchPtr;
- Tcl_HashEntry *i;
- Tcl_Obj *pResult=Tcl_NewObj();
- for(i=Compartment_First(CurrentSim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Compartment *p = (Compartment*)Tcl_GetHashValue(i);
- if(p->public_is_weather) {
- Tcl_ListObjAppendElement(interp, pResult, Compartment_Identify(p));
- }
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_nodedelta (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_Obj *pResult;
- int i;
- int embargo=(CurrentSim->SimCurrentTime % 10);
- if( objc!=2 && objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?field?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- if(objc==3) {
- /* Test if a specific field has changed */
- int offset=-1,err,type;
- int changevalue=0;
- err=Compartment_StructValueOffset(interp, objv[2], &offset,&type);
- if(err == TCL_OK ) {
- if(Compartment_StructChanged(p,offset,embargo,0)) {
- changevalue=1;
- }
- }
- pResult=Tcl_NewBooleanObj(changevalue);
- } else {
- pResult=Tcl_NewDictObj();
- for(i=0;i<CSTRUCT_COMPARTMENT_Count;i++) {
- if(!Compartment_StructChanged(p,i,embargo,0)) continue;
- Tcl_Obj *newElement=Compartment_StructGet(p,i);
- Irm_DictObjPut(interp,pResult,Compartment_paramNameMap[i].zName,newElement);
- }
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_nodeget (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc!=2 && objc != 3){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?field?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- if(objc==3) {
- Tcl_Obj *result;
- int offset=-1,err,type;
- err=Compartment_StructValueOffset(interp, objv[2], &offset,&type);
- if(err == TCL_OK ) {
- result=Compartment_StructGet(p,offset);
- Tcl_SetObjResult(interp,result);
- return TCL_OK;
- }
- /* Pull the value from extended dict */
- result=Compartment_StructDictGet(p,objv[2],IRM_NULL_EMPTY);
- Tcl_SetObjResult(interp,result);
- } else {
- Tcl_SetObjResult(interp,Compartment_StructToDict(interp,p,1));
- }
- return TCL_OK;
- }
- static int Compartment_method_nodeprior (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_Obj *pResult;
- int i;
- if( objc!=2 && objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?field?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- if(objc==3) {
- /* Test if a specific field has changed */
- int offset=-1,err,type;
- err=Compartment_StructValueOffset(interp, objv[2], &offset,&type);
- if(err == TCL_OK ) {
- pResult=Compartment_StructGet(p,offset);
- } else {
- pResult=Tcl_NewObj();
- }
- } else {
- pResult=Tcl_NewDictObj();
- for(i=0;i<CSTRUCT_COMPARTMENT_Count;i++) {
- Tcl_Obj *newElement=Compartment_StructGet(p,i);
- Irm_DictObjPut(interp,pResult,Compartment_paramNameMap[i].zName,newElement);
- }
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_nodeput (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_DictSearch search;
- Tcl_Obj *key, *value, *objPtr;
- int done;
- int offset,type,err=TCL_OK;
- if( objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID infoDict");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- objPtr=objv[2];
- if (Tcl_DictObjFirst(interp, objPtr, &search,
- &key, &value, &done) != TCL_OK) {
- return TCL_ERROR;
- }
- for (; !done ; Tcl_DictObjNext(&search, &key, &value, &done)) {
- if( Compartment_StructValueOffset(interp, key, &offset, &type) == TCL_OK ) {
- err=Compartment_StructSet(interp,p,offset,value);
- if(err != TCL_OK) {
- break;
- }
- } else {
- Compartment_SpecDictPut(p,key,value);
- Tcl_SetObjResult(interp, value);
- }
- }
- Tcl_DictObjDone(&search);
- if(err==TCL_OK) {
- Compartment_ApplySettings(p);
- }
- return err;
- }
- static int Compartment_method_nodewith (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc != 3){
- Tcl_WrongNumArgs(interp, 1, objv, "ID body");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- return Compartment_nodeeval(interp,p,objv[2],1);
- }
- static int Compartment_method_passage (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc!=2 ) {
- Tcl_WrongNumArgs(interp, 1, objv, "ID");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) {
- /* Treat non-existent comptid as a non passage */
- Tcl_ResetResult(interp);
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
- return TCL_OK;
- }
- if(p->public_is_weather) {
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
- } else {
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(p->public_is_passage));
- }
- return TCL_OK;
- }
- static int Compartment_method_redraw (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc!=2 ) {
- Tcl_WrongNumArgs(interp, 1, objv, "ID");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(p->redraw));
- p->redraw=0;
- return TCL_OK;
- }
- static int Compartment_method_repair (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc != 2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- Compartment_Repair(p,1);
- return TCL_OK;
- }
- static int Compartment_method_reset (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment_Module_Free(CurrentSim);
- Compartment_Module_Init(CurrentSim);
- Tcl_ResetResult(interp);
- return TCL_OK;
- }
- static int Compartment_method_setting (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- int offset,type,rcode;
- /* If given a new value, act like a stylized set */
- Compartment *p;
- if( objc!=3 && objc!=4 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID FIELD ?VALUE?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- if(objc == 4) {
- if( Compartment_StructValueOffset(interp, objv[2], &offset, &type) != TCL_OK ) {
- return TCL_ERROR;
- }
- rcode=Compartment_StructSet(interp,p,offset,objv[3]);
- if(rcode==TCL_OK) {
- Compartment_ApplySettings(p);
- }
- return rcode;
- } else {
- Tcl_Obj *result;
- int offset=-1,err,type;
- err=Compartment_StructValueOffset(interp, objv[2], &offset,&type);
- if(err == TCL_OK ) {
- result=Compartment_StructGet(p,offset);
- Tcl_SetObjResult(interp,result);
- return TCL_OK;
- }
- /* Pull the value from extended dict */
- result=Compartment_StructDictGet(p,objv[2],IRM_NULL_ZERO);
- Tcl_SetObjResult(interp,result);
- return TCL_OK;
- }
- }
- static int Compartment_method_spec_get (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_Obj *pResult=NULL;
- if( objc!=2 && objc != 3){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?field?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- if(objc==3) {
- /* Pull the value from extended dict */
- pResult=Compartment_StructDictGet(p,objv[2],IRM_NULL_EMPTY);
- } else {
- pResult=Entity_GetDict(p->pType,NULL);
- }
- if(pResult) {
- Tcl_SetObjResult(interp,pResult);
- }
- return TCL_OK;
- }
- static int Compartment_method_spec_put (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_DictSearch search;
- Tcl_Obj *key, *value, *objPtr;
- int done;
- if( objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID infoDict");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- objPtr=objv[2];
- if (Tcl_DictObjFirst(interp, objPtr, &search,
- &key, &value, &done) != TCL_OK) {
- return TCL_ERROR;
- }
- for (; !done ; Tcl_DictObjNext(&search, &key, &value, &done)) {
- Compartment_SpecDictPut(p,key,value);
- Tcl_SetObjResult(interp, value);
- }
- Tcl_DictObjDone(&search);
- return TCL_OK;
- }
- static int Compartment_method_spec_replace (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_DictSearch search;
- Tcl_Obj *key, *value, *objPtr;
- int done;
- if( objc!=3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID infoDict");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- objPtr=objv[2];
- if (Tcl_DictObjFirst(interp, objPtr, &search,
- &key, &value, &done) != TCL_OK) {
- return TCL_ERROR;
- }
- for (; !done ; Tcl_DictObjNext(&search, &key, &value, &done)) {
- Compartment_SpecDictPut(p,key,value);
- Tcl_SetObjResult(interp, value);
- }
- Tcl_DictObjDone(&search);
- return TCL_OK;
- }
- static int Compartment_method_step (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_Obj *pResult = Tcl_NewObj();
- Tcl_HashSearch searchPtr;
- Tcl_HashEntry *i;
- for(i=Compartment_First(CurrentSim,&searchPtr); i ; i = Tcl_NextHashEntry(&searchPtr)) {
- Compartment *p = (Compartment*)Tcl_GetHashValue(i);
- double tempC;
- int ki;
- Compartment_ApplySettings(p);
- if(p->public_is_weather) continue;
- //if(!p->public_has_exception) continue;
- /*
- ** The compartment stores temperature in K
- ** convert to C
- */
- tempC=p->public_temperature-273.15;
- if(CurrentSim->public_fire_damage_conduit && p->kidlist) {
- for(ki=1;ki <= p->kidlist[0];ki++) {
- if(SimLink_CalculateThermalEndurance((Roid)p->kidlist[ki],tempC,p->public_fire_size)) {
- Tcl_ListObjAppendList(interp,pResult,Irm_NewStringObj("conduit_rupture"));
- Tcl_ListObjAppendList(interp,pResult,Tcl_NewIntObj((int)p->id));
- Tcl_ListObjAppendList(interp,pResult,Tcl_NewIntObj(p->kidlist[ki]));
- }
- }
- }
- /*
- ** Notify equipment of the cabin temperature
- ** in the surrounding compartment
- */
- SimNode *pNode;
- Roid comptid=p->id;
- for(pNode=SimNode_Index_First(CurrentSim); pNode; pNode=pNode->pNextAll) {
- if( pNode->public_compartment==0 || pNode->public_compartment!=comptid ) {
- continue;
- }
- /*
- ** Kick off the coil calculations
- */
- SimNode_ComputeThermalEndurance(pNode,tempC,p->public_fire_size,p->public_cvis);
- }
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_struct_get (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc!=2 && objc != 3){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?field?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- if(objc==3) {
- Tcl_Obj *result;
- int offset=-1,err,type;
- err=Compartment_StructValueOffset(interp, objv[2], &offset,&type);
- if(err == TCL_OK ) {
- result=Compartment_StructGet(p,offset);
- Tcl_SetObjResult(interp,result);
- return TCL_OK;
- }
- return TCL_ERROR;
- } else {
- Tcl_SetObjResult(interp,Compartment_StructToDict(interp,p,0));
- }
- return TCL_OK;
- }
- static int Compartment_method_struct_put (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Tcl_DictSearch search;
- int done;
- int offset,type,err=TCL_OK;
- if( objc!=3 && objc!=4 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID infoDict");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- if(objc==4) {
- if( Compartment_StructValueOffset(interp, objv[2], &offset, &type) == TCL_OK ) {
- err=Compartment_StructSet(interp,p,offset,objv[3]);
- if(err != TCL_OK) {
- return TCL_ERROR;
- }
- } else {
- return TCL_ERROR;
- }
- } else {
- Tcl_Obj *key, *value;
- Tcl_Obj *objPtr=objv[2];
- if (Tcl_DictObjFirst(interp, objPtr, &search,
- &key, &value, &done) != TCL_OK) {
- return TCL_ERROR;
- }
- for (; !done ; Tcl_DictObjNext(&search, &key, &value, &done)) {
- if( Compartment_StructValueOffset(interp, key, &offset, &type) == TCL_OK ) {
- err=Compartment_StructSet(interp,p,offset,value);
- if(err != TCL_OK) {
- break;
- }
- } else {
- return TCL_ERROR;
- }
- }
- Tcl_DictObjDone(&search);
- }
- if(err==TCL_OK) {
- Compartment_ApplySettings(p);
- }
- return err;
- }
- static int Compartment_method_suppressors (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Roid comptid=0;
- SimNode *pNode;
- Tcl_Obj *pResult=Tcl_NewObj();
- if( objc!=1 && objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "COMPTID");
- return TCL_ERROR;
- }
- if(objc==2) {
- if( Tcl_GetIntFromObj(interp, objv[1], &comptid) ) return TCL_ERROR;
- }
- for(pNode=SimNode_Index_First(CurrentSim); pNode; pNode=pNode->pNextAll) {
- int stype=TypeSpec_GetInt(pNode->pType,SPEC_SUPPRESSOR_STYPE);
- int lastop=0,op=0;
- if (stype==9||stype==8) {
- stype=10;
- }
- if( !pNode->isSuppressor ) continue;
- if(objc==2) {
- if(pNode->public_compartment != comptid ) continue;
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewWideIntObj(pNode->id));
- } else {
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewWideIntObj(pNode->id));
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewWideIntObj(pNode->public_compartment));
- }
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewIntObj(stype));
- if((pNode->delta->public_operational==1) && (pNode->delta->public_onoff == 1)) {
- lastop=1;
- }
- if((pNode->public_operational==1) && (pNode->public_onoff == 1)) {
- op=1;
- }
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewBooleanObj(op==lastop));
- Tcl_ListObjAppendElement(interp, pResult, Tcl_NewBooleanObj(op));
- }
- Tcl_SetObjResult(interp, pResult);
- return TCL_OK;
- }
- static int Compartment_method_type (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Entity *pType;
- if( objc != 2 && objc != 3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "NODEID field");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- pType=Compartment_StructGetType(p);
- if(!pType) {
- if(objc==2) {
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
- }
- return TCL_OK;
- }
- if(objc==2) {
- Tcl_SetObjResult(interp, SimType_Identify(pType));
- }
- if(objc==3) {
- Tcl_Obj *pResult;
- pResult=Entity_ExportField(pType,NULL,Tcl_GetString(objv[2]),IRM_NULL_EMPTY);
- Tcl_SetObjResult(interp,pResult);
- }
- return TCL_OK;
- }
- static int Compartment_method_typeid (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- Entity *pType;
- if( objc!=2 && objc != 3 ){
- Tcl_WrongNumArgs(interp, 1, objv, "ID ?typeid?");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) return TCL_ERROR;
- if(objc==3) {
- if( SimType_FromTclObj(interp, objv[2], &pType) ) {
- /* Translate a ZERO length list to null */
- int len;
- if(Tcl_ListObjLength(NULL,objv[2],&len)) {
- return TCL_ERROR;
- }
- if(len) {
- int intval;
- if(Tcl_GetIntFromObj(NULL,objv[2],&intval)==TCL_ERROR) {
- return TCL_ERROR;
- }
- if(intval>0) {
- return TCL_ERROR;
- }
- }
- Tcl_ResetResult(interp);
- pType=NULL;
- }
- Compartment_StructSetType(p,pType);
- /* Reset the group pointer so it's recalculated */
- Compartment_StructSetGroup(p,-1);
- }
- pType=Compartment_StructGetType(p);
- if(pType) {
- Tcl_SetObjResult(interp, SimType_Identify(pType));
- } else {
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
- }
- return TCL_OK;
- }
- static int Compartment_method_weather (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Compartment *p;
- if( objc!=2 ) {
- Tcl_WrongNumArgs(interp, 1, objv, "ID");
- return TCL_ERROR;
- }
- if( Compartment_FromTclObj(interp, objv[1], &p) ) {
- /* Treat non-existent comptid as weather */
- Tcl_ResetResult(interp);
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1));
- return TCL_OK;
- }
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(p->public_is_weather));
- return TCL_OK;
- }
- static int Compartment_method_witheach (
- ClientData *simulator,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
- ) {
- CurrentSim=(Simulator *)simulator;
- local_interp=interp;
- Tcl_HashSearch *searchPtr;
- Tcl_HashEntry *i;
- int searchresult=TCL_OK;
- Tcl_Obj *body;
- if( objc != 2){
- Tcl_WrongNumArgs(interp, 1, objv, "body");
- return TCL_ERROR;
- }
- body=objv[1];
- searchPtr=(Tcl_HashSearch *)local_Alloc(sizeof(Tcl_HashSearch));
- for(i=Compartment_First(CurrentSim,searchPtr); i ; i = Tcl_NextHashEntry(searchPtr)) {
- Compartment *p = (Compartment *)Tcl_GetHashValue(i);
- searchresult=Compartment_nodeeval(interp,p,body,1);
- if (searchresult !=TCL_OK && searchresult!=TCL_CONTINUE) {
- Tcl_Free((char *)searchPtr);
- return searchresult;
- }
- }
- Tcl_Free((char *)searchPtr);
- return TCL_OK;
- }
- int compartment_Ensemble(Tcl_Interp *interp,Simulator *simPtr,Tcl_Namespace *nsPtr) {
- char zAppend[256];
- char yAppend[256];
- Tcl_Namespace *modPtr;
- /*
- ** Implement compartment
- */
- modPtr=Tcl_FindNamespace(interp,"compartment",nsPtr,TCL_NAMESPACE_ONLY);
- if(!modPtr) {
- strcpy(zAppend,nsPtr->fullName);
- strcat(zAppend,"::compartment");
- modPtr = Tcl_CreateNamespace(interp, zAppend, NULL, NULL);
- Tcl_CreateEnsemble(interp, modPtr->fullName, modPtr, TCL_ENSEMBLE_PREFIX);
- Tcl_Export(interp, modPtr, "[a-z]*", 1);
- } else {
- strcpy(zAppend,modPtr->fullName);
- }
- strcpy(yAppend,zAppend); strcat(yAppend,"::add");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_add,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::create");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_add,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::cid");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_cid,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::condition");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_condition,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::count");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_count,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::exists");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_exists,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::flooding");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_flooding,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::for");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_for,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::foreach");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_foreach,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::groupid");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_groupid,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::group");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_groupid,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::kidlist");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_kidlist,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list_changed");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list_changed,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list_crew");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list_crew,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list_detectors");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list_detectors,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list_eqpt");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list_eqpt,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list_exception");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list_exception,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list_portal");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list_portal,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list_sorted");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list_sorted,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::list_weather");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_list_weather,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::nodedelta");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodedelta,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::delta");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodedelta,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::nodeget");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodeget,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::get");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodeget,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::nodeprior");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodeprior,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::nodeput");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodeput,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::put");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodeput,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::nodewith");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodewith,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::with");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_nodewith,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::passage");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_passage,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::redraw");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_redraw,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::repair");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_repair,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::reset");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_reset,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::setting");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_setting,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::spec_get");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_spec_get,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::spec_put");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_spec_put,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::spec_replace");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_spec_replace,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::step");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_step,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::struct_get");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_struct_get,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::struct_put");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_struct_put,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::suppressors");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_suppressors,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::type");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_type,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::typeid");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_typeid,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::weather");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_weather,(ClientData)simPtr,NULL);
- strcpy(yAppend,zAppend); strcat(yAppend,"::witheach");
- Tcl_CreateObjCommand(interp,yAppend,(Tcl_ObjCmdProc *)Compartment_method_witheach,(ClientData)simPtr,NULL);
- return TCL_OK;
- }