Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2015-02-28 22:27:17 +0000
committerStijn Buys <ingar@osirion.org>2015-02-28 22:27:17 +0000
commit874c85f8a009a1c16a85b439c2dccfb04e3371f9 (patch)
tree5780d2fdc5e97c47da7cddeedd9831b517157a52
parentcffe02f49b66a70d40816ffc8dea42f9e52da57f (diff)
Added abandon engine function to drop the current character.
-rw-r--r--src/game/base/game.cc128
-rw-r--r--src/game/base/game.h1
-rw-r--r--src/game/base/savegame.cc14
3 files changed, 116 insertions, 27 deletions
diff --git a/src/game/base/game.cc b/src/game/base/game.cc
index 77917f6..ffd2c90 100644
--- a/src/game/base/game.cc
+++ b/src/game/base/game.cc
@@ -221,7 +221,10 @@ void Game::func_join(core::Player *player, std::string const &args)
{
// override default reputation with faction reputation
for (core::Reputation::FactionReps::const_iterator rip = character->faction()->reputation().factionreps().begin(); rip != character->faction()->reputation().factionreps().end(); ++rip) {
- player->reputation().set_reputation((*rip)->faction(), (*rip)->reputation());
+ if ((*rip)->faction() != Faction::default_faction())
+ {
+ player->reputation().set_reputation((*rip)->faction(), (*rip)->reputation());
+ }
}
player->reputation().set_reputation(character->faction(), 100.0f);
@@ -234,28 +237,86 @@ void Game::func_join(core::Player *player, std::string const &args)
player->set_dirty();
}
-// a player joins the spectators
+// spectate
void Game::func_spectate(core::Player *player, std::string const &args)
{
if (!player->control())
+ {
+ return;
+ }
+
+ if (core::server()->mode() != core::GameServer::MultiPlayer)
+ {
return;
+ }
core::server()->module()->player_save(player);
+
+ if (player->control())
+ {
+ player->remove_asset(player->control());
+ }
+ if (!player->zone())
+ {
+ player->set_zone(Default::zone);
+ }
+ player->set_view(0);
+
std::string message("^B");
message.append(player->name());
message.append("^B spectates.");
core::server()->broadcast(message);
+}
- if (player->control()) {
+// abandon current character
+void Game::func_abandon(core::Player *player, std::string const &args)
+{
+ if (!player->control())
+ {
+ return;
+ }
+
+ std::istringstream is(args);
+ std::string strconfirm;
+ bool confirm = true;
+ if ((is >> strconfirm) && (strconfirm.compare("confirm") == 0)) {
+ confirm = false;
+ }
+
+ if (!confirm)
+ {
+ std::ostringstream strmsg;
+ strmsg << "Abandon current character?";
+ player->messagebox(strmsg.str().c_str(), "OK", "abandon", "Close");
+ return;
+ }
+
+ if (core::server()->mode() != core::GameServer::MultiPlayer)
+ {
+ core::server()->module()->player_save(player);
+ }
+
+ if (player->control())
+ {
player->remove_asset(player->control());
}
- if (!player->zone()) {
+ if (!player->zone())
+ {
player->set_zone(Default::zone);
}
-
player->set_view(0);
+
+ if (core::server()->mode() == core::GameServer::MultiPlayer)
+ {
+ core::server()->module()->player_save(player);
+ }
+
+ std::string message("^B");
+ message.append(player->name());
+ message.append("^B abandons character.");
+ core::server()->broadcast(message);
}
// a player actives the hyperspace jump drive on his ship
@@ -1337,8 +1398,8 @@ void Game::func_repair(core::Player *player, const std::string &args)
core::Entity *dock = ship->dock();
- // can only buy at planets and stations
- if ((dock->moduletype() != station_enttype) && (dock->moduletype() != planet_enttype)) {
+ // can only repair at planets, ships and stations
+ if ((dock->moduletype() != station_enttype) && (dock->moduletype() != planet_enttype) && (dock->moduletype() != ship_enttype)) {
player->send("^WCan not repair here");
return;
}
@@ -1361,23 +1422,38 @@ void Game::func_repair(core::Player *player, const std::string &args)
std::istringstream is(args);
std::string strconfirm;
- bool confirm = false;
+ bool confirm = true;
if ((is >> strconfirm) && (strconfirm.compare("confirm") == 0)) {
- confirm = true;
+ confirm = false;
}
if (!confirm) {
std::ostringstream strmsg;
strmsg << "Repair ship for " << price << " credits?";
- player->messagebox(strmsg.str().c_str(), "OK", "repair confirm", "Close");
+ player->messagebox(strmsg.str().c_str(), "OK", "repair", "Close");
return;
- } else {
- player->set_credits(player->credits() - (long) price);
- ship->set_armor(ship->armor() + amount);
-
- std::ostringstream strmsg;
- strmsg << "Ship repaired for " << price << " credits.";
- player->send(strmsg.str());
+ }
+ player->set_credits(player->credits() - (long) price);
+ ship->set_armor(ship->armor() + amount);
+
+ std::ostringstream strmsg;
+ strmsg << "Ship repaired for " << price << " credits.";
+ player->send(strmsg.str());
+
+ if (dock->moduletype() == ship_enttype)
+ {
+ // if the player is docked at a carrier, the carrier's owner receives the credits
+ Ship *carrier = static_cast<Ship *>(dock);
+ if (carrier->owner())
+ {
+ carrier->owner()->set_credits(carrier->owner()->credits() + (long) price);
+ std::ostringstream strmsg2;
+ strmsg2 << "Received " << price << " credits from " << player->name();
+ carrier->owner()->send(strmsg2.str());
+
+ carrier->owner()->set_dirty();
+ carrier->owner()->sound("game/buy");
+ }
}
player->set_dirty();
@@ -1956,6 +2032,9 @@ Game::Game() : core::Module("Project::OSiRiON", true)
func = core::Func::add("spectate", Game::func_spectate);
func->set_info("leave the game and spectate");
+
+ func = core::Func::add("abandon", Game::func_abandon);
+ func->set_info("abandon current character");
func = core::Func::add("buy", Game::func_buy);
func->set_info("[string] [string] [int] buy an item: specify type, label and amount");
@@ -2972,7 +3051,7 @@ bool Game::generate_entity_menus(core::Entity *entity)
// add repair button
button = new ButtonDescription();
button->set_text("Repair");
- button->set_command("repair", ButtonDescription::CommandGame);
+ button->set_command("repair confirm", ButtonDescription::CommandGame);
button->set_alignment(ButtonDescription::Center);
menu_main->add_button(button);
@@ -3194,10 +3273,7 @@ void Game::player_connect(core::Player *player)
{
std::string args;
player->set_zone(Default::zone);
- player->set_view(0); // not docked
-
- // FIXME load player
- func_spectate(player, args);
+ player->set_view(0);
}
void Game::player_disconnect(core::Player *player)
@@ -3279,11 +3355,11 @@ void Game::game_save(core::Player *player, std::ostream & os)
void Game::player_save(core::Player *player)
{
- if ((!player->control()) || (player->control()->moduletype() != ship_enttype)) {
- return;
- }
-
if (core::server()->mode() == core::GameServer::SinglePlayer) {
+ if ((!player->control()) || (player->control()->moduletype() != ship_enttype)) {
+ return;
+ }
+
std::string command("savegame autosave AUTOSAVE");
core::CommandBuffer::exec(command);
diff --git a/src/game/base/game.h b/src/game/base/game.h
index 25d3cb1..5e49394 100644
--- a/src/game/base/game.h
+++ b/src/game/base/game.h
@@ -142,6 +142,7 @@ private:
static void func_join(core::Player *player, std::string const &args);
static void func_spectate(core::Player *player, std::string const &args);
+ static void func_abandon(core::Player *player, std::string const &args);
static void func_jump(core::Player *player, std::string const &args);
static void func_impulse(core::Player *player, std::string const &args);
static void func_launch(core::Player *player, std::string const &args);
diff --git a/src/game/base/savegame.cc b/src/game/base/savegame.cc
index ab2ecc2..8542a00 100644
--- a/src/game/base/savegame.cc
+++ b/src/game/base/savegame.cc
@@ -124,6 +124,9 @@ void SaveGame::load_game(core::Player *player, filesystem::IniFile & inifile)
continue;
} else if (inifile.got_key_label("zone", str)) {
+ if (!ship) {
+ continue;
+ }
zone = core::Zone::find(str);
continue;
@@ -143,6 +146,9 @@ void SaveGame::load_game(core::Player *player, filesystem::IniFile & inifile)
continue;
} else if (inifile.got_key_string("spawn", str)) {
+ if (!ship) {
+ continue;
+ }
if (!str.size()) {
continue;
} else if (str.size() < 3) {
@@ -189,6 +195,11 @@ void SaveGame::load_game(core::Player *player, filesystem::IniFile & inifile)
} else if (inifile.in_section("item")) {
+ if (!ship)
+ {
+ continue;
+ }
+
if (inifile.got_key_label("type", itemtype)) {
core::InfoType *item_infotype = core::InfoType::find(itemtype);
if (!itemtype.size() || !item_infotype) {
@@ -327,7 +338,8 @@ void SaveGame::player_to_stream(core::Player *player, std::ostream & os)
os << std::endl;
// player reputation
- for (core::Reputation::FactionReps::const_iterator it = player->reputation().factionreps().begin(); it != player->reputation().factionreps().end(); ++it) {
+ for (core::Reputation::FactionReps::const_iterator it = player->reputation().factionreps().begin(); it != player->reputation().factionreps().end(); ++it)
+ {
os << "[reputation]" << std::endl;
os << "faction=" << (*it)->faction()->label() << std::endl;
os << "reputation=" << (*it)->reputation() << std::endl;