naev 0.12.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"
16
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 "ndata.h"
25#include "nlua.h"
26#include "nlua_bkg.h"
27#include "nlua_camera.h"
28#include "nlua_commodity.h"
29#include "nlua_faction.h"
30#include "nlua_hook.h"
31#include "nlua_music.h"
32#include "nlua_spob.h"
33#include "nlua_system.h"
34#include "nlua_tex.h"
35#include "nlua_tk.h"
36#include "nluadef.h"
37#include "npc.h"
38#include "player.h"
39#include "player_fleet.h"
40
52
53/*
54 * libraries
55 */
56/* Mission methods */
57static int misn_setTitle( lua_State *L );
58static int misn_setDesc( lua_State *L );
59static int misn_setReward( lua_State *L );
60static int misn_setDistance( lua_State *L );
61static int misn_setIllegal( lua_State *L );
62static int misn_setFaction( lua_State *L );
63static int misn_setNPC( lua_State *L );
64static int misn_factions( lua_State *L );
65static int misn_accept( lua_State *L );
66static int misn_finish( lua_State *L );
67static int misn_markerAdd( lua_State *L );
68static int misn_markerMove( lua_State *L );
69static int misn_markerRm( lua_State *L );
70static int misn_cargoAdd( lua_State *L );
71static int misn_cargoRm( lua_State *L );
72static int misn_cargoJet( lua_State *L );
73static int misn_osdCreate( lua_State *L );
74static int misn_osdDestroy( lua_State *L );
75static int misn_osdActive( lua_State *L );
76static int misn_osdGet( lua_State *L );
77static int misn_osdGetActiveItem( lua_State *L );
78static int misn_npcAdd( lua_State *L );
79static int misn_npcRm( lua_State *L );
80static int misn_claim( lua_State *L );
81static int misn_computerRefresh( lua_State *L );
82
83static const luaL_Reg misn_methods[] = {
84 { "setTitle", misn_setTitle },
85 { "setDesc", misn_setDesc },
86 { "setReward", misn_setReward },
87 { "setDistance", misn_setDistance },
88 { "setIllegal", misn_setIllegal },
89 { "setFaction", misn_setFaction },
90 { "setNPC", misn_setNPC },
91 { "factions", misn_factions },
92 { "accept", misn_accept },
93 { "finish", misn_finish },
94 { "markerAdd", misn_markerAdd },
95 { "markerMove", misn_markerMove },
96 { "markerRm", misn_markerRm },
97 { "cargoAdd", misn_cargoAdd },
98 { "cargoRm", misn_cargoRm },
99 { "cargoJet", misn_cargoJet },
100 { "osdCreate", misn_osdCreate },
101 { "osdDestroy", misn_osdDestroy },
102 { "osdActive", misn_osdActive },
103 { "osdGet", misn_osdGet },
104 { "osdGetActive", misn_osdGetActiveItem },
105 { "npcAdd", misn_npcAdd },
106 { "npcRm", misn_npcRm },
107 { "claim", misn_claim },
108 { "computerRefresh", misn_computerRefresh },
109 { 0, 0 } };
110
115 * @return 0 on success.
116 */
117int misn_loadLibs( nlua_env env )
118{
119 nlua_loadStandard( env );
120 nlua_loadMisn( env );
121 nlua_loadHook( env );
122 nlua_loadCamera( env );
123 nlua_loadTex( env );
124 nlua_loadBackground( env );
125 nlua_loadMusic( env );
126 nlua_loadTk( env );
127 return 0;
128}
129/*
130 * individual library loading
131 */
134 * @param env Lua environment.
135 */
136int nlua_loadMisn( nlua_env env )
137{
138 nlua_register( env, "misn", misn_methods, 0 );
139 return 0;
140}
141
148 * 3 if the mission got accepted, and 0 normally.
149 */
150int misn_tryRun( Mission *misn, const char *func )
151{
152 int ret;
153 /* Get the function to run. */
154 misn_runStart( misn, func );
155 if ( lua_isnil( naevL, -1 ) ) {
156 lua_pop( naevL, 1 );
157 return 0;
158 }
159 ret = misn_runFunc( misn, func, 0 );
160 return ret;
161}
162
169 * 3 if the mission got accepted, and 0 normally.
170 */
171int misn_run( Mission *misn, const char *func )
172{
173 misn_runStart( misn, func );
174 return misn_runFunc( misn, func, 0 );
175}
176
180 * This should ONLY be called below an nlua_pcall, so __NLUA_CURENV is set
181 */
182Mission *misn_getFromLua( lua_State *L )
183{
184 Mission *misn, **misnptr;
185
186 nlua_getenv( L, __NLUA_CURENV, "__misn" );
187 misnptr = lua_touserdata( L, -1 );
188 misn = misnptr ? *misnptr : NULL;
189 lua_pop( L, 1 );
190
191 return misn;
192}
193
195 * @brief Sets up the mission to run misn_runFunc.
196 */
197void misn_runStart( Mission *misn, const char *func )
198{
199 Mission **misnptr;
200 misnptr = lua_newuserdata( naevL, sizeof( Mission *) );
201 *misnptr = misn;
202 nlua_setenv( naevL, misn->env, "__misn" );
203
204 /* Set the Lua state. */
205 nlua_getenv( naevL, misn->env, func );
206}
207
215 * 3 if the mission got accepted, and 0 normally.
216 */
217int misn_runFunc( const Mission *misn, const char *func, int nargs )
218{
219 int ret, misn_delete;
220 Mission *cur_mission;
221 nlua_env env;
222
223 /* Check to see if it is accepted first. */
224 int 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 =
237 ( lua_isstring( naevL, -1 ) ) ? lua_tostring( naevL, -1 ) : NULL;
238 if ( ( err == NULL ) || ( strcmp( err, NLUA_DONE ) != 0 ) ) {
239 WARN( _( "Mission '%s' -> '%s': %s" ), cur_mission->data->name, func,
240 ( err ) ? err : _( "unknown error" ) );
241 ret = -1;
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
275 * @luafunc setTitle
276 */
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}
292 * @luafunc setDesc
293 */
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}
307 * @luafunc setReward
308 */
309static int misn_setReward( lua_State *L )
310{
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 =
317 CLAMP( CREDITS_MIN, CREDITS_MAX,
318 (credits_t)round( luaL_checknumber( L, 1 ) ) );
319 credits2str( buf, cur_mission->reward_value, 2 );
320 cur_mission->reward = strdup( buf );
321 } else {
322 const char *str = luaL_checkstring( L, 1 );
323 cur_mission->reward = strdup( str );
324 cur_mission->reward_value = 0;
325 }
326 return 0;
327}
328
334 * @luafunc setDistance
335 */
336static int misn_setDistance( lua_State *L )
337{
338 Mission *cur_mission = misn_getFromLua( L );
339 cur_mission->distance = luaL_checklong( L, 1 );
340 return 0;
341}
342
350 * @luafunc setIllegal
351 */
352static int misn_setIllegal( lua_State *L )
353{
354 Mission *cur_mission = misn_getFromLua( L );
355 cur_mission->illegal = lua_toboolean( L, 1 );
356 return 0;
357}
358
364 * @luafunc setFaction
365 */
366static int misn_setFaction( lua_State *L )
367{
368 Mission *cur_mission = misn_getFromLua( L );
369 if ( lua_isnoneornil( L, 1 ) )
370 cur_mission->faction = -1;
371 else
372 cur_mission->faction = luaL_validfaction( L, 1 );
373 return 0;
374}
375
390 * @luafunc markerAdd
391 */
392static int misn_markerAdd( lua_State *L )
393{
394 int id, issys, objid;
395 const char *stype;
396 MissionMarkerType type;
397 Mission *cur_mission;
398
399 /* Check parameters. */
400 if ( lua_isspob( L, 1 ) ) {
401 issys = 0;
402 objid = luaL_checkspob( L, 1 );
403 } else {
404 issys = 1;
405 objid = system_index( luaL_validsystem( L, 1 ) );
406 }
407 stype = luaL_optstring( L, 2, "high" );
408
409 /* Handle types. */
410 if ( strcmp( stype, "computer" ) == 0 )
411 type = SPOBMARKER_COMPUTER;
412 else if ( strcmp( stype, "low" ) == 0 )
413 type = SPOBMARKER_LOW;
414 else if ( strcmp( stype, "high" ) == 0 )
415 type = SPOBMARKER_HIGH;
416 else if ( strcmp( stype, "plot" ) == 0 )
417 type = SPOBMARKER_PLOT;
418 else
419 return NLUA_ERROR( L, _( "Unknown marker type: %s" ), stype );
420
421 /* Convert spob -> system. */
422 if ( issys )
423 type = mission_markerTypeSpobToSystem( type );
424
425 cur_mission = misn_getFromLua( L );
426
427 /* Add the marker. */
428 id = mission_addMarker( cur_mission, -1, objid, type );
429
430 /* Update system markers. */
432
433 /* Return the ID. */
434 lua_pushnumber( L, id );
435 return 1;
436}
437
445 * @luafunc markerMove
446 */
447static int misn_markerMove( lua_State *L )
448{
449 int id, objid, issys;
450 MissionMarker *marker;
451 Mission *cur_mission;
452
453 /* Handle parameters. */
454 id = luaL_checkinteger( L, 1 );
455 if ( lua_isspob( L, 2 ) ) {
456 issys = 0;
457 objid = luaL_checkspob( L, 2 );
458 } else {
459 issys = 1;
460 objid = luaL_checksystem( L, 2 );
461 }
462
463 cur_mission = misn_getFromLua( L );
464
465 /* Check id. */
466 marker = NULL;
467 for ( int i = 0; i < array_size( cur_mission->markers ); i++ ) {
468 if ( id == cur_mission->markers[i].id ) {
469 marker = &cur_mission->markers[i];
470 break;
471 }
472 }
473 if ( marker == NULL )
474 return NLUA_ERROR( L, _( "Mission does not have a marker with id '%d'" ),
475 id );
476
477 /* Update system. */
478 if ( issys )
479 marker->type = mission_markerTypeSpobToSystem( marker->type );
480 else
481 marker->type = mission_markerTypeSystemToSpob( marker->type );
482 marker->objid = objid;
483
484 /* Update system markers. */
486 return 0;
487}
488
496 * @luafunc markerRm
497 */
498static int misn_markerRm( lua_State *L )
499{
500 int id;
501 MissionMarker *marker;
502 Mission *cur_mission = misn_getFromLua( L );
503
504 /* Remove all markers. */
505 if ( lua_isnoneornil( L, 1 ) ) {
506 array_erase( &cur_mission->markers, array_begin( cur_mission->markers ),
507 array_end( cur_mission->markers ) );
509 return 0;
510 }
511
512 /* Handle parameters. */
513 id = luaL_checkinteger( L, 1 );
514
515 /* Check id. */
516 marker = NULL;
517 for ( int i = 0; i < array_size( cur_mission->markers ); i++ ) {
518 if ( id == cur_mission->markers[i].id ) {
519 marker = &cur_mission->markers[i];
520 break;
521 }
522 }
523 if ( marker == NULL ) {
524 /* Already removed. */
525 return 0;
526 }
527
528 /* Remove the marker. */
529 array_erase( &cur_mission->markers, &marker[0], &marker[1] );
530
531 /* Update system markers. */
533 return 0;
534}
535
552 * @luafunc setNPC
553 */
554static int misn_setNPC( lua_State *L )
555{
556 const char *name, *desc;
557 Mission *cur_mission;
558
559 cur_mission = misn_getFromLua( L );
560
561 gl_freeTexture( cur_mission->portrait );
562 cur_mission->portrait = NULL;
563
564 free( cur_mission->npc );
565 cur_mission->npc = NULL;
566
567 free( cur_mission->npc_desc );
568 cur_mission->npc_desc = NULL;
569
570 /* For no parameters just leave having freed NPC. */
571 if ( lua_gettop( L ) == 0 )
572 return 0;
573
574 /* Get parameters. */
575 name = luaL_checkstring( L, 1 );
576 cur_mission->portrait = luaL_validtex( L, 2, GFX_PATH "portraits/" );
577 desc = luaL_checkstring( L, 3 );
578
579 /* Set NPC name and description. */
580 cur_mission->npc = strdup( name );
581 cur_mission->npc_desc = strdup( desc );
582
583 return 0;
584}
585
592 * @luafunc factions
593 */
594static int misn_factions( lua_State *L )
595{
596 Mission *cur_mission = misn_getFromLua( L );
597 const MissionData *dat = cur_mission->data;
598
599 /* we'll push all the factions in table form */
600 lua_newtable( L );
601 for ( int i = 0; i < array_size( dat->avail.factions ); i++ ) {
602 LuaFaction f = dat->avail.factions[i];
603 lua_pushfaction( L, f ); /* value */
604 lua_rawseti( L, -2, i + 1 ); /* store the value in the table */
605 }
606 return 1;
607}
616 * @luafunc accept
617 */
618static int misn_accept( lua_State *L )
619{
620 Mission *new_misn, *cur_mission;
621 int ret = 0;
622
623 if ( player_missions == NULL )
625
626 /* Clean up old stale stuff if necessary. */
627 for ( int i = array_size( player_missions ) - 1; i >= 0; i-- ) {
628 Mission *m = player_missions[i];
629 if ( m->id != 0 )
630 continue;
631 mission_cleanup( m );
632 free( m );
634 &player_missions[i + 1] );
635 }
636
637 /* Create the new mission. */
638 new_misn = calloc( 1, sizeof( Mission ) );
639 array_push_back( &player_missions, new_misn );
640
641 cur_mission = misn_getFromLua( L );
642
643 /* no missions left */
644 if ( cur_mission->accepted )
645 return NLUA_ERROR( L, _( "Mission already accepted!" ) );
646 else { /* copy it over */
647 Mission **misnptr;
648 *new_misn = *cur_mission;
649 memset( cur_mission, 0, sizeof( Mission ) );
650 cur_mission->env = LUA_NOREF;
651 cur_mission->accepted = 1; /* Propagated to the mission computer. */
652 cur_mission = new_misn;
653 cur_mission->accepted = 1; /* Mark as accepted. */
654
655 /* Need to change pointer. */
656 misnptr = lua_newuserdata( L, sizeof( Mission *) );
657 *misnptr = cur_mission;
658 nlua_setenv( L, cur_mission->env, "__misn" );
659 }
660
661 lua_pushboolean( L, !ret ); /* we'll convert C style return to Lua */
662 return 1;
663}
671 * @luafunc finish
672 */
673static int misn_finish( lua_State *L )
674{
675 int b = lua_toboolean( L, 1 );
676 Mission *cur_mission = misn_getFromLua( L );
677
678 lua_pushboolean( L, 1 );
679 nlua_setenv( L, cur_mission->env, "__misn_delete" );
680
681 if ( b )
682 player_missionFinished( mission_getID( cur_mission->data->name ) );
683
684 lua_pushstring( L, NLUA_DONE );
685 lua_error( L ); /* shouldn't return */
686
687 return 0;
688}
689
699 * @luafunc cargoAdd
700 */
701static int misn_cargoAdd( lua_State *L )
702{
703 Commodity *cargo;
704 int quantity, ret;
705 Mission *cur_mission;
706
707 /* Parameters. */
708 cargo = luaL_validcommodity( L, 1 );
709 quantity = luaL_checkint( L, 2 );
710
711 cur_mission = misn_getFromLua( L );
712
713 /* First try to add the cargo. */
714 ret = pfleet_cargoMissionAdd( cargo, quantity );
715 mission_linkCargo( cur_mission, ret );
716
717 lua_pushnumber( L, ret );
718 return 1;
719}
725 * @luafunc cargoRm
726 */
727static int misn_cargoRm( lua_State *L )
728{
729 int ret;
730 unsigned int id;
731 Mission *cur_mission;
732
733 id = luaL_checklong( L, 1 );
734
735 /* First try to remove the cargo from player, since only player can have it.
736 */
737 if ( pilot_rmMissionCargo( player.p, id, 0 ) != 0 ) {
738 lua_pushboolean( L, 0 );
739 return 1;
740 }
741
742 cur_mission = misn_getFromLua( L );
743
744 /* Now unlink the mission cargo if it was successful. */
745 ret = mission_unlinkCargo( cur_mission, id );
746
747 lua_pushboolean( L, !ret );
748 return 1;
749}
755 * @luafunc cargoJet
756 */
757static int misn_cargoJet( lua_State *L )
758{
759 int ret;
760 unsigned int id;
761 Mission *cur_mission;
762
763 id = luaL_checklong( L, 1 );
764
765 /* First try to remove the cargo from player. */
766 if ( pilot_rmMissionCargo( player.p, id, 1 ) != 0 ) {
767 lua_pushboolean( L, 0 );
768 return 1;
769 }
770
771 cur_mission = misn_getFromLua( L );
772
773 /* Now unlink the mission cargo if it was successful. */
774 ret = mission_unlinkCargo( cur_mission, id );
775
776 lua_pushboolean( L, !ret );
777 return 1;
778}
779
790 * @luafunc osdCreate
791 */
792static int misn_osdCreate( lua_State *L )
793{
794 const char *title;
795 int nitems;
796 char **items;
797 Mission *cur_mission = misn_getFromLua( L );
798
799 /* Must be accepted. */
800 if ( !cur_mission->accepted ) {
801 NLUA_WARN( L, _( "Can't create an OSD on an unaccepted mission!" ) );
802 return 0;
803 }
804
805 /* Check parameters. */
806 title = luaL_checkstring( L, 1 );
807 luaL_checktype( L, 2, LUA_TTABLE );
808 nitems = lua_objlen( L, 2 );
809
810 /* Destroy OSD if already exists. */
811 if ( cur_mission->osd != 0 ) {
812 osd_destroy( cur_mission->osd );
813 cur_mission->osd = 0;
814 }
815
816 /* Allocate items. */
817 items = calloc( nitems, sizeof( char * ) );
818
819 /* Get items. */
820 for ( int i = 0; i < nitems; i++ ) {
821 lua_pushnumber( L, i + 1 );
822 lua_gettable( L, 2 );
823 if ( !lua_isstring( L, -1 ) ) {
824 free( items );
825 luaL_typerror( L, -1, "string" );
826 return 0;
827 }
828 items[i] = strdup( lua_tostring( L, -1 ) );
829 lua_pop( L, 1 );
830 }
831
832 /* Create OSD. */
833 cur_mission->osd = osd_create( title, nitems, (const char **)items,
834 misn_osdGetPriority( cur_mission ),
835 misn_osdGetHide( cur_mission ) );
836 cur_mission->osd_set = 1; /* OSD was explicitly set. */
837
838 /* Free items. */
839 for ( int i = 0; i < nitems; i++ )
840 free( items[i] );
841 free( items );
842
843 return 0;
844}
845
849 * @luafunc osdDestroy
850 */
851static int misn_osdDestroy( lua_State *L )
852{
853 Mission *cur_mission = misn_getFromLua( L );
854
855 if ( cur_mission->osd != 0 ) {
856 osd_destroy( cur_mission->osd );
857 cur_mission->osd = 0;
858 }
859
860 return 0;
861}
862
869 * @luafunc osdActive
870 */
871static int misn_osdActive( lua_State *L )
872{
873 int n;
874 Mission *cur_mission;
875
876 n = luaL_checkint( L, 1 );
877 n = n - 1; /* Convert to C index. */
878
879 cur_mission = misn_getFromLua( L );
880
881 if ( cur_mission->osd != 0 )
882 osd_active( cur_mission->osd, n );
883
884 return 0;
885}
886
891 * @luafunc osdGetActive
892 */
893static int misn_osdGetActiveItem( lua_State *L )
894{
895 const Mission *cur_mission = misn_getFromLua( L );
896 if ( cur_mission->osd == 0 )
897 return 0;
898
899 int active = osd_getActive( cur_mission->osd );
900 if ( active < 0 )
901 return 0;
902
903 lua_pushinteger( L, active + 1 );
904 return 1;
905}
906
913 * @luafunc osdGet
914 */
915static int misn_osdGet( lua_State *L )
916{
917 const Mission *cur_mission = misn_getFromLua( L );
918 char **items;
919
920 if ( cur_mission->osd == 0 )
921 return 0;
922
923 lua_pushstring( L, osd_getTitle( cur_mission->osd ) );
924 lua_newtable( L );
925 items = osd_getItems( cur_mission->osd );
926 for ( int i = 0; i < array_size( items ); i++ ) {
927 lua_pushstring( L, items[i] );
928 lua_rawseti( L, -2, i + 1 );
929 }
930 lua_pushinteger( L, osd_getActive( cur_mission->osd ) );
931 return 3;
932}
933
951 * @luafunc npcAdd
952 */
953static int misn_npcAdd( lua_State *L )
954{
955 unsigned int id;
956 int priority;
957 const char *func, *name, *desc;
958 glTexture *portrait, *bg;
959 Mission *cur_mission;
960
961 /* Handle parameters. */
962 func = luaL_checkstring( L, 1 );
963 name = luaL_checkstring( L, 2 );
964 portrait = luaL_validtex( L, 3, GFX_PATH "portraits/" );
965 desc = luaL_checkstring( L, 4 );
966
967 /* Optional parameters. */
968 priority = luaL_optinteger( L, 5, 5 );
969 if ( !lua_isnoneornil( L, 6 ) )
970 bg = luaL_validtex( L, 6, GFX_PATH "portraits/" );
971 else
972 bg = NULL;
973
974 cur_mission = misn_getFromLua( L );
975
976 /* Add npc. */
977 id = npc_add_mission( cur_mission->id, func, name, priority, portrait, desc,
978 bg );
979
980 /* Regenerate bar. */
981 bar_regen();
982
983 /* Return ID. */
984 if ( id > 0 ) {
985 lua_pushnumber( L, id );
986 return 1;
987 }
988 return 0;
989}
990
997 * @luafunc npcRm
998 */
999static int misn_npcRm( lua_State *L )
1000{
1001 unsigned int id = luaL_checklong( L, 1 );
1002 const Mission *cur_mission = misn_getFromLua( L );
1003 int ret = npc_rm_mission( id, cur_mission->id );
1004
1005 /* Regenerate bar. */
1006 bar_regen();
1007
1008 if ( ret != 0 )
1009 return NLUA_ERROR( L, _( "Invalid NPC ID!" ) );
1010 return 0;
1011}
1012
1036 * @luafunc claim
1037 */
1038static int misn_claim( lua_State *L )
1039{
1040 Claim_t *claim;
1041 Mission *cur_mission;
1042 int inclusive;
1043
1044 /* Get mission. */
1045 cur_mission = misn_getFromLua( L );
1046
1047 inclusive = lua_toboolean( L, 2 );
1048
1049 /* Check to see if already claimed. */
1050 if ( !claim_isNull( cur_mission->claims ) )
1051 return NLUA_ERROR( L, _( "Mission trying to claim but already has." ) );
1052
1053 /* Create the claim. */
1054 claim = claim_create( !inclusive );
1055
1056 if ( lua_istable( L, 1 ) ) {
1057 /* Iterate over table. */
1058 lua_pushnil( L );
1059 while ( lua_next( L, 1 ) != 0 ) {
1060 if ( lua_issystem( L, -1 ) )
1061 claim_addSys( claim, lua_tosystem( L, -1 ) );
1062 else if ( lua_isstring( L, -1 ) )
1063 claim_addStr( claim, lua_tostring( L, -1 ) );
1064 lua_pop( L, 1 );
1065 }
1066 } else if ( lua_issystem( L, 1 ) )
1067 claim_addSys( claim, lua_tosystem( L, 1 ) );
1068 else if ( lua_isstring( L, 1 ) )
1069 claim_addStr( claim, lua_tostring( L, 1 ) );
1070 else
1071 NLUA_INVALID_PARAMETER( L, 1 );
1072
1073 /* Test claim. */
1074 if ( claim_test( claim ) ) {
1075 claim_destroy( claim );
1076 lua_pushboolean( L, 0 );
1077 return 1;
1078 }
1079
1080 /* Set the claim. */
1081 cur_mission->claims = claim;
1082 claim_activate( claim );
1083 lua_pushboolean( L, 1 );
1084 return 1;
1085}
1086
1087void misn_pushMissionData( lua_State *L, const MissionData *md )
1088{
1089 const MissionAvail_t *ma = &md->avail;
1090
1091 lua_newtable( L );
1092
1093 lua_pushstring( L, md->name );
1094 lua_setfield( L, -2, "name" );
1095
1096 lua_pushstring( L, mission_availabilityStr( ma->loc ) );
1097 lua_setfield( L, -2, "loc" );
1098
1099 lua_pushinteger( L, ma->chance );
1100 lua_setfield( L, -2, "chance" );
1101
1102 if ( ma->spob != NULL ) {
1103 lua_pushstring( L, ma->spob );
1104 lua_setfield( L, -2, "spob" );
1105 }
1106
1107 if ( ma->system != NULL ) {
1108 lua_pushstring( L, ma->system );
1109 lua_setfield( L, -2, "system" );
1110 }
1111
1112 if ( ma->chapter != NULL ) {
1113 lua_pushstring( L, ma->chapter );
1114 lua_setfield( L, -2, "chapter" );
1115 }
1116
1117 /* TODO factions. */
1118
1119 if ( ma->cond != NULL ) {
1120 lua_pushstring( L, ma->cond );
1121 lua_setfield( L, -2, "cond" );
1122 }
1123
1124 if ( ma->done != NULL ) {
1125 lua_pushstring( L, ma->done );
1126 lua_setfield( L, -2, "done" );
1127 }
1128
1129 lua_pushinteger( L, ma->priority );
1130 lua_setfield( L, -2, "priority" );
1131
1132 if ( mis_isFlag( md, MISSION_UNIQUE ) ) {
1133 lua_pushboolean( L, 1 );
1134 lua_setfield( L, -2, "unique" );
1135 }
1136
1137 lua_newtable( L );
1138 for ( int t = 0; t < array_size( md->tags ); t++ ) {
1139 lua_pushstring( L, md->tags[t] );
1140 lua_pushboolean( L, 1 );
1141 lua_rawset( L, -3 );
1142 }
1143 lua_setfield( L, -2, "tags" );
1144}
1145
1151 * @luafunc computerRefresh
1152 */
1153static int misn_computerRefresh( lua_State *L )
1154{
1155 (void)L;
1156 misn_regen();
1157 return 0;
1158}
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:214
#define array_erase(ptr_array, first, last)
Erases elements in interval [first, last).
Definition array.h:148
static ALWAYS_INLINE int array_size(const void *array)
Returns number of elements in the array.
Definition array.h:179
#define array_push_back(ptr_array, element)
Adds a new element at the end of the array.
Definition array.h:134
#define array_begin(array)
Returns a pointer to the beginning of the reserved memory space.
Definition array.h:206
#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:252
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:75
void bar_regen(void)
Regenerates the bar list.
Definition land.c:432
void misn_regen(void)
Regenerates the mission list.
Definition land.c:419
static void misn_accept(unsigned int wid, const char *str)
Accepts the selected mission.
Definition land.c:661
Mission ** player_missions
Definition mission.c:45
void mission_cleanup(Mission *misn)
Cleans up a mission.
Definition mission.c:779
int mission_addMarker(Mission *misn, int id, int objid, MissionMarkerType type)
Adds a system marker to a mission.
Definition mission.c:586
int mission_linkCargo(Mission *misn, unsigned int cargo_id)
Links cargo to the mission for posterior cleanup.
Definition mission.c:741
void mission_sysMark(void)
Marks all active systems that need marking.
Definition mission.c:616
void mission_shift(int pos)
Puts the specified mission at the end of the player_missions array.
Definition mission.c:835
int mission_getID(const char *name)
Gets id from mission name.
Definition mission.c:99
int mission_unlinkCargo(Mission *misn, unsigned int cargo_id)
Unlinks cargo from the mission, removes it from the player.
Definition mission.c:756
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:914
nlua_env __NLUA_CURENV
Definition nlua.c:55
lua_State * naevL
Definition nlua.c:54
int nlua_loadBackground(nlua_env env)
Loads the graphics library.
Definition nlua_bkg.c:33
int nlua_loadCamera(nlua_env env)
Loads the camera library.
Definition nlua_camera.c:48
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.
LuaFaction luaL_validfaction(lua_State *L, int ind)
Gets faction (or faction name) at index, raising an error if type isn't a valid faction.
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:592
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:81
static int misn_computerRefresh(lua_State *L)
Refreshes the mission computer offerings.
Definition nlua_misn.c:1151
static int misn_npcRm(lua_State *L)
Removes an NPC.
Definition nlua_misn.c:997
static int misn_osdGet(lua_State *L)
Gets the current mission OSD information.
Definition nlua_misn.c:913
static int misn_setDistance(lua_State *L)
Sets the distance to the mission's goal. Used for sorting missions in the mission computer....
Definition nlua_misn.c:334
static int misn_osdActive(lua_State *L)
Sets active in mission OSD.
Definition nlua_misn.c:869
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:849
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:671
static int misn_markerMove(lua_State *L)
Moves a marker to a new system.
Definition nlua_misn.c:445
static int misn_osdCreate(lua_State *L)
Creates a mission OSD.
Definition nlua_misn.c:790
static int misn_cargoRm(lua_State *L)
Removes the mission cargo.
Definition nlua_misn.c:725
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:1036
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:390
static int misn_osdGetActiveItem(lua_State *L)
Gets the active OSD element.
Definition nlua_misn.c:891
static int misn_setFaction(lua_State *L)
Sets the faction giver of the mission. Used mainly as metadata for sorting and organizing missions in...
Definition nlua_misn.c:364
static int misn_setReward(lua_State *L)
Sets the current mission reward description.
Definition nlua_misn.c:307
static int misn_accept(lua_State *L)
Attempts to accept the mission.
Definition nlua_misn.c:616
static int misn_setIllegal(lua_State *L)
Marks whether or not a mission should be considered illegal in the current system....
Definition nlua_misn.c:350
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:755
static int misn_markerRm(lua_State *L)
Removes a mission system marker.
Definition nlua_misn.c:496
static int misn_npcAdd(lua_State *L)
Adds an NPC.
Definition nlua_misn.c:951
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:699
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:552
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:52
LuaSpob luaL_checkspob(lua_State *L, int ind)
Gets spob at index raising an error if isn't a spob.
Definition nlua_spob.c:163
int lua_isspob(lua_State *L, int ind)
Checks to see if ind is a spob.
Definition nlua_spob.c:218
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:113
int nlua_loadTex(nlua_env env)
Loads the texture library.
Definition nlua_tex.c:59
int nlua_loadTk(nlua_env env)
Loads the Toolkit Lua library.
Definition nlua_tk.c:98
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:167
int npc_rm_mission(unsigned int id, unsigned int mid)
removes a mission NPC.
Definition npc.c:257
void gl_freeTexture(glTexture *texture)
Frees a texture.
Definition opengl_tex.c:835
int pilot_rmMissionCargo(Pilot *pilot, unsigned int cargo_id, int jettison)
Removes special mission cargo based on id.
Player_t player
Definition player.c:77
void player_missionFinished(int id)
Marks a mission as completed.
Definition player.c:3094
unsigned int pfleet_cargoMissionAdd(const Commodity *com, int q)
Adds some mission cargo to the player's fleet.
int system_index(const StarSystem *sys)
Gets the index of a star system.
Definition space.c:1049
Represents a commodity.
Definition commodity.h:57
Defines the availability of a mission.
Definition mission.h:36
MissionAvailability loc
Definition mission.h:37
char * chapter
Definition mission.h:45
int * factions
Definition mission.h:49
char * done
Definition mission.h:53
char * spob
Definition mission.h:43
char * system
Definition mission.h:44
char * cond
Definition mission.h:51
Static mission data.
Definition mission.h:64
char * name
Definition mission.h:65
MissionAvail_t avail
Definition mission.h:67
char ** tags
Definition mission.h:75
Mission system marker.
MissionMarkerType type
Represents an active mission.
Definition mission.h:83
Claim_t * claims
Definition mission.h:118
unsigned int osd
Definition mission.h:112
unsigned int distance
Definition mission.h:101
char * npc_desc
Definition mission.h:97
unsigned int id
Definition mission.h:86
glTexture * portrait
Definition mission.h:93
int osd_set
Definition mission.h:113
int illegal
Definition mission.h:102
nlua_env env
Definition mission.h:120
char * reward
Definition mission.h:92
char * desc
Definition mission.h:91
MissionMarker * markers
Definition mission.h:109
char * title
Definition mission.h:90
const MissionData * data
Definition mission.h:84
int faction
Definition mission.h:103
credits_t reward_value
Definition mission.h:100
int accepted
Definition mission.h:87
char * npc
Definition mission.h:96
Abstraction for rendering sprite sheets.
Definition opengl_tex.h:43