naev 0.11.5
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( const Mission *misn, const char *func, int nargs )
216{
217 int ret, misn_delete;
218 Mission *cur_mission;
219 nlua_env env;
220
221 /* Check to see if it is accepted first. */
222 int isaccepted = misn->accepted;
223
224 /* Set up and run function. */
225 env = misn->env;
226 ret = nlua_pcall(env, nargs, 0);
227
228 /* The mission can change if accepted. */
229 nlua_getenv(naevL, env, "__misn");
230 cur_mission = *(Mission**) lua_touserdata(naevL, -1);
231 lua_pop(naevL, 1);
232
233 if (ret != 0) { /* error has occurred */
234 const char* err = (lua_isstring(naevL,-1)) ? lua_tostring(naevL,-1) : NULL;
235 if ((err==NULL) || (strcmp(err,NLUA_DONE)!=0)) {
236 WARN(_("Mission '%s' -> '%s': %s"),
237 cur_mission->data->name, func, (err) ? err : _("unknown error"));
238 ret = -1;
239 }
240 else
241 ret = 1;
242 lua_pop(naevL,1);
243 }
244
245 /* Get delete. */
246 nlua_getenv(naevL, env, "__misn_delete");
247 misn_delete = lua_toboolean(naevL,-1);
248 lua_pop(naevL,1);
249
250 /* Mission is finished */
251 if (misn_delete) {
252 ret = 2;
253 mission_cleanup( cur_mission );
254 for (int i=0; i<array_size(player_missions); i++) {
255 if (cur_mission != player_missions[i])
256 continue;
257
258 mission_shift(i);
259 break;
260 }
261 }
262 /* Mission became accepted. */
263 else if (!isaccepted && cur_mission->accepted)
264 ret = 3;
265
266 return ret;
267}
268
275static int misn_setTitle( lua_State *L )
276{
277 const char *str = luaL_checkstring(L,1);
278 Mission *cur_mission = misn_getFromLua(L);
279 free(cur_mission->title);
280 cur_mission->title = strdup(str);
281 return 0;
282}
292static int misn_setDesc( lua_State *L )
293{
294 const char *str = luaL_checkstring(L,1);
295 Mission *cur_mission = misn_getFromLua(L);
296 free(cur_mission->desc);
297 cur_mission->desc = strdup(str);
298 return 0;
299}
306static int misn_setReward( lua_State *L )
307{
308 Mission *cur_mission = misn_getFromLua(L);
309 free(cur_mission->reward);
310 cur_mission->reward_value = -1.;
311 if (lua_isnumber(L,1)) {
312 char buf[ECON_CRED_STRLEN];
313 cur_mission->reward_value = CLAMP( CREDITS_MIN, CREDITS_MAX, (credits_t)round(luaL_checknumber(L,1)) );
314 credits2str( buf, cur_mission->reward_value, 2 );
315 cur_mission->reward = strdup(buf);
316 }
317 else {
318 const char *str = luaL_checkstring(L,1);
319 cur_mission->reward = strdup(str);
320 }
321 return 0;
322}
323
340static int misn_markerAdd( lua_State *L )
341{
342 int id, issys, objid;
343 const char *stype;
344 MissionMarkerType type;
345 Mission *cur_mission;
346
347 /* Check parameters. */
348 if (lua_isspob(L,1)) {
349 issys = 0;
350 objid = luaL_checkspob(L,1);
351 }
352 else {
353 issys = 1;
354 objid = system_index( luaL_validsystem(L,1) );
355 }
356 stype = luaL_optstring( L, 2, "high" );
357
358 /* Handle types. */
359 if (strcmp(stype, "computer")==0)
360 type = SPOBMARKER_COMPUTER;
361 else if (strcmp(stype, "low")==0)
362 type = SPOBMARKER_LOW;
363 else if (strcmp(stype, "high")==0)
364 type = SPOBMARKER_HIGH;
365 else if (strcmp(stype, "plot")==0)
366 type = SPOBMARKER_PLOT;
367 else
368 return NLUA_ERROR(L, _("Unknown marker type: %s"), stype);
369
370 /* Convert spob -> system. */
371 if (issys)
372 type = mission_markerTypeSpobToSystem( type );
373
374 cur_mission = misn_getFromLua(L);
375
376 /* Add the marker. */
377 id = mission_addMarker( cur_mission, -1, objid, type );
378
379 /* Update system markers. */
381
382 /* Return the ID. */
383 lua_pushnumber( L, id );
384 return 1;
385}
386
396static int misn_markerMove( lua_State *L )
397{
398 int id, objid, issys;
399 MissionMarker *marker;
400 Mission *cur_mission;
401
402 /* Handle parameters. */
403 id = luaL_checkinteger( L, 1 );
404 if (lua_isspob(L,2)) {
405 issys = 0;
406 objid = luaL_checkspob(L,2);
407 }
408 else {
409 issys = 1;
410 objid = luaL_checksystem(L,2);
411 }
412
413 cur_mission = misn_getFromLua(L);
414
415 /* Check id. */
416 marker = NULL;
417 for (int i=0; i<array_size(cur_mission->markers); i++) {
418 if (id == cur_mission->markers[i].id) {
419 marker = &cur_mission->markers[i];
420 break;
421 }
422 }
423 if (marker == NULL)
424 return NLUA_ERROR( L, _("Mission does not have a marker with id '%d'"), id );
425
426 /* Update system. */
427 if (issys)
428 marker->type = mission_markerTypeSpobToSystem( marker->type );
429 else
430 marker->type = mission_markerTypeSystemToSpob( marker->type );
431 marker->objid = objid;
432
433 /* Update system markers. */
435 return 0;
436}
437
446static int misn_markerRm( lua_State *L )
447{
448 int id;
449 MissionMarker *marker;
450 Mission *cur_mission = misn_getFromLua(L);
451
452 /* Remove all markers. */
453 if (lua_isnoneornil(L,1)) {
454 array_erase( &cur_mission->markers, array_begin(cur_mission->markers), array_end(cur_mission->markers) );
456 return 0;
457 }
458
459 /* Handle parameters. */
460 id = luaL_checkinteger( L, 1 );
461
462 /* Check id. */
463 marker = NULL;
464 for (int i=0; i<array_size( cur_mission->markers ); i++) {
465 if (id == cur_mission->markers[i].id) {
466 marker = &cur_mission->markers[i];
467 break;
468 }
469 }
470 if (marker == NULL) {
471 /* Already removed. */
472 return 0;
473 }
474
475 /* Remove the marker. */
476 array_erase( &cur_mission->markers, &marker[0], &marker[1] );
477
478 /* Update system markers. */
480 return 0;
481}
482
500static int misn_setNPC( lua_State *L )
501{
502 const char *name, *desc;
503 Mission *cur_mission;
504
505 cur_mission = misn_getFromLua(L);
506
507 gl_freeTexture(cur_mission->portrait);
508 cur_mission->portrait = NULL;
509
510 free(cur_mission->npc);
511 cur_mission->npc = NULL;
512
513 free(cur_mission->npc_desc);
514 cur_mission->npc_desc = NULL;
515
516 /* For no parameters just leave having freed NPC. */
517 if (lua_gettop(L) == 0)
518 return 0;
519
520 /* Get parameters. */
521 name = luaL_checkstring(L,1);
522 cur_mission->portrait = luaL_validtex(L,2,GFX_PATH"portraits/");
523 desc = luaL_checkstring(L,3);
524
525 /* Set NPC name and description. */
526 cur_mission->npc = strdup(name);
527 cur_mission->npc_desc = strdup(desc);
528
529 return 0;
530}
531
539static int misn_factions( lua_State *L )
540{
541 Mission *cur_mission = misn_getFromLua(L);
542 const MissionData *dat = cur_mission->data;
543
544 /* we'll push all the factions in table form */
545 lua_newtable(L);
546 for (int i=0; i<array_size(dat->avail.factions); i++) {
547 LuaFaction f = dat->avail.factions[i];
548 lua_pushfaction(L, f); /* value */
549 lua_rawseti(L,-2,i+1); /* store the value in the table */
550 }
551 return 1;
552}
562static int misn_accept( lua_State *L )
563{
564 Mission *new_misn, *cur_mission;
565 int ret = 0;
566
567 if (player_missions == NULL)
569
570 /* Clean up old stale stuff if necessary. */
571 for (int i=array_size(player_missions)-1; i>=0; i--) {
572 Mission *m = player_missions[i];
573 if (m->id != 0)
574 continue;
575 mission_cleanup( m );
576 free( m );
578 }
579
580 /* Create the new mission. */
581 new_misn = calloc( 1, sizeof(Mission) );
582 array_push_back( &player_missions, new_misn );
583
584 cur_mission = misn_getFromLua(L);
585
586 /* no missions left */
587 if (cur_mission->accepted)
588 return NLUA_ERROR(L, _("Mission already accepted!"));
589 else { /* copy it over */
590 Mission **misnptr;
591 *new_misn = *cur_mission;
592 memset( cur_mission, 0, sizeof(Mission) );
593 cur_mission->env = LUA_NOREF;
594 cur_mission->accepted = 1; /* Propagated to the mission computer. */
595 cur_mission = new_misn;
596 cur_mission->accepted = 1; /* Mark as accepted. */
597
598 /* Need to change pointer. */
599 misnptr = lua_newuserdata( L, sizeof(Mission*) );
600 *misnptr = cur_mission;
601 nlua_setenv( L, cur_mission->env, "__misn" );
602 }
603
604 lua_pushboolean(L,!ret); /* we'll convert C style return to Lua */
605 return 1;
606}
617static int misn_finish( lua_State *L )
618{
619 int b = lua_toboolean(L,1);
620 Mission *cur_mission = misn_getFromLua(L);
621
622 lua_pushboolean( L, 1 );
623 nlua_setenv( L, cur_mission->env, "__misn_delete" );
624
625 if (b)
626 player_missionFinished( mission_getID( cur_mission->data->name ) );
627
628 lua_pushstring(L, NLUA_DONE);
629 lua_error(L); /* shouldn't return */
630
631 return 0;
632}
633
645static int misn_cargoAdd( lua_State *L )
646{
647 Commodity *cargo;
648 int quantity, ret;
649 Mission *cur_mission;
650
651 /* Parameters. */
652 cargo = luaL_validcommodity(L,1);
653 quantity = luaL_checkint(L,2);
654
655 cur_mission = misn_getFromLua(L);
656
657 /* First try to add the cargo. */
658 ret = pilot_addMissionCargo( player.p, cargo, quantity );
659 mission_linkCargo( cur_mission, ret );
660
661 lua_pushnumber(L, ret);
662 return 1;
663}
671static int misn_cargoRm( lua_State *L )
672{
673 int ret;
674 unsigned int id;
675 Mission *cur_mission;
676
677 id = luaL_checklong(L,1);
678
679 /* First try to remove the cargo from player. */
680 if (pilot_rmMissionCargo( player.p, id, 0 ) != 0) {
681 lua_pushboolean(L,0);
682 return 1;
683 }
684
685 cur_mission = misn_getFromLua(L);
686
687 /* Now unlink the mission cargo if it was successful. */
688 ret = mission_unlinkCargo( cur_mission, id );
689
690 lua_pushboolean(L,!ret);
691 return 1;
692}
700static int misn_cargoJet( lua_State *L )
701{
702 int ret;
703 unsigned int id;
704 Mission *cur_mission;
705
706 id = luaL_checklong(L,1);
707
708 /* First try to remove the cargo from player. */
709 if (pilot_rmMissionCargo( player.p, id, 1 ) != 0) {
710 lua_pushboolean(L,0);
711 return 1;
712 }
713
714 cur_mission = misn_getFromLua(L);
715
716 /* Now unlink the mission cargo if it was successful. */
717 ret = mission_unlinkCargo( cur_mission, id );
718
719 lua_pushboolean(L,!ret);
720 return 1;
721}
722
735static int misn_osdCreate( lua_State *L )
736{
737 const char *title;
738 int nitems;
739 char **items;
740 Mission *cur_mission = misn_getFromLua(L);
741
742 /* Must be accepted. */
743 if (!cur_mission->accepted) {
744 WARN(_("Can't create an OSD on an unaccepted mission!"));
745 return 0;
746 }
747
748 /* Check parameters. */
749 title = luaL_checkstring(L,1);
750 luaL_checktype(L,2,LUA_TTABLE);
751 nitems = lua_objlen(L,2);
752
753 /* Destroy OSD if already exists. */
754 if (cur_mission->osd != 0) {
755 osd_destroy( cur_mission->osd );
756 cur_mission->osd = 0;
757 }
758
759 /* Allocate items. */
760 items = calloc( nitems, sizeof(char *) );
761
762 /* Get items. */
763 for (int i=0; i<nitems; i++) {
764 lua_pushnumber(L,i+1);
765 lua_gettable(L,2);
766 if (!lua_isstring(L,-1)) {
767 free(items);
768 luaL_typerror(L, -1, "string");
769 return 0;
770 }
771 items[i] = strdup( lua_tostring(L, -1) );
772 lua_pop(L,1);
773 }
774
775 /* Create OSD. */
776 cur_mission->osd = osd_create( title, nitems, (const char**) items,
777 cur_mission->data->avail.priority );
778 cur_mission->osd_set = 1; /* OSD was explicitly set. */
779
780 /* Free items. */
781 for (int i=0; i<nitems; i++)
782 free(items[i]);
783 free(items);
784
785 return 0;
786}
787
793static int misn_osdDestroy( lua_State *L )
794{
795 Mission *cur_mission = misn_getFromLua(L);
796
797 if (cur_mission->osd != 0) {
798 osd_destroy( cur_mission->osd );
799 cur_mission->osd = 0;
800 }
801
802 return 0;
803}
804
813static int misn_osdActive( lua_State *L )
814{
815 int n;
816 Mission *cur_mission;
817
818 n = luaL_checkint(L,1);
819 n = n-1; /* Convert to C index. */
820
821 cur_mission = misn_getFromLua(L);
822
823 if (cur_mission->osd != 0)
824 osd_active( cur_mission->osd, n );
825
826 return 0;
827}
828
835static int misn_osdGetActiveItem( lua_State *L )
836{
837 const Mission *cur_mission = misn_getFromLua(L);
838 char **items = osd_getItems(cur_mission->osd);
839 int active = osd_getActive(cur_mission->osd);
840
841 if (!items || active < 0) {
842 lua_pushnil(L);
843 return 1;
844 }
845
846 lua_pushstring(L, items[active]);
847 return 1;
848}
849
858static int misn_osdGet( lua_State *L )
859{
860 const Mission *cur_mission = misn_getFromLua(L);
861 char **items;
862
863 if (cur_mission->osd == 0)
864 return 0;
865
866 lua_pushstring( L, osd_getTitle(cur_mission->osd) );
867 lua_newtable(L);
868 items = osd_getItems(cur_mission->osd);
869 for (int i=0; i<array_size(items); i++) {
870 lua_pushstring( L, items[i] );
871 lua_rawseti( L, -2, i+1 );
872 }
873 lua_pushinteger( L, osd_getActive(cur_mission->osd) );
874 return 3;
875}
876
891static int misn_npcAdd( lua_State *L )
892{
893 unsigned int id;
894 int priority;
895 const char *func, *name, *desc;
896 glTexture *portrait, *bg;
897 Mission *cur_mission;
898
899 /* Handle parameters. */
900 func = luaL_checkstring(L, 1);
901 name = luaL_checkstring(L, 2);
902 portrait = luaL_validtex( L, 3, GFX_PATH"portraits/" );
903 desc = luaL_checkstring(L, 4);
904
905 /* Optional parameters. */
906 priority = luaL_optinteger(L,5,5);
907 if (!lua_isnoneornil(L,6))
908 bg = luaL_validtex( L, 6, GFX_PATH"portraits/" );
909 else
910 bg = NULL;
911
912 cur_mission = misn_getFromLua(L);
913
914 /* Add npc. */
915 id = npc_add_mission( cur_mission->id, func, name, priority, portrait, desc, bg );
916
917 /* Regenerate bar. */
918 bar_regen();
919
920 /* Return ID. */
921 if (id > 0) {
922 lua_pushnumber( L, id );
923 return 1;
924 }
925 return 0;
926}
927
936static int misn_npcRm( lua_State *L )
937{
938 unsigned int id = luaL_checklong(L, 1);
939 const Mission *cur_mission = misn_getFromLua(L);
940 int ret = npc_rm_mission( id, cur_mission->id );
941
942 /* Regenerate bar. */
943 bar_regen();
944
945 if (ret != 0)
946 return NLUA_ERROR(L, _("Invalid NPC ID!"));
947 return 0;
948}
949
968static int misn_claim( lua_State *L )
969{
970 Claim_t *claim;
971 Mission *cur_mission;
972 int inclusive;
973
974 /* Get mission. */
975 cur_mission = misn_getFromLua(L);
976
977 inclusive = lua_toboolean(L,2);
978
979 /* Check to see if already claimed. */
980 if (!claim_isNull(cur_mission->claims))
981 return NLUA_ERROR(L, _("Mission trying to claim but already has."));
982
983 /* Create the claim. */
984 claim = claim_create( !inclusive );
985
986 if (lua_istable(L,1)) {
987 /* Iterate over table. */
988 lua_pushnil(L);
989 while (lua_next(L, 1) != 0) {
990 if (lua_issystem(L,-1))
991 claim_addSys( claim, lua_tosystem( L, -1 ) );
992 else if (lua_isstring(L,-1))
993 claim_addStr( claim, lua_tostring( L, -1 ) );
994 lua_pop(L,1);
995 }
996 }
997 else if (lua_issystem(L, 1))
998 claim_addSys( claim, lua_tosystem( L, 1 ) );
999 else if (lua_isstring(L, 1))
1000 claim_addStr( claim, lua_tostring( L, 1 ) );
1001 else
1002 NLUA_INVALID_PARAMETER(L,1);
1003
1004 /* Test claim. */
1005 if (claim_test( claim )) {
1006 claim_destroy( claim );
1007 lua_pushboolean(L,0);
1008 return 1;
1009 }
1010
1011 /* Set the claim. */
1012 cur_mission->claims = claim;
1013 claim_activate( claim );
1014 lua_pushboolean(L,1);
1015 return 1;
1016}
1017
1018void misn_pushMissionData( lua_State *L, const MissionData *md )
1019{
1020 const MissionAvail_t *ma = &md->avail;
1021
1022 lua_newtable(L);
1023
1024 lua_pushstring( L, md->name );
1025 lua_setfield(L,-2,"name");
1026
1027 lua_pushstring( L, mission_availabilityStr(ma->loc) );
1028 lua_setfield(L,-2,"loc");
1029
1030 lua_pushinteger( L, ma->chance );
1031 lua_setfield(L,-2,"chance");
1032
1033 if (ma->spob != NULL) {
1034 lua_pushstring( L, ma->spob );
1035 lua_setfield(L,-2,"spob");
1036 }
1037
1038 if (ma->system != NULL) {
1039 lua_pushstring( L, ma->system );
1040 lua_setfield(L,-2,"system");
1041 }
1042
1043 if (ma->chapter != NULL) {
1044 lua_pushstring( L, ma->chapter );
1045 lua_setfield(L,-2,"chapter");
1046 }
1047
1048 /* TODO factions. */
1049
1050 if (ma->cond != NULL) {
1051 lua_pushstring( L, ma->cond );
1052 lua_setfield(L,-2,"cond");
1053 }
1054
1055 if (ma->done != NULL) {
1056 lua_pushstring( L, ma->done );
1057 lua_setfield(L,-2,"done");
1058 }
1059
1060 lua_pushinteger( L, ma->priority );
1061 lua_setfield(L,-2,"priority");
1062
1063 if (mis_isFlag(md,MISSION_UNIQUE)) {
1064 lua_pushboolean( L, 1 );
1065 lua_setfield(L,-2,"unique");
1066 }
1067
1068 lua_newtable(L);
1069 for (int t=0; t<array_size(md->tags); t++) {
1070 lua_pushstring( L, md->tags[t] );
1071 lua_pushboolean( L, 1 );
1072 lua_rawset( L, -3 );
1073 }
1074 lua_setfield(L,-2,"tags");
1075}
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 credits2str(char *str, credits_t credits, int decimals)
Converts credits to a usable string for displaying.
Definition commodity.c:59
void bar_regen(void)
Regenerates the bar list.
Definition land.c:382
Mission ** player_missions
Definition mission.c:47
void mission_cleanup(Mission *misn)
Cleans up a mission.
Definition mission.c:739
int mission_addMarker(Mission *misn, int id, int objid, MissionMarkerType type)
Adds a system marker to a mission.
Definition mission.c:549
int mission_linkCargo(Mission *misn, unsigned int cargo_id)
Links cargo to the mission for posterior cleanup.
Definition mission.c:701
void mission_sysMark(void)
Marks all active systems that need marking.
Definition mission.c:578
void mission_shift(int pos)
Puts the specified mission at the end of the player_missions array.
Definition mission.c:791
int mission_getID(const char *name)
Gets id from mission name.
Definition mission.c:100
int mission_unlinkCargo(Mission *misn, unsigned int cargo_id)
Unlinks cargo from the mission, removes it from the player.
Definition mission.c:716
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:798
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:49
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.
int nlua_loadHook(nlua_env env)
Loads the hook Lua library.
Definition nlua_hook.c:125
static int misn_factions(lua_State *L)
Gets the factions the mission is available for.
Definition nlua_misn.c:539
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:936
static int misn_osdGet(lua_State *L)
Gets the current mission OSD information.
Definition nlua_misn.c:858
static int misn_osdActive(lua_State *L)
Sets active in mission OSD.
Definition nlua_misn.c:813
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:793
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:617
static int misn_markerMove(lua_State *L)
Moves a marker to a new system.
Definition nlua_misn.c:396
static int misn_osdCreate(lua_State *L)
Creates a mission OSD.
Definition nlua_misn.c:735
static int misn_cargoRm(lua_State *L)
Removes the mission cargo.
Definition nlua_misn.c:671
static int misn_setTitle(lua_State *L)
Mission Lua bindings.
Definition nlua_misn.c:275
static int misn_claim(lua_State *L)
Tries to claim systems or strings.
Definition nlua_misn.c:968
int misn_runFunc(const Mission *misn, const char *func, int nargs)
Runs a mission set up with misn_runStart.
Definition nlua_misn.c:215
static int misn_markerAdd(lua_State *L)
Adds a new marker.
Definition nlua_misn.c:340
static int misn_osdGetActiveItem(lua_State *L)
Gets the active OSD element.
Definition nlua_misn.c:835
static int misn_setReward(lua_State *L)
Sets the current mission reward description.
Definition nlua_misn.c:306
static int misn_accept(lua_State *L)
Attempts to accept the mission.
Definition nlua_misn.c:562
static int misn_setDesc(lua_State *L)
Sets the current mission description.
Definition nlua_misn.c:292
static int misn_cargoJet(lua_State *L)
Jettisons the mission cargo.
Definition nlua_misn.c:700
static int misn_markerRm(lua_State *L)
Removes a mission system marker.
Definition nlua_misn.c:446
static int misn_npcAdd(lua_State *L)
Adds an NPC.
Definition nlua_misn.c:891
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:645
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:500
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:160
int lua_isspob(lua_State *L, int ind)
Checks to see if ind is a spob.
Definition nlua_spob.c:216
LuaSystem luaL_checksystem(lua_State *L, int ind)
Gets system at index raising an error if type doesn't match.
StarSystem * luaL_validsystem(lua_State *L, int ind)
Gets system (or system name) at index raising an error if type doesn't match.
LuaSystem lua_tosystem(lua_State *L, int ind)
Lua system module.
int lua_issystem(lua_State *L, int ind)
Checks to see if ind is a system.
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:93
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:169
int npc_rm_mission(unsigned int id, unsigned int mid)
removes a mission NPC.
Definition npc.c:256
void gl_freeTexture(glTexture *texture)
Frees a texture.
Definition opengl_tex.c:862
unsigned int pilot_addMissionCargo(Pilot *pilot, const Commodity *cargo, int quantity)
Adds special mission cargo, can't sell it and such.
int pilot_rmMissionCargo(Pilot *pilot, unsigned int cargo_id, int jettison)
Removes special mission cargo based on id.
Player_t player
Definition player.c:74
void player_missionFinished(int id)
Marks a mission as completed.
Definition player.c:2930
int system_index(const StarSystem *sys)
Gets the index of a star system.
Definition space.c:1000
Represents a commodity.
Definition commodity.h:43
Defines the availability of a mission.
Definition mission.h:37
MissionAvailability loc
Definition mission.h:38
char * chapter
Definition mission.h:44
int * factions
Definition mission.h:48
char * done
Definition mission.h:52
char * spob
Definition mission.h:42
char * system
Definition mission.h:43
char * cond
Definition mission.h:50
Static mission data.
Definition mission.h:62
char * name
Definition mission.h:63
MissionAvail_t avail
Definition mission.h:65
char ** tags
Definition mission.h:73
Mission system marker.
MissionMarkerType type
Represents an active mission.
Definition mission.h:81
Claim_t * claims
Definition mission.h:105
unsigned int osd
Definition mission.h:101
char * npc_desc
Definition mission.h:92
unsigned int id
Definition mission.h:83
glTexture * portrait
Definition mission.h:90
int osd_set
Definition mission.h:102
nlua_env env
Definition mission.h:107
char * reward
Definition mission.h:88
char * desc
Definition mission.h:87
MissionMarker * markers
Definition mission.h:98
char * title
Definition mission.h:86
const MissionData * data
Definition mission.h:82
credits_t reward_value
Definition mission.h:89
int accepted
Definition mission.h:84
char * npc
Definition mission.h:91
Pilot * p
Definition player.h:101
Abstraction for rendering sprite sheets.
Definition opengl_tex.h:36