function open_gates_at_olympus_mons()
   local gate = map_get_obj(0x2c3, 0x1f3, 0, 181) -- OBJ_GATE
   if gate ~= nil then
      gate.x = 0x2c2
      gate.frame_n = 3
   else
      printl("AARGH")
   end
   
   gate = map_get_obj(0x2c4, 0x1f3, 0, 181) -- OBJ_GATE
   if gate ~= nil then
      gate.frame_n = 7
   else
      printl("AARGH")
   end
   
end

function open_dream_machine_door()
   local door = map_get_obj(0x2c7, 0x1dc, 0, 152) --OBJ_DOOR
   if door ~= nil then
      door.frame_n = 7
   end
end

function talk_script_fix_panels()
   local numPanels = 0
   for actor in party_members() do
      for obj in actor_inventory(actor) do
         if obj.obj_n == 458 then --OBJ_PANEL
            numPanels = numPanels + 1
            play_md_sfx(4)
            obj.quality = bit32.band(obj.quality, 0xfd)
            obj.qty = 4
         end
      end
   end

   if numPanels <= 1 then
      Actor.clear_talk_flag(0x39, 3)
   else
      Actor.set_talk_flag(0x39, 3)
   end

end

function talk_script_spawn_monster_footprints()
   g_objlist_1d22_unk = 0
   local player_loc = player_get_location()
   for i=0,5 do
      local monster = Actor.new(145, player_loc.x, player_loc.y, player_loc.z) --OBJ_MONSTER_FOOTPRINTS

      actor_init(monster)
      toss_actor(monster, player_loc.x, player_loc.y, player_loc.z, 0)
      monster.wt = 0x8
      g_objlist_1d22_unk = g_objlist_1d22_unk + 1
   end
end

local talk_script_tbl = {
   [1]=talk_script_fix_panels,
   [6]=open_gates_at_olympus_mons,
   [7]=open_dream_machine_door,
   [9]=function() talk_script_status = 9 end,
   [0xA]=function() talk_script_status = 0xA end,
   [0x35]=talk_script_spawn_monster_footprints,
}

function talk_script(script_number)
   if talk_script_tbl[script_number] ~= nil then
      talk_script_tbl[script_number]()
   else
      print("Attempting to run talk script #"..script_number.."\n")
   end
end

local talk_script_status = -1

local talk_script_post_action_tbl = {
   [0x9]=function() play_end_sequence() end,
   [0xA]=function() end,
   [0x34]=wake_from_dream,
   [0x36]=wake_from_dream,
   [0x38]=function() end,
   [0x65]=function() end,
   [0x66]=function() end,
   [0x67]=function() end,
   [0x68]=function() end,
   [0x69]=function() end,
}

function talk_to_actor(actor)
   local actor_num = actor.actor_num

   if actor_num < 2 then
      if g_in_dream_mode then
         printl("YOU_TRY_TO_WAKE_YOURSELF_UP")
         local player_loc = player_get_location()
         if player_loc.z ~= 3 then
            wake_from_dream()
         end
      elseif player_is_in_solo_mode() then
         printl("NOT_WHILE_IN_SOLO_MODE")
      else
         printl("YOU_ARENT_YET_THAT_INSANE")
      end
      return true
   end

   if actor.obj_n == 391 then --your mother
      if player_get_gender() == 0 then
         printl("NO_BACKTALK_FROM_YOU_YOUNG_MAN")
      else
         printl("NO_BACKTALK_FROM_YOU_YOUNG_WOMAN")
      end
      return true
   end

   print(actor.name.."\n")
   Actor.talk(actor_num)
   print("\n")

   if talk_script_post_action_tbl[talk_script_status] ~= nil then
      talk_script_post_action_tbl[talk_script_status]()
   end
   talk_script_status = -1

   return true
end

function talk_conveyor()
   talk_to_actor(Actor.get(0x72))
end

function talk_tower()
   talk_to_actor(Actor.get(0x73))
end

function talk_dream_machine()
   talk_to_actor(Actor.get(0x74))
end

local talk_obj_tbl = {
   [0xC] = function() printl("YOU_RECEIVE_A_MOMENTARY_IMPRESSION") end,
   [0x5C] = function() printl("THIS_WAS_WORN_LAST_BY_A_DYING_MAN") end,
   [0x64] = talk_dream_machine,
   [0xBC] = talk_conveyor,
   [0xBF] = talk_conveyor,
   [0xC0] = talk_conveyor,
   [0xC8] = talk_tower,
   [0xC9] = talk_tower,
   [0xD6] = talk_tower,
   [0xD7] = talk_tower,
   [0xE7] = function() printl("THIS_WAS_USED_BY_A_MARTIAN_MEASURING_TIME") end,
   [0xEA] = function() printl("THIS_JEWELRY_WAS_WORN_BY") end,
   [0xF6] = function() printl("THESE_FOOTBAGS_WERE_WORN_BY") end,
   [0xF7] = function() printl("THIS_SAW_WAS_USED_BY") end,
   [0xF9] = function() printl("THIS_DEVICE_WAS_USED_BY") end,
   [0x113] = function() printl("THIS_SCULPTURE_HAD_GREAT_RITUAL_OR_RELIGIOUS_SIGNIFICANCE") end,
   [0x120] = talk_dream_machine,
   [0x121] = talk_dream_machine,
   [0x122] = talk_dream_machine,

}

function talk_to_obj(obj)

   local player = Actor.get_player_actor()
   if actor_is_affected_by_green_berries(player.actor_num) then
      if bit32.band(obj.status, 1) == 1 then
         local talk_function = talk_obj_tbl[obj.obj_n]
         if talk_function ~= nil then
            talk_function()
            return true
         end
      else
         printl("YOU_RECIEVE_NO_PSYCHIC_IMPRESSIONS")
      end
   else
      printl("NOTHING")
   end

   return false
end