view png_to_js.rb @ 0:1eef88068f9f tip

initial commit of maze game source
author ferencd
date Sun, 15 Sep 2019 11:46:47 +0200
parents
children
line wrap: on
line source
require 'pp'
require 'base64'
require 'gamedata'

def food_loader(foods, wd, file)
  foodnames = []
  foodeffects = []
  foods.each {|food|
    file.write("var #{food[:name]}= new Image();")
    imgfile = "#{wd}/food/#{food[:name]}.png"
    s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)
    file.write("#{food[:name]}.src=\"data:image/png;base64,#{s}\";\n")
    foodnames << "#{food[:name]}"
    foodeffects << food[:energy]
  }

  file.write("var food_image = [#{foodnames.join(',')}];\n")
  file.write("var food_effects = [#{foodeffects.join(',')}];\n")
end

def item_loader(items, wd, file)
  itemnames = []
  itemvalues = []
  items.each {|loot|
    file.write("var #{loot[:name]}= new Image();")
    imgfile = "#{wd}/loot/#{loot[:name]}.png"
    s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)
    file.write("#{loot[:name]}.src=\"data:image/png;base64,#{s}\";\n")
    itemnames << "#{loot[:name]}"
    itemvalues << loot[:value]
  }

  file.write("var item_image = [#{itemnames.join(',')}];\n")
  file.write("var item_value = [#{itemvalues.join(',')}];\n")
end

def weapon_loader(weapons, wd, file)
  weaponnames = []
  weaponhits = []
  weapon_anim_idxs = []
  weapons.each {|weapon|
    file.write("var #{weapon[:name]}= new Image();")
    imgfile = "#{wd}/weapons/#{weapon[:name]}.png"
    s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)
    file.write("#{weapon[:name]}.src=\"data:image/png;base64,#{s}\";\n")
    weaponnames << "#{weapon[:name]}"
    weaponhits << weapon[:hitvalue]
    weapon_anim_idxs << weapon[:anim_idx]
  }

  file.write("var weapon_images = [#{weaponnames.join(',')}];\n")
  file.write("var weapon_hits = [#{weaponhits.join(',')}];\n")
  file.write("var weapon_anim_idx = [#{weapon_anim_idxs.join(',')}];\n")

end

WALL_COUNT = 15

def wall_loader(js_var_name, wall_type, wd, file)
    file.write("\nvar #{js_var_name}=[];\n")

    (0 .. WALL_COUNT).each do |v|
      imgfile = "#{wd}/#{wall_type}/cell_#{v}.png"
      s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)

      file.write("#{js_var_name}[#{v}] = new Image();\n")
      file.write("#{js_var_name}[#{v}].src=\"data:image/png;base64,#{s}\";\n")
    end
end

def doored_wall_loader(js_var_name, wall_location, door_state, indexes, wd, file)
  file.write("\nvar #{js_var_name}=[];\n")
  cidx = 0
  indexes.each do |v|
    imgfile = "#{wd}/walls/cell_#{v}_#{wall_location}_door_#{door_state}.png"
    s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)
    file.write("#{js_var_name}[#{cidx}] = {img: new Image(), idx:#{v}}; \n")
    file.write("#{js_var_name}[#{cidx}].img.src=\"data:image/png;base64,#{s}\";\n")

    cidx += 1
  end
end

def staired_wall_loader(js_var_name, stair_direction, indexes, wd, file)
  file.write("\nvar #{js_var_name}=[];\n")

  indexes.each do |v|
    imgfile = "#{wd}/walls/cell_#{v}_stairs_#{stair_direction}.png"
    s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)

    file.write("#{js_var_name}[#{v}] = new Image();\n")
    file.write("#{js_var_name}[#{v}].src=\"data:image/png;base64,#{s}\";\n")
  end
end

# Will load the images of an animation
def anim_loader(js_var_name,location, type, direction, count, wd, file)

  file.write("\nvar #{js_var_name}=[];\n")

  (1 .. count).each do | v |
    imgfile = "#{wd}/#{location}/#{type}/#{direction}_#{type}_#{v}.png"
    s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)

    file.write("#{js_var_name}[#{v - 1}] = new Image();\n")
    file.write("#{js_var_name}[#{v - 1}].src=\"data:image/png;base64,#{s}\";\n")
  end
end

def overlay_loader(js_var_name, type, count, wd, file)
  file.write("\nvar #{js_var_name}=[];\n")
  (0..count).each do | v |
    imgfile = "#{wd}/overlay/#{type}_#{v}.png"
    s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)

    file.write("#{js_var_name}[#{v}] = new Image();\n")
    file.write("#{js_var_name}[#{v}].src=\"data:image/png;base64,#{s}\";\n")
  end
end


def single_image_loader_printer(images)
  images.each do | v |
    imgfile = "img/#{v}"
    s = Base64.strict_encode64(File.open("#{imgfile}", 'rb').read)
    print "#{v}.src=\"data:image/png;base64,#{s}\";\n"
  end
end

##################################################################################################################
#                                            Main entry point                                                    #
##################################################################################################################

abort("Wrong directory #{Dir.pwd} since no ./img directory exists") if not Dir.exist? ("#{Dir.pwd}/img")

wd = "#{Dir.pwd}/img"

