Tileset swapper

Skripty pro RPG Makeru VX (nekompatibilní s verzí VX Ace).

Moderátor: Moderátoři

Uživatelský avatar
 
Příspěvky: 35
Registrován: květen 19, 2010, 11:09 am
Bydliště: Kolín

Tileset swapper

Příspěvek od Zellmaster » leden 7, 2011, 10:12 pm

Tak, jak jsem už jednou psal, zdejší komunita zřejmě o tileset swapperu ještě neslyšela, pojďme to změnit ;-)

O co jde?
Ti z vás, kteří zkoušeli RMVX a nějaký jiný RM, určitě vás u VXka štvalo, že máte omezenou paletu s grafikou a jediný způsob jak jí rozšířit bylo přidat si paletu "E" nebo si existující palety nahradit. Swapper ale dokáže, že si můžete pro jakoukoli mapu zvolit jakoukoli grafiku, kterou vytvoříte/naleznete a je tu i možnost pomocí swapperu tvořit různé eventy změny prostředí v reálném čase, jednoduchým spuštěním switche a navrácení původní grafiky vypnutím téhož switche.

Jak to funguje?
Vytvořte si složku s názvem "extra_tiles" ve složce Graphics/System ve vašem projektu. Do této složky vložte veškeré tilesety, které chcete využívat - pojmenovat je můžete jak je libo. V okamžik, kdy tileset chcete použít, v eventu vložte funkci "callscript" (poslední stránka s funkcemi, uplně dole) a vepište $tileA1 = "VášNázev" (tileA1 je příklad, můžete využít jakoukoli paletu, kterou chcete změnit - "VášNázev" vyplňte názvem vašeho tilesetu, tím se část palety "A" změní z původní grafiky na grafiku vámi nově nahranou, můžete v jednom callscriptu změnit jen jednu, dvě a nebo všechny palety, je to jen na vás ->
příklad:
$tileA1 = "VášNázev"
$tileA4 = "VášNázev"
$tileE = "VášNázev"
Hned po callscriptu musíte spustit switch pro výmenu tilesetu (deafultně jde o switch 100, ve scripteditoru si ho můžete změnit) pro návrat původní grafiky pak stačí tento switch vypnout. (Např. si uděláte kovárnu, při vstupu do ní změníte tileset C na tileset kovárny, spustíte switch - při odchodu se switch opět vypne a v mapě už se bude zobrazovat C tileset původní)

Průchodnost
Důležitá věc, kterou určitě budete chtít využít je změna průchodnosti. Pokud máte Tileset C, určitě v něm máte nastavenou průchudnost - aby hráč nemohl projít pevnými objekty apod. Bohužel však při změně tilesetu průchodnost zůstává, není však problém ji předělat.

-> Nejlepší cesta, jak si nastavit průchodnost pro nový tileset je otevřít si nový projekt, ve kterém vymažete defaultní tilesety a místo nich si dáte nové, které ve svém hlavním projektu chcete využít (pojmenujete je jako ty původní A1,A2......D) a nastavíte si průchodnost tak, jak jste zvyklí. Projekt uložte a otevřete si v něm složku "data" a zkopírujte si soubor "System.rvdata" nakopírujte jej do složky "extra_tiles" a pojmenujte ho jak chcete, jen zanechte jeho koncovku .rvdata (např. kovarna.rvdata)

-> Změna průchodnosti je řešena stejně jako změna tilesetu, nejdříve společně se změnou tilesetu (klidně i bez ní, můžete si tak pohrávat s průchodností za účelem nějaké minihry apod.) provedeme callscriptem i změnu průchodu a to takto: $swap_passages = "VášNázev" (VášNázev = vámi pojmenovaný soubor s koncovkou .rvdata) a poté musí být spuštěn switch pro změnu průchodnosti (Defaultně jde o switch 99, opět je ve scripteditoru možné si zvolit, o jaký switch by mělo jít)

Změna v reálném čase
Pokud si přejete, aby se tileset změnil automaticky po spuštění eventu (stisknutím tlačítka, vstupem na event atd.), vložte pod callscripty a switche ještě jeden callscript-> $game_map.tileset
Pokud však bude změna provedena až po přenosu hráče na jinou mapu, není třeba vkládat tento call script.

Kód: Vybrat vše
=begin
                    Swap Tileset with new passage setting

Version: 0.4
Author: BulletXt (bulletxt@gmail.com)
Date: 13/06/2009

This scripts makes you:

a) Swap a tileset at any time
b) you can swap all tilesets or n tilesets
c) you can load a new passage setting any time you want

