Updated mkxp-z to 2.2.0, added support for animated gifs

This commit is contained in:
Maruno17
2021-05-09 20:51:36 +01:00
parent e03e258f6a
commit ab3bb12d53
5 changed files with 41 additions and 171 deletions

View File

@@ -1,4 +1,4 @@
# Using mkxp-z v2.1.2 - https://gitlab.com/mkxp-z/mkxp-z/-/releases/v2.1.2 # Using mkxp-z v2.2.0 - https://gitlab.com/mkxp-z/mkxp-z/-/releases/v2.2.0
$VERBOSE = nil $VERBOSE = nil
Font.default_shadow = false if Font.respond_to?(:default_shadow) Font.default_shadow = false if Font.respond_to?(:default_shadow)
Graphics.frame_rate = 40 Graphics.frame_rate = 40

View File

@@ -280,10 +280,10 @@ end
# Note: pbGetFileChar checks anything added in MKXP's RTP setting, # Note: pbGetFileChar checks anything added in MKXP's RTP setting,
# and matching mount points added through System.mount # and matching mount points added through System.mount
def pbRgssExists?(filename) def pbRgssExists?(filename)
filename = canonicalize(filename)
if safeExists?("./Game.rgssad") if safeExists?("./Game.rgssad")
return pbGetFileChar(filename)!=nil return pbGetFileChar(filename)!=nil
else else
filename = canonicalize(filename)
return safeExists?(filename) return safeExists?(filename)
end end
end end

View File

@@ -103,6 +103,7 @@ module RPG
end end
class BitmapWrapper < Bitmap class BitmapWrapper < Bitmap
attr_reader :refcount attr_reader :refcount
attr_accessor :never_dispose attr_accessor :never_dispose

View File

