bool game_character_in_area_on_foot(const ScriptArguments& args) { RW_UNIMPLEMENTED("game_character_in_area_on_foot"); RW_UNUSED(args); /// @todo return false; }
void game_create_character_as_passenger(const ScriptArguments& args) { auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(0)); auto type = args[1].integerValue(); RW_UNUSED(type); RW_UNIMPLEMENTED("game_create_character_as_passenger(): character type"); auto id = args[2].integerValue(); auto seat = args[3].integerValue(); auto character = args.getWorld()->createPedestrian(id, vehicle->getPosition() + spawnMagic); new DefaultAIController(character); if (seat <= -1) { for (seat = 0; seat < static_cast<int>(vehicle->info->seats.size()); seat++) { if (vehicle->getOccupant(seat) == nullptr && !vehicle->isOccupantDriver(seat)) { break; } } } else { /// @todo 0 - passenger seat (or back seat of bike); 1 - left rear seat; 2 - right rear seat seat++; } RW_CHECK(seat < static_cast<int>(vehicle->info->seats.size()), "Seat index too high"); RW_CHECK(vehicle->getOccupant(seat) == nullptr, "Seat is not free"); RW_CHECK(vehicle->isOccupantDriver(seat) == false, "Seat is not a passenger seat"); character->setCurrentVehicle(vehicle, seat); vehicle->setOccupant(seat, character); *args[4].globalInteger = character->getGameObjectID(); }
bool game_is_vehicle_in_water(const ScriptArguments& args) { RW_UNIMPLEMENTED("game_is_vehicle_in_water"); RW_UNUSED(args); /// @todo return false; }
PickupObject* GameWorld::createPickup(const glm::vec3& pos, int id, int type) { auto modelInfo = data->findObjectType<ObjectData>(id); data->loadDFF(modelInfo->modelName + ".dff"); data->loadTXD(modelInfo->textureName + ".txd"); PickupObject* pickup = nullptr; auto pickuptype = (PickupObject::PickupType)type; // Attempt to find an InventoryItem associated with this model auto it = std::find_if( inventoryItems.begin(), inventoryItems.end(), [=](InventoryItem* itm) { return itm->getModelID() == id; }); // If nothing, create a generic pickup instead of an item pickup if (it != inventoryItems.end()) { pickup = new ItemPickup(this, pos, pickuptype, *it); } else { RW_UNIMPLEMENTED("Non-weapon pickups"); pickup = new PickupObject(this, pos, id, pickuptype); } pickupPool.insert(pickup); allObjects.push_back(pickup); return pickup; }
bool game_vehicle_in_air(const ScriptArguments& args) { /// @todo IS vehicle in air. auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(0)); RW_UNUSED(vehicle); RW_UNIMPLEMENTED("game_vehicle_in_air()"); return false; }
void game_get_vehicle_health(const ScriptArguments& args) { RW_UNIMPLEMENTED("game_get_vehicle_health"); auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(0)); if (vehicle) { /// @todo *args[1].globalReal = 1000.f; } }
bool game_is_boat(const ScriptArguments& args) { RW_UNUSED(args); RW_UNIMPLEMENTED("game_is_boat()"); /*auto vehicle = (VehicleObject*)(*args[0].handle); * if( vehicle ) * { * return vehicle->vehicle->type == VehicleData::BOAT; }*/ return false; }
void game_create_weapon_pickup(const ScriptArguments& args) { glm::vec3 pos (args[3].real, args[4].real, args[5].real); int id = args.getModel(0); int type = args[1].integer; int ammo = args[2].integer; RW_UNUSED(ammo); RW_UNIMPLEMENTED("game_create_weapon_pickup(): ammo count"); PickupObject* pickup = args.getWorld()->createPickup(pos, id, type); *args[6].globalInteger = pickup->getGameObjectID(); }
void game_create_character_in_vehicle(const ScriptArguments& args) { auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(0)); auto type = args[1].integer; RW_UNUSED(type); RW_UNIMPLEMENTED("game_create_character_in_vehicle(): character type"); auto id = args[2].integer; auto character = args.getWorld()->createPedestrian(id, vehicle->getPosition() + spawnMagic); new DefaultAIController(character); character->setCurrentVehicle(vehicle, 0); vehicle->setOccupant(0, character); *args[3].globalInteger = character->getGameObjectID(); }
void game_create_player(const ScriptArguments& args) { auto id = args[0].integer; if (id != 0) { RW_UNIMPLEMENTED("Multiple player characters not supported"); } glm::vec3 position(args[1].real, args[2].real, args[3].real); if( position.z < -99.f ) { position = args.getWorld()->getGroundAtPosition(position); } auto pc = args.getWorld()->createPlayer(position + spawnMagic); args.getState()->playerObject = pc->getGameObjectID(); *args[4].globalInteger = args.getWorld()->players.size()-1; }
bool game_character_in_area_or_cylinder(const ScriptArguments& args) { auto character = args.getPlayerCharacter(0); glm::vec2 min(args[1].real, args[2].real); glm::vec2 max(args[3].real, args[4].real); bool isCylinder = !!args[5].integerValue(); RW_UNIMPLEMENTED("game_character_in_area_or_cylinder: should use cylinder if requested?"); RW_UNUSED(isCylinder); /// @todo auto player = character->getPosition(); if( player.x > min.x && player.y > min.y && player.x < max.x && player.y < max.y ) { return true; } return false; }
void MenuState::enterMainMenu() { auto& t = game->getGameData().texts; Menu menu{ {{t.text(MenuDefaults::kStartGameId), [=] { game->getStateManager().enter<IngameState>(game); }}, {t.text(MenuDefaults::kLoadGameId), [=] { enterLoadMenu(); }}, {t.text(MenuDefaults::kDebugId), [=] { game->getStateManager().enter<IngameState>(game, true, "test"); }}, {t.text(MenuDefaults::kOptionsId), [] { RW_UNIMPLEMENTED("Options Menu"); }}, {t.text(MenuDefaults::kQuitGameId), [=] { game->getStateManager().clear(); }}}, glm::vec2(200.f, 200.f)}; setNextMenu(std::move(menu)); }
bool game_character_near_car_2d(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getObject<CharacterObject>(0)); auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(1)); glm::vec2 radius(args[2].real, args[3].real); bool drawMarker = !!args[4].integer; RW_UNUSED(drawMarker); RW_UNIMPLEMENTED("Draw marker in game_character_near_car_2D"); auto charVehicle = character->getCurrentVehicle(); if( charVehicle ) { auto dist = charVehicle->getPosition() - vehicle->getPosition(); if( dist.x <= radius.x && dist.y <= radius.y ) { return true; } } return false; }
bool CharacterObject::isStopped() const { RW_UNIMPLEMENTED("Checking if character is stopped"); return true; }
void game_create_pickup(const ScriptArguments& args) { glm::vec3 pos (args[2].real, args[3].real, args[4].real); int id; int type = args[1].integer; switch(args[0].type) { case TInt8: id = (std::int8_t)args[0].integer; break; case TInt16: id = (std::int16_t)args[0].integer; break; default: RW_ERROR("Unhandled integer type"); *args[5].globalInteger = 0; return; } if ( id < 0 ) { id = -id; auto model = args.getVM()->getFile()->getModels()[id]; std::transform(model.begin(), model.end(), model.begin(), ::tolower); id = args.getWorld()->data->findModelObject(model); args.getWorld()->data->loadDFF(model+".dff"); args.getWorld()->data->loadTXD("icons.txd"); } else { auto data = args.getWorld()->data->findObjectType<ObjectData>(id); if ( ! ( id >= 170 && id <= 184 ) ) { args.getWorld()->data->loadDFF(data->modelName+".dff"); } args.getWorld()->data->loadTXD(data->textureName+".txd"); } PickupObject* pickup = nullptr; if ( id >= 170 && id <= 184 ) { // Find the item for this model ID auto world = args.getWorld(); InventoryItem *item = nullptr; for (auto i = 0; i < maxInventorySlots; ++i) { item = world->getInventoryItem(i); if (item->getModelID() == id) { auto pickuptype = (PickupObject::PickupType)type; pickup = new ItemPickup(args.getWorld(), pos, pickuptype, item); world->pickupPool.insert( pickup ); world->allObjects.push_back(pickup); *args[5].globalInteger = pickup->getGameObjectID(); } } } else { RW_UNIMPLEMENTED("non-item pickups"); *args[5].globalInteger = 0; } }
bool game_character_in_range(const ScriptArguments& args) { RW_UNUSED(args); RW_UNIMPLEMENTED("game_character_in_range()"); return true; }
bool game_character_in_area_9(const ScriptArguments& args) { RW_UNUSED(args); RW_UNIMPLEMENTED("game_character_in_area_9"); return false; }