Salta ai contenuti

Skill

Un giocatore usa una skill dalla finestra delle skill o da una macro; uno script mette alla prova un mobile su una skill con skill.check, e la prova può far crescere la skill. Ventuno skill forniscono uno script (scripts/skills/): Hiding, Stealth, Snooping, Detecting Hidden, Anatomy, Animal Lore, Animal Taming, Evaluating Intelligence, Forensic Evaluation, Tracking, Spirit Speak, Arms Lore, Peacemaking, Provocation, Discordance, Stealing, Meditation, Item Identification, Taste Identification, Begging e Poisoning; vedi Hiding e gli altri script delle skill lì. Il resto del gioco chiama lo stesso controllo man mano che viene costruito.

Il client invia un comando testuale (pacchetto 0x12, tipo 0x24) il cui testo inizia con il numero della skill, come 21 0 per Hiding.

  1. Un personaggio morto viene rifiutato con un messaggio (cliloc 1019048), anche lo staff.
  2. Un prigioniero della prigione legge “You may not use skills in jail.” (messaggio 30168); lo staff non viene mai rifiutato.
  3. Un personaggio ancora in attesa dopo la sua ultima skill legge “You must wait a few moments to use another skill.” (cliloc 500118), al massimo una volta al secondo.
  4. Viene eseguito lo script della skill: on_use(user) della tabella che porta il nome della skill in scripts/skills/<skill>.lua, con i nomi di data/skills.toml (hiding, animal_lore).
  5. Una skill senza script risponde “That skill cannot be used directly.” (500014), e non chiede attesa.
  6. Il personaggio poi attende prima di un’altra skill: il numero restituito da on_use, in secondi da 0 a 3600; quando non ne restituisce, il delay della skill in data/skills.toml; un secondo quando nemmeno il file ne indica uno. Un on_use che chiama wait() è ancora in esecuzione quando l’attesa viene impostata: chiede il delay della skill, almeno 10 secondi, e ciò che restituisce dopo non viene letto.

Uno script di skill può definire altre funzioni che il server chiama da altrove: on_snoop(user, owner, container) in snooping.lua viene eseguita quando un giocatore fa doppio clic sul contenitore di qualcun altro, invece di aprirlo.

animal_taming ha delay = 30.0 nel toml, ma il suo script restituisce sempre 1 secondo, quindi quel valore non viene mai usato.

L’attesa è del personaggio ed è una sola per tutte le sue skill, come in ModernUO. Non viene salvata: non sopravvive a un riavvio.

-- scripts/skills/hiding.lua
hiding = {}
function hiding.on_use(user)
if skill.check(user, "hiding", 0, 100) then
mobile.set_hidden(user, true)
end
end
data/skills.toml
[[skill]]
id = "hiding"
delay = 10.0

Gli script vengono caricati all’avvio, come gli script degli oggetti; gli altri tipi di comando testuale (lanciare un incantesimo, aprire una porta, un’azione) vengono letti ma per ora non hanno effetto.

skill.check(who, skill, min, max) mette alla prova un mobile su un compito: min sono i punti a cui il compito può appena essere iniziato, max quelli a cui non fallisce mai.

Punti del mobile Risultato Può insegnare?
Sotto min Fallisce No
A max o oltre Riesce No
Nel mezzo Riesce con la probabilità (points - min) / (max - min) Sì

Quindi un compito troppo difficile o troppo facile non insegna nulla, come in ModernUO.

