/** * @brief Opens the communication dialogue with a pilot. * * @param pilot Pilot to communicate with. * @return 0 on success. */ int comm_openPilot( unsigned int pilot ) { const char *msg; unsigned int wid; /* Get the pilot. */ comm_pilot = pilot_get( pilot ); if (comm_pilot == NULL) return -1; /* Must not be disabled. */ if (pilot_isFlag(comm_pilot, PILOT_DISABLED)) { player_message("%s does not respond.", comm_pilot->name); return 0; } /* Check to see if pilot wants to communicate. */ msg = comm_getString( "comm_no" ); if (msg != NULL) { player_message( msg ); return 0; } /* Set up for the comm_get* functions. */ ai_setPilot( comm_pilot ); /* Create the generic comm window. */ wid = comm_open( ship_loadCommGFX( comm_pilot->ship ), comm_pilot->faction, pilot_isHostile(comm_pilot) ? -1 : pilot_isFriendly(comm_pilot) ? 1 : 0, pilot_isFlag(comm_pilot, PILOT_BRIBED), comm_pilot->name ); /* Add special buttons. */ window_addButton( wid, -20, 20 + BUTTON_HEIGHT + 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnGreet", "Greet", NULL ); if (!pilot_isFlag(comm_pilot, PILOT_BRIBED) && /* Not already bribed. */ ((faction_getPlayer( comm_pilot->faction ) < 0) || /* Hostile. */ pilot_isHostile(comm_pilot))) window_addButton( wid, -20, 20 + 2*BUTTON_HEIGHT + 40, BUTTON_WIDTH, BUTTON_HEIGHT, "btnBribe", "Bribe", comm_bribePilot ); else window_addButton( wid, -20, 20 + 2*BUTTON_HEIGHT + 40, BUTTON_WIDTH, BUTTON_HEIGHT, "btnRequest", "Refuel", comm_requestFuel ); /* Run hooks if needed. */ pilot_runHook( comm_pilot, PILOT_HOOK_HAIL ); return 0; }
/** * @brief Updates the lockons on the pilot's launchers * * @param p Pilot being updated. * @param o Slot being updated. * @param t Pilot that is currently the target of p (or NULL if not applicable). * @param a Angle to update if necessary. Should be initialized to -1 before the loop. * @param dt Current delta tick. */ void pilot_lockUpdateSlot( Pilot *p, PilotOutfitSlot *o, Pilot *t, double *a, double dt ) { double max, old; double x,y, ang, arc; int locked; /* No target. */ if (t == NULL) return; /* Nota seeker. */ if (!outfit_isSeeker(o->outfit)) return; /* Check arc. */ arc = o->outfit->u.lau.arc; if (arc > 0.) { /* We use an external variable to set and update the angle if necessary. */ if (*a < 0.) { x = t->solid->pos.x - p->solid->pos.x; y = t->solid->pos.y - p->solid->pos.y; ang = ANGLE( x, y ); *a = fabs( angle_diff( ang, p->solid->dir ) ); } /* Decay if not in arc. */ if (*a > arc) { /* Limit decay to the lockon time for this launcher. */ max = o->outfit->u.lau.lockon; /* When a lock is lost, immediately gain half the lock timer. * This is meant as an incentive for the aggressor not to lose the lock, * and for the target to try and break the lock. */ old = o->u.ammo.lockon_timer; o->u.ammo.lockon_timer += dt; if ((old <= 0.) && (o->u.ammo.lockon_timer > 0.)) o->u.ammo.lockon_timer += o->outfit->u.lau.lockon / 2.; /* Cap at max. */ if (o->u.ammo.lockon_timer > max) o->u.ammo.lockon_timer = max; /* Out of arc. */ o->u.ammo.in_arc = 0; return; } } /* In arc. */ o->u.ammo.in_arc = 1; locked = (o->u.ammo.lockon_timer < 0.); /* Lower timer. When the timer reaches zero, the lock is established. */ max = -o->outfit->u.lau.lockon/3.; if (o->u.ammo.lockon_timer > max) { /* Compensate for enemy hide factor. */ o->u.ammo.lockon_timer -= dt * (o->outfit->u.lau.ew_target2 / t->ew_hide); /* Cap at -max/3. */ if (o->u.ammo.lockon_timer < max) o->u.ammo.lockon_timer = max; /* Trigger lockon hook. */ if (!locked && (o->u.ammo.lockon_timer < 0.)) pilot_runHook( p, PILOT_HOOK_LOCKON ); } }
/** * @fn void player_board (void) * * @brief Attempt to board the player's target. * * Creates the window on success. */ void player_board (void) { Pilot *p; unsigned int wdw; if (player->target==PLAYER_ID) { player_message("You need a target to board first!"); return; } p = pilot_get(player->target); if (!pilot_isDisabled(p)) { player_message("You cannot board a ship that isn't disabled!"); return; } else if (vect_dist(&player->solid->pos,&p->solid->pos) > p->ship->gfx_space->sw * PILOT_SIZE_APROX) { player_message("You are too far away to board your target."); return; } else if ((pow2(VX(player->solid->vel)-VX(p->solid->vel)) + pow2(VY(player->solid->vel)-VY(p->solid->vel))) > (double)pow2(MAX_HYPERSPACE_VEL)) { player_message("You are going too fast to board the ship."); return; } else if (pilot_isFlag(p,PILOT_BOARDED)) { player_message("Your target cannot be boarded again."); return; }; /* pilot will be boarded */ pilot_setFlag(p,PILOT_BOARDED); player_message("Boarding ship %s.", p->name); /* * create the boarding window */ wdw = window_create( "Boarding", -1, -1, BOARDING_WIDTH, BOARDING_HEIGHT ); window_addText( wdw, 20, -30, 120, 60, 0, "txtCargo", &gl_smallFont, &cDConsole, "Credits:\n" "Cargo:\n" "Fuel:\n" ); window_addText( wdw, 80, -30, 120, 60, 0, "txtData", &gl_smallFont, &cBlack, NULL ); window_addButton( wdw, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnStealCredits", "Credits", board_stealCreds); window_addButton( wdw, 20+BUTTON_WIDTH+20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnStealCargo", "Cargo", board_stealCargo); window_addButton( wdw, 20+2*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnStealCargo", "Fuel", board_stealFuel); window_addButton( wdw, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnBoardingClose", "Leave", board_exit ); board_update(wdw); /* * run hook if needed */ pilot_runHook(p, PILOT_HOOK_BOARD); }