How it works:
Create a folder named "extra_tiles" inside Graphics/System. Place your new
tilesets there. They can be named as you like. Before doing a map transfer,
do a simple callscript inside the event like this:
$tileA1 = "fileName"

Replace "fileName" with the tileset you want to change. In that example,
it will swap tile set A1. You can swap all tilesets or just some of them.
For example you can swap TileA1, TileA4 and TileE doing as said above:
$tileA1 = "fileName"
$tileA4 = "fileName"
$tileE = "fileName"


Immediately after the script call/s inside event,
turn the SWAP_TILE switch ON (this can be set below). To reset default
tileset, before a map transfer simply turn the switch to OFF.


This said, you can also load a new passage setting.
Simply open a new project, set the passagesettings as you want, save and close.
Get into Data folder and copy System.rvdata to your real project. Paste it always
inside "extra_tiles" and rename it to anything you want. Be sure file extension
ends with ".rvdata" .
Example: System.rvdata is renamed to:  pub.rvdata

Passage setting gets loaded exactly like tilesets, this means that first you
do the script call inside event and then you turn the
LOAD_PASSAGE_SETTING switch ON(this can be set below). You can
load a new passage setting without swapping any tiles. The 2 things are totally
indipendent.
The script call to load a passage setting is like this:
$swap_passages = "filePassage"
Replace filePassage with the passage setting file you want to load.


By simply turning both switches to OFF,
you automatically reset passage setting to default one and reset all
tilesets to default.
If instead you want to do a map transfer and keep your swapped tilesets
but want to reset only TileA3,simply do a script call of this type:
$tileA3 = nil
Same behaviour is for passage setting, simply set:
$swap_passages = nil
and that will reset passage setting to default.


Tricks:

- you can create a special effect as seen in the demo.
  For example, you can make a tile swap without
  doing a map transfer. You can for instance make a wall change real time its
  tile! To do this, do the normal call for swapping (callscript + switch ON),
  then immediatley after do this callscript: $game_map.tileset
  This callscript will reload the map (screen freezes for 30 milliseconds) so
  the final effect is that the wall has magically a new tile!
  Same thing is for passagesetting, you can load a new passage setting in real
  time by simply doing (callscript + switch ON) and then $game_map.tileset.

=end


############################# CONFIGURATION ####################################

# This is a switch ID, if ON it calls the swapping system. This is
# used for swapping/resetting tile sets. THIS DOES NOT CHANGE PASSAGE SETTINGS.
# Be sure to turn the switch ON only after doing the callscript (as said above).
SWAP_TILE = 100

# This is a switch ID, if ON it calls the passage setting system. This is
# used for loading/resetting new passage settings.
# THIS DOES NOT SWAP TILE SETS.
# Be sure to turn the switch ON only after doing the callscript (as said above).
LOAD_PASSAGE_SETTING = 99


########################## END CONFIGURATION ###################################


#==============================================================================
# ** Cache

module Cache_Swap_Tiles
 
  #--------------------------------------------------------------------------
  # * Get Character Graphic
  #     filename : Filename
  #--------------------------------------------------------------------------
  def self.swap(filename)
    load_bitmap("Graphics/System/extra_tiles/", filename)
  end
 
  #--------------------------------------------------------------------------
  # * Clear Cache
  #--------------------------------------------------------------------------
  def self.clear
    @cache = {} if @cache == nil
    @cache.clear
    GC.start
  end
  #--------------------------------------------------------------------------
  # * Load Bitmap
  #--------------------------------------------------------------------------
  def self.load_bitmap(folder_name, filename, hue = 0)
    @cache = {} if @cache == nil
    path = folder_name + filename
    if not @cache.include?(path) or @cache[path].disposed?
      if filename.empty?
        @cache[path] = Bitmap.new(32, 32)
      else
        @cache[path] = Bitmap.new(path)
      end
    end
    if hue == 0
      return @cache[path]
    else
      key = [path, hue]
      if not @cache.include?(key) or @cache[key].disposed?
        @cache[key] = @cache[path].clone
        @cache[key].hue_change(hue)
      end
      return @cache[key]
    end
  end
