(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg338.imageshack.us%2Fimg338%2F1504%2Fwitchtooth2.png&hash=8d0f5829a3ecfc9a256f077f6e038522ccf31292)
"And God Never Shed A Tear"
Story
Six years have passed since Lin disappeared. Rolan's grandmother came down with a serious illness that causes her passing. Left with a single promise to her, Rolan travels to Cairesville with his sister to get the education that his grandmother always wanted Sophie to have. Cairesville sits on the far off continent of Elevan where the two stay with good friends of their family. Now Rolan and his sister, Sophie have to adapt to their new home. But their past cannot be erased. Things left behind will follow them and build a new journey
Characters
Rolan AccadesRolan was born in Havel, originally working as a shopkeeper's assistant. He left much behind after moving to Cairesville, but his excellent fighting skills never faded. He is introduced to the Treasure Hunting business and quickly acquires a liking for it. The memories of a time before drive him to be the best hunter he could be.
Sophie Accades
Sophie was born in Havel alongside her brother, Rolan. She looks up to him but is hit hard by the realization of how much she has lost by moving to Cairesville. For a while she enjoyed being a student, but the routine lifestyle quickly becomes unappealing. With a Slingshot at hand she finds something new to enjoy. An adventurer in her mind, a rebel in everyone else's.
Screenshots
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg827.imageshack.us%2Fimg827%2F568%2F41868905.jpg&hash=a3a53a0e2688243b0e62a0a206e55aebf9fe6931) (http://img827.imageshack.us/i/41868905.jpg/)
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg17.imageshack.us%2Fimg17%2F8302%2F27206846.jpg&hash=80045d84129a7592276ab631e3c227800dad63fc) (http://img17.imageshack.us/i/27206846.jpg/)
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg15.imageshack.us%2Fimg15%2F5061%2F24328241.jpg&hash=898d44a705b46921d13486ea35eeb4ba11af6a95) (http://img15.imageshack.us/i/24328241.jpg/)
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg215.imageshack.us%2Fimg215%2F1810%2F56151455.jpg&hash=efd9b006045b424aeb2d8634ba0df6a9eea3b695) (http://img215.imageshack.us/i/56151455.jpg/)
---------------------------
The game has not been in production for very long. I spent a good while writing before actually putting anything into the game engine. These screenshots are very early work and the locations they take place in are definitely bound to be altered in some way. I'll be trying to update as frequently as possible. I know that many people have not played the first game. I feel like the first was more of a test of my skills as a game developer and lacks in many areas. Hopefully the sequel will fix the problems the first had. If you want to play the game, please do, if not I recommend watching D&P3's playthrough (http://lnk.nu/youtube.com/23eb (http://lnk.nu/youtube.com/23eb)) or just asking me questions because there will be call backs to the original in this game.
Again, I will try to update this page as frequent as possible. The story above is left in a fairly cut and dry state because I plan on releasing a one hour (approx.) demo in about a week or two. Now you all have a nice day.
Credit goes to Bunny for the awesome logo!Demo: http://www.mediafire.com/?7zqti8dxcudw2c2
This looks very nice, I loved the first one and I'm sure you'll do a good job on this one as well. Are you going with a front view battle system and the default encounter system again?
I'm sticking with the front view battle system, as for the random encounters, either it'll be heavily tweeked or I'll be putting the enemies on screen (which is what I really want to do).
Alright, are you using Yanfly's battle system? It makes the front view battle system much more enjoyable.
Looking forward to this :)
Quote from: hiromu656 on July 16, 2012, 01:23:53 AM
I'm sticking with the front view battle system, as for the random encounters, either it'll be heavily tweeked or I'll be putting the enemies on screen (which is what I really want to do).
If you're going to do the latter, make sure that the monsters respawn after some time has past and that the player can actually escape from battle.
And yes, I'm using Yanfly's Battle System, it's great.
[Update]
It's a small update though:
- I've been playing the first Witchtooth, mostly at the higher levels or again, mainly trying to find things worth fixing, ways to balance combat and all that jazz. So, I plan on having less spells this time around, but much higher scaling based on attack and magic damage. For instance, in the first game Rolan had a skill called Heavy Slash that seriously fell off in damage later in the game. A good way to fix that problem is to have Heavy Slash deal pretty low Base Damage, but then increase the effect that his Attack Damage has on the bonus damage. The same goes for Lin, whose Dim spell was nearly useless because the spirit didn't scale well.
So, combat at the moment is my biggest priority. I'm making spells cost less mana, not so that they can be spammed but so combat is less based on Rolan dealing heavy damage with his basic attacks. Monsters will be heavily damaged if you cast or attack with a weapon or spell that uses the element the enemy is least resistant to. You'll be cued as to what that element is if you deal damage with it, afterwards you can remember how to take down specific enemies quickly. No one likes having to heal after every encounter, this way you'll know how to breeze through them at the cost of a couple Volute Potions.
But of course, I'll try to keep the bosses difficult. But by difficult, I don't mean insane HP which is what the problem was in the first game. I'll make sure they have varied skills and most likely deal more damage but have less health. So, if you understand the strategy to kill the boss you will kill it, it would probably piss me off if a boss is incredibly easy for me but the only thing that causes my defeat is how long the fight lasts.
I'll be making Video Gameplay really soon.
Well, I guess there's a slight change in plans on that Video. I was going to make it tomorrow, but I'm going on a sort of vacation tomorrow morning.
In the location I'll be there isn't any Internet. So, that kicks aside my plan of making a video soon. I don't have the game in the best state to record anything yet, so I'll have to push aside the video (uploading that is, I will finish it during the trip). I'll make the video, but it will be uploaded on the day I get back, which will be 2-3 weeks.
The good news about having no Internet for a couple weeks though is that I won't be distracted by the wonders of the Interwebz when I know I should be working on the game. So over 10 straight days of work will come out of this trip, which pretty much guarantees that the first demo will be out the day after I get home, aka the day after my gameplay footage is uploaded. So, first its gameplay, then the next day I'll get my music, and I'll upload the demo. ;8
[yt]http://www.youtube.com/watch?v=6PDgGu2z-yk&feature=youtu.be[/yt]
Demo Release Tomorrow
Cool I'll download the demo when it's out.
The Demo is Here
http://www.mediafire.com/?3uk9rjs4npllvnz
The Demo is Non-RTP, unfortunately, if you add RTP on Ace it adds around 200mb to the file, so the Ace RTP is needed to play the Demo.
It spans around an hour and takes place at the very beginning of the game.
Some things are still under construction, such as the dialogue, music and mapping.
Please leave feedback if you try it out
Download this as well and Add the Folder to the game's Folder
http://www.mediafire.com/?f14t5xf2e5lq3at
Unfortunately I can't even go outside your parent's friends house, the game says that the light file is missing (le). But so far everything is nice, I'm enjoying Rolan's humor so far.
The missing le. file is because there is a script that has me make a new folder for the game, so it must not have been extracted into the game file. I'm going to link the folder. Just add the two folders it includes into the game's Graphics folder. This should fix the problem and a foreseeable problem i know will come up.
I'm glad you're enjoying it.
Do you mean the main folder? Because the graphics folder is encrypted.
Ugh, you're right... how did you work around the le problem?
I didn't, the game crashed and I watched Mayday.
EDIT:
Or did you mean how did I work around it when I used the script? If so I haven't used it.
Alright either download this: http://www.mediafire.com/?f14t5xf2e5lq3at
Or you can create a folder called Graphics and paste those folders inside. I should have play tested the Compressed Version, I don't know why I forgot to. Sorry about that.
I'll play some more tomorrow, but so far it's pretty good. I love the cake joke. Are you switching out the menu? Because I really don't like the default menu, I may be able to script you a menu if I have time.
I really want to switch the menu, right now I'm leaving things basic, as with the title screen. Later on most menu type things will be altered in some way.
Nice maps!! Like the story and it's hint of mystery but it's still clear to people who haven't played the first one. Though, maybe you can add a link to the first one as well?
Why is there a demo download and a file download?
Anyway, I'll be trying this out.
Thanks.
There's a file download because it is necessary for the game to Run. When I release Demo 2, I'll be putting everything into a Rar file, the game extractor, the folders and a notepad instruction. I wish it could be as simple as double clicking the blue crystal, but the scripts I'm using can only be used if you create a specific folder, a folder that is not extracted into the game extractor. Currently this is the only way I can work around it.
And I tried to make sure players new to the game can still understand it without playing the first. I'm glad it actually worked.
[Update]
With school starting up soon for me, I'm having less and less time to work on the game. I'm working mainly on the database, the mapping is coming afterwards. I've already drawn out the map on paper along with many of the enemies and items, so my work intervals run smoothly but don't last very long. The second demo is weeks away, but for now I have just a couple new screenshots.
[spoiler](https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg526.imageshack.us%2Fimg526%2F5347%2F65168350.jpg&hash=48a9fd438adb9b96073745a772ba0bf3a63bc1af) (http://img526.imageshack.us/i/65168350.jpg/)
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg402.imageshack.us%2Fimg402%2F8938%2F34649636.jpg&hash=9f8b6ed13af6b25a868aeb1dbca9e051315456de) (http://img402.imageshack.us/i/34649636.jpg/)
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg827.imageshack.us%2Fimg827%2F2300%2F48517935.jpg&hash=01fc06e39890bc816a13aeee80a45fdf03976323) (http://img827.imageshack.us/i/48517935.jpg/)
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg534.imageshack.us%2Fimg534%2F1316%2F62283086.jpg&hash=f91504741e146f86454b76c4b698f70e32b8a806) (http://img534.imageshack.us/i/62283086.jpg/)[/spoiler]
SO EXCITED!!!!
I've been off this site for a while so I'm catching up. This game is looking great so far, it could also somehow top the original.
Also, I think Witchtooth could be the next Vacant Sky :3
Quote from: hiromu656 on August 15, 2012, 08:15:03 PM
I wish it could be as simple as double clicking the blue crystal, but the scripts I'm using can only be used if you create a specific folder, a folder that is not extracted into the game extractor. Currently this is the only way I can work around it.
Which scripts are causing this?
Either DoctorTodd or I could probably modify them not to be a hassle.
Also I've been putting this off for awhile D:
Needz to play Demo :D
FenixFyreX's Light Effects
and
Victor Engine - Fog Effect
Those require additional folders to be made for the scripts to work.
Here's the light effects script, it now uses the pictures folder. I'll go do the fog one, let me know if you have any issues.
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
# FenixFyreX's Light Effects (FFXLFX)
# Version 1.1
# http://www.rpgmakervx.net
# http://www.rpgmakervxace.net
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
#
# To use this script, either make a preset then setup an event's comment like so:
#
# <prelfx string> OR <prelfx=string> OR <prelfx = string> # You get the idea.
#
# Where string is the name of the preset below,
# or setup an event's comment like so:
#
# <lfx fn "image";>
#
# Where opts is any option defined below that you can put in a preset.
#
# fn = string # The filename of the image to use. Always pulls from Graphics/LFX.
# fa = number # Fadein? Default is 0(false).
# zx = number # The zoom x of the effect.
# zy = number # The zoom y of the effect.
# bl = number # Either 0(normal), 1(add), or 2(subtract).
# op = number # Anything from 0 to 255. Sets maximum opacity for effect.
# z = number # 0 is in front, the default. 1 is behind.
# s = number # Adheres to the light switch? 0 is false, 1 is true. Default is 1.
# fl = number # [n,n]. First n determines randomness of visibility. Second n
# determines the range of opacity change.
# cl = array # [n,n,n] or [n,n,n,n]. [red,green,blue,transparency].
# os = array # [x,y]. will offset the graphic by x,y.
# w = array # [n,n,n] or [n,n,n,n]. [strength,length,speed,phase].
#
# You must include filename if you make a direct light effect in a comment.
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
# Event Script Command Calls
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
# These are commands you can call via Advanced/Script.
#
# remove_lfx(key)
# This will remove any light effects by the key. key has to be 1 or greater.
#
# player_lfx(preset_name,fade = false)
# This will add a light effect to the player. Must be a preset defined below.
# If you leave fade out, the effect will not fade in. If you set it to true,
# it will. es.g:
# player_lfx("Ground") # Will not fadein
# player_lfx("Ground",true) # Will fadein
#
# stop_player_lfx(fade = false)
# This will remove the player's light effect. If you leave out fade, the effect
# will just go away. If fade is true, the effect will fadeout. es.g:
# stop_player_lfx # Will not fadeout
# stop_player_lfx(true) # Will fadeout
#
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
module FFXLFX
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
#
# Set up preset light fx here. the preset can be named anything as long as it
# is a string(e.g. within " ")
# Options for the preset are as follows; if a * is next to it, its mandatory:
#
# :filename * The name of the file in Graphics/Lights/
# :fadein Should the effect fadein? 0 is false(default), 1 is true.
# :flicker Should the light flicker? Must be an array of two numbers.
# :zx Zoom X of the effect, 1 is default
# :zy Zoom Y of the effect, 1 is default
# :z Z coordinate of the effect. 0 is in front, 1 is behind.
# :blend 0 is normal, 1 is add, 2 is subtract
# :switch Adheres to the light switch? true or false. Default is true.
# :color An array of 3-4 numbers, like so: [155,100,0] # Yellow
# To make a random color, put -1 in the color index spot, so
# a fully random color would be [-1,-1,-1]
# :offset An array of two numbers. [-1,1] will offset the image left
# and down one pixel.
# :opacity Anything from 0 to 255. Sets maximum opacity for the effect.
# :wave An array of 3-4 numbers, [amp, length, speed, phase]
#
# :wave makes the image wiggle. Use the help file for further information on
# wave effects. Look up Sprite in the help file.
Presets = { # do NOT delete this.
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
# Preset 1: Ground
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
"Ground" => {
:filename => "ground",
:flicker => [200,100],
:zx => 4,
:zy => 4,
:blend => 1,
:color => [155,100,0],
},
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
# Preset 2: Lantern
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
"Lantern" => {
:filename => "lantern",
:flicker => [500,100],
:zx => 1,
:zy => 1,
:blend => 1,
:color => [190,100,0],
:offset => [0,0],
},
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
# Preset 3: Lightbug
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
"Lightbug" => {
:filename => "ground",
:flicker => [500,200],
:zx => 1,
:zy => 1,
:z => 0,
:blend => 1,
:color => [-1,-1,-1],
:offset => [0,-6],
:switch => false,
},
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
# Preset 4: Headstone
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
"Ghost" => {
:filename => "ghost",
:flicker => [0,0],
:zx => 2,
:zy => 2,
:blend => 1,
:color => [-1,-1,-1],
:offset => [0,-16],
:opacity => -170,
:wave => [2,5,1],
:fadein => true,
},
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
# Preset 5: Fireplace
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
"Fireplace" => {
:filename => "fireplace",
:flicker => [500,200],
:color => [220,10,0],
:blend => 1,
},
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
# Preset 6: Drunk
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=--=- #
"Drunk" => {
:filename => "ground",
:switch => false,
:zx => 3,
:zy => 4,
:color => [220,10,0],
:blend => 1,
},
# -=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=--=- #
} # DO NOT DELETE THIS
# The switch that turns the whole system on or off. If on, the system will be off.
On_Off_Switch = 1
# Is the system on at startup? If true, it does. False, it doesn't.
Sys_Starts_On = true
# This number determines the speed at which light effects fade on and off.
# Higher numbers result in faster fading.
Fade_Time = 3
end
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
# DO NOT EDIT FURTHER UNLESS YOU KNOW WHAT YOU ARE DOING.
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
class Game_Switches
alias initialize_ffxlfx_switch_value initialize
def initialize(*a,&b)
initialize_ffxlfx_switch_value(*a,&b)
@data[FFXLFX::On_Off_Switch] = FFXLFX::Sys_Starts_On
end
end
module FFXLFX
def self.scene
return defined?($scene) ? $scene : SceneManager.scene
end
end
class Sprite
def start_wave(amp,speed,length,phase=nil)
self.wave_amp = amp
self.wave_speed = speed
self.wave_length = length
self.wave_phase = phase.to_i unless phase.nil?
end
end
class Spriteset_Map
alias initialize_ffxlfx_old initialize unless $@
alias update_ffxlfx_old update unless $@
alias dispose_ffxlfx_old dispose unless $@
def initialize(*a, &b)
@ffxlfx_sprites = {}
initialize_ffxlfx_old(*a, &b)
initialize_ffxlfx
update_ffxlfx
end
def update(*a, &b)
update_ffxlfx_old(*a, &b)
update_ffxlfx
end
def dispose(*a, &b)
dispose_ffxlfx
dispose_ffxlfx_old(*a, &b)
end
def initialize_ffxlfx
$game_map.events.each_pair do |id,event|
s = nil
cache = event.light_cache
if cache
s = Sprite_FFXLight.new(@viewport1,id)
s.setup(cache)
end
@ffxlfx_sprites[id] = s
end
@ffxlfx_sprites[:player] = nil
player_lfx
end
def refresh_ffxlfx
@ffxlfx_sprites.each_key do |key|
next unless key.is_a?(Integer)
if (@ffxlfx_sprites[key].nil? || @ffxlfx_sprites[key].disposed?)
cache = $game_map.events[key].nil? ? nil : $game_map.events[key].light_cache
next if (cache.nil? || cache.empty?)
@ffxlfx_sprites[key] = Sprite_FFXLight.new(@viewport1,key)
@ffxlfx_sprites[key].setup(cache)
else
cache = $game_map.events[key].nil? ? nil : $game_map.events[key].light_cache
if cache.nil?
remove_lfx(key)
elsif cache == @ffxlfx_sprites[key].cache
next
else
@ffxlfx_sprites[key].setup(cache)
end
end
end
end
def update_ffxlfx
rs = []
@ffxlfx_sprites.each_pair do |key,s|
next if s.nil?
next if s.disposed?
s.update
if s.to_nil?
rs << key
end
end
rs.each do |r|
@ffxlfx_sprites[r].dispose
@ffxlfx_sprites[r] = nil
end
end
def dispose_ffxlfx
@ffxlfx_sprites.each_pair do |key,s|
next if s.nil?
next if s.disposed?
s.dispose
end
@ffxlfx_sprites = {}
end
def remove_lfx(key)
@ffxlfx_sprites[key].fade2nil
end
def change_lfx(key,key2)
if @ffxlfx_sprites[key].nil?
@ffxlfx_sprites[key] = Sprite_FFXLight.new(@viewport1,key)
@ffxlfx_sprites[key].setup(FFXLFX::Presets[key2])
end
end
def player_lfx
return if $game_player.light_cache.nil?
return unless $game_player.light_cache[:filename]
if @ffxlfx_sprites[:player].nil? || @ffxlfx_sprites[:player].disposed?
@ffxlfx_sprites[:player] = Sprite_FFXLight.new(@viewport1,:player)
@ffxlfx_sprites[:player].cache = {}
@ffxlfx_sprites[:player].set_cache
end
end
def stop_player_lfx(fade)
return if @ffxlfx_sprites[:player].nil? || @ffxlfx_sprites[:player].disposed?
if fade
@ffxlfx_sprites[:player].fade2nil
else
@ffxlfx_sprites[:player].dispose
@ffxlfx_sprites[:player] = nil
end
end
#~ def add_lfx(opts)
#~ end
end
class Game_Player < Game_Character
attr_accessor :light_cache
alias initialize_light_cache initialize unless $@
def initialize(*a,&b)
initialize_light_cache(*a,&b)
@light_cache = nil
end
end
class Game_Event < Game_Character
FFXLFX_Light_Rgxp = /<lfx[ ]*[=]?/i
FFXLFX_Prelight_Rgxp = /<prelfx[ ]*[=]?[ ]*(.*)>/i
alias refresh_ffxlfx_refresh refresh unless $@
def refresh(*a,&b)
refresh_ffxlfx_refresh(*a,&b)
if FFXLFX.scene.is_a?(Scene_Map)
FFXLFX.scene.refresh_ffxlfx_lights
end
end
def name
return @event.nil? ? "" : @event.name
end
def comment?(txt,ret = false)
return false if @page.nil?
@page.list.each do |item|
if [108,408].include?(item.code)
item_text = item.parameters[0]
case txt
when Regexp
m = (item_text.match(txt))
if ret && !m.nil?
return m.captures
else
return !m.nil?
end
when String
if ret && (m = item_text.include?(txt))
return item.parameters[0]
else
return m
end
end
end
end
return false
end
def light?
return comment?(FFXLFX_Light_Rgxp)
end
def prelight?
return comment?(FFXLFX_Prelight_Rgxp)
end
def light_cache
cache = nil
if light?
txt = comment_block(FFXLFX_Prelight_Rgxp, ">")
cache = parse_lfx(txt)
elsif prelight?
txt = comment?(FFXLFX_Prelight_Rgxp, true)
cache = FFXLFX::Presets[txt[0]]
end
unless cache.nil?
cache[:fadein] = false if cache[:fadein].nil?
end
return cache
end
def comment_block(txt1,txt2)
s = [""]
start = false
stop = false
return s if @page.nil?
@page.list.each do |item|
if [108,408].include?(item.code)
item_text = item.parameters[0]
case txt1
when Regexp
if item_text =~ txt1
start = true
end
when String
if item_text.include?(txt1)
start = true
end
end
case txt2
when Regexp
if item_text =~ txt2
stop = true
end
when String
if item_text.include?(txt2)
stop = true
end
end
s << item_text
if stop
break
end
end
end
return s.join("")
end
def parse_lfx(txt="")
cache = {}
ary = txt.split(";")
ary.each do |item|
case item
when /fn[ ]*[=]?[ ]*(.*)/i
cache[:filename] = $1.to_s.gsub(">","")
when /fa[ ]*[=]?[ ]*(\d+)[>]?/i
cache[:fadein] = ($1.to_i == 1)
when /fl[ ]*[=]?[ ]*\[[ ]*(\d+)[ ]*,[ ]*(\d+)\][>]?/i
cache[:flicker] = [$1.to_i,$2.to_i]
when /zx[ ]*[=]?[ ]*(\d+)[>]?/i
cache[:zx] = $1.to_i
when /zy[ ]*[=]?[ ]*(\d+)[>]?/i
cache[:zy] = $1.to_i
when /z[ ]*[=]?[ ]*(0|1)[>]?/i
cache[:z] = ($1.to_i == 1)
when /a[ ]*[=]?[ ]*(0|1)[>]?/i
cache[:switch] = ($1.to_i == 1)
when /bl[ ]*[=]?[ ]*(0|1|2)[>]?/i
cache[:blend] = $1.to_i
when /op[ ]*[=]?[ ]*(\d+)[>]?/i
cache[:opacity] = $1.to_i
when /cl[ ]*[=]?[ ]*\[[ ]*(\d+)[ ]*,[ ]*(\d+)[ ]*,[ ]*(\d+)[ ]*[,]?[ ]*(\d+)?\][>]?/i
cache[:color] = [$1.to_i,$2.to_i,$3.to_i]
cache[:color] << $4.to_i unless $4.nil?
when /os[ ]*[=]?[ ]*\[[ ]*([-]?\d+)[ ]*,[ ]*([-]?\d+)\][>]?/i
cache[:offset] = [$1.to_i,$2.to_i]
when /w[ ]*[=]?[ ]*\[[ ]*(\d+)[ ]*,[ ]*(\d+)[ ]*,[ ]*(\d+)[ ]*[,]?[ ]*(\d+)?\][>]?/i
cache[:wave] = [$1.to_i,$2.to_i,$3.to_i]
cache[:wave] << $4.to_i unless $4.nil?
end
end
return cache
end
end
class Sprite_FFXLight < Sprite_Base
attr_reader :charID,:char
attr_accessor :cache,:offset,:flicker
def initialize(viewport, charID)
super(viewport)
@charID = charID
@char = nil
@cache = {}
@offset = [0,0]
@flicker = nil
@go2nil = @to_nil = false
set_char
set_xyz
end
def setup(cache={})
if cache.nil?
@cache = {}
return
end
unless FileTest.exist?(fn="Graphics/Pictures/"+cache[:filename]+".png")
msgbox "File does not exist: "+fn
exit
end
self.bitmap = Cache.picture(cache[:filename]).clone
self.flicker = cache[:flicker] unless cache[:flicker].nil?
self.zoom_x = cache[:zx] unless cache[:zx].nil?
self.zoom_y = cache[:zy] unless cache[:zy].nil?
unless cache[:color].nil?
self.color = Color.new(*cache[:color])
self.color.red = rand(256) if cache[:color][0] == -1
self.color.green = rand(256) if cache[:color][1] == -1
self.color.blue = rand(256) if cache[:color][2] == -1
end
self.blend_type = cache[:blend] unless cache[:blend].nil?
self.offset = cache[:offset] unless cache[:offset].nil?
self.start_wave(*cache[:wave]) unless cache[:wave].nil?
if cache[:fadein]
self.opacity = 0
fadein
if get_char.is_a?(Game_Player)
get_char.light_cache[:fadein] = false
end
else
self.opacity = max_opacity
end
cache[:switch] = true if cache[:switch].nil?
@cache = cache
set_char
end
def max_opacity
result = 170
result = @cache[:opacity] unless @cache[:opacity].nil?
if !$game_switches[FFXLFX::On_Off_Switch]
result = 0 if @cache[:switch]
end
return result
end
def update
super
if @cache != get_cache
set_char
set_cache
if [nil,{}].include?(@cache)
fadeout
end
setup(@char.light_cache)
end
set_xyz
update_fadeinout
update_flicker if !fading
end
def update_fadeinout
fade_time = FFXLFX::Fade_Time
if @fadein
self.opacity = [[self.opacity+fade_time,0].max, max_opacity].min
if self.opacity >= max_opacity
self.opacity = max_opacity
@fadein = false
else
return
end
elsif @fadeout
self.opacity -= fade_time
if self.opacity == 0
if @go2nil
@to_nil = true
end
@fadeout = false
else
return
end
end
end
def update_flicker
if !@flicker.nil?
self.visible = (rand(@flicker[0]) != @flicker[0]-1)
self.opacity = 255-rand(@flicker[1])
self.opacity = max_opacity if self.opacity > max_opacity
else
self.visible = true
self.opacity = max_opacity
end
end
def set_cache
@cache = get_cache
setup(@cache)
end
def get_cache
return @char.light_cache
end
def fadein
@fadeout = false
@fadein = true
end
def fadeout
@fadein = false
@fadeout = true
end
def set_char
@char = get_char
end
def get_char
if @charID.is_a?(Integer)
return $game_map.events[@charID]
elsif @charID == :player
return $game_player
else
p "A light effect is assigned a nil character. Exiting for safety."
exit
end
end
def set_xyz
a = (@char.screen_x.to_f)
b = (@char.screen_y.to_f)
a -= 16+((self.zoom_x-1)*self.width/2)
b -= 32+((self.zoom_y-1)*self.height/2)
if self.width > 32
n1 = (self.width - 32) / 2
a -= n1
elsif self.width < 32
n1 = (32 - self.width) / 2
a += n1
end
if self.height > 32
n2 = (self.height - 32) / 2
b -= n2
elsif self.height < 32
n2 = (32 - self.height) / 2
b += n2
end
a += @offset[0]
b += @offset[1]
self.x = a
self.y = b
fz = @char.screen_z
if @cache[:z]
fz -= 1
else
fz += 1
end
self.z = fz
end
def to_nil?
return @to_nil
end
def fade2nil
@go2nil = true
fadeout
end
def fading
return true if @fadein || @fadeout || @go2nil
return false
end
end
class Game_Interpreter
def remove_lfx(key)
FFXLFX.scene.remove_lfx(key)
end
#~ def add_lfx(x,y,key)
#~ opts = {}
#~ opts[:x] = x
#~ opts[:y] = y
#~ opts[:k] = key
#~ FFXLFX.scene.add_lfx(opts)
#~ end
def player_lfx(preset,fade=false)
FFXLFX.scene.player_lfx(preset,fade)
end
def stop_player_lfx(fade=false)
FFXLFX.scene.stop_player_lfx(fade)
end
end
class Scene_Map < Scene_Base
def refresh_ffxlfx_lights
return if @spriteset.nil?
@spriteset.refresh_ffxlfx
end
def remove_lfx(key)
@spriteset.remove_lfx(key)
end
#~ def add_lfx(opts)
#~ @spriteset.add_lfx(opts)
#~ end
def player_lfx(preset,fade)
$game_player.light_cache = FFXLFX::Presets[preset]
return if $game_player.light_cache.nil?
$game_player.light_cache[:fadein] = fade
@spriteset.player_lfx
end
def stop_player_lfx(fade)
@spriteset.stop_player_lfx(fade)
end
alias pre_transfer_lfx pre_transfer
def pre_transfer(*a,&b)
pre_transfer_lfx(*a,&b)
@spriteset.dispose_ffxlfx
end
alias post_transfer_lfx post_transfer
def post_transfer(*a,&b)
@spriteset.initialize_ffxlfx
post_transfer_lfx(*a,&b)
end
end
Here is the fog script, I ran out of characters in the first post.
#==============================================================================
# ** Victor Engine - Fog Effect
#------------------------------------------------------------------------------
# Author : Victor Sant
#
# Version History:
# v 1.00 - 2011.12.19 > First relase
# v 1.01 - 2011.12.30 > Faster Regular Expressions
# v 1.02 - 2012.01.02 > Fixed fog dispose when changing maps
# v 1.03 - 2012.01.04 > Fixed load fail when fog ON
# v 1.04 - 2012.01.10 > Fixed fog movement y bug
# v 1.05 - 2012.01.14 > Fixed the positive sign on some Regular Expressions
# v 1.06 - 2012.01.15 > Fixed the Regular Expressions problem with "" and ""
# v 1.07 - 2012.01.15 > Fixed fog position in maps with loop
#------------------------------------------------------------------------------
# This script allows to add varied of effects to the maps. Fos are picutres
# placed above the player layer and loops. Differently from pictures the fog
# follows the map movement instead of the screen (this behavior can be changed)
# You can add various fogs to the map.
#------------------------------------------------------------------------------
# Compatibility
# Requires the script 'Victor Engine - Basic Module' v 1.09 or higher
#
# * Alias methods (Default)
# class Game_Screen
# def initialize
# def clear
# def update
#
# class Game_Map
# def setup(map_id)
# def scroll_down(distance)
# def scroll_left(distance)
# def scroll_right(distance)
# def scroll_up(distance)
#
# class Spriteset_Map
# def initialize
# def dispose
# def update
#
# * Alias methods (Basic Module)
# class Game_Interpreter
# def comment_call
#
#------------------------------------------------------------------------------
# Instructions:
# To instal the script, open you script editor and paste this script on
# a new section on bellow the Materials section. This script must also
# be bellow the script 'Victor Engine - Basic'
# The fogs must be placed on the folder "Graphics/Fogs". Create a folder
# named "Fogs" on the Graphics folder.
#
#------------------------------------------------------------------------------
# Maps and Comment calls note tags:
# Tags to be used on the Maps note box in the database or in events
# comment box, works like a script call
#
# <fog effect>
# settings
# </fog effect>
# Create a fog effect on the map, add the following values to the info
# the ID and name must be added, other values are optional.
# id: x : fog ID
# name: "x" : fog graphic filename ("filename")
# opacity: x : fog opacity (0-255)
# move: x : fog screen movement (32 = fog follows the map)
# zoom: x : fog zoom (100 = default size)
# hue: x : fog hue (0-360)
# blend: x : fog blend type (0: normal, 1: add, 2: subtract)
# depth: x : fog Z axis (300 = default value)
#
# <fog opacity id: o, d>
# This tag allows to change the fog opacity gradually
# id : fog ID
# o : new opacity (0-255)
# d : wait until complete change (60 frames = 1 second)
#
# <fog move id: x, y>
# This tag adds fog continuous movement
# id : fog ID
# x : horizontal movement, can be positive or negative
# y : vertical movement, can be positive or negative
#
# <fog tone id: r, g, b, y, d>
# This tag allows to change the fog opacity gradually
# id : fog ID
# r : red tone (0-255, can be negative)
# g : green tone (0-255, can be negative)
# b : blue tone (0-255, can be negative)
# y : gray tone (0-255)
# d : wait until complete change (60 frames = 1 second)
#
#------------------------------------------------------------------------------
# Additional instructions:
#
# Map note tags commands are called right when enters the map, comment calls
# are called during the event process.
#
#==============================================================================
#==============================================================================
# ** Victor Engine
#------------------------------------------------------------------------------
# Setting module for the Victor Engine
#==============================================================================
module Victor_Engine
#--------------------------------------------------------------------------
# * Set fogs visibility on battle
# When true, fogs are visible on battle
#--------------------------------------------------------------------------
VE_BATTLE_FOGS = false
#--------------------------------------------------------------------------
# * required
# This method checks for the existance of the basic module and other
# VE scripts required for this script to work, don't edit this
#--------------------------------------------------------------------------
def self.required(name, req, version, type = nil)
if !$imported[:ve_basic_module]
msg = "The script '%s' requires the script\n"
msg += "'VE - Basic Module' v%s or higher above it to work properly\n"
msg += "Go to http://victorscripts.wordpress.com/ to download this script."
msgbox(sprintf(msg, self.script_name(script), version))
exit
else
self.required_script(name, req, version, type)
end
end
#--------------------------------------------------------------------------
# * script_name
# Get the script name base on the imported value, don't edit this
#--------------------------------------------------------------------------
def self.script_name(name, ext = "VE")
name = name.to_s.gsub("_", " ").upcase.split
name.collect! {|char| char == ext ? "#{char} -" : char.capitalize }
name.join(" ")
end
end
$imported ||= {}
$imported[:ve_fog_effects] = 1.07
Victor_Engine.required(:ve_fog_effects, :ve_basic_module, 1.09, :above)
#==============================================================================
# ** Game_Screen
#------------------------------------------------------------------------------
# This class handles screen maintenance data, such as change in color tone,
# flashes, etc. It's used within the Game_Map and Game_Troop classes.
#==============================================================================
class Game_Screen
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :fogs
#--------------------------------------------------------------------------
# * Alias method: initialize
#--------------------------------------------------------------------------
alias :initialize_ve_fog_effects :initialize
def initialize
@fogs = Game_Fogs.new
initialize_ve_fog_effects
end
#--------------------------------------------------------------------------
# * Alias method: clear
#--------------------------------------------------------------------------
alias :clear_ve_fog_effects :clear
def clear
clear_ve_fog_effects
clear_fogs
end
#--------------------------------------------------------------------------
# * Alias method: update
#--------------------------------------------------------------------------
alias :update_ve_fog_effects :update
def update
update_ve_fog_effects
update_fogs
end
#--------------------------------------------------------------------------
# * New method: fogs
#--------------------------------------------------------------------------
def fogs
@fogs ||= Game_Fogs.new
end
#--------------------------------------------------------------------------
# * New method: clear_fogs
#--------------------------------------------------------------------------
def clear_fogs
fogs.each {|fog| fog.erase }
end
#--------------------------------------------------------------------------
# * New method: update_fogs
#--------------------------------------------------------------------------
def update_fogs
fogs.each {|fog| fog.update }
end
#--------------------------------------------------------------------------
# * New method: create_fog
#--------------------------------------------------------------------------
def create_fog(*args)
fogs[args.first].show(*args)
end
#--------------------------------------------------------------------------
# * New method: set_fog_move
#--------------------------------------------------------------------------
def set_fog_move(id, sx, sy)
fogs[id].start_movement(sx, sy)
end
#--------------------------------------------------------------------------
# * New method: set_fog_tone
#--------------------------------------------------------------------------
def set_fog_tone(id, red, green, blue, gray, duration = 0)
tone = Tone.new(red, green, blue, gray)
fogs[id].start_tone_change(tone, duration)
end
#--------------------------------------------------------------------------
# * New method: set_fog_opacity
#--------------------------------------------------------------------------
def set_fog_opacity(id, opacity, duration = 0)
fogs[id].start_opacity_change(opacity, duration)
end
end
#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
# This class handles maps. It includes scrolling and passage determination
# functions. The instance of this class is referenced by $game_map.
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :fog_x
attr_reader :fog_y
#--------------------------------------------------------------------------
# * Alias method: setup
#--------------------------------------------------------------------------
alias :setup_ve_fog_effects :setup
def setup(map_id)
setup_ve_fog_effects(map_id)
setup_fogs_effect
end
#--------------------------------------------------------------------------
# * Alias method: scroll_down
#--------------------------------------------------------------------------
alias :scroll_down_ve_fog_effects :scroll_down
def scroll_down(distance)
last_y = @display_y
scroll_down_ve_fog_effects(distance)
@fog_y += loop_vertical? ? distance : @display_y - last_y
end
#--------------------------------------------------------------------------
# * Alias method: scroll_left
#--------------------------------------------------------------------------
alias :scroll_left_ve_fog_effects :scroll_left
def scroll_left(distance)
last_x = @display_x
scroll_left_ve_fog_effects(distance)
@fog_x += loop_horizontal? ? -distance : @display_x - last_x
end
#--------------------------------------------------------------------------
# * Alias method: scroll_right
#--------------------------------------------------------------------------
alias :scroll_right_ve_fog_effects :scroll_right
def scroll_right(distance)
last_x = @display_x
scroll_right_ve_fog_effects(distance)
@fog_x += loop_horizontal? ? distance : @display_x - last_x
end
#--------------------------------------------------------------------------
# * Alias method: scroll_up
#--------------------------------------------------------------------------
alias :scroll_up_ve_fog_effects :scroll_up
def scroll_up(distance)
last_y = @display_y
scroll_up_ve_fog_effects(distance)
@fog_y += loop_vertical? ? -distance : @display_y - last_y
end
#--------------------------------------------------------------------------
# * New method: setup_fogs_effect
#--------------------------------------------------------------------------
def setup_fogs_effect
@fog_x = 0
@fog_y = 0
create_fog(note)
set_fog_opacity(note)
set_fog_move(note)
set_fog_tone(note)
end
#--------------------------------------------------------------------------
# * New method: create_fog
#--------------------------------------------------------------------------
def create_fog(note)
regexp = /<FOG EFFECT>([^><]*)<\/FOG EFFECT>/im
note.scan(regexp) { setup_fog($1) }
end
#--------------------------------------------------------------------------
# * New method: set_fog_opacity
#--------------------------------------------------------------------------
def set_fog_opacity(note)
regexp = /<FOG OPACITY (\d+): (\d+) *, *(\d+)>/i
note.scan(regexp) do |id, o, d|
@screen.set_fog_opacity(id.to_i, o.to_i, d.to_i)
end
end
#--------------------------------------------------------------------------
# * New method: set_fog_move
#--------------------------------------------------------------------------
def set_fog_move(note)
regexp = /<FOG MOVE (\d+): ([+-]?\d+) *, *([+-]?\d+)>/i
note.scan(regexp) do |id, sx, sy|
@screen.set_fog_move(id.to_i, sx.to_i, sy.to_i)
end
end
#--------------------------------------------------------------------------
# * New method: set_fog_tone
#--------------------------------------------------------------------------
def set_fog_tone(note)
values = "(\\d+) *, *(\\d+) *, *(\\d+) *, *(\\d+)(?: *, *(\\d+))?"
regexp = /<FOG TONE (\d+): #{values}>/i
note.scan(regexp) do |i, r, g, b, a, d|
info = [i.to_i, r.to_i, g.to_i, b.to_i, a.to_i, d ? d.to_i : 0]
@screen.set_fog_tone(*info)
end
end
#--------------------------------------------------------------------------
# * New method: setup_fog
#--------------------------------------------------------------------------
def setup_fog(info)
id = info =~ /ID: (\d+)/i ? $1.to_i : 0
name = info =~ /NAME: #{get_filename}/i ? $1.dup : ""
op = info =~ /OPACITY: (\d+)/i ? $1.to_i : 192
move = info =~ /MOVE: (\d+)/i ? $1.to_i : 32
zoom = info =~ /ZOOM: (\d+)/i ? $1.to_f : 100.0
hue = info =~ /HUE: (\d+)/i ? $1.to_i : 0
blend = info =~ /BLEND: (\d+)/i ? $1.to_i : 0
depth = info =~ /DEPTH: ([+-]?\d+)/i ? $1.to_i : 300
@screen.create_fog(id, name, op, move, zoom, hue, blend, depth)
end
end
#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
# An interpreter for executing event commands. This class is used within the
# Game_Map, Game_Troop, and Game_Event classes.
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# * Alias method: comment_call
#--------------------------------------------------------------------------
alias :comment_call_ve_fog_effects :comment_call
def comment_call
call_create_fog_effect
comment_call_ve_fog_effects
end
#--------------------------------------------------------------------------
# * New method: call_create_fog_effect
#--------------------------------------------------------------------------
def call_create_fog_effect
$game_map.create_fog(note)
$game_map.set_fog_opacity(note)
$game_map.set_fog_move(note)
$game_map.set_fog_tone(note)
end
end
#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
# Esta classe reune os sprites da tela de mapa e tilesets. Esta classe é
# usada internamente pela classe Scene_Map.
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# * Alias method: initialize
#--------------------------------------------------------------------------
alias :initialize_ve_fog_effects :initialize
def initialize
create_fogs
initialize_ve_fog_effects
end
#--------------------------------------------------------------------------
# * Alias method: dispose
#--------------------------------------------------------------------------
alias :dispose_ve_fog_effects :dispose
def dispose
dispose_ve_fog_effects
dispose_fogs
end
#--------------------------------------------------------------------------
# * Alias method: update
#--------------------------------------------------------------------------
alias :update_ve_fog_effects :update
def update
update_ve_fog_effects
update_fogs
end
#--------------------------------------------------------------------------
# * New method: create_fogs
#--------------------------------------------------------------------------
def create_fogs
@fog_sprites = []
end
#--------------------------------------------------------------------------
# * New method: dispose_fogs
#--------------------------------------------------------------------------
def dispose_fogs
if @fog_sprites
@fog_sprites.compact.each {|sprite| sprite.dispose }
@fog_sprites.clear
end
end
#--------------------------------------------------------------------------
# * New method: update_fogs
#--------------------------------------------------------------------------
def update_fogs
$game_map.screen.fogs.each do |fog|
@fog_sprites[fog.id] ||= Sprite_Fog.new(@viewport1, fog)
@fog_sprites[fog.id].update
end
end
end
#==============================================================================
# ** Spriteset_Battle
#------------------------------------------------------------------------------
# This class brings together battle screen sprites. It's used within the
# Scene_Battle class.
#==============================================================================
class Spriteset_Battle
#--------------------------------------------------------------------------
# * Alias method: initialize
#--------------------------------------------------------------------------
alias :initialize_ve_fog_effects :initialize
def initialize
create_fogs if VE_BATTLE_FOGS
initialize_ve_fog_effects
end
#--------------------------------------------------------------------------
# * Alias method: dispose
#--------------------------------------------------------------------------
alias :dispose_ve_fog_effects :dispose
def dispose
dispose_fogs if VE_BATTLE_FOGS
dispose_ve_fog_effects
end
#--------------------------------------------------------------------------
# * Alias method: update
#--------------------------------------------------------------------------
alias :update_ve_fog_effects :update
def update
update_fogs if VE_BATTLE_FOGS
update_ve_fog_effects
end
#--------------------------------------------------------------------------
# * New method: create_fogs
#--------------------------------------------------------------------------
def create_fogs
@fog_sprites = []
end
#--------------------------------------------------------------------------
# * New method: dispose_fogs
#--------------------------------------------------------------------------
def dispose_fogs
if @fog_sprite
$game_map.screen.fogs.clear
@fog_sprites.compact.each {|sprite| sprite.dispose }
@fog_sprites.clear
end
end
#--------------------------------------------------------------------------
# * New method: update_fogs
#--------------------------------------------------------------------------
def update_fogs
$game_map.screen.fogs.each do |fog|
@fog_sprites[fog.id] ||= Sprite_Fog.new(@viewport1, fog)
@fog_sprites[fog.id].update
end
end
end
#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# This class performs the map screen processing.
#==============================================================================
class Scene_Map
#--------------------------------------------------------------------------
# * Alias method: pre_transfer
#--------------------------------------------------------------------------
alias :pre_transfer_ve_fog_effects :pre_transfer
def pre_transfer
pre_transfer_ve_fog_effects
if $game_player.new_map_id != $game_map.map_id
@spriteset.dispose_fogs
$game_map.screen.clear_fogs
$game_map.screen.fogs.clear
end
end
end
#==============================================================================
# ** Game_Fog
#------------------------------------------------------------------------------
# This class handles fog data. This class is used within the Game_Fogs class.
#==============================================================================
class Game_Fog
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :id
attr_reader :name
attr_reader :hue
attr_reader :sx
attr_reader :sy
attr_reader :ox
attr_reader :oy
attr_reader :depth
attr_reader :move
attr_reader :zoom_x
attr_reader :zoom_y
attr_reader :opacity
attr_reader :blend_type
attr_reader :tone
#--------------------------------------------------------------------------
# * initialize
#--------------------------------------------------------------------------
def initialize(id)
@id = id
init_basic
init_target
init_tone
end
#--------------------------------------------------------------------------
# * init_basic
#--------------------------------------------------------------------------
def init_basic
@name = ""
@depth = 300
@zoom_x = 1.0
@zoom_y = 1.0
@move = 32
@opacity = 255.0
@blend_type = 1
@sx = 0
@sy = 0
@ox = 0
@oy = 0
@hue = 0
@opacity_duration = 0
@tone_duration = 0
end
#--------------------------------------------------------------------------
# * init_target
#--------------------------------------------------------------------------
def init_target
@target_x = @x
@target_y = @y
@target_zoom_x = @zoom_x
@target_zoom_y = @zoom_y
@target_opacity = @opacity
end
#--------------------------------------------------------------------------
# * init_tone
#--------------------------------------------------------------------------
def init_tone
@tone = Tone.new
@tone_target = Tone.new
@tone_duration = 0
end
#--------------------------------------------------------------------------
# * show
#--------------------------------------------------------------------------
def show(id, name, opacity, move, zoom, hue, blend, depth)
@id = id
@name = name
@move = move
@zoom_x = zoom.to_f
@zoom_y = zoom.to_f
@depth = depth
@opacity = opacity.to_f
@blend_type = blend
init_target
init_tone
end
#--------------------------------------------------------------------------
# * start_movement
#--------------------------------------------------------------------------
def start_movement(sx, sy)
@sx = sx
@sy = sy
end
#--------------------------------------------------------------------------
# * start_tone_change
#--------------------------------------------------------------------------
def start_tone_change(tone, duration)
@tone_target = tone.clone
@tone_duration = [duration.to_i, 0].max
@tone = @tone_target.clone if @tone_duration == 0
end
#--------------------------------------------------------------------------
# * start_opacity_change
#--------------------------------------------------------------------------
def start_opacity_change(opacity, duration)
@opacity_target = opacity
@opacity_duration = [duration.to_i, 0].max
@opacity = @opacity_target if @opacity_duration == 0
end
#--------------------------------------------------------------------------
# * erase
#--------------------------------------------------------------------------
def erase
@name = ""
end
#--------------------------------------------------------------------------
# * update
#--------------------------------------------------------------------------
def update
update_move
update_tone
update_opacity
end
#--------------------------------------------------------------------------
# * update_move
#--------------------------------------------------------------------------
def update_move
@ox -= @sx / 16.0
@oy -= @sy / 16.0
end
#--------------------------------------------------------------------------
# * update_opacity
#--------------------------------------------------------------------------
def update_opacity
return if @opacity_duration == 0
d = @opacity_duration
@opacity = (@opacity * (d - 1) + @opacity_target) / d
@opacity_duration -= 1
end
#--------------------------------------------------------------------------
# * update_tone
#--------------------------------------------------------------------------
def update_tone
return if @tone_duration == 0
d = @tone_duration
@tone.red = (@tone.red * (d - 1) + @tone_target.red) / d
@tone.green = (@tone.green * (d - 1) + @tone_target.green) / d
@tone.blue = (@tone.blue * (d - 1) + @tone_target.blue) / d
@tone.gray = (@tone.gray * (d - 1) + @tone_target.gray) / d
@tone_duration -= 1
end
end
#==============================================================================
# ** Game_Fogs
#------------------------------------------------------------------------------
# This class handles fogs. This class is used within the Game_Screen class.
#==============================================================================
class Game_Fogs
#--------------------------------------------------------------------------
# * initialize
#--------------------------------------------------------------------------
def initialize
@data = []
end
#--------------------------------------------------------------------------
# * []
#--------------------------------------------------------------------------
def [](number)
@data[number] ||= Game_Fog.new(number)
end
#--------------------------------------------------------------------------
# * each
#--------------------------------------------------------------------------
def each
@data.compact.each {|fog| yield fog } if block_given?
end
#--------------------------------------------------------------------------
# * clear
#--------------------------------------------------------------------------
def clear
@data.clear
end
end
#==============================================================================
# ** Sprite_Fog
#------------------------------------------------------------------------------
# This sprite is used to display fgos. It observes a instance of the
# Game_Fog class and automatically changes sprite conditions.
#==============================================================================
class Sprite_Fog < Plane
#--------------------------------------------------------------------------
# * initialize
#--------------------------------------------------------------------------
def initialize(viewport, fog)
super(viewport)
@fog = fog
@x = 0
@y = 0
@old_x = $game_map.round_x($game_map.display_x)
@old_y = $game_map.round_y($game_map.display_y)
update
end
#--------------------------------------------------------------------------
# * dispose
#--------------------------------------------------------------------------
def dispose
bitmap.dispose if bitmap
super
end
#--------------------------------------------------------------------------
# * update
#--------------------------------------------------------------------------
def update
update_bitmap
update_position
update_zoom
update_other
end
#--------------------------------------------------------------------------
# * update bitmap
#--------------------------------------------------------------------------
def update_bitmap
if @fog_name != @fog.name
self.bitmap = Cache.picture(@fog.name)
@fog_name = @fog.name.dup
end
end
#--------------------------------------------------------------------------
# * update_position
#--------------------------------------------------------------------------
def update_position
self.ox = $game_map.fog_x * @fog.move + @fog.ox
self.oy = $game_map.fog_y * @fog.move + @fog.oy
self.z = @fog.depth
end
#--------------------------------------------------------------------------
# * update_zoom
#--------------------------------------------------------------------------
def update_zoom
self.zoom_x = @fog.zoom_x / 100.0
self.zoom_y = @fog.zoom_y / 100.0
end
#--------------------------------------------------------------------------
# * update_other
#--------------------------------------------------------------------------
def update_other
self.opacity = @fog.opacity
self.blend_type = @fog.blend_type
self.tone.set(@fog.tone)
end
end
That's awesome man! Thanks a lot for that. Lemme just get it all set up so it's up and running for Demo 2.
No problem. :)
Looks great i will have to play the demo!
Just downloaded the demo. Gonna play it now.
I seriously apologize for the lack of updates on the game. Sadly, this isn't much of an update, but I wanted to just say that the game is very much in production and I want to have a demo out as soon as possible. My schedule however, filled with Guild Wars and high school (plus being on the football team), has become difficult to find time to work on Witchtooth. At the most, the second demo will be out in a month, that being said I will try to get more screenshots/gameplay out in between this time.
PS: I bought Torchlight 2...hopefully that doesn't take up too much time. :V
I still haven't played it, not really sure if I should. I'll probably LP it when it's complete and LP's kinda suck when the player already knows what's gonna happen.
I do however have something for you. I decided to loop your music for you; no longer will they have to restart after completion :)
I can't really do that to midi files without converting them to ogg. So I guess it's up to you if you're willing to compensate file size for smoother sounds :-\
Oh that's amazing dude! So many helpful fellas on the RMRK. Thanks a lot for that.
Blah!!! nerdgasm, though the first game was great i look forward to this, and again i'm available for whatever help you may need. (except for scripting)
After meandering through the available demonstration, I believe that you are off to a good start on the sequel! I played through most of the first Witchtooth, although I never completed the game (something that I will correct eventually).
The mapping is solid, and while most areas do feel boxy and rigid, one can sense that time was taken to make everything feel organic and populated. The attention to detail is also evident in the many secret chests and items available throughout the game. Toss several more difficult to find secrets in, please! As for the music selection, the songs do tie in nicely to the areas and scenes, but the volume was louder than I enjoy.
There is quite a bit of dialog to wade through and very little action at this point, but considering the span of time that has passed in the story and how early in production the game is, this is understandable. I do not agree with starting the characters from level one as well as with next to no gear when they have clearly adventured in the past. But overall, I believe that you are on the right track!
I did notice some errors along the way, and have noted them below.
[ General ]
-- Color used for the hi-lighted selection within the menu system is extremely difficult to see at times.
-- After returning from witch island, Lin does not join the party.
-- After returning from witch island, ocean background sound continues to play.
[ Cairesville ]
< Bar >
- <Minor>
-- When facing candle holders in the bar and pressing the action button, the light briefly flickers.
- <Minor> : ( Before Image (http://dl.dropbox.com/u/34748352/WT2/wt2-s03b.png) - After Image (http://dl.dropbox.com/u/34748352/WT2/wt2-s03.png) )
-- Rippul virus has infected the patrons of the bar after 'tipping' the street performer.
< Salvadore Residence >
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s10.png) )
-- Sophie doppelganger after returning from witch island.
[ Dreamland Knights' House of Magical Paradise ]
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s02.png) )
-- Passage settings incorrect.
[ Mine ]
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s01.png) )
-- Passage settings incorrect.
[ Witch Island ]
< Beach Tent >
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s04.png) )
-- Passage settings incorrect.
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s05.png) )
-- Passage settings incorrect.
< Witch Village >
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s06.png) )
-- Village soundtrack abruptly restarts upon entering and exiting pictured house.
< Sacred Cave >
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s07.png) )
-- Passage settings incorrect.
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s08.png) )
-- Passage settings incorrect.
- <Minor> : ( Image of Issue (http://dl.dropbox.com/u/34748352/WT2/wt2-s09.png) )
-- Passage settings incorrect.
Protip: Don't put passable tiles on roof/wall tiles, and set the candles to "Direction Fix".
Yeah I discovered the problem with the wall tiles and stuff, I have to go back and find them all.
Thanks a lot for that Exhydra, I'll get that worked out now. Thanks for the images too, that REALLY helps me out.
Pretty much 100% of those passability errors have been fixed, I just haven't had the game updated, I should do that. But, about the Rippul virus and the Sophie clone, it's probably me messing up my switches like I always do. I'll get those worked out right away along with the audio.
It really wasn't specified much, nor shown, but Lin will not fight for you, but she is following. I'll add a small cutscene right after getting off the boat from the Witch Island that'll clarify all of this.
If there is a way to make someone follow the party, but not actually be IN the party, that'd be nice.
My laptop has been suffering from some serious problems. Because of this I've put in little to no progress onto the game. When I get everything settled out I will get a bit more stuff out, such as the videos and screenshots I promised.
My high school football career is officially over so I'll have a ton of time on my hands. So apologies for the lack of updates, I'm working on it.
I'm way too excited. I'm actually as excited for this as I am with Pokemon games or Zelda games XD
I'm loving the progress! Look forward to when this is completed. Also, make sure you back up your projects if your computer is acting touchy. I've lost a few substantial projects (one was posted here, too!) that way.
I'm pretty sure all types of problems have been solved with my laptop. Previously, it simply did not turn on, leaving my game sitting there for at least a month. Now I've got it fixed and the game backed up on my home computer. I can finally do something.
Sorry again! I've been making all these posts of stuff no one really wants to hear, I'll finally get working on the game.
I'm going to be setting myself some deadlines for things I want to have posted/released. I realized that when I don't create deadlines for myself, my procrastinating ways truly kick in. I'll get back on when I'd like to showcase some more of the game really soon.
On Sunday, (Nov. 11) I'll be uploading a new gameplay video and posting it here. Screenshots are kinda boring.
[yt]http://www.youtube.com/watch?v=xizq09CKB0w&feature=youtu.be[/yt]
Here is a bit more Gameplay Footage. It's not much of a trailer, but it showcases one of the game's early zones.
The current demo for the game is awfully buggy and I've been way too lazy when it comes to updating it. So this week I'll be releasing an updated and extended demo (with an hour or so of additional content). Once the demo is fixed I'll be able to get more people to review it without getting all the same feedback about the glitches.
The game is progressing well and I plan on putting up some new screenshots and/or videos once I've built a couple more maps.
Yup.
The second version of the demo is done, you can get it here:
http://www.mediafire.com/?7zqti8dxcudw2c2
Again, this adds another hour to the original demo and fixes most if not all of its bugs.
If anything is found please tell me about them, but what I'm really looking for is the difficulty factor, since its hard to measure difficulty when you're the one who created the game.
An extractor (such as WinRar/7zip) maybe be needed
in second demo version, I think I found a bug, when I finally proceed through the bridge, instead of pay up, I beat up two bandits, then I head to cairesville heal up and back to bridge, they're still there asking to pay up, this time I pay up, but cannot proceed to Ellrock city.
----------
And it would be nice to have a quest log too.
That must be a bug, because for this demo I tried to seal that bridge off... And I'm surprised you could beat them.
I guess I'll be updating the demo again. I'm thinking about adding a quest log, but not a traditional one. We'll see.
I haven't posted anything for Witchtooth 2 in a long time... here's why:
When I created Witchtooth 1, it was incredibly rushed, mainly because I didn't have much time to work on it and releasing it was more of a "look i finished a game" type of thing than it being something I was truly proud of. It had numerous flaws, one of which was its linearity, which I slowly see Witchtooth 2 falling into that same hole. A sequel was never what I truly wanted for the game. I'm not highly motivated to continue a story with these specific characters, or with similar gameplay. I'm on the fence on whether or not I'll try to finish this game. If I did continue at the rate I have been developing the game, I'll hit another roadblock, College. That would make development last even longer.
I want to continue using RPG Maker, but with my time constraints I want to make a game worth the effort. Witchtooth 2 may not be it. I have something else in my head that I'm really excited about working on, but that would kick Witchtooth 2 aside if I decided to work on it.
So for now I'm putting Witchtooth 2 into hiatus until I decide what I want to do with it. I'm sure I'll come back to the witchtooth "universe" with a future game, but for now I'm not motivated to work on this.
I sincerely apologize to the few looking forward to its completion.
You haven't disappointed me, I understand the rushed feeling quite well. I'm Sure others understand too. Take your time and Build the Game you want to, not the one everybody tells you to. otherwise your just a mindless producer. Good Luck to you!
I think it's safe to say, I'm done with this project. I've got something else I'd rather work on.
Could a mod please move this? (to abandoned)
Genuinely upset by this, but I have to say I understand why. When I get half way through making a game, I tend to feel like I've hit a stopping point where I can't think of a way to continue.
If Witchtooth was just you wanted to show people you've made a game, though, I can't begin to imagine how amazing your new project will be :3
Thanks ;)