Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.11.2018, 14:51
Аватар для Alikberov
Кандидат Javascript-наук
Отправить личное сообщение для Alikberov Посмотреть профиль Найти все сообщения от Alikberov
 
Регистрация: 16.08.2018
Сообщений: 109

Игровой скрипт на базе движка форума
Здравствуйте!

Кратко: Тестирую скрипт на несколько участников, используя форум как интерактивную Базу Данных…

Важно: Понимая, что подобный скрипт может нарушать политику правил безопасности, заранее извиняюсь перед Администрацией Форума!

Текущая Игровая Ситуация
<style>body { background-image:url('https://www.dropbox.com/s/i9o3l8ao0r1tzvt/nullpost-javascript.jpeg?raw=1'); } </style>

(Используется глобальное DropBox-облако и локальный NodeJS-скрипт с периодическим обновлением изображения по мере изменения постов данной темы…)

Суть движка
Используя ресурсы форума как свободное открытое хранилище различных данных, решил попробовать написать скрипт, отображающий некое игровое поле в рамках данной темы.
Скрипт просто загружает данную страничку и сканирует все посты (будущих) пользователей на наличие псевдо-тега [map], в котором описывает некая карта-шаблон.
При этом, любые изображения в рамках поста пользователя используются как "кирпичики" для её отображения…

План
Несколько игроков на одной странице темы форума через многократное редактирование своих сообщений прорабатывают некий план местности.
Нуль-пост содержит скрипт, который сканирует основную страницу темы форума и собирает сведения об участвующих игроках.
Каждый игрок включает в своё сообщение несколько алфавитно-цифровых представлений своих планов местности с экранированием в псевдо-тег [map…]. При этом любые изображения в самом сообщении игрока используются как объекты для графического отображения самого плана.
Скрипт нуль-поста всё это переваривает и заполняет выпадающий список участниками с их вариантами карт.
По мере развития ситуации один из игроков начинает одерживать победу над некоторыми из остальных…
Тем самым, другие участники должны корректировать собственные планы, чтобы подавить противника…

Проблема: Хотя скрипт располагается в рамках домена форума, к сожалению, работает только с ключом «--disable-web-security» браузера. Хотя, предполагалось мною, что подобной неприятности не возникнет. Может кто-нибудь посоветует, как можно обойти эту проблемы хотя бы частично?
Скрипт прост и открыт, можно убедиться, что мною им не выполняется никаких противоправных действий.

Здесь под спойлером размещены две карты разметки местности:
(Можно обойтись и без спойлера)
[map:"Номер №1"]
0123456789
0246897531
1357986420
[/map]
[map:"Номер №2"]
1470369258
0369258147
2581470369
[/map]
[map:"Номер №3 - Беседка"]
8555555558  A
5444444445
5444444445     C
5443333445
5443223446  B
5443223446
5443333445     H
5444444445
5444444445  G
8855885588
[/map]

Изображения для карты:
  • - набор 8x8: код 0…9
  • - коллекция 24x24: код A…Z

А здесь - собственно и сам скрипт:
(Его не нужно здесь больше дублировать: Работает на всех участников темы ниже)
<html>
<head>
<script>
var	szPage	= "https://javascript.ru/forum/showthread.php?p=498767";//"https://javascript.ru/forum/project/74942-befunge-byl%E2%80%A6-poprobuem-ehto-v-canvas.html";
var	hXML	= new XMLHttpRequest();
var	hSelect	= null;
var	hSecret	= null;
var	hCanvas	= null;
var	hCtx	= null;
var	aMaps	= {};

