Domanda [PROBLEMA] Dare punti all'uccisione

Stato
Discussione chiusa ad ulteriori risposte.

gianfro95x

Utente Emerald
4 Gennaio 2010
957
163
80
466
Buon pomeriggio a tutti, vorrei sapere come sarebbe possibile dare 10 punti quando un livello 100 uccide un livello 100 o superiore. Mentre dargliene la metà quando ne uccide uno di livello inferiore al 100. Così via magari fino al 250 ogni 25 livelli. Con gli if viene troppo lungo il codice e penso sia brutto da vedere. Quindi pensavo che con un for verrebbe più pulito. Ma non riesco a capire come fare. Vi posto il codice qui sotto, grazie per l'attenzione..
Codice:
quest kill_sbuggato begin
    state start begin
        when login or levelup with pc.get_level() > 1 begin
            set_state("pannello")
        end
    end
       
    state punti_kill begin
        when letter begin
            send_letter("Contatore Punti")
        end
       
        local livelli[liv] = {
                        [100] = 10,
                        [125] = 20,
                        [150] = 30,
                        [175] = 40,
                        [200] = 50,
                        [250] = 60
                        }

        when kill with npc.is_pc() begin
           for i = 1, table.getn(livelli) do
            if pc.get_level() >= livelli then
                pc.setqf("punti", pc.getqf("punti")+livelli[liv])
            else
                pc.setqf("punti", pc.getqf("punti")+livelli[liv]/2)
            end
        end
       
        when button or info begin
            say_title("Contatore Punti")
            say(pc.get_name().." Hai totalizzato: "..pc.getqf("punti").." punti")
        end
    end
end

P.S. Avevo preso come quest quella del conta kills.
 
La tua richiesta non è troppo chiara , ma penso che ti posso accontentare facendo di testa mia.

Ho pensato che volessi qualcosa che tenesse conto della differenza tra i livelli dei player , e che in base a ciò calcolasse il punteggio da assegnare , penalizzando chi killa player con un livello inferiore al proprio e premiando chi invece riesce a killare player di livello superiore.

Ti ho costruito delle function da mettere in questlib , i cui nomi dovrai metterli in questfunctions.
In questlib dovrai mettere il corpo della funzione , mentre in quest function solo il nome (è un pò come la dichiarazione e la definizione in c++).

questo va messo in questlib , dove ti pare basta solo che non lo metti nel bel mezzo di altre funzioni (meglio ancora se lo metti alla fine del file )
Codice:
function get_small_bonus(killer_level , victim_level)

    local difference = killer_level - victim_level
    if difference < 10 then
        return 50
     
    elseif difference < 20 then
        return 40
     
    elseif difference < 30 then
        return 30
     
    elseif difference < 40 then
        return 20
     
    else
        return 10
     
end

function get_big_bonus(killer_level , victim_level)

    local difference = victim_level - killer_level
    if difference < 10 then
        return 50
     
    elseif difference < 20 then
        return 60
     
    elseif difference < 30 then
        return 70
     
    elseif difference < 40 then
        return 80
     
    else
        return 100

end

function get_bonus_score(killer_level , victim_level)

    if killer_level > victim_level then
        return get_small_bonus(killer_level , victim_level)
     
    return get_big_bonus(killer_level , victim_level)

end

La funzione che dovrai poi richiamare nella tua quest per ricevere il valore del bonus è ovviamente get_bonus_score( liv , liv )
Non è il miglior codice che io abbia mai visto ma per quel che serve a te direi che è funzionale.

Grazie al mio solito standard che utilizzo nella scelta dei nomi di variabili/funzioni dovresti capire benissimo ciò che fa ma se avessi dei dubbi , dimmi pure.

nel caso non ti fosse chiaro , in questfunctions devi aggiungere :

Codice:
get_bonus_score
get_small_bonus
get_big_bonus



spero vivamente che non ti dia errore di compilazione (non le ho testate) , per quanto possano essere semplicissime , sono giorni che programmo in c++ e python e quindi potrei benissimamente aver fatto errori di sintassi ahah.

esempio di utilizzo della nuova funzione :
Codice:
local bonus = get_bonus_score(pc.get_level() , npc.get_level())



Saluti ;)
 
