Script Dungeon Pandemonium

« Older   Newer »
 
  Share  
.
  1.     +1   Like  
     
    .
    Avatar

    Il creatore di debbo

    Group
    Boss
    Posts
    2,482
    Vota
    0
    Location
    Sardegna

    Status
    Offline




    Per chi ha visto o ha letto Fairy Tail questo nome sarà noto, infatti avendo per ora un pc che mi permette di giocare giusto a solitario ho deciso di scrivere lo script per questo dungeon. Premetto che non ho potuto testare lo script e che ci possono essere(ci sono sicuramente) dei bug o delle parti che non funzionano, quindi se li trovate oppure avete un modo migliore per scrivere una parte di codice postate sotto. Il codice è commentato(in parte) e ho usato dei nomi comprensibili per le variabili.

    Le regole(per chi non le conosce) sono:
    1)Ci sono fino ad un massimo di 100 mostri suddivisi in 5 classi:
    Classe S = 1 Mostro
    Classe A = 4 Mostri
    Classe B = 15 Mostri
    Classe C = 30 Mostri
    Classe D = 50 Mostri
    2)Una persona può scegliere il numero di mostri da affrontare(Diritto di sfida) ma non la classe dei mostri, poichè vengono scelti casualmente(in quello originale il numero massimo di mostri sfidabili è cento meno quelli sconfitti precedentemente).
    3)Ogni mostro vale 1 punto indipendentemente dalla classe.
    4)Se si muore durante il dungeon il numero di punti accumulati con i mostri precedenti viene azzerato e si viene teletrasportati fuori.
    5)Se il mostro di classe S rimane per ultimo gli hp vengono raddoppiati(in quello originale la forza viene triplicata).
    Io ho aggiunto anche:
    6)Il dungeon si può fare giornalmente.
    7)Il diritto di sfida viene rinnovato ogni volta

    Come implementarlo:
    1)Inserite in questlib.lua questo:


    CODICE
    --INIZIO FUNZIONI DUNGEON
    PANDEMONIUM_MAP_X=0 --Coordinate generali x
    PANDEMONIUM_MAP_Y=256 --Coordinate generali y
    PANDEMONIUM_MAP_X_LOCAL=384 --Coordinate locali mappa x
    PANDEMONIUM_MAP_Y_LOCAL=384 --Coordinate locali mappa y
    PANDEMONIUM_MAP_X_RANGE=20 --X massimo nel quale vengono spawnati i mob
    PANDEMONIUM_MAP_Y_RANGE=20 --Y massimo nel quale vengono spawnati i mob
    PANDEMONIUM_MAP_INDEX=103 --Trigrammi
    PANDEMONIUM_RESET_TIME=24 --ore
    PANDEMONIUM_MIN_LEVEL=80 --livello minimo
    PANDEMONIUM_S_MONSTER_HP=10000 --HP massimi del mostro di classe S
    --Valori dei mostri utilizzati
    PANDEMONIUM_MONSTER_S_VALUE=1093
    PANDEMONIUM_MONSTER_A_VALUE=1041
    PANDEMONIUM_MONSTER_B_VALUE=1040
    PANDEMONIUM_MONSTER_C_VALUE=1003
    PANDEMONIUM_MONSTER_D_VALUE=1002

    function random_coord()
       local coord={}
       local x=0
       local y=0
       if PANDEMONIUM_MAP_X_LOCAL == 0 then
           x = pc.get_local_x()
       else
           x = PANDEMONIUM_MAP_X_LOCAL
       end
       if PANDEMONIUM_MAP_Y_LOCAL == 0 then
           y = pc.get_local_y()
       else
           y = PANDEMONIUM_MAP_Y_LOCAL
       end
       local rnd_x = math.random(1,PANDEMONIUM_MAP_X_RANGE)
       local rnd_y = math.random(1,PANDEMONIUM_MAP_Y_RANGE)
       local rnd_n_x = math.random(1,2)
       local rnd_n_y = math.random(1,2)
       if rnd_n_x == 1 then
           if rnd_n_y == 1 then
               coord[0]=x+rnd_x
               coord[1]=y+rnd_y
               return coord
           elseif rnd_n_y == 2 then
               coord[0]=x+rnd_x
               coord[1]=y-rnd_y
               return coord
           end
       elseif rnd_n_x == 2 then
           if rnd_n_y == 1 then
               coord[0]=x-rnd_x
               coord[1]=y+rnd_y
               return coord
           elseif rnd_n_y == 2 then
               coord[0]=x-rnd_x
               coord[1]=y-rnd_y
               return coord
           end
       end
    end

    function one_lower_dungeon(event_name)
       d.setf(event_name, d.getf(event_name) - 1)
       return
    end

    function one_upper_dungeon(event_name)
       d.setf(event_name, d.getf(event_name) + 1)
       return
    end

    function spawn_dungeon_mobs(n)
       local i = 1
       while i < n do
           if pc.in_dungeon() then
               local m_n = math.random(1,5) --Non mi ricordo se math.random può restituire o no entrambi gli estremi
               local r_coord = random_coord()
               if m_n==1 then
                   if game.get_event_flag("s_monsters") > 0 then
                       one_lower_dungeon("s_monsters")
                       d.setf("s_spawned",1) --Variabile di controllo per lo spawn del mob di classe S
                       local s_mob = d.spawn_mob(PANDEMONIUM_MONSTER_S_VALUE, r_coord[0], r_coord[1])
                       d.set_unique("s_mob" ,s_mob)
                       i=i+1
                   end
               elseif m_n==2 then
                   if game.get_event_flag("a_monsters") > 0 then
                       one_lower_dungeon("a_monsters")
                       d.spawn_mob(PANDEMONIUM_MONSTER_A_VALUE, r_coord[0], r_coord[1])
                       i=i+1
                   end
               elseif m_n==3 then
                   if game.get_event_flag("b_monsters") > 0 then
                       one_lower_dungeon("b_monsters")
                       d.spawn_mob(PANDEMONIUM_MONSTER_B_VALUE, r_coord[0], r_coord[1])
                       i=i+1
                   end
               elseif m_n==4 then
                   if game.get_event_flag("c_monsters") > 0 then
                       one_lower_dungeon("c_monsters")
                       d.spawn_mob(PANDEMONIUM_MONSTER_C_VALUE, r_coord[0], r_coord[1])
                       i=i+1
                   end
               elseif m_n==5 then
                   if game.get_event_flag("d_monsters") > 0 then
                       one_lower_dungeon("d_monsters")
                       d.spawn_mob(PANDEMONIUM_MONSTER_D_VALUE, r_coord[0], r_coord[1])
                       i=i+1
                   end
               end
           end
       end
       return
    end
    --FINE FUNZIONI DUNGEON



    2)Inserite la quest(dungeon_pand.quest) nella cartella /home/game/quest del server:


    CODICE
    ---------------------------
    ---- Questa creata da: ----
    -------- BlackJoker -------
    ---------------------------
    quest dungeon_pand begin
       state start begin
           when login begin
               if pc.get_map_index() == PANDEMONIUM_MAP_INDEX then
                   if pc.get_empire() == 1 then
                       pc . warp ( 469300 , 964200 )
                   elseif pc.get_empire() == 2 then
                       pc . warp ( 55700 , 157900 )
                   elseif pc.get_empire() == 3 then
                       pc . warp ( 969600 , 278400 )
                   end
               end
           end
           when 20004.chat."Pandemonium" with pc.get_level() >= PANDEMONIUM_MIN_LEVEL begin -- 20004=Cittadino ubriaco
               say_title("Cittadino Ubriaco")
               say("Ciao prode guerriero!")
               say("Vuoi entrare nel dungeon?")
               local scegli=select("Si", "No")
               if scegli==2 then
                   say("Ok, come desideri")
                   return
               elseif scegli==1 then
                   local y_can = (get_time() - game.get_event_flag("last_time")) / 3600
                   if y_can > PANDEMONIUM_RESET_TIME then
                       say("Buona fortuna!!")
                       wait()
                       d.new_jump( PANDEMONIUM_MAP_INDEX , (PANDEMONIUM_MAP_X+PANDEMONIUM_MAP_X_LOCAL)*100 , (PANDEMONIUM_MAP_Y+PANDEMONIUM_MAP_Y_LOCAL)*100 ) -- ( index , (xmappa+xpg)*100, (ymappa+ypg)*100 )
                       d.setf("s_monsters", 1) --1093 Spirito della morte
                       d.setf("a_monsters", 4) --1041 Bestia demoniaca
                       d.setf("b_monsters", 15) --1040 Spirito Immortale
                       d.setf("c_monsters", 30) --1003 Demone lanciere
                       d.setf("d_monsters", 50) --1002 Demone arciere
                       d.setf("all_mp", 0) --Punti Mostro Totali
                       game.set_event_flag("last_time", get_time()) --Ultima volta nel dungeon
                       set_state("entrata")
                   else
                       say("Non puoi entrare prima di 24 ore[ENTER]Ne mancano: " .. (PANDEMONIUM_RESET_TIME - y_can))
                       return
                   end
               end
           end
           when 20004.chat."Info" with pc.get_level() >= PANDEMONIUM_MAX_LEVEL begin -- 20004=Cittadino ubriaco
               say_title("Cittadino Ubriaco")
               say("Ciao prode guerriero!")
               say("Ti spiegherò le regole del dungeon:")
               say("1)In questo dungeon si potranno sconfiggere fino[ENTER]ad un massimo di 100 mostri classificati[ENTER]in 5 categorie:[ENTER]Sx1[ENTER]Ax4[ENTER]Bx15[ENTER]Cx30[ENTER]Dx50")
               say("2)Si puo' scegliere il numero di mostri con cui confrontarsi,[ENTER] ma non si può scegliere con quali confrontarsi,[ENTER] infatti verranno scelti casualmente")
               say("3)Ogni mostro(indipendentemente dalla classe) vale 1 punto,[ENTER] se si viene uccisi si perdono tutti i punti accumulati[ENTER] in quel round(ma non quelli totali)")
               say("4)Il dungeon è possibile farlo solo una volta ogni 24 ore")
               say("5)Nel caso in cui il mostro di classe S[ENTER] rimane ultimo i suoi HP raddoppieranno")
               say("Per il resto...buon gioco!!")
           end
       end
       state entrata begin
           when 20004.chat."Inizia" with pc.get_map_index() == (PANDEMONIUM_MAP_INDEX*100000) begin
               say_title("Cittadino Ubriaco")
               say("Inserisci il diritto di sfida: ")
               local diritto=tonumber(input())
               if diritto > 0 and diritto <= 100 then
                   d.setf("temp_mp",0) --Punti temporanei
                   d.setf("s_killed",0) --Mostro di classe S ucciso
                   d.setf("n_monsters",diritto) --Numero mostri
                   d.notice("Fra 15 secondi verrano compariranno i mostri!")
                   timer("spawn_time",15)
               elseif diritto == nil then
                   say("Devi inserire un numero!")
               else
                   say("Numero inserito non valido")
               end
           end
           when spawn_time.timer begin
               cleartimer("spawn_time")
               spawn_dungeon_mobs(d.getf("n_monsters"))
               d.notice("Che Pandemonium abbia inizio!!")
           end
           when 1093.kill with pc.in_dungeon() begin
               d.notice("Hai ucciso il mostro di classe S!")
               one_lower_dungeon("n_monsters")
               one_upper_dungeon("temp_mp")
               one_upper_dungeon("s_killed")
               d.notice("Ti mancano: " .. d.getf("n_monsters") .. " mobs")
           end
           when 1041.kill or 1040.kill or 1003.kill or 1002.kill with pc.in_dungeon() begin
               one_lower_dungeon("n_monsters")
               one_upper_dungeon("temp_mp")
               if d.getf("n_monsters") == 0 then
                   d.notice("Sei riuscito a battere tutti i mostri!!")
                   d.notice("Fra 15 secondi verrai teletrasportato fuori")
                   game.set_event_flag("all_mp",game.set_event_flag("all_mp")+d.getf("temp_mp")) --Setta i punti totali(Si può anche usare il db come alternativa)
                   timer("end_dungeon",15)
               elseif d.getf("n_monsters") == 1 and d.getf("s_killed") == 0 and d.getf("s_spawned") == 1 then
                   local base_hp = PANDEMONIUM_S_MONSTER_HP
                   d.notice("E' rimasto solo il mostro di classe S")
                   d.notice("Quindi i suoi HP vengono raddoppiati")
                   d.unique_set_maxhp("s_mob" , base_hp*2) --Raddoppio gli hp del mob
                   d.unique_set_hp("s_mob", base_hp*2) --Ripristino gli hp del mob
                   d.setf("s_spawned",0)
               else
                   d.notice("Ti mancano: " .. d.getf("n_monsters") .. " mobs")
               end
           end
           when kill with npc.is_pc() == true and pc.in_dungeon() == true begin
               if pc.is_dead() or pc.get_hp() < 1 then
                   d.notice("Sei morto, non sei stato all'altezza del dungeon, ritenta domani")
                   d.purge()
                   d.setf("temp_mp",0)
                   d.exit_all()
               end
           end
           when end_dungeon.timer begin
               d.exit_all()
           end
       end
    end



    3)Inserite in quest_functions questo:


    CODICE
    one_lower_dungeon
    one_upper_dungeon
    spawn_dungeon_mobs
    random_coord




    P.S.
    Essendo un dungeon in singolo utilizza la funzione d.new_jump() che nel file game originale è buggata, per fixarla seguite la guida: Clicca Qui
     
    .
0 replies since 15/7/2013, 11:43   23 views
  Share  
.