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
|
|