Ultima modifica:
La tua richiesta non è troppo chiara , ma penso che ti posso accontentare facendo di testa mia.

Ho pensato che volessi qualcosa che tenesse conto della differenza tra i livelli dei player , e che in base a ciò calcolasse il punteggio da assegnare , penalizzando chi killa player con un livello inferiore al proprio e premiando chi invece riesce a killare player di livello superiore.

Ti ho costruito delle function da mettere in questlib , i cui nomi dovrai metterli in questfunctions.
In questlib dovrai mettere il corpo della funzione , mentre in quest function solo il nome (è un pò come la dichiarazione e la definizione in c++).

questo va messo in questlib , dove ti pare basta solo che non lo metti nel bel mezzo di altre funzioni (meglio ancora se lo metti alla fine del file )
Codice:
function get_small_bonus(killer_level , victim_level)

    local difference = killer_level - victim_level
    if difference < 10 then
        return 50
   
    elseif difference < 20 then
        return 40
   
    elseif difference < 30 then
        return 30
   
    elseif difference < 40 then
        return 20
   
    else
        return 10
   
end

function get_big_bonus(killer_level , victim_level)

    local difference = victim_level - killer_level
    if difference < 10 then
        return 50
   
    elseif difference < 20 then
        return 60
   
    elseif difference < 30 then
        return 70
   
    elseif difference < 40 then
        return 80
   
    else
        return 100

end

function get_bonus_score(killer_level , victim_level)

    if killer_level > victim_level then
        return get_small_bonus(killer_level , victim_level)
   
    return get_big_bonus(killer_level , victim_level)

end

La funzione che dovrai poi richiamare nella tua quest per ricevere il valore del bonus è ovviamente get_bonus_score( liv , liv )
Non è il miglior codice che io abbia mai visto ma per quel che serve a te direi che è funzionale.

Grazie al mio solito standard che utilizzo nella scelta dei nomi di variabili/funzioni dovresti capire benissimo ciò che fa ma se avessi dei dubbi , dimmi pure.

nel caso non ti fosse chiaro , in questfunctions devi aggiungere :

Codice:
get_bonus_score
get_small_bonus
get_big_bonus



spero vivamente che non ti dia errore di compilazione (non le ho testate) , per quanto possano essere semplicissime , sono giorni che programmo in c++ e python e quindi potrei benissimamente aver fatto errori di sintassi ahah.

esempio di utilizzo della nuova funzione :
Codice:
local bonus = get_bonus_score(pc.get_level() , npc.get_level())



Saluti ;)
Innanzitutto ti ringrazio tantissimo per la risposta, sei sempre il primo che mi risponde hahaha, detto ciò, la funzione che mi hai scritto penso di averla capita e anche dove mettere le varie cose. Provo a rispiegare quello che vorrei fare. Io vorrei fare che se un livello 100 uccide un player livello 100 o superiore gli vengono conferiti 20 punti. Mentre se il player di livello 100 fà il bulletto con player inferiori al livello 100 gli vengano assegnati solo 5 punti. Lo stesso discorso vale per un livello 150 ovvero se è di livello 150 e uccide un player con livello > al 150 +20 punti altrimenti +5 punti. Spero di essermi spiegato, nel mentre mi studio quello che hai scritto tu che mi interessa. Ma allo stesso tempo non ci capisco na mazza.

P.S.

Non ti sei dimenticato un'else?
Codice:
function get_bonus_score(killer_level , victim_level)

    if killer_level > victim_level then
        return get_small_bonus(killer_level , victim_level)
    
    return get_big_bonus(killer_level , victim_level)

end
 
non serve l`else e` come se fosse sottointeso, se entra in quella condizione ritorna get_small_bonus altrimenti get_big_bonus (questo si applica coi return ovviamente)
 
  • Mi piace
Reazioni: gianfro95x
Ultima modifica:
Non ti sei dimenticato un'else?

No in quanto il return chiude l'esecuzione della funzione (restituendo il valore)
Quindi se non avviene il primo if , avviene il secondo return (spero di essermi spiegato).
L'else è necessario solo se dopo le if /else condition ci vuoi mettere altro codice.