function GetUp() {
	var	html;
	var	res	= [];
	{
		hSecret.innerHTML = hXML.responseText;
		//document.body.appendChild(hSecret);
		hPosts = hSecret.querySelector("#posts").querySelectorAll("table[id^=post]");
		hPosts.forEach
		(function(hPost) {
			hRows = hPost.rows;
			hThread = hPost.querySelector(".thread-row");
			hUserLink = hRows[1].querySelector(".bigusername");
			hUserPost = hRows[2].querySelector("div[id^=post_message_]");
			nick = hUserLink.textContent;
			post = hUserPost.textContent;
			pics = hUserPost.querySelectorAll("img");
			//rank = hUserLink
			maps = post.match(/(\[map:"(.+)"]([^\0]+?)\[\/map])+/gm);
			if(maps)
				maps
				.forEach
				(function(map) {
					console.log(map);
					mp = map.match(/(\[map:"(.+)"]([^\0]+)\[\/map])+/m);
					console.log(mp);
					if(mp) {
						place = mp[2];
						design = mp[3];
						if(!(nick in aMaps))
							aMaps[nick] = [];
						aMaps[nick][place] = {
							design	:design,
							images	:pics
						};
						hSelect.add(new Option(nick + ":" + place, place), null);
						res.push("«" + nick + "»:" + place + "\r\n" + design);
					}
				});
//			res.push("«" + nick + "»\r\n" + hUserPost.post);
		});
//		hField.textContent = res.join("\r\n--------------\r\n");
	}
}

function showMap(el) {
	var	info = el.selectedOptions[0].textContent.split(/:/);
	var	nick = info[0];
	var	place = info[1];
	var	map = aMaps[nick][place];
	var	y = 0;
	//
	hCtx.clearRect(0, 0, hCanvas.width, hCanvas.height);
	//
	map
	.design.split(/\r?\n/)
	.forEach
	(function(plot) {
		var	x = 0;
		while(plot.length) {
			var	c = plot.charAt(0);
			var	d = plot.charCodeAt(0) - 64;
			if(isFinite(c))
				hCtx.drawImage(map.images[0], 24 * +c, 0, 24, 24, x * 8, y * 8, 24, 24);
			else
			if(d > 0 && map.images.length > d)
				hCtx.drawImage(map.images[d], x * 8, y * 8);
			plot = plot.substr(1);
			++ x;
		}
		++ y;
	});
}

function main() {
	hSecret = document.createElement("html");
	hSelect = document.querySelector("select");
	hCanvas = document.querySelector("canvas");
	hCtx = hCanvas.getContext("2d");
	hXML.open("GET", szPage, false);
	hXML.send();
	if(200 != hXML.status) {
		alert(hXML.status + ": " + hXML.statusText);
	} else {
		setTimeout("GetUp(); showMap(hSelect)", 5000); // Ждём загрузки всех изображений
	}
}
</script>
</head>
<body onload='main()'>
<select onchange='showMap(this)'></select><br/>
<canvas width=640px height=480px></canvas>
</body>
</html>

(Подождите секунд 5 для нормальной работы)

Любой пользователь в этой теме сможет добавить собственную карту тегами [map…] как у меня…
При этом, копировать сам мой скрипт не нужно: Прямо здесь он и будет сканировать сообщения пользователей далее ниже по странице…

Так как движок форума позволяет многократно редактировать собственные сообщения, пользователям не нужно создавать более одного поста от своего имени здесь, чтобы как можно больше остальных пользователей смогли разместиться на данной странице и иметь возможность вносить собственные карты…

P.S.: Возможно скрипт будет мною дорабатываться и усложняться. Например, чтобы добавить движения объектов на карте.
Напоминаю, что работает (пока) он лишь с ключём отключения безопасности…
Типа
chrome.exe --user-data-dir="%tmp%\ChromeGaming" --disable-web-security https://javascript.ru/forum/showthread.php?p=498767

Пример (как выглядит):

Спасибо!
Изображения:
Тип файла: gif jsgame.gif (1.1 Кб, 3 просмотров)
Тип файла: jpeg nullpost.jpeg (27.5 Кб, 11 просмотров)

Последний раз редактировалось Alikberov, 22.11.2018 в 05:22. Причина: Оперативная коррекция скрипта…
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2 компьютера 1 хром и 1 скрипт Megatron13 Opera, Safari и др. 1 21.07.2013 19:12
Почему скрипт не работает с данными, которые вернул другой скрипт? Rooner jQuery 3 20.09.2012 14:56
Всем привет. Скрипт который сравнивает данные сайта с данными в базе.. strengerst Opera, Safari и др. 6 24.06.2012 22:17
Изменить скрипт Изучаю_JS Общие вопросы Javascript 0 12.02.2012 22:05
Помогите исправить скрипт по поиску в базе данных dok_sj2 Internet Explorer 2 29.06.2009 20:04