@@ -1,35 +1,6 @@
# Disabling animated GIF stuff because gif.dll is awful, #===============================================================================
# but leaving the code here just in case someone wants #
# to make Linux and macOS versions of it for some reason #===============================================================================
=begin
module GifLibrary
@@loadlib = Win32API.new("Kernel32.dll", "LoadLibrary", 'p', '')
if safeExists?("gif.dll")
PngDll = @@loadlib.call("gif.dll")
GifToPngFiles = Win32API.new("gif.dll", "GifToPngFiles", 'pp', 'l')
GifToPngFilesInMemory = Win32API.new("gif.dll", "GifToPngFilesInMemory", 'plp', 'l')
CopyDataString = Win32API.new("gif.dll", "CopyDataString", 'lpl', 'l')
FreeDataString = Win32API.new("gif.dll", "FreeDataString", 'l', '')
else
PngDll = nil
end
def self.getDataFromResult(result)
datasize = CopyDataString.call(result, "", 0)
ret = nil
if datasize != 0
data = "0" * datasize
CopyDataString.call(result, data, datasize)
ret = data.unpack("V*")
end
FreeDataString.call(result)
return ret
end
end
=end
class AnimatedBitmap class AnimatedBitmap
def initialize(file, hue = 0) def initialize(file, hue = 0)
raise "Filename is nil (missing graphic)." if file.nil? raise "Filename is nil (missing graphic)." if file.nil?
@@ -54,7 +25,6 @@ class AnimatedBitmap
def each; @bitmap.each { |item| yield item }; end def each; @bitmap.each { |item| yield item }; end
def bitmap; @bitmap.bitmap; end def bitmap; @bitmap.bitmap; end
def currentIndex; @bitmap.currentIndex; end def currentIndex; @bitmap.currentIndex; end
def frameDelay; @bitmap.frameDelay; end
def totalFrames; @bitmap.totalFrames; end def totalFrames; @bitmap.totalFrames; end
def disposed?; @bitmap.disposed?; end def disposed?; @bitmap.disposed?; end
def update; @bitmap.update; end def update; @bitmap.update; end
@@ -63,8 +33,9 @@ class AnimatedBitmap
def copy; @bitmap.copy; end def copy; @bitmap.copy; end
end end
#===============================================================================
#
#===============================================================================
class PngAnimatedBitmap class PngAnimatedBitmap
attr_accessor :frames attr_accessor :frames
@@ -170,138 +141,51 @@ class PngAnimatedBitmap
end end
end end
#===============================================================================
#
#internal class #===============================================================================
class GifBitmap class GifBitmap
attr_accessor :gifbitmaps # internal attr_accessor :bitmap
attr_accessor :gifdelays # internal
# Creates a bitmap from a GIF file with the specified # Creates a bitmap from a GIF file. Can also load non-animated bitmaps.
# optional viewport. Can also load non-animated bitmaps.
def initialize(dir, filename, hue = 0) def initialize(dir, filename, hue = 0)
@gifbitmaps = [] @bitmap = nil
@gifdelays = [] @disposed = false
@totalframes = 0 filename = "" if !filename
@framecount = 0
@currentIndex = 0
@disposed = false
bitmap = nil
filestring = nil
filestrName = nil
filename = "" if !filename
full_path = canonicalize(dir + filename)
begin begin
bitmap = RPG::Cache.load_bitmap(dir, filename, hue) @bitmap = RPG::Cache.load_bitmap(dir, filename, hue)
rescue rescue
bitmap = nil @bitmap = nil
end
if !bitmap || (bitmap.width == 32 && bitmap.height == 32)
if !full_path || full_path.length < 1 || full_path[full_path.length - 1] != 0x2F
if (filestring = pbGetFileChar(full_path))
filestrName = full_path
elsif (filestring = pbGetFileChar(full_path + ".gif"))
filestrName = full_path + ".gif"
elsif (filestring = pbGetFileChar(full_path + ".png"))
filestrName = full_path + ".png"
# elsif (filestring = pbGetFileChar(full_path + ".jpg"))
# filestrName = full_path + ".jpg"
# elsif (filestring = pbGetFileChar(full_path + ".bmp"))
# filestrName = full_path + ".bmp"
end
end
end
if bitmap && filestring && filestring[0].ord == 0x47 &&
bitmap.width == 32 && bitmap.height == 32
# File.open("debug.txt","ab") { |f| f.puts("rejecting bitmap") }
bitmap.dispose
bitmap = nil
end
# Note: MKXP can open .gif files just fine, first frame only
if bitmap
# File.open("debug.txt","ab") { |f| f.puts("reusing bitmap") }
# Have a regular non-animated bitmap
@totalframes = 1
@framecount = 0
@gifbitmaps = [bitmap]
@gifdelays = [1]
else
=begin
tmpBase = File.basename(full_path) + "_tmp_"
filestring = pbGetFileString(filestrName) if filestring
Dir.chdir(ENV["TEMP"]) { # navigate to temp folder since game might be on a CD-ROM
if filestring && filestring[0] == 0x47 && GifLibrary::PngDll
result = GifLibrary::GifToPngFilesInMemory.call(filestring,
filestring.length, tmpBase)
else
result = 0
end
if result >0
@gifdelays = GifLibrary.getDataFromResult(result)
@totalframes = @gifdelays.pop
for i in 0...@gifdelays.length
@gifdelays[i] = [@gifdelays[i], 1].max
bmfile = sprintf("%s%d.png", tmpBase, i)
if safeExists?(bmfile)
gifbitmap = BitmapWrapper.new(bmfile)
@gifbitmaps.push(gifbitmap)
bmfile.hue_change(hue) if hue != 0
if hue == 0 && @gifdelays.length == 1
RPG::Cache.setKey(full_path, gifbitmap)
end
File.delete(bmfile)
else
@gifbitmaps.push(BitmapWrapper.new(32, 32))
end
end
end
}
=end
if @gifbitmaps.length == 0
@gifbitmaps = [BitmapWrapper.new(32, 32)]
@gifdelays = [1]
end
if @gifbitmaps.length == 1
RPG::Cache.setKey(full_path, @gifbitmaps[0])
end
end end
@bitmap = BitmapWrapper.new(32, 32) if @bitmap.nil?
@bitmap.play if @bitmap&.animated?
end end
def [](index) def [](_index)
return @gifbitmaps[index] return @bitmap
end end
def deanimate def deanimate
for i in 1...@gifbitmaps.length @bitmap&.goto_and_stop(0) if @bitmap&.animated?
@gifbitmaps[i].dispose return @bitmap
end
@gifbitmaps = [@gifbitmaps[0]]
@currentIndex = 0
return @gifbitmaps[0]
end
def bitmap
return @gifbitmaps[@currentIndex]
end end
def currentIndex def currentIndex
return @currentIndex return @bitmap&.current_frame || 0
end
def frameDelay(index)
return @gifdelay[index] / 2 # Due to frame count being incremented by 2
end end
def length def length
return @gifbitmaps.length return @bitmap&.frame_count || 1
end end
def each def each
@gifbitmaps.each { |item| yield item } yield @bitmap
end end
def totalFrames def totalFrames
return @totalframes / 2 # Due to frame count being incremented by 2 f_rate = @bitmap.frame_rate
f_rate = 1 if f_rate.nil? || f_rate == 0
return (@bitmap) ? (@bitmap.frame_count / f_rate).floor : 1
end end
def disposed? def disposed?
@@ -309,47 +193,32 @@ class GifBitmap
end end
def width def width
return (@gifbitmaps.length == 0) ? 0 : @gifbitmaps[0].width return @bitmap&.width || 0
end end
def height def height
return (@gifbitmaps.length == 0) ? 0 : @gifbitmaps[0].height return @bitmap&.height || 0
end end
# This function must be called in order to animate the GIF image. # Gifs are animated automatically by mkxp-z. This function does nothing.
def update def update; end
return if disposed?
if @gifbitmaps.length > 0
@framecount += 2
@framecount = (@totalframes <= 0) ? 0 : @framecount % @totalframes
frametoshow = 0
for i in 0...@gifdelays.length
frametoshow = i if @gifdelays[i] <= @framecount
end
@currentIndex = frametoshow
end
end
def dispose def dispose
if !@disposed return if @disposed
@gifbitmaps.each { |b| b.dispose } @bitmap.dispose
end
@disposed = true @disposed = true
end end
def copy def copy
x = self.clone x = self.clone
x.gifbitmaps = x.gifbitmaps.clone x.bitmap = @bitmap.copy if @bitmap
x.gifdelays = x.gifdelays.clone
for i in 0...x.gifbitmaps.length
x.gifbitmaps[i] = x.gifbitmaps[i].copy
end
return x return x
end end
end end
#===============================================================================
#
#===============================================================================
def pbGetTileBitmap(filename, tile_id, hue, width = 1, height = 1) def pbGetTileBitmap(filename, tile_id, hue, width = 1, height = 1)
return RPG::Cache.tileEx(filename, tile_id, hue, width, height) { |f| return RPG::Cache.tileEx(filename, tile_id, hue, width, height) { |f|
AnimatedBitmap.new("Graphics/Tilesets/" + filename).deanimate AnimatedBitmap.new("Graphics/Tilesets/" + filename).deanimate

BIN
Game.exe

Binary file not shown.