123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- # Made by Emperorc
- import sys
- from com.l2jserver.gameserver.model.quest import State
- from com.l2jserver.gameserver.model.quest import QuestState
- from com.l2jserver.gameserver.model.quest import Quest as JQuest
- from com.l2jserver.util import Rnd
- qn = "384_WarehouseKeepersPastime"
- #NPCs
- Cliff = 30182
- Baxt = 30685
- #ITEMS
- Medal = 5964
- #Droplist format - npcId : chance (%)
- Droplist = {
- 20948 : 18, #Bartal
- 20945 : 12, #Cadeine
- 20946 : 15, #Sanhidro
- 20635 : 15, #Carinkain
- 20773 : 61, #Conjurer Bat Lord
- 20774 : 60, #Conjurer Bat
- 20760 : 24, #Dragon Bearer Archer
- 20758 : 24, #Dragon Bearer Chief
- 20759 : 23, #Dragon Bearer Warrior
- 20242 : 22, #Dustwind Gargoyle
- 20281 : 22, #Dustwind Gargoyle (2)
- 20556 : 14, #Giant Monstereye
- 20668 : 21, #Grave Guard
- 20241 : 22, #Hunter Gargoyle
- 20286 : 22, #Hunter Gargoyle (2)
- 20949 : 19, #Luminun
- 20942 : 9, #Nightmare Guide
- 20943 : 12, #Nightmare Keeper
- 20944 : 11, #Nightmare Lord
- 20559 : 14, #Rotting Golem
- 20243 : 21, #Thunder Wyrm
- 20282 : 21, #Thunder Wyrm (2)
- 20677 : 34, #Tulben
- 20605 : 15, #Weird Drake
- }
- #Rewards - item : chance (iterative)
- Rewards_10_Win = {
- 1888 : 16, #Synthetic Cokes
- 1887 : 32, #Varnish of Purity
- 1894 : 50, #Crafted Leather
- 952 : 80, #Scroll: Enchant Armor (C)
- 1890 : 89, #Mithril Alloy
- 1893 : 98, #Oriharukon
- 951 : 100 #Scroll: Enchant Weapon (C)
- }
- Rewards_10_Lose = {
- 4041 : 50, #Mold Hardener
- 952 : 80, #Scroll: Enchant Armor (C)
- 1892 : 98, #Blacksmith\'s Frame
- 917 : 100 #Necklace of Mermaid
- }
- Rewards_100_Win = {
- 883 : 50, #Aquastone Ring
- 951 : 80, #Scroll: Enchant Weapon (C)
- 852 : 98, #Moonstone Earring
- 401 : 100 #Drake Leather Armor
- }
- Rewards_100_Lose = {
- 951 : 50, #Scroll: Enchant Weapon (C)
- 500 : 80, #Great Helmet
- 2437 : 98, #Drake Leather Boots
- 135 : 100 #Samurai Longsword
- }
- class Quest (JQuest) :
- def __init__(self,id,name,descr):
- JQuest.__init__(self,id,name,descr)
- self.questItemIds = [Medal]
- #a dynamic dictionary mapping player names to board status and selected numbers - name : [[game],[guesses],bet]
- self.gameStatus = {}
- def generateBoard(self,player,bet) :
- board = []
- num = [1,2,3,4,5,6,7,8,9]
- for i in range(9) : board.append(num.pop(Rnd.get(1,len(num))-1))
- self.gameStatus[player.getName()] = [board,[],bet]
- return
- def fillBoard(self,player,htmltext) :
- guess = self.gameStatus[player.getName()][1]
- for i in range(9) :
- num = self.gameStatus[player.getName()][0][i]
- if num in guess :
- htmltext = htmltext.replace("<?Cell"+str(i+1)+"?>",str(num))
- else :
- htmltext = htmltext.replace("<?Cell"+str(i+1)+"?>","?")
- return htmltext
- def checkWin(self,player) :
- board = self.gameStatus[player.getName()][0]
- guess = self.gameStatus[player.getName()][1]
- new_board = [[0,0,0],[0,0,0],[0,0,0]]
- k = match = win = 0
- a = range(3)
- for i in a :
- for j in a :
- new_board[i][j] = board[k]
- k += 1
- #Checking rows
- for i in a :
- for j in a :
- match += (new_board[i][j] in guess)
- if match == 3 :
- win += 1
- match = 0
- #Checking collumns
- for j in a :
- for i in a :
- match += (new_board[i][j] in guess)
- if match == 3 :
- win += 1
- match = 0
- #Checking diagonals
- for i in a :
- match += (new_board[i][i] in guess)
- if match == 3 :
- win += 1
- match = 0
- for i,j in [[0,2],[1,1],[2,0]] :
- match += (new_board[i][j] in guess)
- if match == 3 :
- win += 1
- return win
- def getReward(self,rewards) :
- rand = Rnd.get(100)
- for item in rewards.keys() :
- if rand < rewards[item] :
- return item
- def onAdvEvent (self,event,npc,player):
- st = self.getQuestState(player, False)
- if not st: return
- htmltext = event
- npcId = str(npc.getId())
- if event == "30182-05.htm" :
- st.playSound("ItemSound.quest_accept")
- st.setState(State.STARTED)
- st.set("cond","1")
- elif event == npcId + "-08.htm" :
- st.playSound("ItemSound.quest_finish")
- st.exitQuest(1)
- elif event == npcId + "-11.htm" :
- if st.getQuestItemsCount(Medal) >= 10 :
- st.takeItems(Medal,10)
- self.generateBoard(player,10)
- else :
- htmltext = npcId + "-12.htm"
- elif event == npcId + "-13.htm" :
- if st.getQuestItemsCount(Medal) >= 100 :
- st.takeItems(Medal,100)
- self.generateBoard(player,100)
- else :
- htmltext = npcId + "-12.htm"
- elif event.startswith("select_1-") : #first pick
- selection = int(event[9])
- self.gameStatus[player.getName()][1].append(selection)
- htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-14.htm")
- htmltext = self.fillBoard(player,htmltext)
- elif event.startswith("select_2-") : #pick #2-5
- selection = int(event[9])
- guess = self.gameStatus[player.getName()][1]
- num_guesses = len(guess)
- if selection in guess : #already chose that number!
- htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-" + str(14+2*num_guesses) + ".htm")
- else :
- self.gameStatus[player.getName()][1].append(selection)
- num_guesses += 1
- htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-" + str(11+2*num_guesses) + ".htm")
- htmltext = self.fillBoard(player,htmltext)
- elif event.startswith("select_3-") : #pick #6
- selection = int(event[9])
- guess = self.gameStatus[player.getName()][1]
- if selection in guess : #already chose that number!
- htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-26.htm")
- htmltext = self.fillBoard(player,htmltext)
- else :
- self.gameStatus[player.getName()][1].append(selection)
- wins = self.checkWin(player)
- bet = self.gameStatus[player.getName()][2]
- if wins == 3 :
- item = self.getReward(eval("Rewards_"+str(bet)+"_Win"))
- st.giveItems(item,1)
- htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-23.htm")
- elif wins == 0 :
- item = self.getReward(eval("Rewards_"+str(bet)+"_Lose"))
- if item == 2437 : st.giveItems(2463,1)
- st.giveItems(item,1)
- htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-25.htm")
- else :
- htmltext = self.getHtm(player.getHtmlPrefix(), npcId + "-24.htm")
- guess = self.gameStatus[player.getName()][1]
- for i in range(9) :
- num = self.gameStatus[player.getName()][0][i]
- htmltext = htmltext.replace("<?Cell"+str(i+1)+"?>",str(num))
- if num in guess :
- htmltext = htmltext.replace("<?FontColor"+str(i+1)+"?>","ff0000")
- else :
- htmltext = htmltext.replace("<?FontColor"+str(i+1)+"?>","ffffff")
- return htmltext
- def onTalk (self,npc,player) :
- st = self.getQuestState(player, True)
- htmltext = Quest.getNoQuestMsg(player)
- if not st: return htmltext
- npcId = npc.getId()
- id = st.getState()
- cond = st.getInt("cond")
- if npcId == Cliff :
- if id == State.CREATED :
- htmltext = "04"
- if player.getLevel() >= 40 :
- htmltext = "01"
- elif st.getQuestItemsCount(Medal) < 10 :
- htmltext = "06"
- elif st.getQuestItemsCount(Medal) >= 10 :
- htmltext = "07"
- elif npcId == Baxt :
- if st.getQuestItemsCount(Medal) < 10 :
- htmltext = "01"
- elif st.getQuestItemsCount(Medal) >= 10 :
- htmltext = "02"
- if htmltext.isdigit() :
- htmltext = str(npcId) + "-" + htmltext + ".htm"
- return htmltext
- def onKill(self,npc,player,isPet) :
- st = self.getQuestState(player, False)
- if not st : return
- npcId = npc.getId()
- if npcId in Droplist.keys() :
- if Rnd.get(100) < Droplist[npcId] :
- st.giveItems(Medal,1)
- st.playSound("ItemSound.quest_itemget")
- return
- QUEST = Quest(384,qn,"Warehouse Keeper's Pastime")
- QUEST.addStartNpc(Cliff)
- QUEST.addTalkId(Cliff)
- QUEST.addTalkId(Baxt)
- for mob in Droplist.keys() :
- QUEST.addKillId(mob)
|