Portail MVCSE

Ecape Game Manufacture

Escape Game Manufacture est une animation dirigée par Zoomacom, créée à des fins de médiation numérique en reprenant le site de la manufacture pour créer une forme d'escape game alliant réalité et virtuelle pour résoudre des défis et s'échapper de chaque salle associé à un thème référencée de film, série, etc...

Concept et reproductions

Comme dit précédemment, le concept est de reprendre le site de la manufacture ayant servi à l'animation "À l'assaut de la cité interdite" pour y ajouter des lieux, pièces et se servir du concept du zonage pour les défis. Les défis de la Manufacture ont été partiellement repris d'un jeu vidéo de désamorçage de bombe nommé "Keep Talking and Nobody Explodes". L'objectif, étant donc, d'exploiter toutes les capacités du code LUA pour reproduire d'autres défis du jeu.

Introduction au LUA


Le code LUA est un langage de programmation libre, réflexif (ayant une capacité d'examination et de modification des structure interne du programme) et impératif (caractéristique commune à beaucoup d'autres langages de programmation faisant référence à la capacité de modifier l'état d'un programme directement lors des exécutions d'instructions et d'opérations). D'après beaucoup de développeurs et informaticiens, par rapport à d'autres, le LUA est l'un des langages de programmation les plus simples et les plus efficaces. Il est même recommandé, lorsqu'on débute, de commencer par l'apprentissage du code LUA en raison de sa simplicité algorithmique et sa facilité dans le codage. LUA, étant écrit en C ANSI, est compatible, supporté par un bon nombre de systèmes notamment les systèmes d'exploitation UNIX. Il a été utilisé pour le développement de différents jeux célèbres comme Minetest (alternative libre de Minecraft), World Of Warcraft, Roblox ou encore certains mod de GTA.

Dans notre cas, Minetest fonctionne majoritairement en LUA, c'est pourquoi les mods, visant à modifier le jeu Minetest, doit être aussi codé en LUA.

Un dossier de mod contient deux fichiers essentiels : le "init.lua" qui renferme l'ensemble du code participant au bon déroulement du processus et le "mod.conf" qui permet de lier d'autres mods entre eux pour créer des dépendances, c'est-à-dire des mods qui ont besoin de d'autres mods pour fonctionner, sinon, Minetest constatera des manques (blocs, effets...) et ne sera pas en mesure d'exécuter le mod. En tant que créateur de mod, il doit spécifier dans le mod.conf, les mods nécessaire à associer pour le bon fonctionnement du sien. SI nécessaire, le dossier de mod doit contenir les éléments associés nécessaire comme les sons, les textures, les effets...

La Grande Porte (Module 1)


local lamp_state = {0, 0, 0, 0}

local lamp_pos_red = {x=-57, y=10, z=6}
local lamp_pos_green = {x=-57, y=10, z=5}
local lamp_pos_yellow = {x=-57, y=10, z=4}
local lamp_pos_blue = {x=-57, y=10, z=3}
local mese_pos = {x=-58, y=10, z=2}
local switch_pos = {x=-58, y=10, z=1}
	
