/** * @brief Approaches a mission giver guy. * * @brief Returns 1 on destroyed, 0 on not destroyed. */ static int npc_approach_giver( NPC_t *npc ) { int i; int ret; Mission *misn; /* Make sure player can accept the mission. */ for (i=0; i<MISSION_MAX; i++) if (player_missions[i].data == NULL) break; if (i >= MISSION_MAX) { dialogue_alert("You have too many active missions."); return -1; } /* Get mission. */ misn = &npc->u.g; ret = mission_accept( misn ); if ((ret==0) || (ret==2) || (ret==-1)) { /* success in accepting the mission */ if (ret==-1) mission_cleanup( misn ); npc_free( npc ); array_erase( &npc_array, &npc[0], &npc[1] ); ret = 1; } else ret = 0; return ret; }
/** * @brief Accepts the selected mission. * @param wid Window of the mission computer. * @param str Unused. */ static void misn_accept( unsigned int wid, char* str ) { (void) str; char* misn_name; Mission* misn; int pos; int i, ret; misn_name = toolkit_getList( wid, "lstMission" ); /* Make sure you have missions. */ if (strcmp(misn_name,"No Missions")==0) return; /* Make sure player can accept the mission. */ for (i=0; i<MISSION_MAX; i++) if (player_missions[i].data == NULL) break; if (i >= MISSION_MAX) { dialogue_alert("You have too many active missions."); return; } if (dialogue_YesNo("Accept Mission", "Are you sure you want to accept this mission?")) { pos = toolkit_getListPos( wid, "lstMission" ); misn = &mission_computer[pos]; ret = mission_accept( misn ); if ((ret==0) || (ret==2) || (ret==-1)) { /* success in accepting the mission */ if (ret==-1) mission_cleanup( &mission_computer[pos] ); memmove( &mission_computer[pos], &mission_computer[pos+1], sizeof(Mission) * (mission_ncomputer-pos-1) ); mission_ncomputer--; /* Regenerate list. */ misn_genList(wid, 0); /* Add position persistancey after a mission has been accepted */ /* NOTE: toolkit_setListPos protects us from a bad position by clamping */ toolkit_setListPos( wid, "lstMission", pos-1 ); /*looks better without the -1, makes more sense with*/ } /* Reset markers. */ mission_sysMark(); } }