typedef enum { MISSION_ASSIGNED =1, MISSION_FAILED, MISSION_COMPLETED } mission_types; class mission_data; class mission_data { public: mission_data() { mission_vnum = 0; current_stage = 0; type = 0; name = NULL; at_time_fail = 0; } ~mission_data() { extern void free_string(const char *); free_string(name); } private: const char *name; vnum_t mission_vnum; short current_stage; short type; short at_time_fail; public: // retrieval functors! vnum_t get_vnum() { return mission_vnum; } short get_stage() { return current_stage; } short get_type() { return type; } const char *get_name() { return name; } short get_fail_time() { return at_fime_fail; } // setting functors! void set_vnum(vnum_t v) { mission_vnum = v; } void set_name(const char *n) { ReplaceString(name, n); } void set_state(int s) { state = s; } void set_type(short t) { type = t; } void set_fail_time(short t) { at_time_fail = t; } }; IN PCDATA. Lexi::Listmission_list; short CHAR_DATA::mission_type(vnum_t v) { FOREACH(Lexi::List, mission_list, mission_iter) { mission_data *q = (*mission_iter); if(v == q->get_vnum()) { return q->get_type(); } } return -1; } bool CHAR_DATA::has_mission(vnum_t v, short t) { FOREACH(Lexi::List, mission_list, mission_iter) { mission_data *q = (*mission_iter); if(v == q->get_vnum() && q->get_type() == t) { return true; } } return false; } mission_data *CHAR_DATA::get_mission(vnum_t v) { FOREACH(Lexi::List, mission_list, mission_iter) { mission_data *q = (*mission_iter); if(q->get_vnum() == v) return q; } return NULL; } void CHAR_DATA::assign_mission(vnum_t v) { if(get_mission(v) != NULL) return; mission_data *q = new mission_data(); q->set_vnum(v); // q->set_name(mission_name(v)); // for the mission-editor! (brief description of mission && some minor properties) q->set_state(0); q->set_type(MISSION_ASSIGNED); mission_list.push_back(q); return; } void CHAR_DATA::fail_mission(vnum_t v) { mission_data *q = get_mission(v); if(!q) return; // don't have the mission, hard to fail it! if(q->get_type() == MISSION_COMPLETED) return; // already completed the mission, cannot fail it! q->set_type(MISSION_FAILED); // failed the mission! return; } void CHAR_DATA::complete_mission(vnum_t v) { mission_data *q = get_mission(v); if(!q) return; // don't have the mission, hard to complete it. if(q->get_type() == MISSION_FAILED) return; // already failed the mission, cannot fail it! q->set_type(MISSION_COMPLETED); // failed the mission! return; } // change the mission-stage void CHAR_DATA::mission_stage(vnum_t v, short s) { mission_data *q = get_mission(v); if(!q) return; // don't have the mission, hard to complete it. if(q->get_type() == MISSION_FAILED) return; // cannot change stage once failed if(q->get_type() == MISSION_COMPLETED) return; // cannot change stage once completed. q->set_stage(s); // change our stage! return; } // are we the stage selected ? bool CHAR_DATA::mission_isstage(vnum_t v, short x) { mission_data *q = get_mission(v); if(!q) return false; if(q->get_stage() == s) return true; return false; } void CHAR_DATA::mission_settime(vnum_t v, short t) { mission_data *q = get_mission(v); if(!q) return false; if(q->get_type() == MISSION_FAILED) return; // cannot change stage once failed if(q->get_type() == MISSION_COMPLETED) return; // cannot change stage once completed. q->set_time_fail(t); // Sets how long before the mission expires // not all missions are timed. // doing it this way allows us to save the // time-left so we can pick up where we // left off! (hopefully) return false; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // mission fails // mission slowly ticks down till failure! void CHAR_DATA::check_fail() { FOREACH(Lexi::List, mission_list, mission_iter) { mission_data *q = (*mission_iter); if(q->get_fail_time() != 0 && q->get_fail_time() < 2 && q->get_type() != MISSION_FAIL && q->get_type() != MISSION_COMPLETED) { ch->Sendf("You have failed the mission %s, ran out of time!", mission_name(q->get_vnum())); q->set_type(MISSION_FAILED); continue; } // lower us by 1, until we reach our end! if(q->get_fail_time() != 0) { q->set_fail_time(q->get_fail_time()-1); } } return; } COMMAND(cmd_mission) { BUFFER *output; if(NullString(argument)) { ch->Sendf("Syntax: mission \n\r"); return; } if(!str_cmp(argument, "current")) { int count = 0; output = new_buf(); // vnum name stage Time Left BufPrintf("[%6s] %20s %5s %10s\n\r", "SysNum", "Name", "Stage", "Time Left"); Lexi::List, ch->pcdata->mission_list, mission_iter) { mission_data *q = (*mission_iter); if(q->get_type () == MISSION_FAILED) continue; if(q->get_type () == MISSION_COMPLETED) continue; BufPrintf(output, "[%6d] %20s %5d %10d\n\r", q->get_vnum(), q->get_name(), q->get_stage(), q->get_fail_time()); count++; } BufPrintf(output, "You have %d missions currently active!\n\r"); page_to_char(buf_string(output), ch); free_buf(output); return; } if(!str_cmp(argument, "failed")) { int count = 0; output = new_buf(); // vnum name stage Time Left BufPrintf("[%6s] %20s %5s %10s\n\r", "SysNum", "Name", "Stage", "Time Left"); Lexi::List, ch->pcdata->mission_list, mission_iter) { mission_data *q = (*mission_iter); if(q->get_type () != MISSION_FAILED) continue; BufPrintf(output, "[%6d] %20s %5d %10d\n\r", q->get_vnum(), q->get_name(), q->get_stage(), q->get_fail_time()); count++; } BufPrintf(output, "You have failed %d missions!\n\r"); page_to_char(buf_string(output), ch); free_buf(output); return; } if(!str_cmp(argument, "completed")) { int count = 0; output = new_buf(); // vnum name stage Time Left BufPrintf("[%6s] %20s %5s %10s\n\r", "SysNum", "Name", "Stage", "Time Left"); Lexi::List, ch->pcdata->mission_list, mission_iter) { mission_data *q = (*mission_iter); if(q->get_type () != MISSION_FAILED) continue; BufPrintf(output, "[%6d] %20s %5d %10d\n\r", q->get_vnum(), q->get_name(), q->get_stage(), q->get_fail_time()); count++; } BufPrintf(output, "You have completed %d missions!\n\r"); page_to_char(buf_string(output), ch); free_buf(output); return; } ch->Sendf("What are you talking about? Try your syntax again!\n\r"); return; }