void parseEffects() { Parser parser(false, true); parser.readStream(filesystem::FilePackageManager::getInstance().getFile(fileName)); ParserGroup &global = parser.getGlobals(); int groupAmount = global.getSubGroupAmount(); for(int i = 0; i < groupAmount; ++i) { const std::string &name = global.getSubGroupName(i); const ParserGroup &group = global.getSubGroup(i); const ParserGroup &textures = group.getSubGroup("textures"); if(name.empty()) continue; effects.push_back(parseEffectProperties(name, group)); Effect &effect = effects[effects.size() - 1]; int lineCount = textures.getLineCount(); for(int j = 0; j < lineCount; ++j) { const string &texture = textures.getLine(j); addSpawner(effect, manager, texture, storm); } if(lineCount == 0) { Logger::getInstance()->warning("Decal effect with no textures defined"); Logger::getInstance()->warning(name.c_str()); } } }
Entity *addEntityFromResource(char *type, char *name, int startX, int startY) { Entity *e = NULL; if (strcmpignorecase(type, "ITEM") == 0 || strcmpignorecase(type, "SHIELD") == 0 || strcmpignorecase(type, "WEAPON") == 0) { e = addPermanentItem(name, startX, startY); } else if (strcmpignorecase(type, "TEMP_ITEM") == 0 || strcmpignorecase(type, "HEALTH") == 0) { e = addTemporaryItem(name, startX, startY, LEFT, 0, 0); } else if (strcmpignorecase(type, "PLAYER") == 0) { e = loadPlayer(startX, startY, NULL); } else if (strcmpignorecase(type, "PLAYER_WEAPON") == 0) { setPlayerWeaponName(name); } else if (strcmpignorecase(type, "PLAYER_SHIELD") == 0) { setPlayerShieldName(name); } else if (strcmpignorecase(type, "KEY_ITEM") == 0) { e = addKeyItem(name, startX, startY); } else if (strcmpignorecase(type, "ENEMY") == 0) { e = addEnemy(name, startX, startY); } else if (strcmpignorecase(type, "NPC") == 0) { e = addNPC(name, startX, startY); } else if (strcmpignorecase(type, "AUTO_LIFT") == 0 || strcmpignorecase(type, "MANUAL_LIFT") == 0) { e = addLift(name, startX, startY, getEntityTypeByName(type)); } else if (strcmpignorecase(type, "SPAWNER") == 0) { e = addSpawner(startX, startY, name); } else if (strcmpignorecase(type, "TARGET") == 0) { addTarget(startX, startY, name); } else if (strcmpignorecase(type, "PRESSURE_PLATE") == 0) { e = addPressurePlate(name, startX, startY); } else if (strcmpignorecase(type, "TELEPORTER") == 0) { e = addTeleporter(name, startX, startY); } else if (strcmpignorecase(type, "AUTO_DOOR") == 0 || strcmpignorecase(type, "MANUAL_DOOR") == 0) { e = addDoor(name, startX, startY, getEntityTypeByName(type)); } else if (strcmpignorecase(type, "WEAK_WALL") == 0) { e = addWeakWall(name, startX, startY); } else if (strcmpignorecase(type, "TRAP_DOOR") == 0) { e = addTrapDoor(name, startX, startY); } else if (strcmpignorecase(type, "CONVEYOR_BELT") == 0) { e = addConveyorBelt(name, startX, startY); } else if (strcmpignorecase(type, "SWITCH") == 0) { e = addSwitch(name, startX, startY); } else if (strcmpignorecase(type, "SCRIPT_LINE_DEF") == 0 || strcmpignorecase(type, "LINE_DEF") == 0) { e = addLineDef(type, name, startX, startY); } else if (strcmpignorecase(type, "LEVEL_EXIT") == 0) { e = addLevelExit(name, startX, startY); } else if (strcmpignorecase(type, "SAVE_POINT") == 0) { /* Save points don't spawn for replays */ if (game.gameType == NORMAL) { e = addSavePoint(startX, startY); } } else if (strcmpignorecase(type, "TRIGGER") == 0) { addTriggerFromResource(key, value); } else if (strcmpignorecase(type, "GLOBAL_TRIGGER") == 0) { addGlobalTriggerFromResource(key, value); } else if (strcmpignorecase(type, "MAP_TRIGGER") == 0) { addMapTriggerFromResource(key, value); } else if (strcmpignorecase(type, "OBJECTIVE") == 0) { addObjectiveFromResource(key, value); } else if (strcmpignorecase(type, "ACTION_POINT") == 0) { e = addActionPoint(name, startX, startY); } else if (strcmpignorecase(type, "FALLING_PLATFORM") == 0) { e = addFallingPlatform(startX, startY, name); } else if (strcmpignorecase(type, "VANISHING_PLATFORM") == 0) { e = addVanishingPlatform(startX, startY, name); } else if (strcmpignorecase(type, "ANTI_GRAVITY") == 0) { e = addAntiGravityField(startX, startY, name); } else { showErrorAndExit("Unknown Entity type %s", type); } return e; }
MyLevel::MyLevel(Game* j,std::string lvlFileName,Metadata* metadata,int id) :world(b2Vec2(0,-10)), running(false), game(j), factory(&world,this), metadata(metadata), id(id), bossEncounter(false){ LevelObject::resetIds(); boundaries=nullptr; world.SetContinuousPhysics(true); world.SetContactListener(&contactListener); windowPos.x=0; windowPos.y=0; /*abro configuraciones*/ Json::Value config_json; fileToJson(COFIG_FILE,config_json); Item::initializeDropTable(config_json); /*cargo nivel*/ Json::Value level_json; fileToJson(lvlFileName,level_json); /*seteo variables mundo*/ this->worldHeight=level_json["width"].asInt(); this->worldWidth=level_json["length"].asInt(); Json::Value world_json=config_json["world"]; this->stepsPerSecond=world_json["steps/second"].asFloat(); world.SetGravity(b2Vec2(0,world_json["gravity"].asFloat())); this->windowHeight=world_json["windowHeight"].asFloat(); this->windowWidth=world_json["windowWidth"].asFloat(); //window borders createBoundaries(); //load all objects of the level Json::Value objetosNivel=level_json["foreground"]; Json::ValueIterator it=objetosNivel.begin(); for(; it!=objetosNivel.end(); it++){ int id=(*it)["id"].asInt(); b2Vec2 pos=jsonPosToWorldPos((*it)["x"].asInt(), (*it)["y"].asInt()); ObjectInfo info(id,pos); int objectType=id/1000; if( objectType==1){ addSpawner(id,pos); }else{ createObject(&info); } } //load all objects of the level Json::Value objetosBossChamber=level_json["chamber"]; Json::ValueIterator chamberIt=objetosBossChamber.begin(); for(; chamberIt!=objetosBossChamber.end(); chamberIt++){ int id=(*chamberIt)["id"].asInt(); b2Vec2 pos=jsonPosToWorldPos( (*chamberIt)["x"].asInt()+worldWidth+BOSS_CHAMBER_OFFSET, (*chamberIt)["y"].asInt()); ObjectInfo info(id,pos); int objectType=id/1000; if( objectType==1){ addSpawner(id,pos); }else{ createObject(&info); } } spawn(); }