Пример #1
0
void MenuEnemy::render() {
	if (enemy == NULL) return;
	if (enemy->stats.corpse && enemy->stats.corpse_ticks == 0) return;

	Rect src, dest;
	src.w = bar_pos.w;
	src.h = bar_pos.h;

	dest.x = window_area.x+bar_pos.x;
	dest.y = window_area.y+bar_pos.y;
	dest.w = bar_pos.w;
	dest.h = bar_pos.h;

	int hp_bar_length = 0;
	if (enemy->stats.get(STAT_HP_MAX) == 0)
		hp_bar_length = 0;
	else if (bar_hp)
		hp_bar_length = (enemy->stats.hp * bar_hp->getGraphics()->getWidth()) / enemy->stats.get(STAT_HP_MAX);

	// draw hp bar background
	setBackgroundClip(src);
	setBackgroundDest(dest);
	Menu::render();

	// draw hp bar fill
	if (bar_hp) {
		src.w = hp_bar_length;
		src.h = bar_pos.h;
		bar_hp->setClip(src);
		bar_hp->setDest(dest);
		render_device->render(bar_hp);
	}

	std::stringstream ss;
	ss.str("");
	if (enemy->stats.hp > 0)
		ss << enemy->stats.hp << "/" << enemy->stats.get(STAT_HP_MAX);
	else
		ss << msg->get("Dead");

	if (!text_pos.hidden) {

		if (custom_text_pos) {
			label_text.set(window_area.x+text_pos.x, window_area.y+text_pos.y, text_pos.justify, text_pos.valign, msg->get("%s level %d", enemy->stats.level, enemy->stats.name), color_normal, text_pos.font_style);
		}
		else {
			label_text.set(window_area.x+bar_pos.x+bar_pos.w/2, window_area.y+bar_pos.y, JUSTIFY_CENTER, VALIGN_BOTTOM, msg->get("%s level %d", enemy->stats.level, enemy->stats.name), color_normal);
		}
		label_text.render();

		label_stats.set(window_area.x+bar_pos.x+bar_pos.w/2, window_area.y+bar_pos.y+bar_pos.h/2, JUSTIFY_CENTER, VALIGN_CENTER, ss.str(), color_normal);
		label_stats.render();
	}
}
Пример #2
0
void MenuBook::alignElements() {
	closeButton->pos.x += window_area.x;
	closeButton->pos.y += window_area.y;

	Rect clip;
	clip.x = clip.y = 0;
	clip.w = window_area.w;
	clip.h = window_area.h;

	setBackgroundClip(clip);
	setBackgroundDest(window_area);

	for (unsigned i=0; i<text.size(); i++) {
		text[i]->setDestX(size[i].x + window_area.x);
		text[i]->setDestY(size[i].y + window_area.y);
	}
	for (unsigned i=0; i<image.size(); i++) {
		image[i]->setDestX(int(image[i]->getDest().x) + window_area.x);
		image[i]->setDestY(int(image[i]->getDest().y) + window_area.y);
	}
}
Пример #3
0
void MenuTalker::render() {
    if (!visible) return;
    Rect src;
    Rect dest;

    int offset_x = window_area.x;
    int offset_y = window_area.y;

    // dialog box
    src.x = 0;
    src.y = 0;
    dest.x = offset_x + dialog_pos.x;
    dest.y = offset_y + dialog_pos.y;
    src.w = dest.w = dialog_pos.w;
    src.h = dest.h = dialog_pos.h;

    setBackgroundClip(src);
    setBackgroundDest(dest);
    Menu::render();

    if (static_cast<unsigned>(dialog_node) < npc->dialog.size() && event_cursor < npc->dialog[dialog_node].size()) {
        // show active portrait
        EVENT_COMPONENT_TYPE etype = npc->dialog[dialog_node][event_cursor].type;
        if (etype == EC_NPC_DIALOG_THEM) {
            Sprite *r = npc->portrait;
            if (r) {
                src.w = dest.w = portrait_he.w;
                src.h = dest.h = portrait_he.h;
                dest.x = offset_x + portrait_he.x;
                dest.y = offset_y + portrait_he.y;

                r->setClip(src);
                r->setDest(dest);
                render_device->render(r);
            }
        }
        else if (etype == EC_NPC_DIALOG_YOU) {
            if (portrait) {
                src.w = dest.w = portrait_you.w;
                src.h = dest.h = portrait_you.h;
                dest.x = offset_x + portrait_you.x;
                dest.y = offset_y + portrait_you.y;
                portrait->setClip(src);
                portrait->setDest(dest);
                render_device->render(portrait);
            }
        }
    }

    // name & dialog text
    label_name->render();
    textbox->render();

    // show advance button if there are more event components, or close button if not
    if (static_cast<unsigned>(dialog_node) < npc->dialog.size() && !npc->dialog[dialog_node].empty() && event_cursor < npc->dialog[dialog_node].size()-1) {
        if (npc->dialog[dialog_node][event_cursor+1].type != EC_NONE) {
            advanceButton->render();
        }
        else {
            closeButton->render();
        }
    }
    else {
        closeButton->render();
    }
}
Пример #4
0
void MenuPowers::render() {
	if (!visible) return;

	Rect src;
	Rect dest;

	// background
	dest = window_area;
	src.x = 0;
	src.y = 0;
	src.w = window_area.w;
	src.h = window_area.h;

	setBackgroundClip(src);
	setBackgroundDest(dest);
	Menu::render();


	if (tab_control) {
		tab_control->render();
		unsigned active_tab = tab_control->getActiveTab();
		for (unsigned i=0; i<tabs.size(); i++) {
			if (active_tab == i) {
				// power tree
				Sprite *r = tree_surf[i];
				if (r) {
					r->setClip(src);
					r->setDest(dest);
					render_device->render(r);
				}

				// power icons
				renderPowers(active_tab);
			}
		}
	}
	else if (!tree_surf.empty()) {
		Sprite *r = tree_surf[0];
		if (r) {
			r->setClip(src);
			r->setDest(dest);
			render_device->render(r);
		}
		renderPowers(0);
	}
	else {
		renderPowers(0);
	}

	// close button
	closeButton->render();

	// text overlay
	if (!title.hidden) label_powers.render();

	// stats
	if (!unspent_points.hidden) {
		std::stringstream ss;

		ss.str("");
		if (points_left !=0) {
			ss << msg->get("Unspent skill points:") << " " << points_left;
		}
		stat_up.set(ss.str());
		stat_up.render();
	}
}
Пример #5
0
void MenuTalker::render() {
	if (!visible) return;
	Rect src;
	Rect dest;

	int offset_x = window_area.x;
	int offset_y = window_area.y;

	// dialog box
	src.x = 0;
	src.y = 0;
	dest.x = offset_x + dialog_pos.x;
	dest.y = offset_y + dialog_pos.y;
	src.w = dest.w = dialog_pos.w;
	src.h = dest.h = dialog_pos.h;

	setBackgroundClip(src);
	setBackgroundDest(dest);
	Menu::render();

	if (static_cast<unsigned>(dialog_node) < npc->dialog.size() && event_cursor < npc->dialog[dialog_node].size()) {
		// show active portrait
		int etype = npc->dialog[dialog_node][event_cursor].type;
		if (etype == EventComponent::NPC_DIALOG_THEM) {
			if (npc->npc_portrait) {
				src.w = dest.w = portrait_he.w;
				src.h = dest.h = portrait_he.h;
				dest.x = offset_x + portrait_he.x;
				dest.y = offset_y + portrait_he.y;

				npc->npc_portrait->setClipFromRect(src);
				npc->npc_portrait->setDestFromRect(dest);
				render_device->render(npc->npc_portrait);
			}
		}
		else if (etype == EventComponent::NPC_DIALOG_YOU) {
			if (npc->hero_portrait) {
				src.w = dest.w = portrait_you.w;
				src.h = dest.h = portrait_you.h;
				dest.x = offset_x + portrait_you.x;
				dest.y = offset_y + portrait_you.y;
				npc->hero_portrait->setClipFromRect(src);
				npc->hero_portrait->setDestFromRect(dest);
				render_device->render(npc->hero_portrait);
			}
			else if (portrait) {
				src.w = dest.w = portrait_you.w;
				src.h = dest.h = portrait_you.h;
				dest.x = offset_x + portrait_you.x;
				dest.y = offset_y + portrait_you.y;
				portrait->setClipFromRect(src);
				portrait->setDestFromRect(dest);
				render_device->render(portrait);
			}
		}
	}
	else if (dialog_node == -1 && npc->npc_portrait) {
		src.w = dest.w = portrait_he.w;
		src.h = dest.h = portrait_he.h;
		dest.x = offset_x + portrait_he.x;
		dest.y = offset_y + portrait_he.y;

		npc->npc_portrait->setClipFromRect(src);
		npc->npc_portrait->setDestFromRect(dest);
		render_device->render(npc->npc_portrait);
	}

	// name & dialog text
	label_name->render();
	textbox->render();

	// show advance button if there are more event components, or close button if not
	if (advanceButton->enabled)
		advanceButton->render();
	else if (closeButton->enabled)
		closeButton->render();
}
Пример #6
0
void MenuStatBar::render() {

	if (disappear()) return;

	Rect src;
	Rect dest;

	// position elements based on the window position
	Rect bar_dest = bar_pos;
	bar_dest.x = bar_pos.x+window_area.x;
	bar_dest.y = bar_pos.y+window_area.y;

	// draw bar background
	dest.x = bar_dest.x;
	dest.y = bar_dest.y;
	src.x = 0;
	src.y = 0;
	src.w = bar_pos.w;
	src.h = bar_pos.h;
	setBackgroundClip(src);
	setBackgroundDest(dest);
	Menu::render();

	unsigned long stat_cur_clamped = std::min(stat_cur, stat_max);
	unsigned long normalized_cur = stat_cur_clamped - std::min(stat_cur_clamped, stat_min);
	unsigned long normalized_max = stat_max - std::min(stat_max, stat_min);

	// draw bar progress based on orientation
	if (orientation == HORIZONTAL) {
		unsigned long bar_length = (normalized_max == 0) ? 0 : (normalized_cur * static_cast<unsigned long>(bar_pos.w)) / normalized_max;
		src.x = 0;
		src.y = 0;
		src.w = static_cast<int>(bar_length);
		src.h = bar_pos.h;
		dest.x = bar_dest.x;
		dest.y = bar_dest.y;
	}
	else if (orientation == VERTICAL) {
		unsigned long bar_length = (normalized_max == 0) ? 0 : (normalized_cur * static_cast<unsigned long>(bar_pos.h)) / normalized_max;
		src.x = 0;
		src.y = bar_pos.h-static_cast<int>(bar_length);
		src.w = bar_pos.w;
		src.h = static_cast<int>(bar_length);
		dest.x = bar_dest.x;
		dest.y = bar_dest.y+src.y;
	}

	if (bar) {
		bar->setClipFromRect(src);
		bar->setDestFromRect(dest);
		render_device->render(bar);
	}

	// if mouseover, draw text
	if (!text_pos.hidden) {

		if (settings->statbar_labels || (inpt->usingMouse() && Utils::isWithinRect(bar_dest, inpt->mouse) && !menu->exit->visible)) {
			std::stringstream ss;
			if (!custom_string.empty())
				ss << custom_string;
			else
				ss << stat_cur << "/" << stat_max;

			label->setText(ss.str());
			label->setColor(font->getColor(FontEngine::COLOR_MENU_NORMAL));

			if (custom_text_pos) {
				label->setPos(bar_dest.x + text_pos.x, bar_dest.y + text_pos.y);
				label->setJustify(text_pos.justify);
				label->setVAlign(text_pos.valign);
				label->setFont(text_pos.font_style);
			}
			else {
				label->setPos(bar_dest.x + bar_pos.w/2, bar_dest.y + bar_pos.h/2);
				label->setJustify(FontEngine::JUSTIFY_CENTER);
				label->setVAlign(LabelInfo::VALIGN_CENTER);
			}
			label->render();
		}
	}
}