MultiWorld Explorer

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

MultiWorld Explorer

Сообщение FaKk2 » 13.03.2006 (Пн) 3:07

Идея этого проекта состоит в создании общей среды для различных игровых миров, как то Территория, Бойцовский Клуб, тот же ОГейм.

Эта среда должна поддерживать различные виды игр, автоматизацию действий и отличаться расширяемостью.

Для описания каждого мира используется отдельный XML файл. Этот файл содержит нужную для функционирования информацию.

В качестве интерпретатора используется JScript движок. Код запускается под контролом WebBrowser, таким образом в распоряжении разработчика находится все обьекты и свойства текущего окна игры.

Каждая функция вызывается соответствующим пунктом меню, и это единственный на данный момент способ.

Программа написана в VS2005 на C#, требует framework 2.0.

Ах да, комменты на бочку!

На данный момент реализована загрузка и исполнение JScript кода. Меню Base-Manage Worlds-Apply Current

В проект включены два тестовых файла для Бойцовского Клуба и Территории с минимальной функциональностью.
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось FaKk2 13.03.2006 (Пн) 5:44, всего редактировалось 1 раз.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Структура XML файла

Сообщение FaKk2 » 13.03.2006 (Пн) 5:39

Структура XML файла или как самому расширить функциональность

Профили миров хранятся в папке worlds, которая должна лежать вместе с исполняемым файлом.

Файл формата XML должен иметь окончание xml. Рассмотрим пример профиля Территории:

Код: Выделить всё
<?xml version="1.0" encoding="utf-8" ?>
<world>
   <description>
      <name>Территория</name>
      <version>1.0</version>
      <author>FaKk2</author>
      <contact>ICQ#: 82656023</contact>
      <requires>1.0</requires>
   </description>
   <menus caption="Features">
      <menu>
         <name>Log In</name>
         <run>login_page</run>
      </menu>
      <menu>
         <name>Toggle Private Messages</name>
         <run>set_private_only</run>
      </menu>
      <menu>
         <name>-</name>
         <run></run>
      </menu>
      <menu>
         <name>About</name>
         <run>show_about</run>
      </menu>
   </menus>
   <code>
      <function name="login_page">
         window.location.href="http://www.territory.ru/";
      </function>
      <function name="show_about">
         alert("This world file is made by FaKk2");
      </function>
      <function name="set_private_only">
         if (this.location.href.indexOf('/main.php') > 0)
            this.frames["bottom"].document.links[2].fireEvent("onclick");
      </function>
   </code>
</world>


Тег description
В этом теге расположена информация о файле. Содержание показывается в окне "Manage Worlds".

Тег menus
В этом теге описаны элементы меню, которое будет показано при выборе этого профиля. Меню будет показано в том порядке что и здесь.
Тег name определяет надпись пункта меню.
Тег run определяет название функции которая будет исполнена при нажатии на этот пункт.

Тег code
Тег code содержит те функции, что указаны в пунктах меню. Название должно быть уникальным, порядок не важен.

В коде функции можно использовать любой JScript (JavaScript) код. Код будет выполнятся относительно окна браузера, таким образом у вас есть доступ ко всему.

Пример
На примере Территории создадим пункт меню которое будет устанавливать тип принимаемых сообщений - все/приват.
Подобная кнопка есть внизу экрана, слева от поля ввода сообщения. Открываем исходник страницы (right click->View Source), ищем "Приватные сообщения" (подпись картинки).
Видим код:
Код: Выделить всё
<td height=24 valign=center>
<a href="#" onclick="setFilter();">
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
if (top.privateOnly) {
  document.write('<img src=images/design/b_chat_2_on.gif alt="Приватные сообщения" name="private" id="private" width=19 height=19 vspace=0 border=0 align=absbottom>');
} else {
  document.write('<img src=images/design/b_chat_2.gif alt="Приватные сообщения" name="private" id="private" width=19 height=19 vspace=0 border=0 align=absbottom>');
}
</SCRIPT>
</a>
</td>

Вот и наша ссылка:
Код: Выделить всё
<a href="#" onclick="setFilter();">

Из этой строки видно, что тип сообщений регулирует ф-ция setFilter(). Значит мы либо вызываем ее либо эмулируем нажатие на картинку. Из-за того что я хочу показать как работать с обьектами, мы будет эмулировать нажатие.

