Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - MetalZelda

#481
Development / Re: Menu help
November 10, 2015, 11:04:54 AM
Quote from: Diarandor on November 10, 2015, 10:30:08 AM
Quote from: Username on November 10, 2015, 10:22:54 AM
Hmmm, strange thing is that you can't set the custom effect from the debug console in-game, it always return that set_custom_command_effect doesn't exist

I don't understand what exactly you mean. The function set_custom_command_effect is not a built-in function as Christopho said, it is fully scripted in Lua (in this case it is in the game_manager script); if you get an error is because you have not written it in your scripts. The command_effect is the built-in one, which cannot be changed directly.

Right !
For this issue, There must be in newer releases of Solarus a game:freeze_all(bool), just like when you press "d", because, interestingly , you can move while you're in the menu and trigger an error, the menu would still work.
My guess is, at the moment, that the menu isn't halting/freezing stuffs (only the hero is freez'd), so the engine might still consider that it need to update some values (and, it still update the ocarina patch's custom interraction while you're in the warp menu), other than that, I don't know what is causing this issue, that's quite strange honestly


#482
Development / Re: Menu help
November 10, 2015, 10:22:54 AM
Quote from: Diarandor on November 10, 2015, 08:54:39 AM
The reason why I changed those lines of code was to allow talking with npcs while carrying custom entities (to allow giving them objects of type "portable_entity"), so I needed to give priority to the built-in action effect. (In an older version of my script I used the action button to throw the entity, which is also used to talk with normal npcs, so I changed the priority for the built-in talking effect.) But probably you are not using that feature. Anyway, it should be possible to modify the scripts to make everything work correctly with the original code (but that would mean to remove this feature, although that may be fine for your purposes if you don't plan to use it).

In case you change back that code, there might happen that you open the pause menu while carrying a portable_entity, so the custom_command_effects change during the menu, and hence after closing the menu you cannot throw the entity because the custom_command_effects have been changed. The solution should be easy: just store the value of the custom_command_effects in some variables when you open some menu and restore those values after closing the menu.

Hmmm, strange thing is that you can't set the custom effect from the debug console in-game, it always return that set_custom_command_effect doesn't exist
#483
Development / Re: Menu help
November 10, 2015, 12:53:03 AM
For the text I found the culprit

  self.caption_text_(1 and 2) = sol.text_surface.create{
    horizontal_alignment = "center",
    vertical_alignment = "middle",
    font = "fixed",
    font = menu_font,
    font_size = menu_font_size,


There is no menu_font, menu_font_size declared so the game cannot render the text with nothing, plus, there is 2 fonts section

You should replaced "fixed" (nil) by an existing fonts in /font folder and font_size is up to you

(I do tested with font = "lttp" and font_size = 12, here's the result, text caption 2 display nothing for some reasons, maybe the variable isn't correct ?)

Edit  : for caption_text 2, there is no value for them in strings.dat.
Please test caption 2



Now let's see about custom action
#484
Development / Re: Menu help
November 10, 2015, 12:34:05 AM
Quote from: wrightmat on November 10, 2015, 12:16:44 AM
Username - that makes sense, but I'm not sure how to fix it. I use game:on_warp_started() to call sol.menu.start() because I pass a variable - initial_point (from self:get_name() of the custom entity) to the menu and I couldn't figure how to do that from sol.menu.start() directly. Is that possible?

Diarandor - is it possible to change maps while paused? Have you seen an instance of this in my game, or another game?

As for the set_custom_command_effect lines, I didn't have them in there yet, sorry. Updated code is below!

Code (lua) Select

local game = ...
local warp_menu = {}  -- The warp menu.
local initial_point
local initial_y = 10
local initial_volume
local index

-- Warp point name, Companion point, Warp to map, Coordinate x on minimap, Coordinate y on minimap, Name of warp.
warp_points = {         -- Intentionally Global!
  b1500 = { "b1501", "133", 166, 102, "Old Kasuto" },
  b1501 = { "b1500", "46", 178, 220, "Hidden Village" },
  b1502 = { "b1503", "51", 90, 194, "Kakariko City" },
  b1503 = { "b1502", "11", 162, 372, "Ordon Village" },
  b1504 = { "b1505", "72", 2, 228, "Gerudo Camp" },
  b1505 = { "b1504", "66", 208, 178, "Goron City" },
  b1506 = { "b1507", "82", 50, 346, "Beach" },
  b1507 = { "b1506", "37", 218, 266, "Lost Woods" },
  b1508 = { "b1509", "60", 4, 180, "Snowpeak" },
  b1509 = { "b1508", "88", 15, 25, "Calatia Peaks" },
  b1510 = { "b1511", "56", 160, 150, "Septen Heights" },
  b1511 = { "b1510", "139", 178, 126, "Three Eye Rock" },
  b1512 = { "b1513", "57", 184, 150, "Zora's Domain" },
  b1513 = { "b1512", "93", 34, 40, "Rito Town" },
  b1514 = { "b1515", "34", 120, 258, "Lake Hylia" },
  b1515 = { "b1514", "13", 210, 365, "Floria Peninsula" }
}

function game:on_warp_started(point)
  initial_point = point
  if not sol.menu.is_started(warp_menu) then sol.menu.start(game, warp_menu) end
end

function warp_menu:on_started()
  self.hero_head_sprite = sol.sprite.create("menus/hero_head")
  self.hero_head_sprite:set_animation("tunic" .. game:get_item("tunic"):get_variant())
  self.background_surfaces = sol.surface.create("pause_submenus.png", true)
  self.background_surfaces:set_opacity(192)
  self.cursor_sprite = sol.sprite.create("menus/pause_cursor")
  self.caption_text_1 = sol.text_surface.create{
    horizontal_alignment = "center",
    vertical_alignment = "middle",
    font = "fixed",
    font = menu_font,
    font_size = menu_font_size,
  }
  self.caption_text_2 = sol.text_surface.create{
    horizontal_alignment = "center",
    vertical_alignment = "middle",
    font = "fixed",
    font = menu_font,
    font_size = menu_font_size,
  }

  -- Show a world map.
  self.caption_text_1:set_text(sol.language.get_string("map.caption.warp"))
  self.outside_world_minimap_size = { width = 225, height = 399 }
  self.world_minimap_img = sol.surface.create("menus/warp_map.png")
  self.world_minimap_movement = nil

  -- Initialize the cursor and scroll map to initial point.
  for k, v in pairs(warp_points) do
    if k == initial_point then
      index = k
      self:set_cursor_position(v[3], v[4])
      if v[4] >= 133 then initial_y = v[4] - 133 + 10 else initial_y = 0 end
      self.world_minimap_visible_xy = {x = 0, y = initial_y }
    end
  end

  -- Update HUD icons (not working).
  game:set_custom_command_effect("action", nil)
  game:set_custom_command_effect("attack", "validate")
  game:set_custom_command_effect("pause", "return")

  -- Ensure the hero can't move.
  game:get_map():get_hero():freeze()

  -- Lower the volume (so ocarina sound can be heard when point selected).
  initial_volume = sol.audio.get_music_volume()
  sol.audio.set_music_volume(initial_volume/3)
end

function warp_menu:on_command_pressed(command)
  if command == "left" or command == "up" then
    self:previous_warp_point()
    handled = true
  elseif command == "right" or command == "down" then
    self:next_warp_point()
    handled = true
  elseif command == "action" or command == "attack" then
    for k, v in pairs(warp_points) do
      if k == index and game:get_value(v[1]) then
        game:start_dialog("warp.to_"..v[2], function(answer)
          if answer == 1 then
            sol.menu.stop(warp_menu)
            game:get_map():get_hero():set_animation("ocarina")
            sol.audio.play_sound("ocarina_wind")
            game:get_map():get_entity("hero"):teleport(v[2], "ocarina_warp", "fade")
          end
        end)
      end
    end
  elseif command == "pause" then
    sol.menu.stop(warp_menu)
  end

  return true
end

function warp_menu:next_warp_point()
  if index == "b1500" then index = "b1501"
  elseif index == "b1501" then index = "b1502"
  elseif index == "b1502" then index = "b1503"
  elseif index == "b1503" then index = "b1504"
  elseif index == "b1504" then index = "b1505"
  elseif index == "b1505" then index = "b1506"
  elseif index == "b1506" then index = "b1507"
  elseif index == "b1507" then index = "b1508"
  elseif index == "b1508" then index = "b1509"
  elseif index == "b1509" then index = "b1510"
  elseif index == "b1510" then index = "b1511"
  elseif index == "b1511" then index = "b1512"
  elseif index == "b1512" then index = "b1513"
  elseif index == "b1513" then index = "b1514"
  elseif index == "b1514" then index = "b1515"
  elseif index == "b1515" then index = "b1500" end

  -- Move cursor and scroll map to new warp point.
  for k, v in pairs(warp_points) do
    if k == index and game:get_value(v[1]) then
      self:set_cursor_position(v[3], v[4])
      if v[4] >= 133 then initial_y = v[4] - 133 + 10 else initial_y = 0 end
      self.world_minimap_visible_xy = {x = 0, y = initial_y }
    end
  end
end

function warp_menu:previous_warp_point()
  if index == "b1500" then index = "b1515"
  elseif index == "b1501" then index = "b1500"
  elseif index == "b1502" then index = "b1501"
  elseif index == "b1503" then index = "b1502"
  elseif index == "b1504" then index = "b1503"
  elseif index == "b1505" then index = "b1504"
  elseif index == "b1506" then index = "b1505"
  elseif index == "b1507" then index = "b1506"
  elseif index == "b1508" then index = "b1507"
  elseif index == "b1509" then index = "b1508"
  elseif index == "b1510" then index = "b1509"
  elseif index == "b1511" then index = "b1510"
  elseif index == "b1512" then index = "b1511"
  elseif index == "b1513" then index = "b1512"
  elseif index == "b1514" then index = "b1513"
  elseif index == "b1515" then index = "b1514" end

  -- Move cursor and scroll map to new warp point.
  for k, v in pairs(warp_points) do
    if k == index and game:get_value(v[1]) then
      self:set_cursor_position(v[3], v[4])
      if v[4] >= 133 then initial_y = v[4] - 133 + 10 else initial_y = 0 end
      self.world_minimap_visible_xy = {x = 0, y = initial_y }
    end
  end
end

function warp_menu:set_cursor_position(x, y)
  self.cursor_x = x
  self.cursor_y = y
  if y > 133 then
    if y <399 then self.world_minimap_visible_xy.y = y - 51 else self.world_minimap_visible_xy.y = 399 end
  end

  -- Update the caption text.
  for k, v in pairs(warp_points) do
    if k == initial_point then self.caption_text_2:set_text(sol.language.get_string(v[5])) end
  end
end

function warp_menu:on_draw(dst_surface)
  -- Draw background.
  local width, height = dst_surface:get_size()
  self.background_surfaces:draw_region(320, 0, 320, 240, dst_surface, (width - 320) / 2, (height - 240) / 2)

  -- Draw caption (Not working currently for some reason).
  local width, height = dst_surface:get_size()
  self.caption_text_1:draw(dst_surface, width / 2, height / 2 + 83)
  self.caption_text_2:draw(dst_surface, width / 2, height / 2 + 95)

  -- Draw the minimap.
  self.world_minimap_img:draw_region(self.world_minimap_visible_xy.x, self.world_minimap_visible_xy.y, 255, 133, dst_surface, 48, 59)

  -- Draw the warp points.
  for k, v in pairs(warp_points) do
    if game:get_value(v[1]) then -- Only those that have been discovered are shown.
      local point_visible_y = v[4] - self.world_minimap_visible_xy.y
      if point_visible_y >= 10 and point_visible_y <= 133 then self.hero_head_sprite:draw(dst_surface, v[3] + 40, point_visible_y + 51) end
    end
  end

  -- Draw the cursor.
  if self.cursor_y >= (10 + self.world_minimap_visible_xy.y) and self.cursor_y <= (133 + self.world_minimap_visible_xy.y) then
    self.cursor_sprite:draw(dst_surface, self.cursor_x + 48, self.cursor_y + 55 - self.world_minimap_visible_xy.y)
  end
end

function warp_menu:on_finished()
  sol.audio.set_music_volume(initial_volume)
  game:get_map():get_hero():unfreeze()
end


Yeah that's the one I tested, I didn't see that there were sol.menu.start, which make the thing a lot weirder  :o
That's a tough issue
#485
Development / Re: Custom Hero?
November 09, 2015, 11:16:52 PM
Yes, this might be in future Solarus version, this must be an option for custom hero sprites that is bigger than Link.

https://github.com/christopho/solarus/issues/791
#486
Development / Re: Is Surface bellow layers possible ?
November 09, 2015, 05:57:41 PM
Quote from: Christopho on November 09, 2015, 05:25:17 PM
To allow custom background, there should be new events map:on_pre_draw() and map:on_post_draw(). For now there is only map:on_draw(), which occurs after the map is drawn and before its menus are drawn.
A problem is that the background color of the tileset should not overwrite what is done in map:on_pre_draw(). Maybe the background color of the tileset should be optional, or maybe defining it should become a default background in case map:on_pre_draw() is not defined?

Hmmm, I was talking about image-based background, for the color that might be the same thing
#487
Development / Re: Is Surface bellow layers possible ?
November 09, 2015, 05:13:17 PM
That's a good news though
#488
Development / Is Surface bellow layers possible ?
November 09, 2015, 04:52:18 PM
Hi.

Does Solarus accept drawable objects (surface) to be bellow all layers ? I do have checked the API http://www.solarus-games.org/doc/latest/lua_api_surface.html and it doesn't seems to have some parameters like putting it on a certain layer or bellow
http://www.solarus-games.org/doc/latest/lua_api_drawable.html#lua_api_drawable_draw_region
This would be cool if there were a parameter "height" in drawable:draw (desired layer or top or bellow all)

Example of use :
This could be useful for auto-scrolling backgrounds
#489
Development / Re: Custom Hero?
November 09, 2015, 03:45:40 PM
He might be saying a collision with an enemy since he says "with the hero"

If this is the case then it exist a event on_taking_damage, for the hero and enemy
http://www.solarus-games.org/doc/latest/lua_api_hero.html#lua_api_hero_on_taking_damage

Or he's talking about custom hero bounding box. (which is not possible yet afaik)

Or he's talking about changing the sprite of the hero. (set_tunic_sprite_id)
#490
Development / Re: Menu help
November 09, 2015, 09:24:23 AM
Oh, yeah, that might be this, "confirm" doesn't exist as a action, so validate might be right thing

https://github.com/wrightmat/zbom/blob/master/data/scripts/hud/action_icon.lua#L41
Edit : Oh he does already have these.

Edit 2 : The custom_interraction script is called each frame when the hero step on the ocarina patch or any custom entity, so it can't call "validate" from the menu since it is immediately replaced by the custom entity's interraction one(check).

The problem is : Your warp script isn't a real menu, judging by how it is called in ocarina_patch, you should consider using http://www.solarus-games.org/doc/latest/lua_api_menu.html#lua_api_menu_start, game:on_warp_started() doesn't halt upcoming map update and thus entities are still updating since it runs at the same time, unlike a menu.

If you put a print("blabla") after game:add_collision_test in custom_interraction and another print in your on_called menu, you will see what i'm talking about, if you "regular pause", the interaction is halted because sol.menu take the advantage. (Am I right ?)

#491
Development / Re: Menu help
November 09, 2015, 12:30:36 AM
Quote from: wrightmat on November 09, 2015, 12:13:52 AM
Every other script that I have (such as the pause submenus) which changes the HUD icons works though, so I'm reticent to go changes a bunch of stuff for one menu.


If that work for others then this is not the thing I described above, hmmmm, that's a strange issue.
#492
Development / Re: Menu help
November 08, 2015, 11:51:15 PM
Quote from: wrightmat on November 08, 2015, 11:13:42 PM
Great research everyone, thanks!

Diarandor, I've tried "validate" and "return" as well, but still no luck. The HUD continues to display what was there before the menu appears.

Anyone who has more experience with menus - does the structure of my menu script look okay? Maybe it's something unrelated to get/set_custom_command_effect and something wrong with the menu itself?

If you have a early version of you game, you might try if this work, if yesn then that should be :
- the hud script or your script
- https://github.com/christopho/zelda_mercuris_chest/blob/master/data/scripts/hud/hud.lua#L21
https://github.com/wrightmat/zbom/blob/master/data/scripts/hud/hud.lua#L15
Mercuri's Chest Hud.lua have get/set_custom_command declared on it and use the hud_manager.game: , while your game manager use game:, and since you changed the hud script, the game:get/set_blabla in game_manager might be obsolete

This is confusing  :o
#493
Development / Re: Menu help
November 08, 2015, 08:35:23 PM
Quote from: Christopho on November 08, 2015, 07:41:50 PM
get/set_custom_command_effect are not in the Solarus API, there are added in pure in Lua in game_manager.lua in ZSDX. If I remember correctly, the HUD silently does nothing if get_custom_command_effect does not exist. Maybe this is why there is no result and no error?


I do used BoM source when I started my project, set_custom_command works properly (I use it for some custom entity interraction), maybe the culprit is the hud script itself since he now use another hud script (Mercuris Chest)

He does have set/get_custom_command_effect and his hud script seems to have no problem, I don't know why it don't work actually
https://github.com/wrightmat/zbom/blob/master/data/scripts/game_manager.lua#L102
#494
Development / Re: Menu help
November 08, 2015, 02:12:58 PM
Quote2) I can't figure out how to change the HUD icons. I've frozen the hero when the menu starts so you don't move around when trying to interact with the menu, but that's also frozen the HUD. I would like the attack icon to be "Confirm" (validate) and the pause icon to be "Back".

Have you tried game:set_custom_command_effect("pause", "back") game:set_custom_command_effect("attack", "confirm")  in warp_menu:on_started()

For the 1 : Is there any errors ?
#495
It can be reached without the needed item, but you need precise pixel positionning. It is not necessary atm