Jump to content
Rpg²S Forum

LO Script: Tag manager


DonDante
 Share

Recommended Posts

Tag Manager

Descrizione

Permette di creare categorie e restrizioni personalizzate tramite notetag

Tali restrizioni possono essere applicate su:

  • Eroi
  • Classi
  • Abilità
  • Oggetti
  • Armi
  • Armature
  • Nemici
  • Stati
  • Mappe

 

Autore

Tsukihime

 

Allegati

---

 

Istruzioni per l'uso

All'interno dello script

 

Script

 

=begin

#==============================================================================

 ** Tag Manager

 Author: Tsukihime

 Date: Mar 6, 2013

------------------------------------------------------------------------------

 ** Change log

 1.3 Mar 6, 2013 

   - added tags to Maps

   - integrated several plugins with this script

 1.2 Nov 3, 2012

   - made more compatible with th_core scripts and other managers

 1.1 Nov 1, 2012

   - fixed bug where multiple tags were not being parsed

 1.0 Oct 26, 2012

   - Initial Release

------------------------------------------------------------------------------   

 ** Terms of Use

 * Free to use in commercial/non-commercial projects

 * No real support. The script is provided as-is

 * Will do bug fixes, but no compatibility patches

 * Features may be requested but no guarantees, especially if it is non-trivial

 * Credits to Tsukihime in your project

 * Preserve this header

------------------------------------------------------------------------------

 

 This script allows you to assign "database object tags", or basically "tags",

 to various database objects. These are simple strings that are stored with

 the object and can be referenced if needed.

 

 There are two types of tags:



 1. Object tags.

    - These are tags that will be stored with your objects.

 

 2. Condition tags.

    - These are special tags that can be used to filter objects by tags.

      For example, you can use them to prevent an actor from equipping something

    

 To add an object tag, notetag the database object with

    <tag: string1 string2 string3>

    

 Where each string is an arbitrary non-whitespace terminated sequence of

 characters (eg: male, female, dwarf, elf, blah, carrot)

 

 You may have multiple object tags for a single object.

    

 To add a condition tag, notetag the database object with

    <tag_cond: tag1 tag2 ... > 

    

 For special map conditions, you can use the notetag

    <map_cond: tag1 tag2 ... >

 

 Tag conditions are specified as logical expressions.

 Conditions of the form

    <tag_cond: tag1 tag2 tag3 ... >

 Mean that tag1 AND tag2 AND tag3 AND ... must all be satisfied.

 

 Conditions of the form

    <tag_cond: tag1>

    <tag_cond: tag2>

 Mean that the requirements are satisfied if tag1 OR tag2 are present.

 

 You also have the NOT operator, which can be specified using the ! sign,

 as shown:

    <tag_cond: !tag1>

    

 Which means the condition is satisfied only if tag1 does NOT exist.

 

 You can mix all three of the above operators to create all kinds of logical

 expressions. For example

 

    <tag_cond: male soldier !human>

    <tag_cond: female monk elf>

    

 This translates to

   (male AND soldier AND NOT human) OR (female AND monk AND elf)

   

 This script does not handle parentheses, so you are unable to say things

 like !(a or b). Instead, you should expand it to !a and !b and then

 apply the logic there.

    

#==============================================================================

=end

$imported = {} if $imported.nil?

$imported["Tsuki_TagManager"] = 1.3

#-------------------------------------------------------------------------------

# Configuration

#-------------------------------------------------------------------------------

module TagManager

  

  # delimiter to use to separate tags in a single line. 

  Tag_Delimiter = " "   

#-------------------------------------------------------------------------------

# Rest of Script

