From 1876f0f3fda9d0dc4c198416950fa6bf25378626 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 13 Dec 2014 20:21:10 +0000 Subject: Added repair engine function and the ability to repair ships at bases. --- src/game/base/game.cc | 85 ++++++++++++++++++++++++++++++++++++++++++++++ src/game/base/game.h | 1 + src/game/base/shipmodel.cc | 2 +- 3 files changed, 87 insertions(+), 1 deletion(-) (limited to 'src/game') diff --git a/src/game/base/game.cc b/src/game/base/game.cc index 4703aac..575ba3b 100644 --- a/src/game/base/game.cc +++ b/src/game/base/game.cc @@ -1167,6 +1167,76 @@ void Game::func_buy(core::Player *player, const std::string &args) } } +// repair ship +void Game::func_repair(core::Player *player, const std::string &args) +{ + // must be joined to repair + if (!player->control()) { + player->send("^WYou need to join the game first!"); + return; + } + + // player must be controlling a ship + if (player->control()->moduletype() != ship_enttype) { + return; + } + + Ship *ship = static_cast(player->control()); + + // must be docked to repair + if ((ship->state() != core::Entity::Docked) || (!ship->dock())) { + player->send("^WYou need to be docked!"); + return; + } + + core::Entity *dock = ship->dock(); + + // can only buy at planets and stations + if ((dock->moduletype() != station_enttype) && (dock->moduletype() != planet_enttype)) { + player->send("^WCan not repair here"); + return; + } + + // check if repair is required + if (ship->armor() >= ship->maxarmor()) { + player->messagebox("Ship armor is already at full strength."); + } + + const float base_price = roundf(10.0f + player->reputation(dock->faction()) /-20.0f); // base price per armor unit + + float amount = ship->maxarmor() - ship->armor(); + float price = base_price * amount; + + if (player->credits() < (long) price) { + amount = floorf((float) player->credits() / base_price); + price = base_price * amount; + } + + std::istringstream is(args); + std::string strconfirm; + bool confirm = false; + if ((is >> strconfirm) && (strconfirm.compare("confirm") == 0)) { + confirm = true; + } + + if (!confirm) { + std::ostringstream strmsg; + strmsg << "Repair ship for " << price << " credits?"; + player->messagebox(strmsg.str().c_str(), "OK", "repair confirm", "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_dirty(); + player->sound("game/repair"); +} + // drop item requests void Game::func_drop(core::Player *player, const std::string &args) { @@ -1176,6 +1246,11 @@ void Game::func_drop(core::Player *player, const std::string &args) return; } + // player must be controlling a ship + if (player->control()->moduletype() != ship_enttype) { + return; + } + Ship *ship = static_cast(player->control()); // cannot be docked to drop items @@ -1732,6 +1807,9 @@ Game::Game() : core::Module("Project::OSiRiON", true) func = core::Func::add("sell", Game::func_sell); func->set_info("[string] [string] [int] sell an item: specify type, label and amount"); + + func = core::Func::add("repair", Game::func_repair); + func->set_info("repair ship"); func = core::Func::add("drop", Game::func_drop); func->set_info("[label] drop an item and activate it"); @@ -2698,6 +2776,13 @@ 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_alignment(ButtonDescription::Center); + menu_main->add_button(button); + return true; } diff --git a/src/game/base/game.h b/src/game/base/game.h index 81d5339..444916c 100644 --- a/src/game/base/game.h +++ b/src/game/base/game.h @@ -145,6 +145,7 @@ private: static void func_mount(core::Player *player, const std::string &args); static void func_unmount(core::Player *player, const std::string &args); static void func_beam(core::Player *player, const std::string &args); + static void func_repair(core::Player *player, const std::string &args); static void func_wingmen(core::Player *player, const std::string &args); diff --git a/src/game/base/shipmodel.cc b/src/game/base/shipmodel.cc index 1edd9d2..9489c91 100644 --- a/src/game/base/shipmodel.cc +++ b/src/game/base/shipmodel.cc @@ -355,7 +355,7 @@ void ShipModel::buy(core::EntityControlable *buyer, core::Entity *seller, bool c // needs confirmation if (!confirm) { std::ostringstream ostrtxt; - ostrtxt << "Buy a " << name() << " for " << price() -refund << " credits?"; + ostrtxt << "Buy " << aux::article(name()) << " for " << price() - refund << " credits?"; std::ostringstream ostrcmd; ostrcmd << "buy " << seller_item->id() << " 1 confirm"; -- cgit v1.2.3