void drawPlayerInfo(PlayerController* player, GameWorld* world, GameRenderer* render) { float infoTextX = render->getRenderer()->getViewport().x - (ui_outerMargin + ui_weaponSize + ui_infoMargin); float infoTextY = 0.f + ui_outerMargin; float iconX = render->getRenderer()->getViewport().x - (ui_outerMargin + ui_weaponSize); float iconY = ui_outerMargin; float wantedX = render->getRenderer()->getViewport().x - (ui_outerMargin); float wantedY = ui_outerMargin + ui_weaponSize + 3.f; TextRenderer::TextInfo ti; ti.font = 1; ti.size = ui_textSize; ti.align = TextRenderer::TextInfo::Right; { std::stringstream ss; ss << std::setw(2) << std::setfill('0') << world->getHour() << std::setw(0) << ":" << std::setw(2) << world->getMinute(); ti.text = ss.str(); } ti.baseColour = ui_shadowColour; ti.screenPosition = glm::vec2(infoTextX + 1.f, infoTextY+1.f); render->text.renderText(ti); ti.baseColour = ui_timeColour; ti.screenPosition = glm::vec2(infoTextX, infoTextY); render->text.renderText(ti); infoTextY += ui_textHeight; ti.text = "$" + std::to_string(world->state->playerInfo.money); ti.baseColour = ui_shadowColour; ti.screenPosition = glm::vec2(infoTextX + 1.f, infoTextY+1.f); render->text.renderText(ti); ti.baseColour = ui_moneyColour; ti.screenPosition = glm::vec2(infoTextX, infoTextY); render->text.renderText(ti); infoTextY += ui_textHeight; { std::stringstream ss; ss << "@" << std::setw(3) << std::setfill('0') << (int)player->getCharacter()->getCurrentState().health; ti.text = ss.str(); } ti.baseColour = ui_shadowColour; ti.screenPosition = glm::vec2(infoTextX + 1.f, infoTextY+1.f); render->text.renderText(ti); ti.baseColour = ui_healthColour; ti.screenPosition = glm::vec2(infoTextX, infoTextY); render->text.renderText(ti); if (player->getCharacter()->getCurrentState().armour > 0) { std::stringstream ss; ss << "[" << std::setw(3) << std::setfill('0') << (int)player->getCharacter()->getCurrentState().armour; ti.text = ss.str(); ti.baseColour = ui_shadowColour; ti.screenPosition = glm::vec2(infoTextX + 1.f - ui_armourOffset, infoTextY+1.f); render->text.renderText(ti); ti.baseColour = ui_armourColour; ti.screenPosition = glm::vec2(infoTextX - ui_armourOffset, infoTextY); render->text.renderText(ti); } std::string s; for (int i = 0; i < ui_maxWantedLevel; ++i) { s += "]"; } ti.text = s; ti.baseColour = ui_shadowColour; ti.screenPosition = glm::vec2(wantedX + 1.f, wantedY + 1.f); render->text.renderText(ti); #if 0 // Useful for debugging ti.text = "ABCDEFGHIJKLMANOQRTSWXYZ\nM0123456789"; ti.size = 30; ti.align = TextRenderer::TextInfo::Left; ti.baseColour = glm::vec3(0.f, 0.f, 0.f); ti.screenPosition = glm::vec2(101.f, 202.f); render->text.renderText(ti); ti.baseColour = glm::vec3(1.f, 1.f, 1.f); ti.screenPosition = glm::vec2(100.f, 200.f); render->text.renderText(ti); #endif InventoryItem *current = player->getCharacter()->getActiveItem(); std::string itemTextureName = "fist"; if (current) { uint16_t model = current->getModelID(); if (model > 0) { ObjectDataPtr weaponData = world ->data ->findObjectType<ObjectData>(model); if (weaponData != nullptr) { itemTextureName = weaponData->modelName; } } } // Urgh if (itemTextureName == "colt45") { itemTextureName = "pistol"; } TextureData::Handle itemTexture = render->getData()->findTexture(itemTextureName); RW_CHECK(itemTexture != nullptr, "Item has 0 texture"); if (itemTexture != nullptr) { RW_CHECK(itemTexture->getName() != 0, "Item has 0 texture"); render->drawTexture(itemTexture.get(), glm::vec4(iconX, iconY, ui_weaponSize, ui_weaponSize)); } if (current) { WeaponItem* wep = static_cast<WeaponItem*>(current); if (wep->getWeaponData()->fireType != WeaponData::MELEE) { const CharacterState& cs = player->getCharacter()->getCurrentState(); const CharacterWeaponSlot& slotInfo = cs.weapons[cs.currentWeapon]; ti.text = std::to_string(slotInfo.bulletsClip) + "-" + std::to_string(slotInfo.bulletsTotal); ti.baseColour = ui_shadowColour; ti.font = 2; ti.size = ui_ammoSize; ti.align = TextRenderer::TextInfo::Center; ti.screenPosition = glm::vec2(iconX + ui_weaponSize / 2.f, iconY + ui_weaponSize - ui_ammoHeight); render->text.renderText(ti); } } }
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; } }