end






#initialize global variables
$tileA1 = nil
$tileA2 = nil
$tileA3 = nil
$tileA4 = nil
$tileA5 = nil
$tileB = nil
$tileC = nil
$tileD = nil
$tileE = nil
$swap_passages = nil
################################################################################
class Game_Map
include Cache_Swap_Tiles 
  alias bulletxt_goodbye_vx_limit_tile_setup setup
  def setup(map_id)
    #if false, normal vx behavior and exit
    if $game_switches[LOAD_PASSAGE_SETTING] == false
    bulletxt_goodbye_vx_limit_tile_setup(map_id)
    $swap_passages = nil
    return 
    end
   
 
    path = "Graphics/System/extra_tiles/" + $swap_passages.to_s() + ".rvdata" rescue nil

   if $swap_passages != nil

     @map_id = map_id
     @map = load_data(sprintf("Data/Map%03d.rvdata", @map_id))
     @display_x = 0
     @display_y = 0
     
     
      # load system settings from that file
      new_system_rvdata = load_data(path)
      # Use passage settings from that file
      @passages = new_system_rvdata.passages
     
      #default vx code
      referesh_vehicles
      setup_events
      setup_scroll
      setup_parallax
      @need_refresh = false
     
    else
    bulletxt_goodbye_vx_limit_tile_setup(map_id) 
    end
   
  end
 
  #if here, player has done a $game_map.tileset call. It must reload
  #map with new passage setting (if it exists) and upate map.
  def tileset
    #if false, we must update and load default passage
    if $game_switches[LOAD_PASSAGE_SETTING] == false
    @passages = $data_system.passages
    else
   
    #if nil, must reset passage setting to default 
    if $swap_passages == nil
    @passages = $data_system.passages
    $scene = Scene_Map.new
    return
    end
     
     
path = "Graphics/System/extra_tiles/" + $swap_passages + ".rvdata" rescue nil
   
    # load system settings from that file
    new_system_rvdata = load_data(path)
    # Use passage settings from that file
    @passages = new_system_rvdata.passages
   
     
   end   
   #this updates the map tiles. it does not modify events or anything else.
   $scene = Scene_Map.new
  end
 
 
 
end



class Spriteset_Map
include Cache_Swap_Tiles 
  alias bulletxt_lodestone_create_tilemap create_tilemap
  def create_tilemap
    if $game_switches[SWAP_TILE] == false
     bulletxt_lodestone_create_tilemap
     $tileA1 = nil
     $tileA2 = nil
     $tileA3 = nil
     $tileA4 = nil
     $tileA5 = nil
     $tileB = nil
     $tileC = nil
     $tileD = nil
     $tileE = nil
    else
bulletxt_lodestone_create_tilemap
path_to_graphic = "extra_tiles/"

#tileA1   
tile1 = Cache_Swap_Tiles.swap($tileA1 + ".png") rescue nil
@tilemap.bitmaps[0] = tile1 if $tileA1 != nil#if FileTest.exist?(path_to_graphic + $tileA1.to_s() + ".png")
#tileA2
tile2 = Cache_Swap_Tiles.swap($tileA2 + ".png") rescue nil
@tilemap.bitmaps[1] = tile2 if $tileA2 != nil#if FileTest.exist?(path_to_graphic + $tileA2.to_s() + ".png")
#tileA3
tile3 = Cache_Swap_Tiles.swap($tileA3 + ".png") rescue nil
@tilemap.bitmaps[2] = tile3 if $tileA3 != nil#if FileTest.exist?(path_to_graphic + $tileA3.to_s() + ".png")
#tileA4
tile4 = Cache_Swap_Tiles.swap($tileA4 + ".png") rescue nil
@tilemap.bitmaps[3] = tile4 if $tileA4 != nil#if FileTest.exist?(path_to_graphic + $tileA4.to_s() + ".png")
#tileA5
tile5 = Cache_Swap_Tiles.swap($tileA5 + ".png") rescue nil
@tilemap.bitmaps[4] = tile5 if $tileA5 != nil#if FileTest.exist?(path_to_graphic + $tileA5.to_s() + ".png")
#tileB
tile6 = Cache_Swap_Tiles.swap($tileB + ".png") rescue nil
@tilemap.bitmaps[5] = tile6 if $tileB != nil#if FileTest.exist?(path_to_graphic + $tileB.to_s() + ".png")
#tileC
tile7 = Cache_Swap_Tiles.swap($tileC + ".png") rescue nil
@tilemap.bitmaps[6] = tile7 if $tileC != nil#if FileTest.exist?(path_to_graphic + $tileC.to_s() + ".png")
#tileD
tile8 = Cache_Swap_Tiles.swap($tileD + ".png") rescue nil
@tilemap.bitmaps[7] = tile8 if $tileD != nil#if FileTest.exist?(path_to_graphic + $tileD.to_s() + ".png")
#tileE
tile9 = Cache_Swap_Tiles.swap($tileE + ".png") rescue nil
@tilemap.bitmaps[8] = tile9 if $tileE != nil#if FileTest.exist?(path_to_graphic + $tileE.to_s() + ".png")   

   
    end

  end

