Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/hud.cc80
-rw-r--r--src/client/hudtargetstatus.cc25
-rw-r--r--src/client/targets.cc37
-rw-r--r--src/core/range.h29
-rw-r--r--src/game/base/game.cc6
-rw-r--r--src/game/base/npc.cc2
6 files changed, 111 insertions, 68 deletions
diff --git a/src/client/hud.cc b/src/client/hud.cc
index 1b2ddd8..1fabe10 100644
--- a/src/client/hud.cc
+++ b/src/client/hud.cc
@@ -6,6 +6,7 @@
#include "core/core.h"
+#include "core/range.h"
#include "client/client.h"
#include "client/hud.h"
#include "client/hudenginestatus.h"
@@ -144,9 +145,9 @@ void HUD::draw_offscreen_target(core::Entity *entity, bool is_active_target)
}
// reputation color
- if (reputation > 50.0f) {
+ if (reputation >= core::range::reputation_friendly) {
bitmap_color.assign(0.0f, 1.0f, 0.0f); // green
- } else if (reputation < -50.0f) {
+ } else if (reputation <= core::range::reputation_hostile) {
bitmap_color.assign(1.0f, 0.0f, 0.0f); // red
} else {
bitmap_color.assign(1.0f, 1.0f, 1.0f); // white
@@ -156,9 +157,9 @@ void HUD::draw_offscreen_target(core::Entity *entity, bool is_active_target)
bitmap_material.assign("bitmaps/hud/offscreen_dockable");
// reputation color
- if (reputation > 50.0f) {
+ if (reputation >= core::range::reputation_friendly) {
bitmap_color.assign(0.0f, 1.0f, 0.0f); // green
- } else if (reputation < -50.0f) {
+ } else if (reputation <= core::range::reputation_hostile) {
bitmap_color.assign(1.0f, 0.0f, 0.0f); // red
} else {
bitmap_color.assign(1.0f, 1.0f, 1.0f); // white
@@ -257,31 +258,24 @@ void HUD::draw_target(core::Entity *entity, bool is_active_target)
} else {
bitmap_material.assign("bitmaps/hud/target_default");
}
-
- // reputation color
- if (reputation > 50.0f) {
- bitmap_color.assign(0.0f, 1.0f, 0.0f); // green
- } else if (reputation < -50.0f) {
- bitmap_color.assign(1.0f, 0.0f, 0.0f); // red
- } else {
- bitmap_color.assign(1.0f, 1.0f, 1.0f); // white
- }
+ bitmap_color.assign(1.0f, 1.0f, 1.0f); // white
} else if (entity->has_flag(core::Entity::Dockable)) {
bitmap_material.assign("bitmaps/hud/target_dockable");
- // reputation color
- if (reputation > 50.0f) {
- bitmap_color.assign(0.0f, 1.0f, 0.0f); // green
- } else if (reputation < -50.0f) {
- bitmap_color.assign(1.0f, 0.0f, 0.0f); // red
- } else {
- bitmap_color.assign(1.0f, 1.0f, 1.0f); // white
- }
-
+ bitmap_color.assign(1.0f, 1.0f, 1.0f); // white
} else {
bitmap_material.assign("bitmaps/hud/target_default");
- bitmap_color.assign(palette()->text());
+ bitmap_color.assign(palette()->text()); // default text color
+ }
+
+ // reputation color
+ if (reputation >= core::range::reputation_friendly) {
+ // friendly
+ bitmap_color.assign(0.0f, 1.0f, 0.0f); // green
+ } else if (reputation <= core::range::reputation_hostile) {
+ // hostile
+ bitmap_color.assign(1.0f, 0.0f, 0.0f); // red
}
if (entity == core::localplayer()->mission_target()) {
@@ -309,24 +303,23 @@ void HUD::draw_target(core::Entity *entity, bool is_active_target)
if (do_draw_label) {
// draw name label
+ std::string label_color;
std::string label_text;
- if (controlable) {
- if (controlable->owner()) {
- label_text.append("^B");
- label_text.append(controlable->owner()->name());
- } else {
- label_text.append("^N");
- label_text.append(entity->name());
- }
+
+ if (controlable && controlable->owner()) {
+ label_color.assign("^B");
+ } else if (entity->has_flag(core::Entity::Dockable)) {
+ label_color.assign("^B");
} else {
- if (entity->has_flag(core::Entity::Dockable)) {
- label_text.append("^B");
- label_text.append(entity->name());
-
- } else {
- label_text.append("^N");
- label_text.append(entity->name());
- }
+ label_color.assign("^N");
+ }
+
+ label_text.assign(label_color);
+
+ if (controlable && controlable->owner()) {
+ label_text.append(controlable->owner()->name());
+ } else {
+ label_text.append(entity->name());
}
const ui::Font *label_font;
@@ -343,14 +336,7 @@ void HUD::draw_target(core::Entity *entity, bool is_active_target)
// draw distance label
if (is_active_target) {
std::ostringstream strdistance;
-
- if (controlable && controlable->owner()) {
- strdistance << "^B";
- } else if (entity->has_flag(core::Entity::Dockable)) {
- strdistance << "^B";
- } else {
- strdistance << "^N";
- }
+ strdistance << label_color;
float d = math::distance(core::localcontrol()->location(), entity->location()) - entity->radius() - core::localcontrol()->radius();
if (d > 0) {
diff --git a/src/client/hudtargetstatus.cc b/src/client/hudtargetstatus.cc
index 893d816..77fb60d 100644
--- a/src/client/hudtargetstatus.cc
+++ b/src/client/hudtargetstatus.cc
@@ -38,26 +38,39 @@ void HUDTargetStatus::draw()
pos[1] += padding;
math::Vector2f s(width() - 2.0f * padding, height() - 2.0f * padding);
-
+
+ // reputation color
+ std::string label_color;
+ const float reputation = core::localplayer()->reputation(target->faction());
+
+ if (reputation >= core::range::reputation_friendly) {
+ // friendly
+ label_color.assign("^2");
+ } else if (reputation <= core::range::reputation_hostile) {
+ // hostile
+ label_color.assign("^1");
+ } else {
+ label_color.assign("^B");
+ }
std::ostringstream targetinfostr;
if (target->type() == core::Entity::Controlable) {
const core::EntityControlable *target_controlable = static_cast<const core::EntityControlable *>(target);
if (target_controlable->owner()) {
- targetinfostr << "^B" << target_controlable->owner()->name() << "\n";
+ targetinfostr << label_color << target_controlable->owner()->name() << "\n";
} else {
- targetinfostr << "^B" << target->name() << "\n";
+ targetinfostr << label_color << target->name() << "\n";
}
if (target->info()) {
- targetinfostr << "^B" << target->info()->name() << "\n";
+ targetinfostr << "^N" << target->info()->name() << "\n";
} else {
targetinfostr << "\n";
}
} else {
- targetinfostr << "^B" << target->name() << "\n";
+ targetinfostr << label_color << target->name() << "\n";
if (target->info()) {
core::game()->request_info(target->info()->id());
- targetinfostr << "^B" << target->info()->name() << "\n";
+ targetinfostr << "^N" << target->info()->name() << "\n";
} else {
targetinfostr << "\n";
}
diff --git a/src/client/targets.cc b/src/client/targets.cc
index 3c3b2b8..088d334 100644
--- a/src/client/targets.cc
+++ b/src/client/targets.cc
@@ -243,7 +243,13 @@ void func_target_controlable_next(std::string const &args)
if (!current_target_id) {
// first entity
it = zone->content().begin();
- while ((it != zone->content().end()) && (((*it)->type() != core::Entity::Controlable) || !is_valid_hud_target((*it)))) {
+ while (
+ (it != zone->content().end()) && (
+ ((*it)->type() != core::Entity::Controlable) ||
+ (math::distancesquared(core::localcontrol()->location(), (*it)->location()) > core::range::fxdistance * core::range::fxdistance) ||
+ !is_valid_hud_target((*it))
+ )
+ ) {
++it;
}
@@ -268,12 +274,12 @@ void func_target_controlable_next(std::string const &args)
if (it == zone->content().end()) {
it = zone->content().begin();
}
- while (
- !(
- is_valid_hud_target((*it)) &&
+ while (!(
+ is_valid_hud_target((*it)) &&
((*it)->type() == core::Entity::Controlable) &&
((static_cast<core::EntityControlable *>((*it))->owner() || (math::distancesquared(core::localcontrol()->location(), (*it)->location()) < core::range::fxdistance * core::range::fxdistance)))
- )) {
+ )
+ ) {
it++;
if (it == zone->content().end())
it = zone->content().begin();
@@ -315,7 +321,13 @@ void func_target_controlable_prev(std::string const &args)
if (!current_target_id) {
// last entity
rit = zone->content().rbegin();
- while ((rit != zone->content().rend()) && (((*rit)->type() != core::Entity::Controlable) || !is_valid_hud_target((*rit)))) {
+ while (
+ (rit != zone->content().rend()) && (
+ ((*rit)->type() != core::Entity::Controlable) ||
+ (math::distancesquared(core::localcontrol()->location(), (*rit)->location()) > core::range::fxdistance * core::range::fxdistance) ||
+ !is_valid_hud_target((*rit))
+ )
+ ) {
++rit;
}
@@ -340,7 +352,12 @@ void func_target_controlable_prev(std::string const &args)
if (rit == zone->content().rend()) {
rit = zone->content().rbegin();
}
- while (!(((*rit)->type() == core::Entity::Controlable) && is_valid_hud_target((*rit))) ) {
+ while (!(
+ is_valid_hud_target((*rit)) &&
+ ((*rit)->type() == core::Entity::Controlable) &&
+ ((static_cast<core::EntityControlable *>((*rit))->owner() || (math::distancesquared(core::localcontrol()->location(), (*rit)->location()) < core::range::fxdistance * core::range::fxdistance)))
+ )
+ ) {
++rit;
if (rit == zone->content().rend())
rit = zone->content().rbegin();
@@ -352,7 +369,11 @@ void func_target_controlable_prev(std::string const &args)
}
}
- if ((rit != zone->content().rend()) && ((*rit)->type() == core::Entity::Controlable) && is_valid_hud_target((*rit))) {
+ if ((rit != zone->content().rend()) &&
+ is_valid_hud_target((*rit)) &&
+ ((*rit)->type() == core::Entity::Controlable) &&
+ ((static_cast<core::EntityControlable *>((*rit))->owner() || (math::distancesquared(core::localcontrol()->location(), (*rit)->location()) < core::range::fxdistance * core::range::fxdistance)))
+ ) {
set_target((*rit));
} else {
current_target = 0;
diff --git a/src/core/range.h b/src/core/range.h
index a133695..c5265c4 100644
--- a/src/core/range.h
+++ b/src/core/range.h
@@ -12,19 +12,36 @@ namespace core
/**
* @brief range and scale constants
+ * These global constants are shared between client and server.
+ * Changing them is generally a bad idea.
*/
namespace range
{
-/// maximal visible range (world distance)
-/** This is the distance of the frustum far plane,
- * the maximal distance at which entities can be drawn.
- * the maximal radar range
- * and the maximal range to send entity updates
+
+/**
+ * @brief maximal visible range (world distance)
+ * This is the distance of the frustum far plane,
+ * the maximal distance at which entities can be drawn.
+ * the maximal radar range
+ * and the maximal range to send entity updates
*/
const float maxdistance = 1024.0f;
-/// detail/fx distance (world distance)
+/**
+ * @brief maximal range in which graphics effects are drawn
+ * */
const float fxdistance = 256.0f;
+
+/**
+ * @brief reputation limit to indicate hostile targets
+ * */
+const float reputation_hostile = -70.0f;
+
+/**
+ * @brief reputation limit to indicate friendly targets
+ * */
+const float reputation_friendly = 70.0f;
+
}
}
diff --git a/src/game/base/game.cc b/src/game/base/game.cc
index a628440..fa3e81a 100644
--- a/src/game/base/game.cc
+++ b/src/game/base/game.cc
@@ -236,6 +236,12 @@ void Game::func_target_dock(core::Player *player, core::Entity *entity)
return;
}
+ if (player->reputation(entity->faction()) <= core::range::reputation_hostile) {
+ // FIXME replace with "Denied" voice
+ player->send("Dock denied");
+ return;
+ }
+
Ship * ship = static_cast<Ship *>(player->control());
ship->set_autopilot_target(entity);
diff --git a/src/game/base/npc.cc b/src/game/base/npc.cc
index d09f8a2..ca2a1c2 100644
--- a/src/game/base/npc.cc
+++ b/src/game/base/npc.cc
@@ -140,7 +140,7 @@ Ship *NPC::target_closest_enemy()
}
// reputation threshold to get attacked
- if (reputation >= -50.0f) {
+ if (reputation > core::range::reputation_hostile) {
continue;
}