Lephisto/src/comm.c
2014-01-25 19:29:42 +00:00

164 lines
4.3 KiB
C

/**
* @file comm.c
*
* @brief For communicating with planets/pilots.
*/
#include "lephisto.h"
#include "log.h"
#include "toolkit.h"
#include "dialogue.h"
#include "pilot.h"
#include "rng.h"
#include "llua.h"
#include "comm.h"
#define BUTTON_WIDTH 80 /**< Button width. */
#define BUTTON_HEIGHT 30 /*<< Button height. */
static Pilot* comm_pilot = NULL; /**< Pilot currently talking to. */
/* Static. */
static void comm_bribe(unsigned int wid, char* str);
static unsigned int comm_getBribeAmount(void);
/* Extern. */
void ai_setPilot(Pilot* p);
/**
* @brief Open the communication dialogue with a pilot.
* @param pilot Pilot to communicate with.
* @return 0 on success.
*/
int comm_open(unsigned int pilot) {
int x, y, w;
glTexture* logo, *gfx_comm;
char* name, *stand;
unsigned int wid;
/* Get the pilot. */
comm_pilot = pilot_get(pilot);
if(comm_pilot == NULL)
return -1;
/* Get graphics and text. */
gfx_comm = comm_pilot->ship->gfx_comm;
logo = faction_logoSmall(comm_pilot->faction);
name = comm_pilot->name;
stand = faction_getStandingBroad(faction_getPlayer(comm_pilot->faction));
w = MAX(gl_printWidth(NULL, name), gl_printWidth(NULL, stand));
y = gl_defFont.h*2 + 15;
if(logo != NULL) {
w += logo->w;
y = MAX(y, logo->w);
}
x = (gfx_comm->w - w) / 2;
/* Create the window. */
wid = window_create("Communication Channel", -1, -1,
20 + gfx_comm->w + 20 + BUTTON_WIDTH + 20, 30 + gfx_comm->h + y + 5 + 20);
/* Create the ship image. */
window_addRect(wid, 20, -30, gfx_comm->w, gfx_comm->h + y + 5, "rctShip", &cGrey10, 1);
window_addImage(wid, 20, -30, "imgShip", gfx_comm, 0);
/* Faction logo. */
if(logo != NULL) {
window_addImage(wid, x, -30 - gfx_comm->h - 5,
"imgFaction", logo, 0);
x += logo->w + 10;
y -= (logo->w - (gl_defFont.h*2 + 15)) / 2;
}
/* Name. */
window_addText(wid, x, -30 - gfx_comm->h - y + gl_defFont.h*2 + 10,
gfx_comm->w - x, 20, 0, "txtName",
NULL, &cDConsole, name);
/* Standing. */
window_addText(wid, x, -30 - gfx_comm->h - y + gl_defFont.h + 5,
gfx_comm->w - x, 20, 0, "txtStanding", NULL,
faction_getColour(comm_pilot->faction), stand);
/* Buttons. */
window_addButton(wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT,
"btnClose", "Close Channel", window_close);
window_addButton(wid, -20, 20 + BUTTON_HEIGHT + 20,
BUTTON_WIDTH, BUTTON_HEIGHT, "btnGreet", "Greet", NULL);
if((faction_getPlayer(comm_pilot->faction) < 0) ||
pilot_isFlag(comm_pilot, PILOT_HOSTILE))
window_addButton(wid, -20, 20 + 2*BUTTON_HEIGHT + 40,
BUTTON_WIDTH, BUTTON_HEIGHT, "btnBribe", "Bribe", comm_bribe);
else
window_addButton(wid, -20, 20 + 2*BUTTON_HEIGHT + 40,
BUTTON_WIDTH, BUTTON_HEIGHT, "btnRequest", "Request...", NULL);
return 0;
}
/**
* @brief Try to bribe the pilot.
* @param wid ID of window calling the function.
* @param str Unused.
*/
static void comm_bribe(unsigned int wid, char* str) {
(void)str;
int answer;
int price;
price = comm_getBribeAmount();
/* Unbribeable. */
if(price == 0) {
dialogue_msg("Bribe Pilot", "\"Money won't save your hide now!\"");
return;
}
answer = dialogue_YesNo("Bribe Pilot", "\"I'm gonna need at least %d credits \
to not leave you as a hunk of floating debris.\"\n\npay %d Credits?", price, price);
if(player->credits < price) {
dialogue_msg("Bribe Pilot", "You don't have enough credits for the bribary.");
} else {
player->credits -= price;
dialogue_msg("Bribe Pilot", "\"Pleasure to do business with you.\"");
pilot_setFlag(comm_pilot, PILOT_BRIBED);
/* Reopen window. */
window_destroy(wid);
comm_open(comm_pilot->id);
}
}
/**
* @brief Get the amount the communicating pilot wants as a bribe.
*
* Note: It's a hack around the AI stuff, probably not too good of an idea.
* @return Amount pilot wants.
*/
static unsigned int comm_getBribeAmount(void) {
lua_State* L;
double bribe;
/* Set up the state. */
ai_setPilot(comm_pilot);
L = comm_pilot->ai->L;
/* Get the bribe amount. */
lua_getglobal(L, "mem");
lua_getfield(L, -1, "bribe");
/* If not number consider unbribeable. */
if(!lua_isnumber(L, -1)) {
lua_pop(L, 2);
return 0;
}
/* Get amount. */
bribe = (unsigned int) lua_tonumber(L, -1);
/* Clean up. */
lua_pop(L, 2);
return bribe;
}