Skip to content

Quests and Missions

Lost Saga has two systems that look alike in the lobby but use different files.

System What it is Server file Client file
Quests Long quests and time-limited event quests sp2_quest_info.ini sp2_quest_info.ini, sp2_quest_help.ini
Missions Daily, weekly and monthly lists that reset on a schedule sp2_daily_mission.ini, sp2_weekly_mission.ini, sp2_monthly_mission.ini the same three names
Rewards (both) The gift a quest or mission pays sp2_quest_present.ini sp2_quest_present.ini

Server files are in ls_gamesvr\config\. Client paths were checked in the unpacked 2021 client. In 2014 and 2019 the client files are inside rs.iop, which was not opened for this page. Edit packs with the pack tutorials and edit an INI table.

The server decides what counts and what is paid. The client only shows names, texts and icons. A quest that exists on the server but not in the client file has no title and no help text.

Code: ioQuestManager.cpp and QuestVariety.cpp (server), ioQuestManager.cpp (client).

[common]
max_quest = 15000
[quest1]
class_name = QuestPlayTimeCount
main_index = 1
max_sub_quest = 1
sub1_title = My event
sub1_perform_type = 2
sub1_start_year = 2026
sub1_start_month = 11
sub1_start_date = 20
sub1_start_hour = 5
sub1_end_year = 2026
sub1_end_month = 12
sub1_end_date = 4
sub1_end_hour = 5
sub1_occur_value = 1
sub1_complete_value = 1
sub1_max_reward = 1
sub1_reward_present1 = 824
  1. The server reads [quest1] up to [quest<max_quest>]. A section with an empty class_name is skipped.
  2. class_name picks the code that counts progress. The full list is in CreateQuest in ioQuestManager.cpp (for example QuestPlayTimeCount, QuestRealTimeCount, QuestBuyItem, QuestGangsiKill, QuestExcavationTry, QuestSoccerGoal, QuestGuildLevel). An unknown name is logged as “None Class” and the quest is not created.
  3. main_index is the quest line. Each subK_* block is one step. max_sub_quest is the number of steps.
  4. subK_perform_type: 1 normal quest, 2 event quest. The start and end dates (start_year, start_month, start_date, start_hour and the same for end_) are only read for event quests. A quest outside its window is not alive.
  5. subK_occur_value and subK_complete_value are the numbers the class compares with, for example minutes or counts. subK_custom_valueN are extra class values. What each value means depends on the class and is not confirmed yet per class.
  6. Other keys the server reads: oneday_style, oneday_cnt, repeat_style, guild_style, pcroom_style, channeling_type, occur_mode, complete_mode, period_hour, rewardselect_style, rewardselect_num, prev_main_index, prev_sub_index, next_main_index, next_sub_index.
  1. Copy a block from the same class that is close to what you want. Give it a new [questN] number and a new main_index.
  2. Raise max_quest if you went past the current number (the shipped file already says 15000).
  3. Set the dates, the values and the reward (see Rewards below).
  4. Add the same quest to the client sp2_quest_info.ini with the texts (see Text below). The client reads the same section and key names.
  5. Restart the game server and the client.

sp2_one_day_quest.ini (oneday_hour, oneday_current) is written by the server for the daily quest reset. Do not edit it by hand.

sp2_quest.ini (tutorial quests with Name, QuestFun, ClearTermFun) is in all three testbeds, but no code in the 2021 game server source reads it. Whether the client reads it is not confirmed yet.

Code: MissionManager.cpp (server).

[common]
reset_hour = 5
close = 0
max_count = 394
[date1]
start_date = 201223
mission1_code = 1
mission1_type = 12
mission1_values = 4
mission1_present = 12580
  1. [dateN] blocks are the rotation. start_date is YYMMDD (201223 is 2020-12-23). The server picks the block that is current for today. Weekly blocks also have end_date.
  2. Inside a block, missionK_code must be unique and must not be 0: the loader stops at the first missionK_code that is 0.
  3. missionK_type is the class of the mission (enum MissionClasses in MissionTriggerBase.h):
