__init__.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. # Coins of Magic version 0.1 by DrLecter
  2. #Quest info
  3. qn = "336_CoinOfMagic"
  4. QUEST_NUMBER = 336
  5. QUEST_NAME = "CoinOfMagic"
  6. QUEST_DESCRIPTION = "Coins of Magic"
  7. #Quest items
  8. COIN_DIAGRAM,KALDIS_COIN,MEMBERSHIP_1,MEMBERSHIP_2,MEMBERSHIP_3 = range(3811,3816)
  9. BLOOD_MEDUSA, BLOOD_WEREWOLF, BLOOD_BASILISK, BLOOD_DREVANUL, \
  10. BLOOD_SUCCUBUS, BLOOD_DRAGON, BELETHS_BLOOD, MANAKS_BLOOD_WEREWOLF,\
  11. NIAS_BLOOD_MEDUSA, GOLD_DRAGON, GOLD_WYVERN, GOLD_KNIGHT, \
  12. GOLD_GIANT, GOLD_DRAKE, GOLD_WYRM, BELETHS_GOLD, \
  13. MANAKS_GOLD_GIANT, NIAS_GOLD_WYVERN, SILVER_UNICORN, SILVER_FAIRY, \
  14. SILVER_DRYAD, SILVER_DRAGON, SILVER_GOLEM, SILVER_UNDINE, \
  15. BELETHS_SILVER, MANAKS_SILVER_DRYAD, NIAS_SILVER_FAIRY = range(3472,3499)
  16. #NPCs
  17. SORINT, BERNARD, PAGE, HAGGER, STAN, RALFORD, FERRIS, COLLOB, PANO, DUNING, LORAIN = \
  18. 30232, 30702, 30696,30183, 30200,30165, 30847, 30092, 30078,30688, 30673
  19. #MOBs
  20. TIMAKARCH, TIMAKSOLD, TIMAKSHAM, LAKIN, HATARHANI, PUNISHMENT, SHACKLE, TIMAKORC, HEADLESS, ROYALSERVANT, \
  21. MALRUKTUREN, FORMOR, FORMORELDER, VANORSHAMAN, TARLKHIWARRIOR, OLMAHUM, OLMAHUMW, HARITMATR, HARITSHA, \
  22. SHACKL2, HEADLES2, MALRUKTURE2, ROYALSERVAN2 = \
  23. 20584, 20585, 20587, 20604, 20663, 20678, 20235, 20583, 20146, 20240, 20245, 20568, 20569, 20685, 20572, 20161, 20575, 20645, 20644, 20279, 20280, 20284, 20276
  24. #C5 update - drops for these mobs are custom, i tried to make it more balanced. You confirm.
  25. KOOKABU1,KOOKABU2,KOOKABU3,KOOKABU4,ANTELOP1,ANTELOP2,ANTELOP3,ANTELOP4,BANDERSN1,BANDERSN2,BANDERSN3,BANDERSN4,BUFALO1,BUFALO2,BUFALO3,BUFALO4=range(21274,21290)
  26. GRAVE_L,DOOM_ARC,DOOM_KNI,DOOM_SERV,CLAW_SPL,PUNISH_SPL,WISDOM_SPL,WAILING_SPL,HUNGRY_C,BLOODY_G,NIHIL_INV,DARK_GUARD=21003,21008,20674,21006,21521,21531,21526,21539,20954,20960,20957,20959
  27. PROMOTE={3:[BLOOD_WEREWOLF,GOLD_DRAKE,SILVER_FAIRY,BLOOD_DREVANUL,GOLD_KNIGHT,SILVER_GOLEM],
  28. 2:[SILVER_DRYAD,BLOOD_BASILISK,BLOOD_SUCCUBUS,SILVER_UNDINE,GOLD_GIANT,GOLD_WYRM],}
  29. COND={3:9,2:11}
  30. DROP_LIST={
  31. TIMAKSHAM:[BLOOD_MEDUSA],TIMAKARCH:[BLOOD_MEDUSA],TIMAKSOLD:[BLOOD_MEDUSA],LAKIN:[BLOOD_MEDUSA],PUNISHMENT:[BLOOD_MEDUSA],KOOKABU1:[BLOOD_MEDUSA],KOOKABU2:[BLOOD_MEDUSA],KOOKABU3:[BLOOD_MEDUSA],KOOKABU4:[BLOOD_MEDUSA],BANDERSN1:[BLOOD_MEDUSA],BANDERSN2:[BLOOD_MEDUSA],BANDERSN3:[BLOOD_MEDUSA],BANDERSN4:[BLOOD_MEDUSA],PUNISH_SPL:[BLOOD_MEDUSA],HUNGRY_C:[BLOOD_MEDUSA],BLOODY_G:[BLOOD_MEDUSA],DOOM_SERV:[BLOOD_MEDUSA],GRAVE_L:[BLOOD_MEDUSA],\
  32. TIMAKORC:[GOLD_WYVERN],HATARHANI:[GOLD_WYVERN],SHACKLE:[GOLD_WYVERN],HEADLESS:[GOLD_WYVERN],ROYALSERVANT:[GOLD_WYVERN],MALRUKTUREN:[GOLD_WYVERN],SHACKL2:[GOLD_WYVERN],HEADLES2:[GOLD_WYVERN],ROYALSERVAN2:[GOLD_WYVERN],MALRUKTURE2:[GOLD_WYVERN],ANTELOP1:[GOLD_WYVERN],ANTELOP2:[GOLD_WYVERN],ANTELOP3:[GOLD_WYVERN],ANTELOP4:[GOLD_WYVERN],WAILING_SPL:[GOLD_WYVERN],CLAW_SPL:[GOLD_WYVERN],NIHIL_INV:[GOLD_WYVERN],DOOM_ARC:[GOLD_WYVERN],\
  33. FORMOR:[SILVER_UNICORN],FORMORELDER:[SILVER_UNICORN],VANORSHAMAN:[SILVER_UNICORN],TARLKHIWARRIOR:[SILVER_UNICORN],OLMAHUM:[SILVER_UNICORN],OLMAHUMW:[SILVER_UNICORN],BUFALO1:[SILVER_UNICORN],BUFALO2:[SILVER_UNICORN],BUFALO3:[SILVER_UNICORN],BUFALO4:[SILVER_UNICORN],WISDOM_SPL:[SILVER_UNICORN],DARK_GUARD:[SILVER_UNICORN],DOOM_KNI:[SILVER_UNICORN],\
  34. HARITMATR:[KALDIS_COIN],HARITSHA:[KALDIS_COIN]
  35. }
  36. EXCHANGE_LIST={
  37. PAGE: {GOLD_KNIGHT:{GOLD_WYVERN:10},SILVER_FAIRY:{SILVER_UNICORN:10},BLOOD_WEREWOLF:{BLOOD_MEDUSA:10},NIAS_BLOOD_MEDUSA:{BLOOD_MEDUSA:20}},
  38. LORAIN:{GOLD_KNIGHT:{GOLD_WYVERN:10},SILVER_GOLEM:{SILVER_UNICORN:10},BLOOD_DREVANUL:{BLOOD_MEDUSA:10},NIAS_GOLD_WYVERN:{GOLD_WYVERN:20}},
  39. HAGGER:{GOLD_DRAKE:{GOLD_WYVERN:10},SILVER_GOLEM:{SILVER_UNICORN:10},BLOOD_WEREWOLF:{BLOOD_MEDUSA:10},NIAS_SILVER_FAIRY:{SILVER_UNICORN:20}},
  40. RALFORD:{GOLD_WYRM:{GOLD_DRAKE:5,GOLD_KNIGHT:5},SILVER_DRYAD:{SILVER_GOLEM:5,SILVER_FAIRY:5},SILVER_UNDINE:{SILVER_GOLEM:5,SILVER_FAIRY:5},MANAKS_BLOOD_WEREWOLF:{BLOOD_DREVANUL:10,BLOOD_WEREWOLF:10}},
  41. STAN: {GOLD_GIANT:{GOLD_DRAKE:5,GOLD_KNIGHT:5},BLOOD_BASILISK:{BLOOD_DREVANUL:5,BLOOD_WEREWOLF:5},SILVER_UNDINE:{SILVER_GOLEM:5,SILVER_FAIRY:5},MANAKS_SILVER_DRYAD:{SILVER_GOLEM:10,SILVER_FAIRY:10}},
  42. DUNING: {GOLD_GIANT:{GOLD_DRAKE:5,GOLD_KNIGHT:5},BLOOD_SUCCUBUS:{BLOOD_DREVANUL:5,BLOOD_WEREWOLF:5},SILVER_UNDINE:{SILVER_GOLEM:5,SILVER_FAIRY:5},MANAKS_GOLD_GIANT:{GOLD_DRAKE:10,GOLD_KNIGHT:10}},
  43. FERRIS:{BLOOD_DRAGON:{BLOOD_SUCCUBUS:5,BLOOD_BASILISK:5},SILVER_DRAGON:{SILVER_DRYAD:5,SILVER_UNDINE:5},GOLD_DRAGON:{GOLD_WYRM:5,GOLD_GIANT:5},BELETHS_BLOOD:{BLOOD_SUCCUBUS:10,BLOOD_BASILISK:10}},
  44. COLLOB:{BLOOD_DRAGON:{BLOOD_SUCCUBUS:5,BLOOD_BASILISK:5},SILVER_DRAGON:{SILVER_DRYAD:5,SILVER_UNDINE:5},GOLD_DRAGON:{GOLD_WYRM:5,GOLD_GIANT:5},BELETHS_GOLD:{GOLD_WYRM:10,GOLD_GIANT:10}},
  45. PANO: {BLOOD_DRAGON:{BLOOD_SUCCUBUS:5,BLOOD_BASILISK:5},SILVER_DRAGON:{SILVER_DRYAD:5,SILVER_UNDINE:5},GOLD_DRAGON:{GOLD_WYRM:5,GOLD_GIANT:5},BELETHS_SILVER:{SILVER_DRYAD:10,SILVER_UNDINE:10}}
  46. }
  47. GAMBLE_LIST={
  48. PAGE: {GOLD_KNIGHT:[GOLD_WYVERN],SILVER_FAIRY:[SILVER_UNICORN],BLOOD_WEREWOLF:[BLOOD_MEDUSA],NIAS_BLOOD_MEDUSA:[BLOOD_MEDUSA]},
  49. LORAIN:{GOLD_KNIGHT:[GOLD_WYVERN],SILVER_GOLEM:[SILVER_UNICORN],BLOOD_DREVANUL:[BLOOD_MEDUSA],NIAS_GOLD_WYVERN:[GOLD_WYVERN]},
  50. HAGGER:{GOLD_DRAKE:[GOLD_WYVERN],SILVER_GOLEM:[SILVER_UNICORN],BLOOD_WEREWOLF:[BLOOD_MEDUSA],NIAS_SILVER_FAIRY:[SILVER_UNICORN]},
  51. RALFORD:{GOLD_WYRM:[GOLD_DRAKE],SILVER_DRYAD:[SILVER_FAIRY],SILVER_UNDINE:[SILVER_GOLEM],MANAKS_BLOOD_WEREWOLF:[BLOOD_DREVANUL,BLOOD_WEREWOLF]},
  52. STAN: {GOLD_GIANT:[GOLD_DRAKE],BLOOD_BASILISK:[BLOOD_WEREWOLF],SILVER_UNDINE:[SILVER_FAIRY],MANAKS_SILVER_DRYAD:[SILVER_GOLEM,SILVER_FAIRY]},
  53. DUNING: {GOLD_GIANT:[GOLD_DRAKE],BLOOD_SUCCUBUS:[BLOOD_DREVANUL],SILVER_UNDINE:[SILVER_FAIRY],MANAKS_GOLD_GIANT:[GOLD_DRAKE,GOLD_KNIGHT]},
  54. FERRIS:{BLOOD_DRAGON:[BLOOD_BASILISK],SILVER_DRAGON:[SILVER_DRYAD],GOLD_DRAGON:[GOLD_GIANT],BELETHS_BLOOD:[BLOOD_SUCCUBUS,BLOOD_BASILISK]},
  55. COLLOB:{BLOOD_DRAGON:[BLOOD_SUCCUBUS],SILVER_DRAGON:[SILVER_UNDINE],GOLD_DRAGON:[GOLD_WYRM],BELETHS_GOLD:[GOLD_WYRM,GOLD_GIANT]},
  56. PANO: {BLOOD_DRAGON:[BLOOD_BASILISK],SILVER_DRAGON:[SILVER_DRYAD],GOLD_DRAGON:[GOLD_WYRM],BELETHS_SILVER:[SILVER_DRYAD,SILVER_UNDINE]}
  57. }
  58. GAMBLE_PRICE={3:{2:4,3:8,4:9},2:{2:3,3:7,4:9},1:{2:3,3:7,4:9}}
  59. GAMBLE_COINS={'0':'gold','1':'silver','2':'blood'}
  60. EXCHANGE_LEVEL={PAGE:3,LORAIN:3,HAGGER:3,RALFORD:2,STAN:2,DUNING:2,FERRIS:1,COLLOB:1,PANO:1}
  61. TRADE_LIST={
  62. 206: [[BELETHS_BLOOD,1],[SILVER_DRAGON,1],[GOLD_WYRM,13]], # Demon's Staff
  63. 233: [[BELETHS_GOLD,1],[BLOOD_DRAGON,1],[SILVER_DRYAD,1],[GOLD_GIANT,1]], # Dark Screamer
  64. 303: [[BELETHS_SILVER,1],[GOLD_DRAGON,1],[BLOOD_SUCCUBUS,1],[BLOOD_BASILISK,2]], # Widow Maker
  65. 132: [[GOLD_DRAGON,1],[SILVER_DRAGON,1],[BLOOD_DRAGON,1],[SILVER_UNDINE,1]], # Sword of Limit
  66. 2435: [[MANAKS_GOLD_GIANT,1]], # Demon's Boots
  67. 472: [[MANAKS_SILVER_DRYAD,1],[SILVER_DRYAD,1]], # Demon's Stockings
  68. 2459: [[MANAKS_GOLD_GIANT,1]], # Demon's Gloves
  69. 2414: [[MANAKS_BLOOD_WEREWOLF,1],[GOLD_WYRM,1],[GOLD_GIANT,1]], # Full Plate Helm
  70. 852: [[NIAS_BLOOD_MEDUSA,2],[BLOOD_DREVANUL,2],[GOLD_DRAKE,2],[GOLD_KNIGHT,3]], # Moonstone Earring
  71. 855: [[NIAS_BLOOD_MEDUSA,7],[BLOOD_DREVANUL,5],[SILVER_GOLEM,5],[GOLD_KNIGHT,5]],# Nassens Earring
  72. 886: [[NIAS_GOLD_WYVERN,5],[GOLD_DRAKE,4],[SILVER_GOLEM,4],[BLOOD_DREVANUL,4]], # Ring of Binding
  73. 916: [[NIAS_SILVER_FAIRY,5],[SILVER_FAIRY,3],[GOLD_KNIGHT,3],[BLOOD_DREVANUL,3]],# Necklace of Protection
  74. }
  75. import sys
  76. from com.l2jserver import Config
  77. from com.l2jserver.gameserver.model.quest import State
  78. from com.l2jserver.gameserver.model.quest import QuestState
  79. from com.l2jserver.gameserver.model.quest import Quest as JQuest
  80. def promote(st) :
  81. grade = st.getInt("grade")
  82. if grade == 1 :
  83. html = "30232-15.htm"
  84. else :
  85. h = 0
  86. for i in range(len(PROMOTE[grade])) :
  87. if st.getQuestItemsCount(PROMOTE[grade][i]):
  88. h += 1
  89. if h == i + 1 :
  90. for j in PROMOTE[grade] :
  91. st.takeItems(j,1)
  92. html = "30232-"+str(19-grade)+".htm"
  93. st.takeItems(3812+grade,-1)
  94. st.giveItems(3811+grade,1)
  95. st.set ("grade",str(grade-1))
  96. cond=COND[grade]
  97. st.playSound("ItemSound.quest_fanfare_middle")
  98. else :
  99. html = "30232-"+str(16-grade)+".htm"
  100. cond=COND[grade]-1
  101. st.set("cond",str(cond))
  102. return html
  103. # main code
  104. class Quest (JQuest) :
  105. def __init__(self,id,name,descr):
  106. JQuest.__init__(self,id,name,descr)
  107. self.questItemIds = range(3472,3499)+range(3811,3816)
  108. def onEvent (self,event,st) :
  109. htmltext = event
  110. grade=st.getInt("grade")
  111. cond = st.getInt("cond")
  112. if event == "30702-06.htm":
  113. if cond < 7:
  114. st.set("cond","7")
  115. st.playSound("ItemSound.quest_accept")
  116. elif event == "30232-22.htm" :
  117. if cond < 6:
  118. st.set("cond","6")
  119. elif event == "30232-23.htm" :
  120. if cond < 5:
  121. st.set("cond","5")
  122. elif event == "30702-02.htm":
  123. st.set("cond","2")
  124. elif event == "30232-05.htm" :
  125. st.setState(State.STARTED)
  126. st.set("part","SOLO")
  127. st.playSound("ItemSound.quest_accept")
  128. st.giveItems(COIN_DIAGRAM,1)
  129. st.set("cond","1")
  130. st.set("grade","0")
  131. elif event in ["30232-04.htm","30232-18a.htm"] :
  132. st.exitQuest(1)
  133. st.playSound("ItemSound.quest_giveup")
  134. elif event == "raise" :
  135. htmltext = promote(st)
  136. elif event.isdigit() :
  137. item = int(event)
  138. if item in TRADE_LIST.keys() :
  139. j = 0
  140. k = len(TRADE_LIST[item])
  141. for i in range(len(TRADE_LIST[item])) :
  142. if st.getQuestItemsCount(TRADE_LIST[item][i][0]) >= TRADE_LIST[item][i][1] :
  143. j += 1
  144. if j == k :
  145. for l in range(len(TRADE_LIST[item])) :
  146. st.takeItems(TRADE_LIST[item][l][0],TRADE_LIST[item][l][1])
  147. st.giveItems(item,1)
  148. htmltext = "30232-24a.htm"
  149. else :
  150. htmltext = "30232-24.htm"
  151. elif event.startswith("Li_"):
  152. action,npc,coin=event.split("_")
  153. if grade <= EXCHANGE_LEVEL[int(npc)]:
  154. if int(coin) in EXCHANGE_LIST[int(npc)].keys():
  155. htmltext=st.showHtmlFile(npc+"-06.htm").replace("%itemid%",coin)
  156. else:
  157. htmltext="Cheating huh?"
  158. st.exitQuest(1)
  159. else:
  160. htmltext=npc+"-54.htm"
  161. elif event.startswith("Ex_"):
  162. action,npc,coin,qty=event.split("_")
  163. npc,coin,qty=int(npc),int(coin),int(qty)
  164. if grade <= EXCHANGE_LEVEL[npc]:
  165. if coin in EXCHANGE_LIST[npc].keys():
  166. j=0
  167. i=len(EXCHANGE_LIST[npc][coin])
  168. for item in EXCHANGE_LIST[npc][coin].keys():
  169. if st.getQuestItemsCount(item) >= EXCHANGE_LIST[npc][coin][item]*qty:
  170. j+=1
  171. if i==j:
  172. for k in EXCHANGE_LIST[npc][coin].keys():
  173. st.takeItems(k,EXCHANGE_LIST[npc][coin][k]*qty)
  174. st.giveItems(coin,qty)
  175. st.playSound("ItemSound.quest_itemget")
  176. htmltext=str(npc)+"-07.htm"
  177. else:
  178. htmltext=str(npc)+"-10.htm"
  179. else:
  180. htmltext="Exchange not possible"
  181. else:
  182. htmltext="I can't trade with you"
  183. elif event.startswith("Ga_"):
  184. action,npc,coin,tries=event.split("_")
  185. npc,coin,tries=int(npc),int(coin),int(tries)
  186. if npc in GAMBLE_LIST.keys() and \
  187. coin in GAMBLE_LIST[npc].keys() and \
  188. grade <= EXCHANGE_LEVEL[npc] and \
  189. tries in range(2,5) :
  190. required=GAMBLE_PRICE[EXCHANGE_LEVEL[npc]][tries]
  191. if coin in [NIAS_GOLD_WYVERN,NIAS_SILVER_FAIRY,NIAS_BLOOD_MEDUSA]:
  192. required *= 2
  193. j=0
  194. i=len(GAMBLE_LIST[npc][coin])
  195. for item in GAMBLE_LIST[npc][coin]:
  196. if st.getQuestItemsCount(item) >= required :
  197. j+=1
  198. if i==j:
  199. for k in GAMBLE_LIST[npc][coin]:
  200. st.takeItems(k,required)
  201. grid=[]
  202. for i in range(3) :
  203. grid.append(self.getRandom(3))
  204. for i in range(len(grid)): grid[i]=str(grid[i])
  205. st.set("chosen","? ? ?")
  206. st.set("grid"," ".join(grid))
  207. st.set("tries",str(tries-1))
  208. st.set("current","1")
  209. st.set("coin",str(coin))
  210. st.set("npc",str(npc))
  211. htmltext=str(npc)+"-11.htm"
  212. else:
  213. htmltext=str(npc)+"-10.htm"
  214. else:
  215. htmltext="killall nalipriest"
  216. elif event.startswith("_"):
  217. event = int(event.replace("_",""))
  218. npc=st.get("npc")
  219. if event in range(13,22):
  220. if event in range(13,16):
  221. current=1
  222. next="14"
  223. elif event in range(16,19):
  224. current=2
  225. next="17"
  226. elif event in range(19,22):
  227. current=3
  228. if event in [13,16,19]:
  229. answer=0
  230. elif event in [14,17,20]:
  231. answer=1
  232. elif event in [15,18,21]:
  233. answer=2
  234. stored=st.getInt("current")
  235. if stored == current :
  236. chosen = st.get("chosen").split()
  237. chosen[current-1]=str(answer)
  238. st.set("chosen"," ".join(chosen))
  239. if current == 3:
  240. count=0
  241. grid = st.get("grid").split()
  242. tries=st.getInt("tries")
  243. for i in range(3):
  244. if chosen[i]==grid[i]:
  245. count+=1
  246. if count == 3:
  247. st.giveItems(st.getInt("coin"),1)
  248. next = "20"
  249. else:
  250. if tries :
  251. st.set("current","1")
  252. st.set("tries",str(tries-1))
  253. if count == 1 :
  254. next="50"
  255. elif count == 2 :
  256. next="51"
  257. elif count == 0 :
  258. next="52"
  259. else :
  260. next="23"
  261. msg=[]
  262. for i in grid:
  263. msg.append(GAMBLE_COINS[i])
  264. for var in ["grid","current","tries","chosen","coin","npc"]:
  265. st.unset(var)
  266. return st.showHtmlFile(npc+"-"+next+".htm").replace("%first%",msg[0]).replace("%second%",msg[1]).replace("%third%",msg[2])
  267. else :
  268. st.set("current",str(current+1))
  269. htmltext=npc+"-"+next+".htm"
  270. return htmltext
  271. def onTalk (self,npc,player):
  272. htmltext = Quest.getNoQuestMsg(player)
  273. st = self.getQuestState(player, True)
  274. if not st : return htmltext
  275. npcId = npc.getId()
  276. id = st.getState()
  277. if npcId != SORINT and id == State.CREATED : return htmltext
  278. if npcId != SORINT and npcId != BERNARD and id == State.STARTED and st.get("part")== "SOLO" : return htmltext
  279. cond=st.getInt("cond")
  280. grade = st.getInt("grade")
  281. if npcId == SORINT :
  282. if id == State.CREATED :
  283. if player.getLevel() < 40 :
  284. htmltext = "30232-01.htm"
  285. st.exitQuest(1)
  286. else :
  287. st.set("part","CREATED")
  288. htmltext = "30232-02.htm"
  289. else :
  290. if st.getQuestItemsCount(COIN_DIAGRAM) :
  291. if st.getQuestItemsCount(KALDIS_COIN) :
  292. st.takeItems(KALDIS_COIN,-1)
  293. st.takeItems(COIN_DIAGRAM,-1)
  294. st.giveItems(MEMBERSHIP_3,1)
  295. st.setState(State.STARTED)
  296. st.set("part","PARTY")
  297. st.set("grade","3")
  298. st.set("cond","4")
  299. st.playSound("ItemSound.quest_fanfare_middle")
  300. htmltext = "30232-07.htm"
  301. else :
  302. htmltext = "30232-06.htm"
  303. else:
  304. if grade == 3 :
  305. htmltext = "30232-12.htm"
  306. elif grade == 2 :
  307. htmltext = "30232-11.htm"
  308. elif grade == 1 :
  309. htmltext = "30232-10.htm"
  310. elif npcId == BERNARD:
  311. if st.getQuestItemsCount(COIN_DIAGRAM) and grade == 0:
  312. htmltext = "30702-01.htm"
  313. elif grade == 3 :
  314. htmltext = "30702-05.htm"
  315. elif npcId in EXCHANGE_LIST.keys() and grade :
  316. htmltext = str(npcId)+"-01.htm"
  317. return htmltext
  318. def onKill(self,npc,player,isPet):
  319. npcId=npc.getId()
  320. st = 0
  321. # solo section of the quest
  322. if npcId in [HARITMATR, HARITSHA] :
  323. st = self.getQuestState(player, False)
  324. if not st: return
  325. if st.getState() != State.STARTED or not st.get("part") or st.get("part") != "SOLO" : return
  326. if not npcId in [HARITMATR, HARITSHA] :
  327. # for party-kill mobs of this quest, get a random player among those who await a drop
  328. partyMember = self.getRandomPartyMember(player,"part","PARTY")
  329. if not partyMember : return
  330. st = partyMember.getQuestState(qn)
  331. cond=st.getInt("cond")
  332. grade=st.getInt("grade")
  333. chance=int((npc.getLevel() - grade * 3 - 20)*Config.RATE_QUEST_DROP)
  334. item=DROP_LIST[npcId][0]
  335. random = self.getRandom(100)
  336. if item == KALDIS_COIN :
  337. if cond == 2 :
  338. if not st.getQuestItemsCount(item) and random < (chance - 10) :
  339. st.giveItems(item,1)
  340. st.playSound("ItemSound.quest_middle")
  341. st.set("cond","3")
  342. elif random < chance:
  343. st.giveItems(item,1)
  344. st.playSound("ItemSound.quest_itemget")
  345. return
  346. # Quest class and state definition
  347. QUEST = Quest(QUEST_NUMBER, str(QUEST_NUMBER)+"_"+QUEST_NAME, QUEST_DESCRIPTION)
  348. # Quest NPC starter initialization
  349. QUEST.addStartNpc(SORINT)
  350. # Quest initialization
  351. for npc in [SORINT, BERNARD, PAGE, HAGGER, STAN, RALFORD, FERRIS, COLLOB, PANO, DUNING, LORAIN]:
  352. QUEST.addTalkId(npc)
  353. for mob in DROP_LIST.keys():
  354. QUEST.addKillId(mob)