end



class Scene_File < Scene_Base
  alias bulletxt_swap_tiles_write_save_data write_save_data
  def write_save_data(file)
    bulletxt_swap_tiles_write_save_data(file)
    Marshal.dump($tileA1,      file)
    Marshal.dump($tileA2,      file)
    Marshal.dump($tileA3,      file)
    Marshal.dump($tileA4,      file)
    Marshal.dump($tileA5,      file)
    Marshal.dump($tileB,      file)
    Marshal.dump($tileC,      file)
    Marshal.dump($tileD,      file)
    Marshal.dump($tileE,      file)
    Marshal.dump($swap_passages.to_s(),   file)
  end 
 
 
  alias bulletxt_swap_tiles_read_save_data read_save_data
  def read_save_data(file)
    bulletxt_swap_tiles_read_save_data(file)
    $tileA1        = Marshal.load(file)
    $tileA2        = Marshal.load(file)
    $tileA3        = Marshal.load(file)
    $tileA4        = Marshal.load(file)
    $tileA5        = Marshal.load(file)
    $tileB        = Marshal.load(file)
    $tileC        = Marshal.load(file)
    $tileD        = Marshal.load(file)
    $tileE        = Marshal.load(file)
    $swap_passages = Marshal.load(file)
  end
 
 
 
  end


Další velmi užitečná utilitka, bez které by celé využití tileset swapperu v editoru byla opravdu oříškem je prográmek swap_tileset. Společně se všemi pluginy ho nakopírujte do složky se svým projektem.
Důležité je, abyste měli všechny defaultní tilesety ve složce Graphics/system (v původnímy názvy TileA1, TileA2....)
Po spušetění byste měli ihned pochopit, jak funguje, jednoduše nahrajete grafiku nového tilesetu, která nahradí původní grafiku.
Zpusťte poté editor vašeho projektu - místo původních tilesetů v paletě nyní uvidíte ty, kterými jste je nahradili, to vám pomůže při výměně tilesetů.

Program ZDE ke stažení.
A TADY si můžete stáhnout tilesety z RMXP :-)
Nakonec si ZDE můžete stáhnout demo přímo od autora scriptu - pomocí něj je pochopení funkce swapperu možná ještě jasnější.

Uživatelský avatar
 
Příspěvky: 794
Registrován: únor 14, 2010, 10:07 pm
Bydliště: Slaný. To je kousek od Prahy.

Re: Tileset swapper

Příspěvek od legition » leden 16, 2011, 9:09 pm

Vypadá to dobře. Jen by jsi mněl ještě upozornít, že tileset musí být v PNG :wink: . další věc, je hezké že tu dáváš tilesety do XP, ale VX používá jiný formát. Oprav mě pokud mi něco ušlo...
Obrázek


Obrázek

Uživatelský avatar
 
Příspěvky: 35
Registrován: květen 19, 2010, 11:09 am
Bydliště: Kolín

Re: Tileset swapper

Příspěvek od Zellmaster » leden 16, 2011, 10:59 pm