Comunque se vuoi fare in modo soltanto di differire tra chi killa un player di livello superiore al proprio, e chi invece killa player di livello inferiore , al posto di return get_small_bonus ci va return 5 , e return 20 al posto di get_big_bonus
Ovviamente le function get_small_bonus e get_bug_bonus puoi deletarle

@gianfro95x vorrei anche farti notare che attualmente l'if principale ritorna 20 anche per caso di parità di livello in quanto killer > victim ritorna 5 e in tutti gli altri casi (parità compresa) ritorna 20
 
  • Mi piace
Reazioni: gianfro95x
No in quanto il return chiude l'esecuzione della funzione (restituendo il valore)
Quindi se non avviene il primo if , avviene il secondo return (spero di essermi spiegato).
L'else è necessario solo se dopo le if /else condition ci vuoi mettere altro codice.

Comunque se vuoi fare in modo soltanto di differire tra chi killa un player di livello superiore al proprio, e chi invece killa player di livello inferiore , al posto di return get_small_bonus ci va return 5 , e return 20 al posto di get_big_bonus
Ovviamente le function get_small_bonus e get_bug_bonus puoi deletarle

Ok grazie, scusa ma volevo capire il perchè non ci fosse un'else e direttamente il return..
Quindi io con questa funzione:
Codice:
function get_small_bonus(killer_level , victim_level) -- killer_level ipotizzo 100 e victim_level ipotizzo 90

    local difference = killer_level - victim_level    --- difference quindi diventerà 10 e se difference è minore di 10 mi da 50 punti?
    if difference < 10 then
        return 50
    
    elseif difference < 20 then   ----- qui difference è sempre 10 ma rimane minore di 20 quindi mi da 40 punti?
        return 40
    
    elseif difference < 30 then   
        return 30
    
    elseif difference < 40 then
        return 20
    
    else
        return 10
    
end

Mentre con questa:
Codice:
function get_big_bonus(killer_level , victim_level)

    local difference = victim_level - killer_level   ----- victim_level 90 e killer_level 100 
    if difference < 10 then                  ------difference sarà -10 ed è minore di 10 quindi mi darà 50 punti.
        return 50
    
    elseif difference < 20 then       ----- qua sempre minore di 20 e mi darà 60 punti
        return 60
    
    elseif difference < 30 then
        return 70
    
    elseif difference < 40 then
        return 80
    
    else                                        -----qua se il livello di differenza è esagerato mi darà 100 punti?
        return 100

end

Alla fine:
Codice:
function get_bonus_score(killer_level , victim_level)

    if killer_level > victim_level then                 ---se il killer_level(es. 150)  è maggiore del victim_level (es.100) torna alla funzione di prima
        return get_small_bonus(killer_level , victim_level)
    
    return get_big_bonus(killer_level , victim_level)    ---se non funge quella sopra ritorna alla funzione di prima 

end

Scusa se ti rompo e continuo a scrivere, ma non voglio fare copia e incolla, ma vorrei anche capire, purtroppo so fatto così.
 
Ultima modifica:
Non ti è chiaro l'uso del return.

