__init__.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. # Made by Emperorc
  2. import sys
  3. from com.l2jserver.gameserver.model.quest import State
  4. from com.l2jserver.gameserver.model.quest import QuestState
  5. from com.l2jserver.gameserver.model.quest import Quest as JQuest
  6. from com.l2jserver.util import Rnd
  7. qn = "384_WarehouseKeepersPastime"
  8. #NPCs
  9. Cliff = 30182
  10. Baxt = 30685
  11. #ITEMS
  12. Medal = 5964
  13. #Droplist format - npcId : chance (%)
  14. Droplist = {
  15. 20948 : 18, #Bartal
  16. 20945 : 12, #Cadeine
  17. 20946 : 15, #Sanhidro
  18. 20635 : 15, #Carinkain
  19. 20773 : 61, #Conjurer Bat Lord
  20. 20774 : 60, #Conjurer Bat
  21. 20760 : 24, #Dragon Bearer Archer
  22. 20758 : 24, #Dragon Bearer Chief
  23. 20759 : 23, #Dragon Bearer Warrior
  24. 20242 : 22, #Dustwind Gargoyle
  25. 20281 : 22, #Dustwind Gargoyle (2)
  26. 20556 : 14, #Giant Monstereye
  27. 20668 : 21, #Grave Guard
  28. 20241 : 22, #Hunter Gargoyle
  29. 20286 : 22, #Hunter Gargoyle (2)
  30. 20949 : 19, #Luminun
  31. 20942 : 9, #Nightmare Guide
  32. 20943 : 12, #Nightmare Keeper
  33. 20944 : 11, #Nightmare Lord
  34. 20559 : 14, #Rotting Golem
  35. 20243 : 21, #Thunder Wyrm
  36. 20282 : 21, #Thunder Wyrm (2)
  37. 20677 : 34, #Tulben
  38. 20605 : 15, #Weird Drake
  39. }
  40. #Rewards - item : chance (iterative)
  41. Rewards_10_Win = {
  42. 1888 : 16, #Synthetic Cokes
  43. 1887 : 32, #Varnish of Purity
  44. 1894 : 50, #Crafted Leather
  45. 952 : 80, #Scroll: Enchant Armor (C)
  46. 1890 : 89, #Mithril Alloy
  47. 1893 : 98, #Oriharukon
  48. 951 : 100 #Scroll: Enchant Weapon (C)
  49. }
  50. Rewards_10_Lose = {
  51. 4041 : 50, #Mold Hardener
  52. 952 : 80, #Scroll: Enchant Armor (C)
  53. 1892 : 98, #Blacksmith\'s Frame
  54. 917 : 100 #Necklace of Mermaid
  55. }
  56. Rewards_100_Win = {
  57. 883 : 50, #Aquastone Ring
  58. 951 : 80, #Scroll: Enchant Weapon (C)
  59. 852 : 98, #Moonstone Earring
  60. 401 : 100 #Drake Leather Armor
  61. }
  62. Rewards_100_Lose = {
  63. 951 : 50, #Scroll: Enchant Weapon (C)
  64. 500 : 80, #Great Helmet
  65. 2437 : 98, #Drake Leather Boots
  66. 135 : 100 #Samurai Longsword
  67. }
  68. class Quest (JQuest) :
  69. def __init__(self,id,name,descr):
  70. JQuest.__init__(self,id,name,descr)
  71. self.questItemIds = [Medal]
  72. #a dynamic dictionary mapping player names to board status and selected numbers - name : [[game],[guesses],bet]
  73. self.gameStatus = {}
  74. def generateBoard(self,player,bet) :
  75. board = []
  76. num = [1,2,3,4,5,6,7,8,9]
  77. for i in range(9) : board.append(num.pop(Rnd.get(1,len(num))-1))
  78. self.gameStatus[player.getName()] = [board,[],bet]
  79. return
  80. def fillBoard(self,player,htmltext) :
  81. guess = self.gameStatus[player.getName()][1]
  82. for i in range(9) :
  83. num = self.gameStatus[player.getName()][0][i]
  84. if num in guess :
  85. htmltext = htmltext.replace("<?Cell"+str(i+1)+"?>",str(num))
  86. else :
  87. htmltext = htmltext.replace("<?Cell"+str(i+1)+"?>","?")
  88. return htmltext
  89. def checkWin(self,player) :
  90. board = self.gameStatus[player.getName()][0]
  91. guess = self.gameStatus[player.getName()][1]
  92. new_board = [[0,0,0],[0,0,0],[0,0,0]]
  93. k = match = win = 0
  94. a = range(3)
  95. for i in a :
  96. for j in a :
  97. new_board[i][j] = board[k]
  98. k += 1
  99. #Checking rows
  100. for i in a :
  101. for j in a :
  102. match += (new_board[i][j] in guess)
  103. if match == 3 :
  104. win += 1
  105. match = 0
  106. #Checking collumns
  107. for j in a :
  108. for i in a :
  109. match += (new_board[i][j] in guess)
  110. if match == 3 :
  111. win += 1
  112. match = 0
  113. #Checking diagonals
  114. for i in a :
  115. match += (new_board[i][i] in guess)
  116. if match == 3 :
  117. win += 1
  118. match = 0
  119. for i,j in [[0,2],[1,1],[2,0]] :
  120. match += (new_board[i][j] in guess)
  121. if match == 3 :
  122. win += 1
  123. return win
  124. def getReward(self,rewards) :
  125. rand = Rnd.get(100)
  126. for item in rewards.keys() :
  127. if rand < rewards[item] :
  128. return item
  129. def onAdvEvent (self,event,npc,player):
  130. st = self.getQuestState(player, False)
  131. if not st: return
  132. htmltext = event
  133. npcId = str(npc.getId())
  134. if event == "30182-05.htm" :
  135. st.playSound("ItemSound.quest_accept")
  136. st.setState(State.STARTED)
  137. st.set("cond","1")
  138. elif event == npcId + "-08.htm" :
  139. st.playSound("ItemSound.quest_finish")
  140. st.exitQuest(1)
  141. elif event == npcId + "-11.htm" :
  142. if st.getQuestItemsCount(Medal) >= 10 :
  143. st.takeItems(Medal,10)
  144. self.generateBoard(player,10)
  145. else :
  146. htmltext = npcId + "-12.htm"
  147. elif event == npcId + "-13.htm" :
  148. if st.getQuestItemsCount(Medal) >= 100 :
  149. st.takeItems(Medal,100)
  150. self.generateBoard(player,100)
  151. else :
  152. htmltext = npcId + "-12.htm"
  153. elif event.startswith("select_1-") : #first pick
  154. selection = int(event[9])
  155. self.gameStatus[player.getName()][1].append(selection)
  156. htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-14.htm")
  157. htmltext = self.fillBoard(player,htmltext)
  158. elif event.startswith("select_2-") : #pick #2-5
  159. selection = int(event[9])
  160. guess = self.gameStatus[player.getName()][1]
  161. num_guesses = len(guess)
  162. if selection in guess : #already chose that number!
  163. htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-" + str(14+2*num_guesses) + ".htm")
  164. else :
  165. self.gameStatus[player.getName()][1].append(selection)
  166. num_guesses += 1
  167. htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-" + str(11+2*num_guesses) + ".htm")
  168. htmltext = self.fillBoard(player,htmltext)
  169. elif event.startswith("select_3-") : #pick #6
  170. selection = int(event[9])
  171. guess = self.gameStatus[player.getName()][1]
  172. if selection in guess : #already chose that number!
  173. htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-26.htm")
  174. htmltext = self.fillBoard(player,htmltext)
  175. else :
  176. self.gameStatus[player.getName()][1].append(selection)
  177. wins = self.checkWin(player)
  178. bet = self.gameStatus[player.getName()][2]
  179. if wins == 3 :
  180. item = self.getReward(eval("Rewards_"+str(bet)+"_Win"))
  181. st.giveItems(item,1)
  182. htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-23.htm")
  183. elif wins == 0 :
  184. item = self.getReward(eval("Rewards_"+str(bet)+"_Lose"))
  185. if item == 2437 : st.giveItems(2463,1)
  186. st.giveItems(item,1)
  187. htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-25.htm")
  188. else :
  189. htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-24.htm")
  190. guess = self.gameStatus[player.getName()][1]
  191. for i in range(9) :
  192. num = self.gameStatus[player.getName()][0][i]
  193. htmltext = htmltext.replace("<?Cell"+str(i+1)+"?>",str(num))
  194. if num in guess :
  195. htmltext = htmltext.replace("<?FontColor"+str(i+1)+"?>","ff0000")
  196. else :
  197. htmltext = htmltext.replace("<?FontColor"+str(i+1)+"?>","ffffff")
  198. return htmltext
  199. def onTalk (self,npc,player) :
  200. st = self.getQuestState(player, True)
  201. htmltext = Quest.getNoQuestMsg(player)
  202. if not st: return htmltext
  203. npcId = npc.getId()
  204. id = st.getState()
  205. cond = st.getInt("cond")
  206. if npcId == Cliff :
  207. if id == State.CREATED :
  208. htmltext = "04"
  209. if player.getLevel() >= 40 :
  210. htmltext = "01"
  211. elif st.getQuestItemsCount(Medal) < 10 :
  212. htmltext = "06"
  213. elif st.getQuestItemsCount(Medal) >= 10 :
  214. htmltext = "07"
  215. elif npcId == Baxt :
  216. if st.getQuestItemsCount(Medal) < 10 :
  217. htmltext = "01"
  218. elif st.getQuestItemsCount(Medal) >= 10 :
  219. htmltext = "02"
  220. if htmltext.isdigit() :
  221. htmltext = str(npcId) + "-" + htmltext + ".htm"
  222. return htmltext
  223. def onKill(self,npc,player,isPet) :
  224. st = self.getQuestState(player, False)
  225. if not st : return
  226. npcId = npc.getId()
  227. if npcId in Droplist.keys() :
  228. if Rnd.get(100) < Droplist[npcId] :
  229. st.giveItems(Medal,1)
  230. st.playSound("ItemSound.quest_itemget")
  231. return
  232. QUEST = Quest(384,qn,"Warehouse Keeper's Pastime")
  233. QUEST.addStartNpc(Cliff)
  234. QUEST.addTalkId(Cliff)
  235. QUEST.addTalkId(Baxt)
  236. for mob in Droplist.keys() :
  237. QUEST.addKillId(mob)