Воспользуемся услугами DOM, для ознакомления с которой сходите по ссылке
Итак мы находимся на уровне главного окна и нам нужно спуститься "вниз" к нужной ссылке и вызвать ее нажатие. Также нужно знать что окно игры разбито на фреймы (из ИЕ меню View->Source). Из вышеприведенной ссылки и метода тыка доходим до
Код: Выделить всё
this.frames["bottom"].document.links[2].fireEvent("onclick")

Исследование удобно производить с помощью JScript Command Line (в меню Base) обрамляя в alert(); для отображения информации.
Правильное программирование предполагает обработку ошибок. Ведь в процессе исследования вы наверняка заметили, что неверный путь к элементу вызывает исключение. Данный код должен работать только когда пользователь залогинился в игру. Для этого добавим проверку текущего пути:
Код: Выделить всё
if (this.location.href.indexOf('/main.php') > 0)
            this.frames["bottom"].document.links[2].fireEvent("onclick");


Как только код написан, его можно внедрить в среду (т.е. сам проект). Для этого по примеру создаем меню и функцию. Все, вы только что создали свое собственное расширение игры. :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Денис Победря
Мегобойанист
Мегобойанист
 
Сообщения: 1037
Зарегистрирован: 03.01.2005 (Пн) 21:29
Откуда: Из Москвы

Сообщение Денис Победря » 13.03.2006 (Пн) 13:48

Только ты поспешил это на дотнете делать...
[Место cдаётся]

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 13.03.2006 (Пн) 14:56

Денис Победря
да шо вы все так против дотнета????? :roll: чем он вас обидел то?

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 15.03.2006 (Ср) 15:15

фреймворком :lol: И большой рекламной кампанией, за которой по сути ничего нового и интересного. Ну да бог с ним - мелкомягким деньги нужно зарабатывать.
По поводу проекта - интересно, интересно. Очень скоро может понадобиться :)
То, что для одних константа, для других только переменная...

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 15.03.2006 (Ср) 19:00

Ставлю движок сайта на http://mwexplorer.sourceforge.net, форум уже готов, можете заходить :)

По поводу проекта:
1. Добавил возможность вызова по событиям: ProfileLoaded и DocumentCompleted.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 15.03.2006 (Ср) 19:20

Так... Скачал-посмотрел. Ну что сказать. Задумка интересна, но:

1. Интерфейс срочно менять - лазить по менюшкам не удобно. Лучше сделать custom-набор кнопок, например. А также и других элементов управления, из которых можно собирать панельки управления.
2. В JS, которые прописываются в xml-инах добавить возможность макроподстановок, в которые можно включать: значения текстовых полей на панелях управления и константы.
3. Создать инструмент, с помощью которого можно добавлять-редактировать из интерфейса константы, привязанные к определенным features. Например - есть у нас функция логина. Она предопределена разработчиком xml-ки. Пользователю совершенно не нужно и неинтересно копаться в коде xml-ки. Достаточно отредактировать константы функции Lon In, указав свои данные.
4. Сохранять последний загруженный мир.

Вопрос: к какму document имеет доступ JS? К основному окну? Я это к вопросу об управлении фреймами. Ну пока все :)
То, что для одних константа, для других только переменная...

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 15.03.2006 (Ср) 19:25

Код запускается под основным окном. Это видно в коде, там где инициализируется обьект win. Кроме того у каждого обьекта в DOM есть parentElement.

1. Менюшки меня тоже не привлекают, согласен :)
2. А где хранить подстановки?
3, 4. Тот же вопрос.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 15.03.2006 (Ср) 19:54

Под основным окном - этого достаточно. Дальше дело техники. По поводу сохранения:

подстановки: прямо в коде. Например:

document.all['login_name'].value = '%const1%'

%const1% - это и будет макроподстановка. Перед выполнением JS кода парсиш его и меняеш макросы на нужные значения.

константы, привязанные к функциям предлагаю хранить в самой xml-ине. Например, внутри секции function создаем секцию Constants и тулим туда значения. Например:

<function name="login_page">
<constants>
<const1 customval="MyName" />
<const2 customval="MyPass" />
</constants>
window.location.href="http://www.combats.ru/";
document.all['name'].value = '%const1%';
document.all['pass'].value = '%const2%';
</function>

глобальные настройки: например сделать настроечную xml-ну и хранить в ней.
То, что для одних константа, для других только переменная...

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 15.03.2006 (Ср) 21:24

Нда, это идея.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48

    TopList