def load_player_images(array_name, location, file, wd)
  anim_loader("right_going_#{location}", location, 'wl', 'r', 9, wd, file)
  anim_loader("left_going_#{location}", location, 'wl', 'l', 9, wd, file)
  anim_loader("up_going_#{location}", location, 'wl', 'u', 9, wd, file)
  anim_loader("down_going_#{location}", location, 'wl', 'd', 9, wd, file)
  file.write("var #{array_name} = [left_going_#{location}, up_going_#{location}, right_going_#{location}, down_going_#{location}];")

  anim_loader("right_thrust_#{location}", location, 'tr', 'r', 8, wd, file)
  anim_loader("left_thrust_#{location}", location, 'tr', 'l', 8, wd, file)
  anim_loader("up_thrust_#{location}", location, 'tr', 'u', 8, wd, file)
  anim_loader("down_thrust_#{location}", location, 'tr', 'd', 8, wd, file)
  file.write("var #{array_name}_thrust = [left_thrust_#{location}, up_thrust_#{location}, right_thrust_#{location}, down_thrust_#{location}];")
end

open('graphics.js', 'w') do |file|

  # 1. Wall images, in: /img/walls/cell_*.png
  wall_loader('wall_images', 'walls', wd, file)
  # 2. Fog drawn walls
  wall_loader('fog_drawn_wall_images', 'fog_drawn', wd, file)

  # 2.5 cells with closed doors
  bottom_closed_door_indexes = [12,13,1,4,5,8,9]
  doored_wall_loader('bottom_closed_doors', 'bottom', 'closed', bottom_closed_door_indexes, wd, file)

  top_closed_door_indexes = [2,6,14]
  doored_wall_loader('top_closed_doors', 'top', 'closed', top_closed_door_indexes, wd, file)

  # 2.6 Stairs going down
  stairs_down_indexes = [1,8,9]
  staired_wall_loader('stairs_down', 'down', stairs_down_indexes, wd, file)

  # 3. player
  step_anim_cnt = 'step_anim_cnt'
  file.write("var #{step_anim_cnt}= 9;")

  thrust_anim_cnt = 'thrust_anim_cnt'
  file.write("var #{thrust_anim_cnt}= 8;")

  load_player_images('lr_player', 'player', file, wd)
  load_player_images('lr_player_spear', 'player_spear', file, wd)
  load_player_images('lr_player_armor', 'player_armor', file, wd)
  load_player_images('lr_player_armor_spear', 'player_armor_spear', file, wd)
  load_player_images('lr_player_shoes', 'player_shoes', file, wd)
  load_player_images('lr_player_shoes_spear', 'player_shoes_spear', file, wd)

  # dying player
  anim_loader('dying_player', 'player', 'hr', 't', 6, wd, file)

  # Skeletons
  
  # simple skeleton

  anim_loader('skel_walker_right', 'skel', 'wl', 'r', 9, wd, file)
  anim_loader('skel_walker_left', 'skel', 'wl', 'l', 9, wd, file)
  anim_loader('skel_walker_up', 'skel', 'wl', 'u', 9, wd, file)
  anim_loader('skel_walker_down', 'skel', 'wl', 'd', 9, wd, file)
  file.write("var skel = [skel_walker_left, skel_walker_up, skel_walker_right, skel_walker_down];\n")
  
  # Skeleton with spear

  anim_loader('skel_spear_walker_right', 'skel_spear', 'wl', 'r', 9, wd, file)
  anim_loader('skel_spear_walker_left', 'skel_spear', 'wl', 'l', 9, wd, file)
  anim_loader('skel_spear_walker_up', 'skel_spear', 'wl', 'u', 9, wd, file)
  anim_loader('skel_spear_walker_down', 'skel_spear', 'wl', 'd', 9, wd, file)
  file.write("var skel_spear = [skel_spear_walker_left, skel_spear_walker_up, skel_spear_walker_right, skel_spear_walker_down];\n")

  # Skeletons array
  
  file.write('var walker_images = [skel, skel_spear];')

  # Dancing skeletion
  anim_loader('skel_killer_dancer_d', 'skel', 'sc', 'd', 7, wd, file)
  anim_loader('skel_killer_dancer_u', 'skel', 'sc', 'u', 7, wd, file)
  anim_loader('skel_killer_dancer_l', 'skel', 'sc', 'l', 7, wd, file)
  anim_loader('skel_killer_dancer_r', 'skel', 'sc', 'r', 7, wd, file)
  file.write("var skel_dancer = [skel_killer_dancer_l, skel_killer_dancer_u, skel_killer_dancer_r, skel_killer_dancer_d];\n")

  # Dying skeleton
  anim_loader('skel_dies', 'skel', 'hr', 't', 6, wd, file)

  # 5. torches
  overlay_loader('torch_images', 'torch', 2, wd, file)

  #6. food stuff
  food = [ {:name => 'apple', :energy => 10},
           {:name => 'bread', :energy => 15},
           {:name => 'carrot', :energy => 20},
           {:name => 'fish', :energy => 25},
           {:name => 'meat', :energy => 30},
           {:name => 'mushroom_bad', :energy => -15},
           {:name => 'mushroom', :energy => 5},
           {:name => 'onio', :energy => 5},
           {:name => 'potato', :energy => 15},
           {:name => 'tomato', :energy => 15}
  ]
  food_loader(food, wd, file)

  #7. Weapons. Don't change the order, js uses this
  weapons = [ {:name => 'spear', :hitvalue => 5, :anim_idx => 1},
              {:name => 'armor', :hitvalue => 0, :anim_idx => 2},
              {:name => 'shoe',  :hitvalue => 0, :anim_idx => 4},
              {:name => 'ring', :hitvalue => 0, :anim_idx => 0}]

  weapon_loader(weapons, wd, file)

  # 8. Loot items for the adventure mode

  item_loader($ITEMS, wd, file)

  # Activate this upon final release and put the data in the img tags in the html
  #static_images=%w(menu.png dungeonslogo.png player/heart.png skel/wl/d_wl_1.png funnyfellow.png)
  #single_image_loader_printer static_images
end