Type Meaning Type Meaning
1 Login time 9 Item reinforce
2 Fishing 10 Mode play
3 Collect peso 11 Daily missions completed
4 Monster kill 12 All daily missions cleared
5 Item buy 13 Weekly missions completed
6 Clover 14 All weekly missions cleared
7 Excavation 15 All monthly missions cleared
8 Item use 16 Additive use
  1. missionK_values is a list of numbers separated by dots, for example 4 (a count) or 1.90000.6.28. What each position means is not confirmed yet, except that the first number is the target count in the shipped examples.
  2. missionK_present is a reward index in sp2_quest_present.ini (MissionManager.cpp calls g_QuestMgr.SendRewardPresent). It is not an item code.
  3. reset_hour is the hour of the daily reset. close = 1 turns all missions off (the server logs “mission is closed”). max_count caps the number of date blocks (default 1000 if 0).

The last block in the shipped files starts on 2022-01-20 (2019 and 2021 daily), 2022-01-02 (2014 daily), and weekly and monthly end in 2021 to early 2022. By the code in IsPrevMissionData, a daily block that started more than a day ago and has no later block is treated as old and is not activated. So the shipped missions probably stay empty today. Add new [dateN] blocks with current dates. Not tested in game yet.

  1. Add a new [dateN] block at the end with the next number and a current start_date. Daily and weekly rotate one block per day or week, so one block per period is needed.
  2. Raise max_count if you pass it.
  3. Add the same block to the client file with the texts.
  4. Restart the game server.

sp2_quest_present.ini, loaded by ioQuestManager.cpp:

[common]
max_present = 30000
[Present1]
RewardIndex = 1
PresentSendID = Event
PresentType = 8
PresentAlarm = 0
PresentMent = 1010
PresentPeriod = 28
PresentValue1 = 10
PresentValue2 = 0
PresentDirect = 1
  1. The loader reads [Present1] to [Present<max_present>] and files each under its RewardIndex. Quests and missions point at that number, not at the section number.
  2. PresentType and the values (from the header of the file):
Type Gift Value1 Value2
1 Hero Class code Period in hours
2 Deco Sex Code
3 Etc item Code Amount
4 Peso Amount not used
5 Gear Code (reinforce x 10000) + period in hours
6 Gear box Code Resale price
7 Deco, player chooses not confirmed yet not confirmed yet
8 Experience Amount not used
9 Medal Code Period in hours
  1. PresentSendID is the sender name shown on the gift. PresentDirect = 1 is read as the “direct reward” flag (m_bDirectReward). What it changes in play is not confirmed yet. PresentAlarm, PresentMent (a text index) and PresentPeriod also come from this file. The unit of PresentPeriod is not confirmed yet.
  2. Copy the same reward to the client sp2_quest_present.ini.
  • Quest text is in the client sp2_quest_info.ini: subK_title, subK_progress, subK_progress_result, subK_icon, and subK_help. subK_help is a number: it points at a [helpN] block with the same index in the client sp2_quest_help.ini. That file is a list of lines, each with lineJ_text1, lineJ_color1, lineJ_size.
  • Mission text is in the client mission files: missionK_title1_text1, missionK_title2_text1, missionK_present_text1 to _text4, missionK_icon, missionK_back_frame_type.
  • The shipped 2021 client mission and quest files are still mostly Korean text. Texts can be plain English. For STR(n) keys and %1 or %s see Text and Languages.
Point 2014 2019 2021
sp2_quest_info.ini size 3.9 MB 4.9 MB 4.9 MB
Daily blocks 364, to 2022-01-02 394, to 2022-01-20 394, to 2022-01-20
Weekly blocks 52 56 56
Monthly blocks 12 13 13
Extra files in the server config folder sp2_quest_help.ini, sp2_quest_guide.ini (client files) none none

The mission and quest loaders were read in the 2021 source only. That the 2014 and 2019 servers read the keys the same way is not confirmed yet.