naev 0.10.4
nlua_misn.c
Go to the documentation of this file.
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
10#include <math.h>
11#include <stdio.h>
12#include <stdlib.h>
13
14#include "naev.h"
17#include "nlua_misn.h"
18
19#include "array.h"
20#include "gui_osd.h"
21#include "land.h"
22#include "log.h"
23#include "mission.h"
24#include "music.h"
25#include "ndata.h"
26#include "nlua.h"
27#include "nlua_audio.h"
28#include "nlua_bkg.h"
29#include "nlua_camera.h"
30#include "nlua_commodity.h"
31#include "nlua_faction.h"
32#include "nlua_hook.h"
33#include "nlua_music.h"
34#include "nlua_spob.h"
35#include "nlua_player.h"
36#include "nlua_system.h"
37#include "nlua_tex.h"
38#include "nlua_tk.h"
39#include "nluadef.h"
40#include "npc.h"
41#include "nstring.h"
42#include "nxml.h"
43#include "player.h"
44#include "rng.h"
45#include "shiplog.h"
46#include "toolkit.h"
47
59/*
60 * libraries
61 */
62/* Mission methods */
63static int misn_setTitle( lua_State *L );
64static int misn_setDesc( lua_State *L );
65static int misn_setReward( lua_State *L );
66static int misn_setNPC( lua_State *L );
67static int misn_factions( lua_State *L );
68static int misn_accept( lua_State *L );
69static int misn_finish( lua_State *L );
70static int misn_markerAdd( lua_State *L );
71static int misn_markerMove( lua_State *L );
72static int misn_markerRm( lua_State *L );
73static int misn_cargoAdd( lua_State *L );
74static int misn_cargoRm( lua_State *L );
75static int misn_cargoJet( lua_State *L );
76static int misn_osdCreate( lua_State *L );
77static int misn_osdDestroy( lua_State *L );
78static int misn_osdActive( lua_State *L );
79static int misn_osdGet( lua_State *L );
80static int misn_osdGetActiveItem( lua_State *L );
81static int misn_npcAdd( lua_State *L );
82static int misn_npcRm( lua_State *L );
83static int misn_claim( lua_State *L );
84static const luaL_Reg misn_methods[] = {
85 { "setTitle", misn_setTitle },
86 { "setDesc", misn_setDesc },
87 { "setReward", misn_setReward },
88 { "setNPC", misn_setNPC },
89 { "factions", misn_factions },
90 { "accept", misn_accept },
91 { "finish", misn_finish },
92 { "markerAdd", misn_markerAdd },
93 { "markerMove", misn_markerMove },
94 { "markerRm", misn_markerRm },
95 { "cargoAdd", misn_cargoAdd },
96 { "cargoRm", misn_cargoRm },
97 { "cargoJet", misn_cargoJet },
98 { "osdCreate", misn_osdCreate },
99 { "osdDestroy", misn_osdDestroy },
100 { "osdActive", misn_osdActive },
101 { "osdGet", misn_osdGet },
102 { "osdGetActive", misn_osdGetActiveItem },
103 { "npcAdd", misn_npcAdd },
104 { "npcRm", misn_npcRm },
105 { "claim", misn_claim },
106 {0,0}
107};
115int misn_loadLibs( nlua_env env )
116{
118 nlua_loadMisn(env);
119 nlua_loadHook(env);
120 nlua_loadCamera(env);
121 nlua_loadTex(env);
123 nlua_loadMusic(env);
124 nlua_loadTk(env);
125 return 0;
126}
127/*
128 * individual library loading
129 */
134int nlua_loadMisn( nlua_env env )
135{
136 nlua_register(env, "misn", misn_methods, 0);
137 return 0;
138}
139
148int misn_tryRun( Mission *misn, const char *func )
149{
150 int ret;
151 /* Get the function to run. */
152 misn_runStart( misn, func );
153 if (lua_isnil( naevL, -1 )) {
154 lua_pop(naevL,1);
155 return 0;
156 }
157 ret = misn_runFunc( misn, func, 0 );
158 return ret;
159}
160
169int misn_run( Mission *misn, const char *func )
170{
171 misn_runStart( misn, func );
172 return misn_runFunc( misn, func, 0 );
173}
174
180Mission* misn_getFromLua( lua_State *L )
181{
182 Mission *misn, **misnptr;
183
184 nlua_getenv( L, __NLUA_CURENV, "__misn" );
185 misnptr = lua_touserdata( L, -1 );
186 misn = misnptr ? *misnptr : NULL;
187 lua_pop( L, 1 );
188
189 return misn;
190}
191
195void misn_runStart( Mission *misn, const char *func )
196{
197 Mission **misnptr;
198 misnptr = lua_newuserdata( naevL, sizeof(Mission*) );
199 *misnptr = misn;
200 nlua_setenv( naevL, misn->env, "__misn" );
201
202 /* Set the Lua state. */
203 nlua_getenv( naevL, misn->env, func );
204}
205
215int misn_runFunc( Mission *misn, const char *func, int nargs )
216{
217 int ret;
218 int misn_delete;
219 Mission *cur_mission;
220 nlua_env env;
221 int isaccepted;
222
223 /* Check to see if it is accepted first. */
224 isaccepted = misn->accepted;
225
226 /* Set up and run function. */
227 env = misn->env;
228 ret = nlua_pcall(env, nargs, 0);
229
230 /* The mission can change if accepted. */
231 nlua_getenv(naevL, env, "__misn");
232 cur_mission = *(Mission**) lua_touserdata(naevL, -1);
233 lua_pop(naevL, 1);
234
235 if (ret != 0) { /* error has occurred */
236 const char* err = (lua_isstring(naevL,-1)) ? lua_tostring(naevL,-1) : NULL;
237 if ((err==NULL) || (strcmp(err,NLUA_DONE)!=0)) {
238 WARN(_("Mission '%s' -> '%s': %s"),
239 cur_mission->data->name, func, (err) ? err : _("unknown error"));
240 ret = -1;
241 }
242 else
243 ret = 1;
244 lua_pop(naevL,1);
245 }
246
247 /* Get delete. */
248 nlua_getenv(naevL, env, "__misn_delete");
249 misn_delete = lua_toboolean(naevL,-1);
250 lua_pop(naevL,1);
251
252 /* Mission is finished */
253 if (misn_delete) {
254 ret = 2;
255 mission_cleanup( cur_mission );
256 for (int i=0; i<array_size(player_missions); i++) {
257 if (cur_mission != player_missions[i])
258 continue;
259
260 mission_shift(i);
261 break;
262 }
263 }
264 /* Mission became accepted. */
265 else if (!isaccepted && cur_mission->accepted)
266 ret = 3;
267
268 return ret;
269}
270
277static int misn_setTitle( lua_State *L )
278{
279 const char *str = luaL_checkstring(L,1);
280 Mission *cur_mission = misn_getFromLua(L);
281 free(cur_mission->title);
282 cur_mission->title = strdup(str);
283 return 0;
284}
294static int misn_setDesc( lua_State *L )
295{
296 const char *str = luaL_checkstring(L,1);
297 Mission *cur_mission = misn_getFromLua(L);
298 free(cur_mission->desc);
299 cur_mission->desc = strdup(str);
300 return 0;
301}
308static int misn_setReward( lua_State *L )
309{
310 const char *str;
311 Mission *cur_mission = misn_getFromLua(L);
312 free(cur_mission->reward);
313 cur_mission->reward_value = -1.;
314 if (lua_isnumber(L,1)) {
315 char buf[ECON_CRED_STRLEN];
316 cur_mission->reward_value = CLAMP( CREDITS_MIN, CREDITS_MAX, (credits_t)round(luaL_checknumber(L,1)) );
317 credits2str( buf, cur_mission->reward_value, 2 );
318 cur_mission->reward = strdup(buf);
319 }
320 else {
321 str = luaL_checkstring(L,1);
322 cur_mission->reward = strdup(str);
323 }
324 return 0;
325}
326
343static int misn_markerAdd( lua_State *L )
344{
345 int id, issys, objid;
346 const char *stype;
347 MissionMarkerType type;
348 Mission *cur_mission;
349
350 /* Check parameters. */
351 if (lua_isspob(L,1)) {
352 issys = 0;
353 objid = luaL_checkspob(L,1);
354 }
355 else {
356 issys = 1;
357 objid = system_index( luaL_validsystem(L,1) );
358 }
359 stype = luaL_optstring( L, 2, "high" );
360
361 /* Handle types. */
362 if (strcmp(stype, "computer")==0)
363 type = SPOBMARKER_COMPUTER;
364 else if (strcmp(stype, "low")==0)
365 type = SPOBMARKER_LOW;
366 else if (strcmp(stype, "high")==0)
367 type = SPOBMARKER_HIGH;
368 else if (strcmp(stype, "plot")==0)
369 type = SPOBMARKER_PLOT;
370 else {
371 NLUA_ERROR(L, _("Unknown marker type: %s"), stype);
372 return 0;
373 }
374
375 /* Convert spob -> system. */
376 if (issys)
377 type = mission_markerTypeSpobToSystem( type );
378
379 cur_mission = misn_getFromLua(L);
380
381 /* Add the marker. */
382 id = mission_addMarker( cur_mission, -1, objid, type );
383
384 /* Update system markers. */
386
387 /* Return the ID. */
388 lua_pushnumber( L, id );
389 return 1;
390}
391
401static int misn_markerMove( lua_State *L )
402{
403 int id, objid, issys;
404 MissionMarker *marker;
405 Mission *cur_mission;
406
407 /* Handle parameters. */
408 id = luaL_checkinteger( L, 1 );
409 if (lua_isspob(L,2)) {
410 issys = 0;
411 objid = luaL_checkspob(L,2);
412 }
413 else {
414 issys = 1;
415 objid = luaL_checksystem(L,2);
416 }
417
418 cur_mission = misn_getFromLua(L);
419
420 /* Check id. */
421 marker = NULL;
422 for (int i=0; i<array_size(cur_mission->markers); i++) {
423 if (id == cur_mission->markers[i].id) {
424 marker = &cur_mission->markers[i];
425 break;
426 }
427 }
428 if (marker == NULL) {
429 NLUA_ERROR( L, _("Mission does not have a marker with id '%d'"), id );
430 return 0;
431 }
432
433 /* Update system. */
434 if (issys)
435 marker->type = mission_markerTypeSpobToSystem( marker->type );
436 else
437 marker->type = mission_markerTypeSystemToSpob( marker->type );
438 marker->objid = objid;
439
440 /* Update system markers. */
442 return 0;
443}
444
453static int misn_markerRm( lua_State *L )
454{
455 int id;
456 MissionMarker *marker;
457 Mission *cur_mission = misn_getFromLua(L);
458
459 /* Remove all markers. */
460 if (lua_isnoneornil(L,1)) {
461 array_erase( &cur_mission->markers, array_begin(cur_mission->markers), array_end(cur_mission->markers) );
463 return 0;
464 }
465
466 /* Handle parameters. */
467 id = luaL_checkinteger( L, 1 );
468
469 /* Check id. */
470 marker = NULL;
471 for (int i=0; i<array_size( cur_mission->markers ); i++) {
472 if (id == cur_mission->markers[i].id) {
473 marker = &cur_mission->markers[i];
474 break;
475 }
476 }
477 if (marker == NULL) {
478 /* Already removed. */
479 return 0;
480 }
481
482 /* Remove the marker. */
483 array_erase( &cur_mission->markers, &marker[0], &marker[1] );
484
485 /* Update system markers. */
487 return 0;
488}
489
507static int misn_setNPC( lua_State *L )
508{
509 const char *name, *desc;
510 Mission *cur_mission;
511
512 cur_mission = misn_getFromLua(L);
513
514 gl_freeTexture(cur_mission->portrait);
515 cur_mission->portrait = NULL;
516
517 free(cur_mission->npc);
518 cur_mission->npc = NULL;
519
520 free(cur_mission->npc_desc);
521 cur_mission->npc_desc = NULL;
522
523 /* For no parameters just leave having freed NPC. */
524 if (lua_gettop(L) == 0)
525 return 0;
526
527 /* Get parameters. */
528 name = luaL_checkstring(L,1);
529 cur_mission->portrait = luaL_validtex(L,2,GFX_PATH"portraits/");
530 desc = luaL_checkstring(L,3);
531
532 /* Set NPC name and description. */
533 cur_mission->npc = strdup(name);
534 cur_mission->npc_desc = strdup(desc);
535
536 return 0;
537}
538
546static int misn_factions( lua_State *L )
547{
548 Mission *cur_mission = misn_getFromLua(L);
549 const MissionData *dat = cur_mission->data;
550
551 /* we'll push all the factions in table form */
552 lua_newtable(L);
553 for (int i=0; i<array_size(dat->avail.factions); i++) {
554 LuaFaction f = dat->avail.factions[i];
555 lua_pushfaction(L, f); /* value */
556 lua_rawseti(L,-2,i+1); /* store the value in the table */
557 }
558 return 1;
559}
569static int misn_accept( lua_State *L )
570{
571 Mission *new_misn, *cur_mission, **misnptr;
572 int ret = 0;
573
574 if (player_missions == NULL)
576
577 /* Clean up old stale stuff if necessary. */
578 for (int i=array_size(player_missions)-1; i>=0; i--) {
579 Mission *m = player_missions[i];
580 if (m->id != 0)
581 continue;
582 mission_cleanup( m );
583 free( m );
585 }
586
587 /* Create the new mission. */
588 new_misn = calloc( 1, sizeof(Mission) );
589 array_push_back( &player_missions, new_misn );
590
591 cur_mission = misn_getFromLua(L);
592
593 /* no missions left */
594 if (cur_mission->accepted)
595 NLUA_ERROR(L, _("Mission already accepted!"));
596 else { /* copy it over */
597 *new_misn = *cur_mission;
598 memset( cur_mission, 0, sizeof(Mission) );
599 cur_mission->env = LUA_NOREF;
600 cur_mission->accepted = 1; /* Propagated to the mission computer. */
601 cur_mission = new_misn;
602 cur_mission->accepted = 1; /* Mark as accepted. */
603
604 /* Need to change pointer. */
605 misnptr = lua_newuserdata( L, sizeof(Mission*) );
606 *misnptr = cur_mission;
607 nlua_setenv( L, cur_mission->env, "__misn" );
608 }
609
610 lua_pushboolean(L,!ret); /* we'll convert C style return to Lua */
611 return 1;
612}
623static int misn_finish( lua_State *L )
624{
625 int b = lua_toboolean(L,1);
626 Mission *cur_mission = misn_getFromLua(L);
627
628 lua_pushboolean( L, 1 );
629 nlua_setenv( L, cur_mission->env, "__misn_delete" );
630
631 if (b)
632 player_missionFinished( mission_getID( cur_mission->data->name ) );
633
634 lua_pushstring(L, NLUA_DONE);
635 lua_error(L); /* shouldn't return */
636
637 return 0;
638}
639
651static int misn_cargoAdd( lua_State *L )
652{
653 Commodity *cargo;
654 int quantity, ret;
655 Mission *cur_mission;
656
657 /* Parameters. */
658 cargo = luaL_validcommodity(L,1);
659 quantity = luaL_checkint(L,2);
660
661 cur_mission = misn_getFromLua(L);
662
663 /* First try to add the cargo. */
664 ret = pilot_addMissionCargo( player.p, cargo, quantity );
665 mission_linkCargo( cur_mission, ret );
666
667 lua_pushnumber(L, ret);
668 return 1;
669}
677static int misn_cargoRm( lua_State *L )
678{
679 int ret;
680 unsigned int id;
681 Mission *cur_mission;
682
683 id = luaL_checklong(L,1);
684
685 /* First try to remove the cargo from player. */
686 if (pilot_rmMissionCargo( player.p, id, 0 ) != 0) {
687 lua_pushboolean(L,0);
688 return 1;
689 }
690
691 cur_mission = misn_getFromLua(L);
692
693 /* Now unlink the mission cargo if it was successful. */
694 ret = mission_unlinkCargo( cur_mission, id );
695
696 lua_pushboolean(L,!ret);
697 return 1;
698}
706static int misn_cargoJet( lua_State *L )
707{
708 int ret;
709 unsigned int id;
710 Mission *cur_mission;
711
712 id = luaL_checklong(L,1);
713
714 /* First try to remove the cargo from player. */
715 if (pilot_rmMissionCargo( player.p, id, 1 ) != 0) {
716 lua_pushboolean(L,0);
717 return 1;
718 }
719
720 cur_mission = misn_getFromLua(L);
721
722 /* Now unlink the mission cargo if it was successful. */
723 ret = mission_unlinkCargo( cur_mission, id );
724
725 lua_pushboolean(L,!ret);
726 return 1;
727}
728
741static int misn_osdCreate( lua_State *L )
742{
743 const char *title;
744 int nitems;
745 char **items;
746 Mission *cur_mission = misn_getFromLua(L);
747
748 /* Must be accepted. */
749 if (!cur_mission->accepted) {
750 WARN(_("Can't create an OSD on an unaccepted mission!"));
751 return 0;
752 }
753
754 /* Check parameters. */
755 title = luaL_checkstring(L,1);
756 luaL_checktype(L,2,LUA_TTABLE);
757 nitems = lua_objlen(L,2);
758
759 /* Destroy OSD if already exists. */
760 if (cur_mission->osd != 0) {
761 osd_destroy( cur_mission->osd );
762 cur_mission->osd = 0;
763 }
764
765 /* Allocate items. */
766 items = calloc( nitems, sizeof(char *) );
767
768 /* Get items. */
769 for (int i=0; i<nitems; i++) {
770 lua_pushnumber(L,i+1);
771 lua_gettable(L,2);
772 if (!lua_isstring(L,-1)) {
773 free(items);
774 luaL_typerror(L, -1, "string");
775 return 0;
776 }
777 items[i] = strdup( lua_tostring(L, -1) );
778 lua_pop(L,1);
779 }
780
781 /* Create OSD. */
782 cur_mission->osd = osd_create( title, nitems, (const char**) items,
783 cur_mission->data->avail.priority );
784 cur_mission->osd_set = 1; /* OSD was explicitly set. */
785
786 /* Free items. */
787 for (int i=0; i<nitems; i++)
788 free(items[i]);
789 free(items);
790
791 return 0;
792}
793
799static int misn_osdDestroy( lua_State *L )
800{
801 Mission *cur_mission = misn_getFromLua(L);
802
803 if (cur_mission->osd != 0) {
804 osd_destroy( cur_mission->osd );
805 cur_mission->osd = 0;
806 }
807
808 return 0;
809}
810
819static int misn_osdActive( lua_State *L )
820{
821 int n;
822 Mission *cur_mission;
823
824 n = luaL_checkint(L,1);
825 n = n-1; /* Convert to C index. */
826
827 cur_mission = misn_getFromLua(L);
828
829 if (cur_mission->osd != 0)
830 osd_active( cur_mission->osd, n );
831
832 return 0;
833}
834
841static int misn_osdGetActiveItem( lua_State *L )
842{
843 Mission *cur_mission = misn_getFromLua(L);
844 char **items = osd_getItems(cur_mission->osd);
845 int active = osd_getActive(cur_mission->osd);
846
847 if (!items || active < 0) {
848 lua_pushnil(L);
849 return 1;
850 }
851
852 lua_pushstring(L, items[active]);
853 return 1;
854}
855
864static int misn_osdGet( lua_State *L )
865{
866 Mission *cur_mission = misn_getFromLua(L);
867 char **items;
868
869 if (cur_mission->osd == 0)
870 return 0;
871
872 lua_pushstring( L, osd_getTitle(cur_mission->osd) );
873 lua_newtable(L);
874 items = osd_getItems(cur_mission->osd);
875 for (int i=0; i<array_size(items); i++) {
876 lua_pushstring( L, items[i] );
877 lua_rawseti( L, -2, i+1 );
878 }
879 lua_pushinteger( L, osd_getActive(cur_mission->osd) );
880 return 3;
881}
882
897static int misn_npcAdd( lua_State *L )
898{
899 unsigned int id;
900 int priority;
901 const char *func, *name, *desc;
902 glTexture *portrait, *bg;
903 Mission *cur_mission;
904
905 /* Handle parameters. */
906 func = luaL_checkstring(L, 1);
907 name = luaL_checkstring(L, 2);
908 portrait = luaL_validtex( L, 3, GFX_PATH"portraits/" );
909 desc = luaL_checkstring(L, 4);
910
911 /* Optional parameters. */
912 priority = luaL_optinteger(L,5,5);
913 if (!lua_isnoneornil(L,6))
914 bg = luaL_validtex( L, 6, GFX_PATH"portraits/" );
915 else
916 bg = NULL;
917
918 cur_mission = misn_getFromLua(L);
919
920 /* Add npc. */
921 id = npc_add_mission( cur_mission->id, func, name, priority, portrait, desc, bg );
922
923 /* Regenerate bar. */
924 bar_regen();
925
926 /* Return ID. */
927 if (id > 0) {
928 lua_pushnumber( L, id );
929 return 1;
930 }
931 return 0;
932}
933
942static int misn_npcRm( lua_State *L )
943{
944 unsigned int id = luaL_checklong(L, 1);
945 Mission *cur_mission = misn_getFromLua(L);
946 int ret = npc_rm_mission( id, cur_mission->id );
947
948 /* Regenerate bar. */
949 bar_regen();
950
951 if (ret != 0)
952 NLUA_ERROR(L, _("Invalid NPC ID!"));
953 return 0;
954}
955
975static int misn_claim( lua_State *L )
976{
977 Claim_t *claim;
978 Mission *cur_mission;
979 int onlytest, inclusive;
980
981 /* Get mission. */
982 cur_mission = misn_getFromLua(L);
983
984 onlytest = lua_toboolean(L,2);
985 inclusive = lua_toboolean(L,3);
986
987 /* Check to see if already claimed. */
988 if (!onlytest && !claim_isNull(cur_mission->claims)) {
989 NLUA_ERROR(L, _("Mission trying to claim but already has."));
990 return 0;
991 }
992
993 /* Create the claim. */
994 claim = claim_create( !inclusive );
995
996 if (lua_istable(L,1)) {
997 /* Iterate over table. */
998 lua_pushnil(L);
999 while (lua_next(L, 1) != 0) {
1000 if (lua_issystem(L,-1))
1001 claim_addSys( claim, lua_tosystem( L, -1 ) );
1002 else if (lua_isstring(L,-1))
1003 claim_addStr( claim, lua_tostring( L, -1 ) );
1004 lua_pop(L,1);
1005 }
1006 }
1007 else if (lua_issystem(L, 1))
1008 claim_addSys( claim, lua_tosystem( L, 1 ) );
1009 else if (lua_isstring(L, 1))
1010 claim_addStr( claim, lua_tostring( L, 1 ) );
1011 else
1012 NLUA_INVALID_PARAMETER(L);
1013
1014 /* Only test, but don't apply case. */
1015 if (onlytest) {
1016 lua_pushboolean( L, !claim_test( claim ) );
1017 claim_destroy( claim );
1018 return 1;
1019 }
1020
1021 /* Test claim. */
1022 if (claim_test( claim )) {
1023 claim_destroy( claim );
1024 lua_pushboolean(L,0);
1025 return 1;
1026 }
1027
1028 /* Set the claim. */
1029 cur_mission->claims = claim;
1030 claim_activate( claim );
1031 lua_pushboolean(L,1);
1032 return 1;
1033}
Provides macros to work with dynamic arrays.
#define array_end(array)
Returns a pointer to the end of the reserved memory space.
Definition: array.h:202
#define array_erase(ptr_array, first, last)
Erases elements in interval [first, last).
Definition: array.h:140
static ALWAYS_INLINE int array_size(const void *array)
Returns number of elements in the array.
Definition: array.h:168
#define array_push_back(ptr_array, element)
Adds a new element at the end of the array.
Definition: array.h:129
#define array_begin(array)
Returns a pointer to the beginning of the reserved memory space.
Definition: array.h:194
#define array_create(basic_type)
Creates a new dynamic array of ‘basic_type’.
Definition: array.h:93
int claim_test(const Claim_t *claim)
Tests to see if a system claim would have collisions.
Definition: claim.c:112
void claim_destroy(Claim_t *claim)
Destroys a system claim.
Definition: claim.c:189
int claim_addStr(Claim_t *claim, const char *str)
Adds a string claim to a claim.
Definition: claim.c:59
int claim_addSys(Claim_t *claim, int ss_id)
Adds a claim to a system claim.
Definition: claim.c:77
void claim_activate(Claim_t *claim)
Activates a claim on a system.
Definition: claim.c:251
int claim_isNull(const Claim_t *claim)
See if a claim actually contains data.
Definition: claim.c:95
Claim_t * claim_create(int exclusive)
Creates a system claim.
Definition: claim.c:42
void bar_regen(void)
Regenerates the bar list.
Definition: land.c:452
Mission ** player_missions
Definition: mission.c:47
void mission_cleanup(Mission *misn)
Cleans up a mission.
Definition: mission.c:677
int mission_addMarker(Mission *misn, int id, int objid, MissionMarkerType type)
Adds a system marker to a mission.
Definition: mission.c:487
int mission_linkCargo(Mission *misn, unsigned int cargo_id)
Links cargo to the mission for posterior cleanup.
Definition: mission.c:639
void mission_sysMark(void)
Marks all active systems that need marking.
Definition: mission.c:516
void mission_shift(int pos)
Puts the specified mission at the end of the player_missions array.
Definition: mission.c:729
int mission_getID(const char *name)
Gets id from mission name.
Definition: mission.c:98
int mission_unlinkCargo(Mission *misn, unsigned int cargo_id)
Unlinks cargo from the mission, removes it from the player.
Definition: mission.c:654
Header file with generic functions and naev-specifics.
#define CLAMP(a, b, x)
Definition: naev.h:41
int nlua_loadStandard(nlua_env env)
Loads the standard Naev Lua API.
Definition: nlua.c:760
int nlua_loadBackground(nlua_env env)
Loads the graphics library.
Definition: nlua_bkg.c:38
int nlua_loadCamera(nlua_env env)
Loads the camera library.
Definition: nlua_camera.c:47
Commodity * luaL_validcommodity(lua_State *L, int ind)
Makes sure the commodity is valid or raises a Lua error.
LuaFaction * lua_pushfaction(lua_State *L, LuaFaction faction)
Pushes a faction on the stack.
Definition: nlua_faction.c:192
int nlua_loadHook(nlua_env env)
Loads the hook Lua library.
Definition: nlua_hook.c:121
static int misn_factions(lua_State *L)
Gets the factions the mission is available for.
Definition: nlua_misn.c:546
Mission * misn_getFromLua(lua_State *L)
Gets the mission that's being currently run in Lua.
Definition: nlua_misn.c:180
static const luaL_Reg misn_methods[]
Definition: nlua_misn.c:84
static int misn_npcRm(lua_State *L)
Removes an NPC.
Definition: nlua_misn.c:942
static int misn_osdGet(lua_State *L)
Gets the current mission OSD information.
Definition: nlua_misn.c:864
static int misn_osdActive(lua_State *L)
Sets active in mission OSD.
Definition: nlua_misn.c:819
int misn_tryRun(Mission *misn, const char *func)
Tries to run a mission, but doesn't err if it fails.
Definition: nlua_misn.c:148
static int misn_osdDestroy(lua_State *L)
Destroys the mission OSD.
Definition: nlua_misn.c:799
void misn_runStart(Mission *misn, const char *func)
Sets up the mission to run misn_runFunc.
Definition: nlua_misn.c:195
static int misn_finish(lua_State *L)
Finishes the mission.
Definition: nlua_misn.c:623
static int misn_markerMove(lua_State *L)
Moves a marker to a new system.
Definition: nlua_misn.c:401
static int misn_osdCreate(lua_State *L)
Creates a mission OSD.
Definition: nlua_misn.c:741
static int misn_cargoRm(lua_State *L)
Removes the mission cargo.
Definition: nlua_misn.c:677
static int misn_setTitle(lua_State *L)
Mission Lua bindings.
Definition: nlua_misn.c:277
static int misn_claim(lua_State *L)
Tries to claim systems or strings.
Definition: nlua_misn.c:975
static int misn_markerAdd(lua_State *L)
Adds a new marker.
Definition: nlua_misn.c:343
static int misn_osdGetActiveItem(lua_State *L)
Gets the active OSD element.
Definition: nlua_misn.c:841
static int misn_setReward(lua_State *L)
Sets the current mission reward description.
Definition: nlua_misn.c:308
static int misn_accept(lua_State *L)
Attempts to accept the mission.
Definition: nlua_misn.c:569
static int misn_setDesc(lua_State *L)
Sets the current mission description.
Definition: nlua_misn.c:294
int misn_runFunc(Mission *misn, const char *func, int nargs)
Runs a mission set up with misn_runStart.
Definition: nlua_misn.c:215
static int misn_cargoJet(lua_State *L)
Jettisons the mission cargo.
Definition: nlua_misn.c:706
static int misn_markerRm(lua_State *L)
Removes a mission system marker.
Definition: nlua_misn.c:453
static int misn_npcAdd(lua_State *L)
Adds an NPC.
Definition: nlua_misn.c:897
int nlua_loadMisn(nlua_env env)
Loads the mission Lua library.
Definition: nlua_misn.c:134
static int misn_cargoAdd(lua_State *L)
Adds some mission cargo to the player. They cannot sell it nor get rid of it unless they abandons the...
Definition: nlua_misn.c:651
int misn_loadLibs(nlua_env env)
Registers all the mission libraries.
Definition: nlua_misn.c:115
static int misn_setNPC(lua_State *L)
Sets the current mission NPC.
Definition: nlua_misn.c:507
int misn_run(Mission *misn, const char *func)
Runs a mission function.
Definition: nlua_misn.c:169
int nlua_loadMusic(nlua_env env)
Music Lua module.
Definition: nlua_music.c:58
LuaSpob luaL_checkspob(lua_State *L, int ind)
Gets spob at index raising an error if isn't a spob.
Definition: nlua_spob.c:150
int lua_isspob(lua_State *L, int ind)
Checks to see if ind is a spob.
Definition: nlua_spob.c:207
LuaSystem luaL_checksystem(lua_State *L, int ind)
Gets system at index raising an error if type doesn't match.
Definition: nlua_system.c:141
StarSystem * luaL_validsystem(lua_State *L, int ind)
Gets system (or system name) at index raising an error if type doesn't match.
Definition: nlua_system.c:156
LuaSystem lua_tosystem(lua_State *L, int ind)
Lua system module.
Definition: nlua_system.c:130
int lua_issystem(lua_State *L, int ind)
Checks to see if ind is a system.
Definition: nlua_system.c:201
glTexture * luaL_validtex(lua_State *L, int ind, const char *searchpath)
Gets texture directly or from a filename (string) at index or raises error if there is no texture at ...
Definition: nlua_tex.c:115
int nlua_loadTex(nlua_env env)
Loads the texture library.
Definition: nlua_tex.c:62
int nlua_loadTk(nlua_env env)
Loads the Toolkit Lua library.
Definition: nlua_tk.c:90
unsigned int npc_add_mission(unsigned int mid, const char *func, const char *name, int priority, glTexture *portrait, const char *desc, glTexture *background)
Adds a mission NPC to the mission computer.
Definition: npc.c:168
int npc_rm_mission(unsigned int id, unsigned int mid)
removes a mission NPC.
Definition: npc.c:255
void gl_freeTexture(glTexture *texture)
Frees a texture.
Definition: opengl_tex.c:755
unsigned int pilot_addMissionCargo(Pilot *pilot, const Commodity *cargo, int quantity)
Adds special mission cargo, can't sell it and such.
Definition: pilot_cargo.c:236
int pilot_rmMissionCargo(Pilot *pilot, unsigned int cargo_id, int jettison)
Removes special mission cargo based on id.
Definition: pilot_cargo.c:264
Player_t player
Definition: player.c:73
void player_missionFinished(int id)
Marks a mission as completed.
Definition: player.c:2896
int system_index(const StarSystem *sys)
Gets the index of a star system.
Definition: space.c:955
Represents a commodity.
Definition: commodity.h:43
int * factions
Definition: mission.h:48
int priority
Definition: mission.h:53
Static mission data.
Definition: mission.h:61
char * name
Definition: mission.h:62
MissionAvail_t avail
Definition: mission.h:64
Mission system marker.
MissionMarkerType type
Represents an active mission.
Definition: mission.h:79
Claim_t * claims
Definition: mission.h:103
unsigned int osd
Definition: mission.h:99
char * npc_desc
Definition: mission.h:90
unsigned int id
Definition: mission.h:81
glTexture * portrait
Definition: mission.h:88
int osd_set
Definition: mission.h:100
nlua_env env
Definition: mission.h:105
char * reward
Definition: mission.h:86
char * desc
Definition: mission.h:85
MissionMarker * markers
Definition: mission.h:96
char * title
Definition: mission.h:84
const MissionData * data
Definition: mission.h:80
credits_t reward_value
Definition: mission.h:87
int accepted
Definition: mission.h:82
char * npc
Definition: mission.h:89
Pilot * p
Definition: player.h:101
Abstraction for rendering sprite sheets.
Definition: opengl_tex.h:34