Nel caso in cui la funzione serva a restituire un valore (come get_bonus_score ad esempio) il return è usato per interrompere l'esecuzione della funzione , restituendo il valore.
In conclusione se il codice raggiunge un "return" in una function , l'esecuzione del codice si fermerà in quel punto.
Il return usato in uno when interrompe l esecuzione del codice del when proprio come se fosse in una function, difatti è usato molto male generalmente( chi mette return end ad esempio non ha capito che l'end non viene nemmeno letto)

quindi se difference è 10 e il codice dice :
if difference < 10 then
return 50
elseif difference < 20 then
return 60

il primo if essendo falso non viene eseguito , il secondo essendo vero viene eseguito , ed esattamente in quel punto (al return) si ferma l esecuzione della function (ritornando il valore)

Oltretutto non tieni conto dell'utilizzo che faccio delle due function small e big ..
non sono usate a caso , una viene usata se killi un pg di liv inferiore , l'altra quando killi player di livello maggiore al tuo ( o uguale)
Quindi non puoi fare l'esempio che hai fatto , visto che la big viene eseguita con livello del killer inferiore a quello della vittima


@gianfro95x eccoti il codice commentato :
Codice:
function get_small_bonus(killer_level , victim_level)

    local difference = killer_level - victim_level -- numero sempre non negativo (0+)
    if difference < 10 then -- se difference è minore di 10
        return 50            -- ritorno 50 e mi fermo
     
    elseif difference < 20 then -- se arrivo fin qui allora difference non è sicuramente minore di 10
        return 40                -- quindi se è compreso tra 10 e 19 , ritorno 40
    
    elseif difference < 30 then -- idem come sopra ma tra 20 e 29
        return 30       
    
    elseif difference < 40 then    -- idem come sopra ma tra 30 e 39
        return 20
    
    else            -- se la differenza è superiore a 39 ( quindi non è minore di 40) allora ritorno 10
        return 10
    
end

function get_big_bonus(killer_level , victim_level)

    local difference = victim_level - killer_level -- numero sempre non negativo ( 0+)
    if difference < 10 then -- se difference è minore di 10 ritorno 50 e mi fermo
        return 50
    
    elseif difference < 20 then -- se arrivo fin qui difference non è minore di 10
        return 60                -- se quindi è compreso tra 10 e 19 ritorno 60 e mi fermo
    
    elseif difference < 30 then -- se arrivo fin qui difference non è minore di 10 e nemmeno di 20
        return 70                -- se quindi è compreso tra 20 e 29 ritorno 70
    
    elseif difference < 40 then --idem come  sopra
        return 80
    
    else                        -- se la differenza è maggiore di 39 (ovvero non è minore di 40)
        return 100                -- allora ritorno 100

end

function get_bonus_score(killer_level , victim_level)

    if killer_level > victim_level then
        return get_small_bonus(killer_level , victim_level) --- se il livello del killer è superiore al livello della vittima
                                                            --- eseguo get_small_bonus , dopo di chè ne restituisco il valore
                                                            --- che quest'ultima mi ha restituito
    
    return get_big_bonus(killer_level , victim_level) -- altrimenti eseguo get_big_bonus
                                                      -- restituendo lo stesso valore che essa ha restituito

end
 
  • Mi piace
Reazioni: gianfro95x
Ok grazie mille per la spiegazione del return e delle altre due, adesso ho capito ma ho un'ultimo dubbio.
Quindi:
if difference < 10 then
return 50
elseif difference < 20 then
return 60

Il primo if non lo calcola proprio, mentre il secondo dato che è vero lo calcola. Però quel 60 vicino al return cosa sarebbe? Giuro che se ci fosse ancora la reputazione te la darei a valanghe.
 
Ho editato lo scorso messaggio , dai un occhiata al codice commentato.
Il return è una keyword del lua ( e di molti altri linguaggi )
Il suo scopo è quello di ritornare un valore (ma dai?) e fermare l'esecuzione del codice "locale" (che sia funzione , when , o quello che ti pare)
In realtà tu non lo conosci in questo modo , perchè chi ha rilasciato la maggior parte delle quest su questa ed altre community non conosce a sua volte il vero scopo del return.

Se non ha nessun valore vicino , allora è usato solo per fermare l esecuzione di codice e probabilmente ci si trova in una "void" , ovvero una funzione che non ha scopo di ritorno ma solo di esecuzione.
Ora ti faccio un esempio.
pc.get_level() non è void perchè RITORNA un valore (ovvero il livello) che tu puoi "catturare in variabile" (local level = pc.get_level() )

pc.set_skill_level(vnum , level) è una void , ovvero viene eseguita ed è fine a se stessa (non ha un valore di ritorno)

nel caso della funzione da me costruita (get_bonus_score e company) non si ha a che fare con "void" ma con funzioni di ritorno , quindi il return ha fianco a se un valore ( che poi è il valore che riceverai se la usi - local bonus = get_bonus_score(liv , liv ) ).

Se non riesco proprio a spiegartelo , mi dispiace ma devi cercare sul web , ho fatto il mio massimo... sarò io che non riesco a spiegarmi bene.
 
  • Mi piace
Reazioni: gianfro95x
Va benissimo ho capito grazie mille, sei stato grande. E scusami del tempo che ti ho fatto perdere. Con questo chiudo il topic. Grazie mille bello.
 
  • Mi piace
Reazioni: Ikarus_
Stato
Discussione chiusa ad ulteriori risposte.