#-------------------------------------------------------------------------------

  Tag_Regex = /<tag:\s*(.*)>/i

  Tag_Cond_Regex = /<tag_cond:\s*(.*)>/i

  Map_Cond_Regex = /<map_cond:\s*(.*)>/i

  

  def object_tags

    return @tags unless @tags.nil?

    load_notetag_object_tags

    return @tags

  end

  

  def condition_tags

    return @cond_tags unless @cond_tags.nil?

    load_notetag_condition_tags

    return @cond_tags

  end

  

  def map_condition_tags

    return @map_cond_tags unless @map_cond_tags.nil?

    load_notetag_map_condition_tags

    return @map_cond_tags

  end

  

  def load_notetag_object_tags

    @tags = []

    res = self.note.scan(Tag_Regex).flatten

    @tags = res ? res.map{|tag| tag.downcase.split(Tag_Delimiter)}.flatten : []

  end

  

  def load_notetag_condition_tags

    @cond_tags = []

    res = self.note.scan(Tag_Cond_Regex)

    res.each {|group|

      @cond_tags.push(parse_condition_tags(group[0].downcase.split(Tag_Delimiter)))

    }

  end

  

  def load_notetag_map_condition_tags

    @map_cond_tags = []

    res = self.note.scan(Map_Cond_Regex)

    res.each {|group|

      @map_cond_tags.push(parse_condition_tags(group[0].downcase.split(Tag_Delimiter)))

    }

  end

  

  # Use two lists to keep track of NOT conditions. The first list

  # holds all tags that must exist, and the second list holds

  # all tags that must not exist.

  def parse_condition_tags(conds)

    lists = [[],[]]

    conds.each {|cond|

      cond[0] == "!" ? lists[1] << cond[1..-1] : lists[0] << cond

    }

    return lists

  end

  

  alias :cond_tags :condition_tags

  alias :tags :object_tags

  alias :map_cond_tags :map_condition_tags

end



module RPG

  

  class BaseItem

    include TagManager

  end

  

  class Map

    include TagManager

  end

end



class Game_BattlerBase

  

  # Returns an array of tags that the battler has

  def tags

    tag_objects.inject([]) {|r, obj| r + obj.object_tags }

  end

  

  def tag_objects

    states

  end

  

  def map_tag_conditions_met?(item)

    return true if item.map_cond_tags.empty?

    return item.map_cond_tags.any? {|group|

      (group[0] - $game_map.tags).empty? && (group[1] & $game_map.tags).empty?

    }

  end

  

  # Returns true if there are no tag conditions, or all tag conditions

  # are met, which means all required tags must be present and actor does not

  # have any restricted tags

  def item_tag_conditions_met?(item)

    return true if item.cond_tags.empty?

    return false unless item.cond_tags.any? {|group|

      (group[0] - tags).empty? && (group[1] & tags).empty?

    }

    return true

  end

  

  def equippable?(item)

    return false unless item.is_a?(RPG::EquipItem)

    return false if equip_type_sealed?(item.etype_id)

    return false if item.is_a?(RPG::Weapon) && !equip_weapon_ok?(item) 

    return false if item.is_a?(RPG::Armor) && !equip_armor_ok?(item)

    return true

  end 

  

  def equip_weapon_ok?(item)

    return false if !map_tag_conditions_met?(item)

    return false if !item_tag_conditions_met?(item)

    return true

  end

  

  def equip_armor_ok?(item)

    return false if !map_tag_conditions_met?(item)

    return false if !item_tag_conditions_met?(item)

    return true

  end

end



class Game_Battler < Game_BattlerBase

      

  alias :th_tag_manager_item_test :item_test

  def item_test(user, item)

    

    # Effects only valid if tag conditions met

    return false unless item_tag_conditions_met?(item)

    return false unless map_tag_conditions_met?(item)

    return th_tag_manager_item_test(user, item)

  end

end



class Game_Enemy < Game_Battler

  

  #-----------------------------------------------------------------------------

  # 

  #-----------------------------------------------------------------------------

  def tag_objects

    super + [enemy]

  end

end



class Game_Actor < Game_Battler

   

  #-----------------------------------------------------------------------------

  #

  #-----------------------------------------------------------------------------

  def tag_objects

    super + [actor] + [self.class] + equips.compact

  end

end



class Game_Map

  

  #-----------------------------------------------------------------------------

  # Tags on the map

  #-----------------------------------------------------------------------------

  def tags

    @map.tags

  end

end

 

 

 

Bugs e Conflitti Noti

In teoria nessuno. In caso contrario segnalatelo

Altri dettagli

Usare questo script da moltissima libertà, ma va un attimino "capito"

Con la notetag

<tag: X>

daremo un qualsiasi valore ad un qualsiasi elemento, sia esso una mappa, un oggetto, un eroe, una classe o via discorrendo.

Ad esempio, se vogliamo che un attore sia riconosciuto dal sistema come "donna" useremo

<tag: donna>

Una volta fatto questo avremo creato un gruppo "donna"

Se volessimo quinidi creare un oggetto solo per donne useremo il tag

<tag_cond: X>

sostituendo il valore di X con "donna"

Tutti gli oggetti taggati con

<tag_cond: donna>

saranno quindi limitati alle donne.

I tag funzionano anche sulle mappe, con un piccolo accorgimento.