Una prova nel mezzo, superata o fallita, può far crescere la skill di un giocatore. Gli NPC non imparano mai.

  • Sotto i 10.0 punti una skill impara sempre.
  • Da 10.0 in poi, la probabilità è quella di ModernUO: la media dello spazio rimasto sotto il limite totale e sotto il limite della skill, poi la media tra quella e la difficoltà del compito (un successo conta metà di ciò che mancava alla certezza, un fallimento un quinto), moltiplicata per il gain_factor della skill in data/skills.toml; mai meno di una su cento.
  • Una skill fino a 10.0 punti guadagna da 0.1 a 0.4 punti alla volta, sopra guadagna 0.1.
  • Una skill al suo limite (100.0) non cresce, e nemmeno una il cui lucchetto non è su.
  • Il totale delle skill di un giocatore si ferma a ultima.skills.total_cap (700.0 punti). Più il totale gli è vicino, più spesso una crescita abbassa prima della stessa quantità un’altra skill con il lucchetto giù; al limite, una skill cresce solo quando un’altra può essere abbassata.
  • Un game master imposta una skill a mano con skill; il limite totale non vale per quel comando.

Ogni skill ha un lucchetto, su per ogni skill di un nuovo personaggio: la freccia accanto a essa nella finestra delle skill. Il giocatore lo sposta e il client lo comunica al server (pacchetto 0x3A), che lo conserva con la skill e lo salva.

Lucchetto La skill
Su Può crescere quando viene messa alla prova.
Giù Non cresce, e può essere abbassata per fare spazio a un’altra che cresce quando il totale è al limite.
Bloccato Non cresce e non viene mai abbassata.

Una skill o un lucchetto che non esiste viene ignorato.

ultima.skills.gain_enabled = false ferma ogni crescita: i controlli continuano a riuscire e a fallire.

Un controllo riuscito di un giocatore può anche far crescere forza, destrezza o intelligenza, secondo la regola classica di ModernUO, che la skill stessa sia cresciuta o no (un controllo fallito non lo fa mai). I campi str_gain, dex_gain e int_gain della skill in data/skills.toml dicono quanto la skill favorisce ciascuna statistica; una statistica il cui numero è 0 non viene mai provata da quella skill.

  1. Per ogni statistica che la skill favorisce e il cui lucchetto è su, un tiro con la probabilità gain / 33.3 (un guadagno di 0.8 è il 2,4%).
  2. Una statistica che passa viene provata una volta ogni stat_gain_minutes (10): l’attesa inizia quando viene provata, anche se non cresce nulla. È tenuta in memoria, non salvata: dopo un riavvio una statistica può essere provata subito.
  3. Più la somma delle tre statistiche si avvicina a stat_cap (225), più spesso il giocatore cede: viene tolto un punto a una statistica con il lucchetto giù (sopra i 10 punti), la più bassa delle due quando entrambe possono. Una volta che il totale è al limite cede sempre.
  4. Se il totale è poi sotto stat_cap, e la statistica ha il lucchetto su ed è sotto stat_max (100), cresce di uno.

Il massimo della sua barra si muove con essa: la forza per i punti ferita, la destrezza per la stamina e l’intelligenza per il mana, e il giocatore rivede l’intero stato. Gli NPC non guadagnano mai statistiche.

Forza, destrezza e intelligenza hanno un lucchetto ciascuna, come le skill, salvato con il personaggio: le frecce accanto a esse nella finestra di stato (0xBF sottocomando 0x1A dal client, e 0x19 verso il client al login e ogni volta che un lucchetto cambia).

Lucchetto La statistica
Su Può crescere quando una skill viene messa alla prova.
Giù Non cresce; cede un punto quando un’altra cresce e il totale è al limite.
Bloccato Non cresce e non viene mai abbassata.

L’attesa di una statistica è tenuta in memoria per personaggio, quindi uscire e rientrare non la salta; un riavvio sì. Le tre colonne (str_lock, dex_lock, int_lock) fanno parte di world.mobiles.

