summaryrefslogtreecommitdiff
path: root/world/map/npc/functions/dailyquest.txt
blob: 07d4d90e9415bab476dd48c66c609ab32d35c76d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
// The daily quests

// Variables returned:
// @dq_return - Code of what happend
//    0 = Low level
//    1 = Ignored NPC
//    2 = Not enough points
//    3 = Not enough items
//    4 = Success

// Variables to set:
// @dq_level - Minimal level needed to use the quest
// @dq_cost - The number of points this quest uses
// @dq_count - The number of given item needed
// @dq_name$ - String name of the item as seen by server
// @dq_friendly_name$ - String name of the item as seen by user
// @dq_money - The money reward for doing the quest
// @dq_exp - Experince gained by doing the quest

// Optional:
// @dq_handle_return - When set to anything other then 0 the function will not print exiting text

// Variables used inside:
// DailyQuestPoints - The number of points the player currently has
// DailyQuestTime - Time since DailyQuestPoints was lasted renewed
// DailyQuestBonus - Additional points added in addition to player BaseLevel

// (DailyQuestBonus makes a good reward from non-daily quests)

function|script|DailyQuestPoints
{
    set @dq_earliest, gettimetick(2) - 86400;
    if (DailyQuestTime < @dq_earliest)
        set DailyQuestTime, @dq_earliest;

    // how many whole daily quest points the player has earned
    // we increment DailyQuestTime by the number of seconds in that many increments
    set @dq_increments, (gettimetick(2) - DailyQuestTime)*BaseLevel / 86400;
    set DailyQuestTime, DailyQuestTime + @dq_increments*86400/BaseLevel;

    // normal recharging case - increment, but don't let it recharge more than a day's worth
    set DailyQuestPoints, DailyQuestPoints + @dq_increments;
    if (DailyQuestPoints > BaseLevel)
        set DailyQuestPoints, BaseLevel;

    return;
}

function|script|DailyQuest
{
    set @dq_multiplier, 0;

    callfunc "DailyQuestPoints";

    if (BaseLevel < @dq_level)
        goto L_Low_Level;

    set .@total_points, (DailyQuestPoints + DailyQuestBonus);
    if (.@total_points < @dq_cost)
        goto L_Not_Enough_Points;

    mes "\"If you bring me " + @dq_count + " " + @dq_friendly_name$ + ", I will give you a reward.\"";
    menu
        "I have what you want.", L_Trade,
        "Take all you need.", L_Trade_All,
        "Ok, I'll get to work.", L_Next,
        "Nah, I'm not going to help you.", L_Next;

L_Next:
    set @dq_return, 1;
    goto L_Exit;

L_Trade:
    set @dq_multiplier, 1;
    goto L_Trade_Combined;

L_Trade_All:
    set .@total_points, (DailyQuestPoints + DailyQuestBonus);
    set .@item_multiple, (countitem(@dq_name$) / @dq_count);
    set .@dp_multiple, (.@total_points / @dq_cost);

    if (.@dp_multiple > .@item_multiple)
        set @dq_multiplier, .@item_multiple;
    else
        set @dq_multiplier, .@dp_multiple;

    goto L_Trade_Combined;

L_Trade_Combined:
    // the check for points already happens before the menu.
    if (countitem(@dq_name$) < @dq_count)
        goto L_Not_Enough;

    set .@dq_cost_total, @dq_cost * @dq_multiplier;
    set .@dq_cost_bonus, .@dq_cost_total - DailyQuestPoints;

    set DailyQuestPoints, max(0, -.@dq_cost_bonus);
    if (.@dq_cost_bonus > 0)
        set DailyQuestBonus, DailyQuestBonus - .@dq_cost_bonus;

    delitem @dq_name$, (@dq_count * @dq_multiplier);

    set Zeny, Zeny + (@dq_money * @dq_multiplier);
    getexp (@dq_exp * @dq_multiplier), 0;

    if (@dq_handle_return)
        goto L_Exit_Good;

    mes "\"Thank you!\"";
    callsub S_SayPhrase;
    mes "";
    mes "[" + (@dq_money * @dq_multiplier) + " money]";
    mes "[" + (@dq_exp * @dq_multiplier) + " experience points]";
    goto L_Exit_Good;

L_Exit_Good:
    set @dq_return, 4;
    goto L_Exit;

L_Not_Enough:
    if (!@dq_handle_return)
        mes "\"I said " + @dq_count + " " + @dq_friendly_name$ + ", you should learn to count.\"";
    set @dq_return, 3;
    goto L_Exit;

L_Low_Level:
    if (!@dq_handle_return)
        mes "\"Hey, you should go kill some things to get stronger first.\"";
    set @dq_return, 0;
    goto L_Exit;

L_Not_Enough_Points:
    mes "\"You look exhausted, maybe you should rest a bit.\"";
    set @dq_return, 2;
    goto L_Exit;

L_Exit:
    set @dq_handle_return, 0;  // Incase they forget
    return;

S_SayPhrase:
    if (@dq_handle_return)
        goto L_Return;

    set .@total_points, (DailyQuestPoints + DailyQuestBonus);
    if (.@total_points < @dq_cost)
        goto L_Exhausted;
    if (.@total_points > BaseLevel)
        goto L_Over;
    if (.@total_points > (BaseLevel*9)/10)
        goto L_P90;
    if (.@total_points > (BaseLevel*7)/10)
        goto L_P70;
    if (.@total_points > (BaseLevel*5)/10)
        goto L_P50;
    goto L_Low;

L_Over:
    mes "\"Woah, you're bursting with power.\"";
    return;
L_P90:
    mes "\"You're in a very good shape.\"";
    return;
L_P70:
    mes "\"You don't seem very exhausted by my tasks.\"";
    return;
L_P50:
    mes "\"Aren't you getting weary yet?\"";
    return;
L_Low:
    mes "\"You look a little tired.\"";
    return;
L_Exhausted:
    mes "\"You look exhausted, maybe you should rest a bit.\"";
    return;

L_Return:
    return;
}