Se, ad esempio vogliamo che un oggetto funzioni solo mella mappa del mondo,

taggheremo la mappa del mondo con

<tag: mondo>

mentre l'oggetto avrà una condizione

<map_cond: mondo> e non <tag_cond: mondo>

Ultimo punto dobbiamo capire, per gestire al meglio i tag, le funzioni

OR, AND e NOT

Con queste funzioni porremo una condizione del tipo

<tag_cond: X OR Y>

la condizione include tutti gli elementi con tag X oppure Y

<tag_cond: X AND Y>

la condizione include tutti gli elementi che sono sia X che Y

<tag_cond: NOT Y>

la condizione include tutti gli elementi che non sono Y

Con un po di fantasia, si può, attraverso questo sistema, fare quasi qualunque cosa...

Enjoy!

Edited by DonDante

Progetti in Corso:




...



Link to comment
Share on other sites

Ah ottimo script! Soprattutto perchè agisce su quasi tutte le categorie! :3

^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!
(> <)


Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^

http://i.imgur.com/KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^

http://i.imgur.com/FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^

REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

 

SUWOnzB.jpg 🖤
http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gif
http://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3
http://i.imgur.com/MpaUphY.jpg by Idriu E:3

Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44)

http://i.imgur.com/PgUqHPm.png
Ufficiale
"Ad opera della sua onestà e del suo completo appoggio alla causa dei Panda, Guardian Of Irael viene ufficialmente considerato un Membro portante del Partito, e Ambasciatore del suo Popolo presso di noi"


http://i.imgur.com/TbRr4iS.png<- Grazie Testament E:3
Ricorda...se rivolgi il tuo sguardo ^ ^ a Guardian anche Guardian volge il suo sguardo ^ ^ a te ^ ^
http://i.imgur.com/u8UJ4Vm.gifby Flame ^ ^
http://i.imgur.com/VbggEKS.gifhttp://i.imgur.com/2tJmjFJ.gifhttp://projectste.altervista.org/Our_Hero_adotta/ado2.png
Grazie Testament XD Fan n°1 ufficiale di PQ! :D

Viva
il Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che non
avevo programmi di grafica per fare un banner su questo pc XD (ora ho di
nuovo il mio PC veramente :D)

Rosso Guardiano della
http://i.imgur.com/Os5rvhx.png

Rpg2s RPG BY FORUM:

Nome: Darth Reveal

 

PV totali 2
PA totali 16

Descrizione: ragazzo dai lunghi capelli rossi ed occhi dello stesso colore. Indossa una elegante giacca rossa sopra ad una maglietta nera. Porta pantaloni rossi larghi, una cintura nera e degli stivali dello stesso colore. E' solito trasportare lo spadone dietro la schiena in un fodero apposito. Ha un pendente al collo e tiene ben legato un pezzo di stoffa (che gli sta particolarmente a cuore) intorno al braccio sinistro sotto la giacca, copre una cicatrice.
Bozze vesti non definitive qui.

Equipaggiamento:
Indossa:
60$ e 59$ divisi in due tasche interne
Levaitan

Spada a due mani elsa lunga

Guanti del Defender (2PA)
Anello del linguaggio animale (diventato del Richiamo)

Scrinieri da lanciere (2 PA)

Elmo del Leone (5 PA)

Corazza del Leone in Ferro Corrazzato (7 PA)

ZAINO (20) contenente:
Portamonete in pelle di cinghiale contenente: 100$
Scatola Sanitaria Sigillata (può contenere e tenere al sicuro fino a 4 oggetti curativi) (contiene Benda di pronto soccorso x3, Pozione di cura)
Corda
Bottiglia di idromele
Forma di formaggio
Torcia (serve ad illuminare, dura tre settori)

Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)
Ampolla Bianca

Semi di Balissa

 

CAVALLO NORMALE + SELLA (30 +2 armi) contentente:
66$
Benda di pronto soccorso x3
Spada a due mani

Fagotto per Adara (fazzoletto ricamato)


 

Link to comment
Share on other sites

Ti dirò:

Con questo script ho già creato un sacco di eventi, e di abilità, che in caso contrario avrebbero richiesto un lavoro di eventi comuni gargantuesca!

 

E dico gargantuesca perchè sono colto. U_U

Progetti in Corso:




...



Link to comment
Share on other sites

  • 1 month later...

Mmm per come ho creato il mio gioco mi servirebbe di aggiungere una tag DOPO l'inizio del gioco a seconda di una scelta, è possibile aggiungere una nota al pg tramite evento?