Un venditore, un guaritore o uno stalliere insegna le abilità che ha a 60,0 o più, come gli istruttori di ModernUO. Le abilità sono quelle del suo template mobile, quindi un venditore insegna quelle uscite così alte. I banchieri non insegnano: l’oro trascinato su di loro viene depositato.

  • Chiedere. Il menu contestuale del PNG ha una voce Train per ogni abilità che insegna e di cui il giocatore sa meno, da 8 caselle (12 per lo stalliere). Dire train entro 4 caselle, da vivo, fa elencare al PNG le abilità che insegna, o dire che non ha nulla da insegnare.
  • Prezzo. Il PNG insegna fino a un terzo del suo valore, al massimo 42,0 e mai oltre il tetto dell’abilità del giocatore. Scegliere una voce gli fa dire il prezzo: 1 oro per ogni decimo di punto, quindi 10 oro per un punto intero (420 oro per 42,0), e che per meno insegna meno. Il preventivo dura finché non viene pagato, viene dato un altro prezzo o la sessione finisce.
  • Pagare. Il giocatore trascina oro sul PNG, da 2 caselle. L’abilità sale subito di un decimo di punto per ogni moneta, fino a quanto preventivato; si prende solo l’oro necessario e il resto della pila resta al giocatore. Un trascinamento senza preventivo di quel PNG, o di qualunque cosa che non sia oro, torna indietro.
  • Rifiuti. Il giocatore sa già quanto il PNG insegnerebbe (thou knowest all I can teach) o di più; l’abilità non è bloccata verso l’alto, oppure il tetto totale (ultima.skills.total_cap) non lascia posto nemmeno abbassando le abilità bloccate verso il basso, che cedono nell’ordine delle abilità; il giocatore è morto. Un oro trascinato che non può più insegnare riceve la stessa risposta, e il preventivo viene scartato.

Uno script dà a un PNG queste lezioni con il modulo trainer e common/training.lua; shopkeeper.lua, healer.lua e stablemaster.lua lo fanno già. trainer.skills(npc, player) elenca le abilità, trainer.quote(npc, player, skill) dà un prezzo e trainer.pay(npc, giver, item) prende l’oro, che è ciò che risponde un on_drag_drop.

I dodici maestri di gilda di ModernUO (bardo, fabbro, pescatore, guaritore, mago, mercante, minatore, ranger, sarto, ladro, calderaio e guerriero) sono template mobile, un uomo (m_<trade>_guildmaster) e una donna (f_<trade>_guildmaster) per ciascuno, e una lista di PNG del mestiere (<trade>guildmaster) che ne sceglie uno. Li crea moongate-convert modernuo-guildmasters dalle classi di ModernUO: il titolo (the blacksmith guildmaster o guildmistress), le abilità del mestiere, le principali fra 80 e 100, e la gilda, e ciò che indossano e portano per il mestiere: il fabbro un grembiule o una maglia di maglia ad anelli, un bascinetto e un martello, il mago e il guaritore una veste (in tinta azzurra o gialla) e il mago un bastone. Il kryss o il pugnale del ladro non ha ancora un template oggetto. Sono venditori come gli altri, quindi insegnano ciò che sanno (Istruttori); vende solo quello del fabbro, come in ModernUO. Gli spawn di ModernUO li collocano nelle città.

Un maestro di gilda accetta membri per la gilda del suo mestiere. Il giocatore dice il nome del maestro e join o member entro 2 caselle per sentire il prezzo, 500 oro (il maestro parla solo a quel giocatore, sopra la testa), e trascina esattamente quell’oro su di lui per iscriversi. Un giocatore appartiene al massimo a una gilda (la gilda è una prop salvata del personaggio) e gli viene detto se è già membro o di un’altra gilda. La gilda dei ladri chiede di non avere uccisioni e Stealing 60,0 (anche il maestro dei ladri delle città di UOX3 è ora un maestro di gilda). Dire il nome e resign o quit lascia la gilda, non prima di una settimana dall’iscrizione. Il maestro dei minatori in ModernUO non nomina nessuna gilda, quindi insegna soltanto. L’iscrizione non ha ancora effetto: nulla la legge. L’età e il tempo di gioco che ModernUO chiede a un nuovo membro non sono conservati.

Il campo di template npc_guild (blacksmiths, thieves…) rende un PNG un maestro di gilda, e il modulo Lua npcguild (of, member, quote, is_join_payment, join, resign) con common/guild.lua dà al suo script le parole e l’oro.

Creato con ❤️ da Tom

Offrimi un caffè