Beispiel #1
0
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);
		}
	}
}
Beispiel #2
0
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;
	}
	
}