legition píše:Vypadá to dobře. Jen by jsi mněl ještě upozornít, že tileset musí být v PNG :wink: . další věc, je hezké že tu dáváš tilesety do XP, ale VX používá jiný formát. Oprav mě pokud mi něco ušlo...

Tak že musí být v PNG asi každý ví, ze stránky kterou jsem přiložil stahuješ přímo PNG... Co se týče formátu tak jediné, co se liší je velikost postav, na tom, jak se rozkouskuje tileset nezáleží, navíc jsou čtverečky pořád stejně veliké...

Uživatelský avatar
 
Příspěvky: 794
Registrován: únor 14, 2010, 10:07 pm
Bydliště: Slaný. To je kousek od Prahy.

Re: Tileset swapper

Příspěvek od legition » leden 17, 2011, 8:41 am

Já třeba používám JPG nebo BMP, když nepotřebuji průhlednost..

a kté velikosti. Xp využívá tilesety o velikosti 256x576, ale VX používá 512x512. Takže pokud nemáš program který ti ty čtverečky nepřeskládá do daného formátu, tak tilesety XP nemůžeš použít.
Obrázek


Obrázek

Uživatelský avatar
 
Příspěvky: 881
Registrován: srpen 25, 2008, 9:01 pm

Re: Tileset swapper

Příspěvek od Sorc » leden 17, 2011, 4:25 pm

Jenom pro přesnost XP používá 256xjakejkoli násobek 32.

Uživatelský avatar
 
Příspěvky: 794
Registrován: únor 14, 2010, 10:07 pm
Bydliště: Slaný. To je kousek od Prahy.

Re: Tileset swapper

Příspěvek od legition » leden 17, 2011, 5:47 pm

Sorry, bral jsem ty defaultní, ale máš pravdu. Jen, nechci aby to vypadalo že do toho rípu. Ten script se bude určitě hodně používat. Kdybych o něm věděl dříve možná bych i markuse dělal jinak. Jen upozorňuji, aby se tu pak nešířily, matoucí informace. Prostě Tilesety do VX z XP buď musíš nějak převést. Nebo použiješ jiné tilesety do VX, na netu jich je taky docela dost.
Obrázek


Obrázek

Uživatelský avatar
 
Příspěvky: 35
Registrován: květen 19, 2010, 11:09 am
Bydliště: Kolín

Re: Tileset swapper

Příspěvek od Zellmaster » leden 18, 2011, 6:21 pm

legition píše:Sorry, bral jsem ty defaultní, ale máš pravdu. Jen, nechci aby to vypadalo že do toho rípu. Ten script se bude určitě hodně používat. Kdybych o něm věděl dříve možná bych i markuse dělal jinak. Jen upozorňuji, aby se tu pak nešířily, matoucí informace. Prostě Tilesety do VX z XP buď musíš nějak převést. Nebo použiješ jiné tilesety do VX, na netu jich je taky docela dost.

Já XPčkovský tilesety používám a zatím jsem na žádný problém nenarazil...

Uživatelský avatar
 
Příspěvky: 794
Registrován: únor 14, 2010, 10:07 pm
Bydliště: Slaný. To je kousek od Prahy.

Re: Tileset swapper

Příspěvek od legition » únor 13, 2011, 3:30 pm

V tom případě, nechceš mi poslat ukázku, jak používáš tilesetyz XP do VX?? Kdybych to pochopil, určitě by mi to usnadnilo plno věcí.. a určitě nejen mně..
Obrázek


Obrázek

 
Příspěvky: 15
Registrován: duben 29, 2008, 7:15 am
Bydliště: Brno

Re: Tileset swapper

Příspěvek od Crystoball » březen 19, 2011, 9:20 pm

Tak jako musím konstatovat,že tenhle prográmeček je mazec.
Díky za něj.
Nevim jestli o tom víte,ale možná jo,tak i přesto Vám sem dám link na snad novou verzi.Minimálně pro mě to noví bylo :D
http://sourceforge.net/projects/lodesto ... es/SwapXT/
Stahujte to SwapXT

A tady máte na to ještě Tutorial z Youtube:
http://www.youtube.com/watch?v=kL-4axRCkKc


Zpět na Skripty pro RPG Maker VX

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 4 návštevníků