From: Laszlo T. <ave...@us...> - 2004-03-17 21:00:36
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6777 Modified Files: GameScript.cpp GameScript.h Map.cpp Log Message: Completed object compiler (action/trigger now work with object parameters) Index: GameScript.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameScript.cpp,v retrieving revision 1.99 retrieving revision 1.100 diff -C2 -d -r1.99 -r1.100 *** GameScript.cpp 17 Mar 2004 01:07:25 -0000 1.99 --- GameScript.cpp 17 Mar 2004 20:51:05 -0000 1.100 *************** *** 827,831 **** *tmp = 0; src++; - return; } --- 827,830 ---- *************** *** 837,841 **** } for (int i = 0; i < MaxObjectNesting; i++) { ! oB->objectIdentifiers[i] = ParseInt( line ); } if (HasAdditionalRect) { --- 836,840 ---- } for (int i = 0; i < MaxObjectNesting; i++) { ! oB->objectFilters[i] = ParseInt( line ); } if (HasAdditionalRect) { *************** *** 1116,1120 **** } for (int i = 0; i < MaxObjectNesting; i++) { ! int filterid = oC->objectIdentifiers[i]; if(!filterid) { break; --- 1115,1119 ---- } for (int i = 0; i < MaxObjectNesting; i++) { ! int filterid = oC->objectFilters[i]; if(!filterid) { break; *************** *** 1203,1206 **** --- 1202,1281 ---- } + static int GetIdsValue(const char *symbol, const char *idsname) + { + int idsfile=core->LoadSymbol(idsname); + SymbolMgr *valHook = core->GetSymbol(idsfile); + if(!valHook) { + //FIXME:missing ids file!!! + return -1; + } + return valHook->GetValue(symbol); + } + + static void ParseIdsTarget(char *&src, Object *&object) + { + for(int i=0;i<ObjectFieldsCount;i++) { + int x; + + if(isdigit(*src) || *src=='-') { + object->objectFields[i]=strtol(src,&src,0); + } + else { + object->objectFields[i]=GetIdsValue(src, ObjectIDSTableNames[i]); + } + if(*src!='.') { + break; + } + } + src++; //skipping ] + } + + static void ParseObject(char *&str, char *&src, Object *&object) + { + while (( *str != ',' ) && ( *str != ')' )) { + str++; + } + object = new Object(); + switch (*src) { + case '"': + //Object Name + src++; + int i; + for(i=0;i<sizeof(object->objectName)-1 && *src!='"';i++) + { + object->objectName[i] = *src; + src++; + } + object->objectName[i] = 0; + src++; + break; + case '[': + src++; //skipping [ + ParseIdsTarget(src, object); + break; + default: //nested object filters + int Nesting=0; + + while(Nesting++<MaxObjectNesting) { + char filtername[64]; + int x; + for(x=0;isalnum(*src) && x<sizeof(filtername)-1;x++) { + filtername[x]=*src; + src++; + } + filtername[x]=0; + memmove(object->objectFilters+1, object->objectFilters, sizeof(int) *(MaxObjectNesting-1) ); + object->objectFilters[0]=GetIdsValue(filtername,"object"); + if(*src!='(') { + break; + } + } + if(*src=='[') { + ParseIdsTarget(src, object); + } + src+=Nesting; //skipping ) + } + } + Action* GameScript::GenerateAction(char* String) { *************** *** 1338,1365 **** case 'o': ! //Object ! { ! while (( *str != ',' ) && ( *str != ')' )) ! str++; ! if (*src == '"') { ! //Object Name ! src++; ! newAction->objects[objectCount] = new Object(); ! char* dst = newAction->objects[objectCount]->objectName; ! while (*src != '"') { ! *dst = *src; ! dst++; ! src++; ! } ! *dst = 0; ! src++; ! } else { ! ! textcolor( LIGHT_RED ); ! printf( "[GenerateAction]: OBJECT TYPE NOT SUPPORTED\n" ); ! textcolor( WHITE ); ! } ! objectCount++; ! } break; --- 1413,1417 ---- case 'o': ! ParseObject(str, src, newAction->objects[objectCount++]); break; *************** *** 1521,1546 **** case 'o': ! //Object ! { ! while (( *str != ',' ) && ( *str != ')' )) ! str++; ! if (*src == '"') { ! //Object Name ! src++; ! newTrigger->objectParameter = new Object(); ! char* dst = newTrigger->objectParameter->objectName; ! while (*src != '"') { ! *dst = *src; ! dst++; ! src++; ! } ! *dst = 0; ! src++; ! } else { ! textcolor( LIGHT_RED ); ! printf( "[GenerateTrigger]: OBJECT TYPE NOT SUPPORTED\n" ); ! textcolor( WHITE ); ! } ! } break; --- 1573,1577 ---- case 'o': ! ParseObject(str, src, newTrigger->objectParameter); break; Index: GameScript.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameScript.h,v retrieving revision 1.70 retrieving revision 1.71 diff -C2 -d -r1.70 -r1.71 *** GameScript.h 15 Mar 2004 15:25:13 -0000 1.70 --- GameScript.h 17 Mar 2004 20:51:06 -0000 1.71 *************** *** 117,121 **** memset( objectFields, 0, MAX_OBJECT_FIELDS * sizeof( int ) ); ! memset( objectIdentifiers, 0, MAX_NESTING * sizeof( int ) ); memset( objectRect, 0, 4 * sizeof( int ) ); --- 117,121 ---- memset( objectFields, 0, MAX_OBJECT_FIELDS * sizeof( int ) ); ! memset( objectFilters, 0, MAX_NESTING * sizeof( int ) ); memset( objectRect, 0, 4 * sizeof( int ) ); *************** *** 127,131 **** public: int objectFields[MAX_OBJECT_FIELDS]; ! int objectIdentifiers[MAX_NESTING]; int objectRect[4]; char objectName[65]; --- 127,131 ---- public: int objectFields[MAX_OBJECT_FIELDS]; ! int objectFilters[MAX_NESTING]; int objectRect[4]; char objectName[65]; Index: Map.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Map.cpp,v retrieving revision 1.77 retrieving revision 1.78 diff -C2 -d -r1.77 -r1.78 *** Map.cpp 13 Mar 2004 15:18:50 -0000 1.77 --- Map.cpp 17 Mar 2004 20:51:06 -0000 1.78 *************** *** 860,863 **** --- 860,864 ---- py = ny; } + return Return; } |