"Giochiamo a: schiettezza o grande impresa eroica!"

Personaggio PBF: Lyriel
PN: 12/20
PV: 2/2
PA: 4 (5 col mantello d'acero)
Equipaggiamento:

Spada comune
Pugnale comune
Arco elfico (magico, ignifugo. Permette di colpire da lunghe distanze. Se distrutto si auto-restaura a fine battaglia. Le frecce scoccate con questo arco ottengono l'effetto dell'incantesimo Folata di vento permettendo di spazzare via piccoli oggetti e creature.)
Faretra con 20 frecce
Cappuccio
Armatura delle ombre borchiata (punti armatura 4, ignifuga, di notte +1 a furtività)
2 anelli di valore
Borsa comune (10 slot)

  • Corda
  • Penna e calamaio
  • Libro vuoto
  • Forma di formaggio
  • Mappa
  • Cannocchiale
  • Tagliola di ferro
  • Campanellino di Maia
  • Mantello d'Acero (+1PA): un mantello pesante di colore rossiccio che presenta dei motivi fiochi, dello stesso colore, a forma di foglie d'acero. E' dotato di un ampio cappuccio e può coprire completamente chi lo indossa. Se si resta fermi in un'area boschiva o tra un gruppo di alberi il mantello è in grado di celare completamente la presenza del possessore dando un grado di furtività pari a gr.5. Nel caso di bestie ed animali dalla visuale meno acuta, se il giocatore è già stato notato od ha notificato in qualche modo la sua presenza può gettarsi a terra tra un gruppo di foglie o tra i cespugli per scomparire completamente dalla visuale di tali nemici.

181 monete d'oro
Cintura porta coltelli (6 slot)

  • Coltello da lancio intarsiato
  • Coltello da lancio in metallo
  • Coltello da lancio in metallo

Campanellino di Maia




Se Lyriel, e solo lui, suona tre volte il campanellino può richiamare una creatura magica che combatterà al suo fianco al prezzo di 3 PN.
L'animale ha l'aspetto di un leopardo delle nevi, i suoi occhi sono viola e così gli artigli, i denti e la punta della coda. Questa è lunga e larga, molto folta e corposa. Il manto a differenza dei leopardi è tutto bianco, inoltre ha una folta criniera circolare intorno al collo a mo' di sciarpa e che si unisce con la sommità della fronte creando un cresta non molto alta pettinata all'indietro.
La creatura combatte indipendentemente dal possessore (il giocatore potrà descriverne il comportamento in battaglia e fuori, ma il master potrà riservarsi il diritto di far compiere alla creatura delle azioni per conto proprio).
La creatura non deve per forza stare vicino all'utilizzatore, ma può essere mandata lontano e tornare da lui su comando.
Lyriel e l'animale hanno un contatto mentale e possono comunicare anche a distanza.
Non vi è limite alla permanenza della creatura una volta evocata, però se i suoi PV raggiungono lo zero dovrà essere risvegliata magicamente da un mago od un curatore esperto. Lyriel può richiamare all'interno del campanellino la creatura quando essa non è impegnata in combattimento od in altre prove senza sforzi, ma dovrà spendere di nuovo 3 PN per richiamarla. Può continuare a combattere se Lyriel viene sconfitto.
L'animale vede bene anche di notte e se c'è nebbia.
Caratteristiche della creatura:
PV 2
PA 2
Atletica Gr.4
Furtività Gr.1
Attacco (tipo descritto dal giocatore nei limiti fisici di artigli e morso) di massimo Gr.5 può dichiarare DIRETTO su armature di cuoio o cuoio borchiato e MAGICO con tutti gli attacchi. Può dichiarare SONNO se artigli e denti viola entrano in contatto diretto con il sangue l'avversario. DIRETTO e SONNO sono due effetti, quindi come da regolamento solo uno può essere scelto. MAGICO può esser combinato con entrambi.
Malus: il campanellino deve tintinnare, quindi Lyriel suonandolo tradirà la sua presenza.
Il campanellino tutte le volte che viene suonato fa venire in mente Maia a Lyriel, quindi il giocatore dovrà scrivere una frase di almeno 3 parole per ricordare la bambina, ogni volta diversa, altrimenti l'evocazione non avrà esito.

 


Personaggio PBF: Wren
PN: 20/20
PV:2/2
PA:0


Borsa Comune

  • 3 filoni di pane
  • 4 mele
  • prosciutto
  • formaggio
  • coltello da cucina

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...