function main()
	minetest.after(0.1, function()
		if minetest.get_node(mese_pos).name=="mesecons_extrawires:mese_powered" then
			local lamp_activation = math.random(1,4) 
			lamp_state[lamp_activation]=1
			if lamp_activation == 1 then
			minetest.set_node(lamp_pos_red, {name="mesecons_lightstone:lightstone_red_on"})
				minetest.after(3, function()
					minetest.set_node(lamp_pos_red, {name="mesecons_lightstone:lightstone_red_off"})
				end)
			elseif lamp_activation == 2 then
				minetest.set_node(lamp_pos_green, {name="mesecons_lightstone:lightstone_green_on"})
				minetest.after(3, function()
					minetest.set_node(lamp_pos_green, {name="mesecons_lightstone:lightstone_green_off"})
				end)
			elseif lamp_activation == 3 then
				minetest.set_node(lamp_pos_yellow, {name="mesecons_lightstone:lightstone_yellow_on"})
				minetest.after(3, function()
					minetest.set_node(lamp_pos_yellow, {name="mesecons_lightstone:lightstone_yellow_off"})
				end)
			elseif lamp_activation == 4 then
				minetest.set_node(lamp_pos_blue, {name="mesecons_lightstone:lightstone_blue_on"})
				minetest.after(3, function()
					minetest.set_node(lamp_pos_blue, {name="mesecons_lightstone:lightstone_blue_off"})
				end)
			minetest.after(3, function()
			end)
			else
			minetest.set_node(lamp_pos_red, {name="mesecons_lightstone:lightstone_red_off"})
			minetest.set_node(lamp_pos_yellow, {name="mesecons_lightstone:lightstone_yellow_off"})
			minetest.set_node(lamp_pos_green, {name="mesecons_lightstone:lightstone_green_off"})
			minetest.set_node(lamp_pos_blue, {name="mesecons_lightstone:lightstone_blue_off"})
			end
			minetest.set_node(mese_pos, {name="default:mese"})
			minetest.set_node(switch_pos, {name="mesecons_walllever:wall_lever_off"})
		end
	end)
	minetest.after(0.1, main)
end
main()


Au sein du init.lua du mod "four colors", le programme a été particulièrement inspiré du premier module (dit "didactique") de la manufacture, avec les quatre cubes de couleur. Pour rappel du principe, à l'activation du levier, l'une des quatre lampes de couleur différente va s'allumer et le joueur va devoir appuyer sur le bouton correspondant de la boîte à boutons parmi les quatre pour ouvrir la Grande Porte de la Manufacture.

Le programme va s'organiser avec la définition des variables et la fonction "main()" qui est chargé de former la boucle.
  • local lamp_state = {0, 0, 0, 0}
    
Le programme étant très classique va débuter par l'adaptation virtuelle des quatres cubes de couleur dans un tableau écrit entre accolades qui va accueillir pour chacune des cellule, des valeurs binaires (car nous sommes dans un cas où il ne s'agit que de lampe qui exerce deux états : celle de s'éteindre et s'allumer).

  • local lamp_pos_red = {x=-57, y=10, z=6}
    local lamp_pos_green = {x=-57, y=10, z=5}
    local lamp_pos_yellow = {x=-57, y=10, z=4}
    local lamp_pos_blue = {x=-57, y=10, z=3}
    
On définit la position des quatres lampes de couleurs (rouge, vert, jaune, bleu).

  • local mese_pos = {x=-58, y=10, z=2}
    local switch_pos = {x=-58, y=10, z=1}
    
On définit la position des éléments activateurs (mesecons powered et le levier).

La fonction main() (
function main()
) sera alors créée pour former une boucle infinie.

Dans cette fonction, on temporisera les effets de la fonction avec une fonction de temporisation spécifique à Minetest appelé "minetest.after" (
minetest.after(0.1, function()
) avec comme argument un temps donné en secondes et la fonction concerné, pour que la fonction ne puisse pas s'activer lors de la phase d'initialisation du monde.

Au sein de la structure de condition, des éléments vont s'éxecuter progressivement :
  • minetest.get_node(mese_pos).name=="mesecons_extrawires:mese_powered"
    
La fonction
minetest.get_node
est une fonction LUA spécifique de Minetest, accueillant en argument une position et, après le signe d'égalité, un nom de bloc, qui permet de demander au moteur Minetest si le bloc désigné est bel et bien celui posé aux coordonnées saisis.
  • local lamp_activation = math.random(1,4)
    
La variable
lamp_activation
contiendra le tirage de la fonction
math.random
qui permet de tirer un nombre au hasard (dans notre cas, c'est un chiffre entre 1 et 4), pour ensuite utiliser la variable lamp_state (
lamp_state[lamp_activation]=1
) pour désigner la cellule correspondante pour la mettre à 1.
  • Une fois qu'il a été mis à 1, on coordonne la valeur avec les lampes.