quest.h
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C头文件 代码 · 共 202 行
H
202 行
// by snowcat#ifndef __KAIFENG_QUEST__#define __KAIFENG_QUEST__//#define MAXDELAY 200// mon reduced time limit. 4/7/98#define MAXDELAY 60#define DELAY_CONST 50#define MAXREWARD 200#define INDEXTIMES 40#define CACHESIZE 30#define INDEXDELTA 20#define IDX_TYPE 0#define IDX_NAME 1#define IDX_ID 2#define IDX_OBJ 3#define IDX_AMT 4// the quest format is the following mapping:// daoxing : type name id object amount//---------------------------------------------------------------// 1000 : ({ "find", "秘笈", "mi ji" , "", "1" }), // 5000 : ({ "give", "灾民", "zai min" , "白银(silver)", "5" }), // 12000 : ({ "kill", "白骨精", "baigu jing", "", "3" }); //找一本秘笈,救济灾民五两银子,三打白骨精......int *order_list (int *list){ int i, j; int size = sizeof(list); for (i = size-2; i >= 0; i--) { for (j = 0; j <= i; j++) { reset_eval_cost(); if (list[j] > list[j+1]) { int k = list[j]; list[j] = list[j+1]; list[j+1] = k; } } } return list;}// must execute only once !int *sort_quests (mapping quests){ int *quest_keys = keys (quests); return order_list (quest_keys);}int quest_accurate_index (int *quest_keys, int daoxing){ int i = 0; int j = 0; int k = sizeof(quest_keys)-1; while (i < k) { // reset_eval_cost(); j = (k-i)/2+i; if (quest_keys[j] == daoxing) { return j; } else if (quest_keys[j] > daoxing) { k = j - 1; } else { i = j + 1; } } return j;}void reduce_cache (object who, string cache_name){ mapping cache = who->query(cache_name); string key; int value = 0; int k = 0; string *my_keys; int *my_values; if (! cache) return; my_keys = keys(cache); my_values = values(cache); k = sizeof (cache); if (k < CACHESIZE) return; while (k--) { if (my_values[k] < value || 0 == value) { key = my_keys[k]; value = my_values[k]; } } who->delete (cache_name+"/"+key);}int quest_random_index (int *quest_keys, int i, object who, string cache_name){ int j = INDEXTIMES; int k; int lower; int upper; int size = sizeof (quest_keys); lower = i - INDEXDELTA; upper = i + INDEXDELTA; if (lower < 0) { lower = 0; upper = INDEXDELTA + INDEXDELTA; } if (upper >= size) { upper = size - 1; } // adjust here, allow access to lower quests: lower = upper/4; if (upper - lower < INDEXDELTA) lower = 0; reduce_cache (who, cache_name); while (j--) { string str; reset_eval_cost(); k = lower + random (upper-lower); str = cache_name+"/"+to_chinese(k); if (! who->query(str)) { who->set(str,who->query("quest/number")); return k; } } return -1;}int log10 (int i){ int j = 0; while (i = i/10) j++; return j;}int quest_reward (object who, mapping quests, string quest){ int reward; int exp = who->query("combat_exp"); int dx = who->query("quest/pending/"+quest+"/daoxing"); int index = who->query("quest/pending/"+quest+"/index"); reward = random(who->query("cps")); // initial value reward += MAXREWARD*(1+index)/sizeof(quests); // normal value reward = reward*(1+log10(exp/10000))*exp/(exp+dx)*dx/(exp+dx); // high value reward += random(who->query_int())+random(who->query_kar()); // base value if (reward >= MAXREWARD) reward = MAXREWARD + random(who->query("kar")); return reward;}void quest_done (object who){ string *strs = ({ "慢慢地一小团祥云在$N的身边升起。\n", "$N的身上慢慢升起一股祥云。\n", "一小股祥云在$N的身上缓缓升起。\n", "只见$N的身上徐徐飘浮起一小团祥云。\n", "一团小祥云在$N的身上慢慢升起。\n", }); who->add("quest/number",1); message_vision (strs[random(sizeof(strs))],who); tell_object (who, "你的品德增加了。\n");}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?