Accueil Portfolio Contact
Emplois Compétences Portfolio Contact

David BOUET

Master Chimie Théorique et Modélisation

Photo David BOUET

Master Chimie Théorique et Modélisation

Le domaine des sciences m'intéresse depuis toujours, plus particulièrement les sciences de l'information. Le choix de la spécialisation chimie théorique m'a permis de concilier la chimie que j'affectionnais, avec l'outil informatique, me permettant ainsi d'apprecier mon travail.

Emplois et Stages

Panorama de Perugia
Pérouse, Italie

2017
(6 mois)

Stage Erasmus en Italie : « Distributed Gaussian Orbitals for Molecular Calculations » (résolution de l’équation de Schrödinger poly-électronique, suite du stage effectué en fin de Master 1).

Università degli studi di Perugia
Dipartimento di chimica biologia e biotecnologie

Vue de Toulouse
Toulouse, France

2016
(3 mois)

Stage portant sur le développement d’un programme (C++) de calculs d'énergie ab-initio en utilisant des bases d'orbitales gaussiennes distribuées dans l'espace pour les système mono-électronique.

Université Toulouse 3
Laboratoire de Chimie et Physique Quantiques


2011
(3 semaines)

Stage portant sur l’amélioration d’un catalyseur via différentes méthodes de dopage dans le cadre d’un Travail d’initiative personnel encadré (TIPE).

Université Toulouse 3
Laboratoire des IMRCP

2008-2011
(3 ans)

Employé polyvalent à temps partiel dans un tabac/presse.

31400 Toulouse
La Tabatière

miniatiure du Panorama de Perugia
Miniature de Toulouse

Compétences

Portfolio

SARPIC1 SARPIC2
SARPIC
Cette macro VBA permet de calculer l'ensemble des quantités de produits à commander pour l'ensemble des TP, de générer les liens vers la page du distributeur, et bien plus.
blob1 blob2 blob3 blob4
Portal 2: Flying blob gel
Ce script permet l'utilisation d'un nouvel élement de gameplay. Les blobs de peintures permettant de rendre solide une plateforme par exemple.
DisSedere1 DisSedere2 DisSedere3
Site de la guilde Dis Sedere
Ce site écrit en php récupère les informations de l'API Blizzard afin de générer la partie progression et roster de la page.
miniSarpic
miniBlob
miniBlob
×

Code SARPIC [VBA]

											
'Requiert d'inclure Microsoft Scripting Runtime  (Tools-> Reference) 
'Requiert d'inclure Microsoft VB Regular Expression 5.5  (Tools-> Reference) 

Public Sub Update()
  
    Dim pattern As String: pattern = "^([ 0123456789-])+$"
    
    Dim Regex As New RegExp                         'declare un objet expression reguliere
    Dim strInput As String
    
    Dim cellule As Range                            'une cellule
    Dim numeroCellule As Double
    
    Dim map As Scripting.Dictionary                 'une map de C++ 
    Set map = New Scripting.Dictionary
    Dim masseTemp As Range
    
    Dim couleur As Scripting.Dictionary                 'une map de C++  mais pour les couleurs
                                                        '(pour differencier liquides et solides)
    Set couleur = New Scripting.Dictionary
    
    Dim nom As Scripting.Dictionary                 'une map de C++  mais pour le nom
    Set nom = New Scripting.Dictionary
    

    Dim nombreFeuilles As Integer
    Dim i As Integer

       
    nombreFeuilles = ActiveWorkbook.Worksheets.Count
   
    For i = 1 To nombreFeuilles - 1  'on itere sur toutes les feuilles sauf celle du menu
        nombreLigne = (ActiveWorkbook.Worksheets(i).Range("A" & Rows.Count).End(xlUp).Row) + 1
            
        'MsgBox ("La derniere ligne est: " + CStr(nombreLigne))
            
        numeroCellule = 1                                                           
        Set cellule = ActiveWorkbook.Worksheets(i).Range("A" + CStr(numeroCellule))
        strInput = cellule.Value          
            Do
                'si le pattern est pas nul (doh)
                If (pattern <> "" And strInput <> vbNullString) Then                           
        
                    With Regex
                        .Global = True
                        .MultiLine = True
                        .IgnoreCase = True
                        .pattern = pattern
                    End With
                    
                    If Regex.test(strInput) Then     'si l'expression reguliere marche: on a bien iteré sur un numéro CAS
                        Set masseTemp = ActiveWorkbook.Worksheets(i).Range("D" + CStr(numeroCellule)) 'on se place sur la case contenant le
                                                                                                      'volume/la masse
                        If (map(CStr(strInput)) = "") Then 'si la clef n'existe pas on la crée, sinon on modifie la valeur
                            'ah oui, quand on teste la clef, ça la genere. donc on est obligé de verifier si la valeur associée est vide.
                            'Et ce n'est pas un soucis de = au lieu == dans le if. Le VBA c'est un seul = dans les if...
                            map(CStr(strInput)) = masseTemp.Value 'La clef c'est le numero CAS, la valeur c'est la masse ou le volume
                                If (couleur(CStr(strInput)) = "") Then
                                    couleur(strInput) = masseTemp.Font.ColorIndex ' on recupere la couleur pour voir si c'est un liquide ou pas :D
                                End If
                                      
                                If (nom(CStr(strInput)) = "") Then                'on reutilise la variable masse temp pour chopper le nom
                                    Set masseTemp = ActiveWorkbook.Worksheets(i).Range("B" + CStr(numeroCellule))
                                    nom(strInput) = masseTemp.Value '
                                End If
                                'MsgBox CStr(masseTemp.Font.ColorIndex)             
         
                        Else
                            map(CStr(strInput)) = map(CStr(strInput)) + masseTemp.Value
                        End If
                                
                    'Else
                        'MsgBox ("FeelsBadMan :gun:")
                    End If
                            
                End If

                numeroCellule = numeroCellule + 1                                ' ++numeroCellule BibleThump
                Set cellule = ActiveWorkbook.Worksheets(i).Range("A" + CStr(numeroCellule))
                strInput = cellule.Value          'on met la valeur suivante dans la variable 
                                                   'comme ça ça evite de faire un tour de plus si on tombe sur une case vide #YOLO
            Loop While (numeroCellule <> nombreLigne)
    Next i
    
    Call ecrireValeurs(map, couleur, nom)
    'Call LoopKeys(map) 'pour tester si les valeurs sont ajoutées correctement
    'Call LoopKeys(couleur)
End Sub


Sub LoopKeys(ByRef dic As Scripting.Dictionary)
    Dim key As Variant

    'ajouter reference à MS Scripting Runtime


    For Each key In dic.Keys
        MsgBox ("Key: " & key & " Value: " & dic(key))
    Next
    
End Sub

Sub ecrireValeurs(ByRef dic As Scripting.Dictionary, ByRef color As Scripting.Dictionary, ByRef name As Scripting.Dictionary)

    Dim cellule As Range
    Dim hyperlien As String
    Dim temp As String
 
    
    Dim i As Integer
    i = 4                                     ' a modifier ici si tu changes la façon dont le tableau est affiché
    
   
    
    For Each key In dic.Keys
        Set cellule = ActiveWorkbook.ActiveSheet.Range("A" + CStr(i))
        'MsgBox ("Key: " & key& " Value: " & dic(key))
        cellule.Value = "'" + CStr(key)
     
        If cellule.Value = 60778 Then
          hyperlien = "http://www.sigmaaldrich.com/catalog/product/fluka/60778?lang=fr&region=FR"
        
        Else
          hyperlien = "http://www.sigmaaldrich.com/catalog/search?term=" + CStr(key) + "&interface=CAS%20No.&lang=fr&region=FR&focus=product"
        End If
        
        cellule.Parent.Hyperlinks.Add Anchor:=cellule, Address:=hyperlien

        temp = CStr(cellule.Value)  'petite magouille pour pouvoir recuperer la clef en texte plein. 
                                    'Si on fait directement string a = clef ça ne marche pas, donc
                                    'on lit ce qu'on vient d'ecrire dans la cellule
                                   
                                   
        Set cellule = ActiveWorkbook.ActiveSheet.Range("B" + CStr(i))
        cellule.Value = CStr(name(key))
        
        
        Set cellule = ActiveWorkbook.ActiveSheet.Range("C" + CStr(i))
        
        
        cellule.Value = CDbl(dic(key))
        
        cellule.Font.ColorIndex = CInt(color(temp))
        i = i + 1
    Next
'http://www.sigmaaldrich.com/catalog/search?term=865-49-6&interface=CAS%20No.&N=0&mode=partialmax&lang=fr&region=FR&focus=product
End Sub										
											
Private Sub Worksheet_Change(ByVal Target As Range)
    
    'permet de sortir de la procédure si plus d'une cellule est sélectionnée
    '(sinon la suite de la macro renvoie un message d'erreur)
    If Target.Count > 1 Then Exit Sub
    
    Dim nombreLigne As Integer 'nombre de ligne sur la colonne E
    nombreLigne = (ActiveWorkbook.ActiveSheet.Range("E" & Rows.Count).End(xlUp).Row)
    
    
    
    If CStr(Target.Column) = 6 And CStr(Target.Row) > 2 And CStr(Target.Row) <= nombreLigne Then 
    'faut pas que ça tourne si on ecrit une cellule qui correspond à rien
       ' Dim nouveauNombre
        'nouveanNombre = Target.Value
        Dim cellule As Range
        Set cellule = ActiveWorkbook.ActiveSheet.Range("E" + CStr(Target.Row))
        
        'on itere pour chercher la bonne page
        Dim nombreFeuilles
        nombreFeuilles = ActiveWorkbook.Worksheets.Count
   
        For i = 1 To nombreFeuilles - 1  'on itere sur toutes les feuilles sauf celle du menu
            If ActiveWorkbook.Worksheets(i).Range("B1").Value = cellule.Value Then 'si le nom du TP est égal a celui qu'on vient de changer
                ActiveWorkbook.Worksheets(i).Range("D1").Value = Target.Value 'on change le nombre
            End If
            
            
      
        Next i
        
        Call Module1.Update
          
    End If
   
        

End Sub

Private Sub Worksheet_Activate()
    Call Module2.effacer
    Call Module3.getTP
    Call Module1.Update

End Sub

										
											
Public Sub getTP()
    Dim cellule As Range
     
    Dim nombreFeuilles As Integer
    Dim i As Integer
    Dim mapTP As Scripting.Dictionary
    Set mapTP = New Scripting.Dictionary
    Dim strInput As String
    
    Dim mapPage As Scripting.Dictionary
    Set mapPage = New Scripting.Dictionary
       
         nombreFeuilles = ActiveWorkbook.Worksheets.Count

     i = 2
      For i = 2 To nombreFeuilles - 1
      
        Set cellule = ActiveWorkbook.Worksheets(i).Range("B1") 'on recupere le nom du TP
        strInput = cellule.Value
        
        
        
        If (mapTP(CStr(strInput)) = "") Then
            mapTP(strInput) = ActiveWorkbook.Worksheets(i).Range("D1").Value 'on recupere le nombre de manip
        End If
        
        If (mapPage(CStr(strInput)) = "") Then
            mapPage(strInput) = ActiveWorkbook.Worksheets(i).name
        End If
     
      Next i
      
      Call EcrireTp(mapTP, mapPage)
      
End Sub


Sub EcrireTp(ByRef TP As Dictionary, ByRef Page As Dictionary)
    Application.EnableEvents = False 'on desactive ça sinon ça va actualiser les cases du TP alors que ça s'actualise sur la page du menu.
    
    Dim i As Integer
    Dim cellule As Range
    i = 3
    
    
    
    
     For Each key In TP.Keys
       Set cellule = ActiveWorkbook.ActiveSheet.Range("E" + CStr(i))
       'MsgBox CStr(key)
       'cellule.Value = CStr(key)
       'MsgBox CStr(Page(key))
       
        cellule.Parent.Hyperlinks.Add Anchor:=cellule, Address:="", _
                         SubAddress:="'" & CStr(Page(key)) & "'!A1", TextToDisplay:=CStr(key)
       
       Set cellule = ActiveWorkbook.ActiveSheet.Range("F" + CStr(i))
       cellule.Value = CStr(TP(key))
       i = i + 1
     Next
     Application.EnableEvents = True
     
End Sub


										
											
Private Sub Worksheet_Change(ByVal Target As Range)
    
    'permet de sortir de la procédure si plus d'une cellule est sélectionnée
    '(sinon la suite de la macro renvoie un message d'erreur)
    If Target.Count > 1 Then Exit Sub
    
    Dim nombreLigne As Integer 'nombre de ligne sur la colonne E
    nombreLigne = (ActiveWorkbook.ActiveSheet.Range("E" & Rows.Count).End(xlUp).Row)
    
    
    
    If CStr(Target.Column) = 6 And CStr(Target.Row) > 2 And CStr(Target.Row) <= nombreLigne Then 
    'faut pas que ça tourne si on ecrit une cellule qui ne correspond à rien
       ' Dim nouveauNombre
        'nouveanNombre = Target.Value
        Dim cellule As Range
        Set cellule = ActiveWorkbook.ActiveSheet.Range("E" + CStr(Target.Row))
        
        'on itere pour chercher la bonne page
        Dim nombreFeuilles
        nombreFeuilles = ActiveWorkbook.Worksheets.Count
   
        For i = 1 To nombreFeuilles - 1  'on itere sur toutes les feuilles sauf celle du menu
            If ActiveWorkbook.Worksheets(i).Range("B1").Value = cellule.Value Then 'si le nom du TP est égal a celui qu'on vient de changer
                ActiveWorkbook.Worksheets(i).Range("D1").Value = Target.Value 'on change le nombre
            End If
            
            
      
        Next i
        
        Call Module1.Update
          
    End If
   
        

End Sub

Private Sub Worksheet_Activate()
    Call Module2.effacer
    Call Module3.getTP
    Call Module1.Update

End Sub



										
×

Code Flying Blob [Squirrel]

										
/* Explication: 
	Le but est de faire croire au joueur qu'un blob de peinture vole. Pour ce faire, 
	il faut placer une prop_paint_bomb, accompagnée de son phys_ballsocket.
	point_template pas utilisable car si bombe detruite, cela casse le ballsocket. 

	DONC, il faut teleporter des systemes déjà existant, et les preserver si ils doivent etre détruit. 

	Pour cela, le code ci-dessous effectue ces etapes:

		-> Lors du spawn du logic_script, le code en dehors des fonctions est executé, il a pour but de:
			* declarer les variables: 		
				BOMB_ORIGINALE_NAME <- \"\"; 	// pas dans l'instance: nom de la bombe originale a filtrer
				COUNTER_NAME <- \"\";			// pas dans l'instance: nom du math counter a incrementer/decrementer
				INSTANCE_FIX_UP_NAME <- \"\"; // necessaire pour reparer le filter_activator_name
				FAKE_BOMB_MAKER_NAME <- \"\"; // necessaire pour faire spawn un faux blob à l'endroit du blob qui vole
			
			* remplir les tableaux contenant:  
				handler blobs[i]        	// un handler sur les blobs existant dans l'instance;
   				bool    blobsPlacable[i]	// un booléen pour savoir si le blob[i] est déjà placé ou non;
   				vector	blobsOrigine[i] 	// les coordonnées d'origine du blob[i] dans l'instance, cachée en dehors de la carte;
  				handler	blobsSocket[i] 		// un handler sur le socket lié au blob[i] en question;
			
			* Determiner le fixup name (INSTANCE_FIX_UP_NAME) de l'instance afin de pouvoir utiliser le filter_activator_name

		-> On envoie un RunScriptCode Blob() d'une bombe de peinture, dite bombe originale, celle qui sort du tuyau. (via FireUser)

		-> Blob() se charge de:
			* Teleporter le premier systeme blob + socket disponible
			* Ajouter la possibilité de se faire SilentDissolve à la bombe originale au cas où
			* Faire disparaitre la bombe de peinture originale (SilentDissolve)
			* Mettre à jour le math_counter via la fonction UpdateCounter(); 

	Lorsque la bombe de peinture originale touche une bombe qui vole, elle doit exploser. 
	Cela casse tout si c'est le cas car le ballsocket ne marchera plus. C'est pourquoi l'instance fonctionne comme ceci:
		->  Des trigger_multiple sont parentés à chaque blob[i]. Ils ont tous pour filtre la bombe originale (via le script)
			Chacun de ces triggers, lorsque touchés (OnStartTouch) envoie RunScriptCode FakeBoom(i) au logic_script

		-> FakeBoom(i) se charge de:
			* Calculer les coordonnées du milieu entre la bombe qui vole et la bombe_originale qui arrive
			* SilentDissolve la bombe_originale
			* Teleporter le systeme (Blob + Socket) à son emplacement d'origine, caché dans l'instance
			* Faire spawn une bombe, sans contraite, qui tombera dans le vide donc, a cet endroit via un env_entity_maker 
			* Mettre à jour le math_counter via la fonction UpdateCounter()
*/



/* VOIR LE RESTE DU CODE RELATIVEMENT COMMENTÉ */

/* A priori le code en dehors de fonction n'est lancé qu'une fois lorsque le fichier du script est lu? */
printl(\"flying_blob.nut loaded\");

printl(\"\\n\\n\");
printl(\"Startup() ---------------- Creation du tableau contenant les blobs disponibles\");

// Le but est de stocker les index ou les nomms de blob disponible
// un tableau pour les noms, un autre pour s'il est libre ou pas
// need taille-3 à cause des parametres dans le logic_script
// [w] DOIT etre la bombe originale, celle en dehors de l'instnace qui spawn les autres si besoin
// [x] doit etre un math_counter, on le passe via les func_instance_parms.
// [y] doit etre un env_entity_maker qui fait la fausse bombe, déjà dans l'instance.
// [z] doit etre un filter_activator_name qui pointe sur le nom de la bombe originale, déjà dans l'instance.
//  celui la est dans l'instance mais doit etre dans le EntityGroup car instance et fixup ça fout la merde */

local PARAMETRES_NON_BLOB_SCRIPT = 4;

// TODO: transformer tout ça avec des .append()
self.ValidateScriptScope();
blobs <- array((EntityGroup.len() - PARAMETRES_NON_BLOB_SCRIPT  )/2);
blobsPlacable <- array((EntityGroup.len() - PARAMETRES_NON_BLOB_SCRIPT  )/2);
blobsSocket <- array((EntityGroup.len() - PARAMETRES_NON_BLOB_SCRIPT  )/2);
blobsOrigine <- array((EntityGroup.len() - PARAMETRES_NON_BLOB_SCRIPT )/2);
/*lasers <- [];
lasersPlacable <- [];
lasersTarget <-[];*/

BOMB_ORIGINALE_NAME <- \"\"; // pas dans l'instance
COUNTER_NAME <- \"\";			// pas dans l'instance
INSTANCE_FIX_UP_NAME <- \"\"; // osef le script le trouve tout seul c'est beau la technologie
FAKE_BOMB_MAKER_NAME <- \"\"; // est dans l'instance, donc ça on a pas besoin de créer

counterTrack <- 0;


// en gros, le fixup name nous ennuie et rajoute dans le logic_script, @instance-nom
// MEME si on l'a ajouté en func_instance_parms donc il faut reussir à virer ces @instance devant le nom des deux parametres en trop, 
																	
/*	ent_dump @blob-bomb_script				

 	Group00: @blob-paint_originale 						Passé en parametre: on doit supprimer le @blob-
	Group01: @blob-bomb_counter							Passé en parametre: on doit supprimer le @blob-
	Group02: @blob-bomb1
 	Group03: @blob-bomb1_ballsocket
  	Group04: @blob-bomb2
  	Group05: @blob-bomb2_ballsocket
  	Group06: @blob-bomb3
  	Group07: @blob-bomb3_ballsocket
 	Group08: @blob-bomb4
 	Group09: @blob-bomb4_ballsocket
  	Group10: @blob-bomb5
  	Group11: @blob-bomb5_ballsocket
  	Group12: @blob-ball_maker
  	Group13: @blob-paint_originale_filter						
 */




/*  CHECK FOR FIXUPNAME: */
local name = self.GetName();
// Si y'a pas de fixupname il s'apelle juste bomb_script, sinon @instance-bomb_script c'est comme ça qu'on va recuperer le nom de l'instance
// si le nom est plus gros que bomb_script (qui fait 11  caracteres)
if (name.len() > 11)
{
	// on doit recuperer le nom de l'instance
	local zulul = \"bomb_script\"
	local char = name.find(zulul);
	// retourne le caractere ou commence bomb_script
	INSTANCE_FIX_UP_NAME = name.slice(0, char);
} 
// COOL: ça marche. 

	
// typeoff renvoie null sur les deux machins pas valide à cause du nom puisque ça pointe vers rien. ok
// solution: on ajoute deux info_target bidons qui auront le nom de la variable pour que
// @instance-counter et @instance-paint_originale existent, ensuite y'a juste a enlever le nom de l'instance devant leur nom et hop


/* On veut remplir tout les tableaux et les variables globales. Pour se faire, on iterer sur EntityGroup[] qui contient plein d'informations
 * PROBLEME: 	si l'entité dans le group est en dehors de l'instance (passé en parametre)
 *          	on obtient quelquechose comme @instancefixup-paint_originale
 *          	comme cet objet n'existe pas, il n'a pas de méthode, donc le code plante. Et on ne peux pas tester pour null car ça plante aussi
 *
 * SOLUTION: 	on ajoute deux info_target bidons qui auront le nom de l'objet en dehors de l'instance
 * 				comme ça, on peut utiliser GetClasseName() qui existera et donc gerer cet objet
 */

local j = 0;
for(local i=0; i< EntityGroup.len() ; i+=1)
{
/*	foreach (_, value in EntityGroup) {
	    printl(value + \"  \" +   typeof(value));
	}*/

	/* SI C'EST UN INFO_TARGET = machin passé en parametre, qui ne doit PAS avoir de fixup name puisque en dehors de l'instance, donc
	 *  soit  le nom de la bombe originale soit du counter) */

	/* nouveau probleme si on veut instancifier le dropper: le info_target ne possedera pas un nom valide si l'instance du dropper
	 * possede un nom qui commence par @ */

	if (EntityGroup[i].GetClassname() == \"info_target\")
	{	
		// on recupere le nom de l'info_target
		local tarname = EntityGroup[i].GetName() 
		// on lui retranche le fix-up name avec slice
		// slice(debut) coupe du char donné jusqu'à la fin
		// slice(debut,fin) ben voila
		local name = tarname.slice(INSTANCE_FIX_UP_NAME.len()); 
		// on trouve l'entité sans fix up-name qui correspond 
		local handler = Entities.FindByName(null,name);
		/* 	DEUX CAS: soit c'est la bombe, soit c'est le math_counter
		 *  PROBLEME: si on a travaille sur la bombe:
		 *					NAME = nom de la bombe, alors le handler retournera
		 *					null ssi la bombe originale est \"remove template entities\" dans son point_template 
		 *						(car la bombe n'existe pas lors du spawn du logic script)
		 * 					un handler sur la bombe si elle est \"dont remove template entities\" dans son point_template 
		 *						(car la bombe existe lors du spawn du logic script) 
		 */

		// si on est sur une bombe, qui n'a pas spawn OU qui a spawn, notez l'importance de l'ordre des tests dans le if
		// mais plus simplement, on la fait spawn (don't remove template entities) et on kill la premiere bombe un peu après commme
		// ça on est peinard
		if ((handler == null) || (handler.GetClassname() == \"prop_paint_bomb\")) 
		{
			BOMB_ORIGINALE_NAME = name;
		}
		// si on est sur le math_counter
		else if ( (handler != null) && (handler.GetClassname() == \"math_counter\"))
			COUNTER_NAME =  name;
	}
	/* SI C'EST LE PAINT_FILTER ALORS ON CHANGE L'ENTITÉ À FILTRER CAR 
	 * IL Y A LE FIXUP NAME DEVANT ET ON EN VEUT PAS */
	else if (EntityGroup[i].GetClassname()==\"filter_activator_name\") 
	{
		EntFireByHandle(EntityGroup[i], \"addoutput\", \"filtername \" + BOMB_ORIGINALE_NAME, 0.00, null, null);
	}
	/* SINON SI C'EST UN BLOB */
  	else if (EntityGroup[i].GetClassname() == \"prop_paint_bomb\")
  	{

   		// Si c'est bien une bomb, on assigne a la case le contenu de EntityGroup, c'est
   		// à dire un handler sur la bombe (j'espere). Et en fait non LUL, c'est juste directement le nom de l'entité suis-je bête.
   		// SAUF QUE en fait non: 
		// AN ERROR HAS OCCURED [parameter 2 has an invalid type 'instance' ; expected: 'string']
		// (Entities.FindByName(null,blobs[i]))
		// donc c'est bien un handler :thinking:
		// et en fait oui:
		//printl(\"blobs[i]:    \"  + blobs[i] +  \"\\ntypeof(blobs[i]):    \" + typeof(blobs[i])  + \"\\ntargetname:  \"   + blobs[i].GetName())
		//blobs[i]:            ([12] prop_paint_bomb: bomb1)
		//typeof(blobs[i]):    instance
		//targetname:          bomb1

		// On remplit les tableaux
   		blobs[j] = EntityGroup[i];
   		blobsPlacable[j] = 1;
   		blobsOrigine[j] = EntityGroup[i].GetOrigin();
  		blobsSocket[j] = EntityGroup[i+1];
 	

   		j++;
	}	
	/* SINON SI C'EST LE MAKER DE LA FAUSSE BOMBE */
	else if (EntityGroup[i].GetClassname() == \"env_entity_maker\")
	{
		FAKE_BOMB_MAKER_NAME = EntityGroup[i].GetName();
	}

	
}


function Blob()
{
	printl(\"Blob() ----------------------------------------------------------------------------\")
	// Si on en fait une instance: remplacer EntityGroup[0] par le paint_originale qui sera passé en parametre de l'instance
	// ça devrait marcher? non car en fait paint_originale pointe réellement sur UNE INSTANCE de paint_bomb
	// qui est donc null instance apres sa destruction. Donc, il faut stocker le NOM de la bombe originale/
	// effectué lors du spawn du logic_script (voir tout le bordel ci dessus)
	
	/*On recupere un handler sur la premiere bombe pour l'origine (là où elle vient de se faire detruire)*/
	printl(\"Blob() ---------------- Bombe originale nom: \" + BOMB_ORIGINALE_NAME);
	bombeOriginale <- Entities.FindByName(null,BOMB_ORIGINALE_NAME);
	printl(\"Blob() ---------------- Bombe originale: \" + bombeOriginale);

 	
 	printl(\"Blob() ---------------- INSTANCE:  \"   + INSTANCE_FIX_UP_NAME)
	printl(\"Blob() ---------------- Nombre total de blob:   \"  +  blobs.len());


	local blobsDisponibles = 0;
	// On se calcule le nombre de blob disponibles
	for(local i = 0; i < blobsPlacable.len(); i++)
  	 	blobsDisponibles += blobsPlacable[i];
  


	printl(\"Blob() ---------------- Nombre de blobs disponibles:   \"  +  blobsDisponibles);
	
	
	// SI on peut placer un blob alors on le fait
	// sinon on laisse à la boule continuer sa route: ça regle le cas ou y'a plus de bombe plaçable car toute placées (normalement math_counter)
	// et ce cas ne se verra pas 
	// et sinon le cas rencontre_une_autre_boule est traité par la fonction FakeBoom()
	if (blobsDisponibles >= 1)
	{
	 	for (local i=0; i< blobs.len() ; i++)
 		{
 			// on prend le premier blob disponible
 			if (blobsPlacable[i] == 1)
 			{
 			//	printl(\"wtf is this shit:\" + bombeOriginale)

 				printl(\"Blob() ---------------- Selection du premier blob disponible\");
 				printl(\"Blob() ---------------- \"+  INSTANCE_FIX_UP_NAME + \"Blobs[\" + i+\"]\");
 			//	local handlerBlob = Entities.FindByName(null,blobs[i].GetName());
 			//	local handlerSocket = Entities.FindByName(null,blobsSocket[i].GetName());
 				// On teleporte le tout: blob et socket
 				//printl(bombeOriginale);

 			//	handlerBlob.SetOrigin(bombeOriginale.GetOrigin());
 			//	handlerSocket.SetOrigin(bombeOriginale.GetOrigin());
 				blobs[i].SetOrigin(bombeOriginale.GetOrigin());
 				blobsSocket[i].SetOrigin(bombeOriginale.GetOrigin());
 				
 				// On indique qu'il n'est plus disponible
 				blobsPlacable[i] = 0;
 				// On détruit la bombe originale
 				printl(\"Blob() ---------------- Destruction de la bombe originale\");
 				

 				/* ET ON AUTORISE SILENTDISSOLVE AU CAS OU IL EST PAS ACTIVÉ DANS HAMMER cmonBruh */
				EntFireByHandle(bombeOriginale, \"addoutput\", \"AllowSilentDissolve 1\", 0.00, null, null);
 				EntFireByHandle(bombeOriginale, \"SilentDissolve\", \"\", 0.00, null, null); 
 				// On met a jour le math_counter de machin deja placé dans la carte pour gerer la plateforme clip !
 				printl(\"Blob() ---------------- Mise a jour du counter(\" + COUNTER_NAME + \") : +1\");
				UpdateCounter(1);
			//	printl(\"Blob() ---------------- Appel de SetLaserTarget(\" + i + \")\");
			//	SetLaserTarget(i)

 				// on sort de la boucle puisqu'on a trouvé ce qu'on cherchait
 				// on enleve ce break si on veut plusieurs boules au meme endroit, ce qui est marrant à voir une fois ZULUL
 				break;
 			}
 		}	
 	}
 	else
 		printl(\"Blob() ---------------- Aucun blob disponible: nothing to be done\");
 	/*Pour verifier que c'est le meme scope/objet on compare les adreses*/
 	//printl(this); 
 	//printl(this.blobs[1]);
}


/* Pour gerer le blob qui refuse de se forcespawn a la place on va le tp et creer une copie pile ou il etait avant qu'il n'explose? 
 * En fait ça deconne car si la bulle explode elle est detruite, donc TurnOn
 * Enable the constraint; do this if the constrained objects don't exist when it spawns.
 * Note that broken constraints cannot be turned back on as they have been deleted
 * Pas tres pratique*/
/* SOIT: on teste de voir si on peut pas teleporter les boules avec un jeu de trigger et apres on fait une fausse bombe qui explose
 * SOIT: on turnoff la contraite avant que l'objet soit detruit (COMMMENT?) et on regarde si on peut la turnon apres avoir spawn
 * Ou alors on fait en sorte qu'ils ne puissent pas se collisionner? */

function FakeBoom(michel)
{
	printl(\"FakeBoom() ---------------- Sauvetage du blob numero:   \" + michel);

	// LUL?
	//SendToConsole(\"host_timescale 0.01\")

	/*le but est de teleporter la bomb d'avant et de faire spawn une fausse qui explosera*/
	/* Normalement cette fonction n'est appelée qu'une fois car on a un filter_activator_name sur la bombe originale qui touchera 
	le trigger et se fera détruire AVANT de toucher le FireUser1 qui appelle Blob() */
	local boomA, boomB, boomC;

	/*On recupere un handler sur la premiere bombe pour l'origine (là où elle vient de se faire detruire/de toucher le trigger de l'autre)*/
 	bombeOriginale <- Entities.FindByName(null,BOMB_ORIGINALE_NAME);
 	// Si elle existe
 	if (bombeOriginale != null)
 	{


		printl(\"FakeBoom() ---------------- Bombe originale trouvée\");
		boomA = bombeOriginale.GetOrigin();
		printl(\"boomA ? Jebaited\");
		boomB = blobs[michel].GetOrigin();
		printl(\"boomB ? Jebaited\");
		boomC = (boomA + boomB);
		printl(\"boomC ? Jebaited\");
		boomC.x /= 2; boomC.y /= 2; boomC.z /= 2;
		// on teleporte le machin dans sa position d'origine
		printl(\"FakeBoom() ---------------- Teleportation du blob et du socket\");
		blobs[michel].SetOrigin(blobsOrigine[michel]);
		blobsSocket[michel].SetOrigin(blobsOrigine[michel]);
		/* ET ON AUTORISE SILENTDISSOLVE AU CAS OU IL EST PAS ACTIVÉ DANS HAMMER cmonBruh */
		// ça marche pas FeelsBadMan
		EntFireByHandle(bombeOriginale, \"addoutput\", \"AllowSilentDissolve 1\", 0.00, null, null);
		printl(\"FakeBoom() ---------------- Bombe originale SilentDissolve\");
		EntFireByHandle(bombeOriginale, \"SilentDissolve\", \"\", 0.00, null, null); 

 	}
 	// Si il n'y a pas de bombe originale, c'est qu'on a appelé Explode() quelque part
 	else 
 	{
 		// bon si on arrive dans ce bloc c'est trop tard ducoup il va servir si c'est pour Explode() ou pour FireUser4?
 		printl(\"FakeBoom() ---------------- called from Explode()\");
 		printl(\"DansGame EXPLAIN\");
 		// on assigne boomC aux coordonnées de la bombe à sauver
 		boomC = blobs[michel].GetOrigin();
 		// on teleporte le machin dans sa position d'origine
		blobs[michel].SetOrigin(blobsOrigine[michel]);
		blobsSocket[michel].SetOrigin(blobsOrigine[michel]);
 	}

 	printl(\"FakeBoom() ---------------- Creation d'une fausse bombe\");
 	local handlerMaker =  Entities.FindByName(null,FAKE_BOMB_MAKER_NAME);
	handlerMaker.SetOrigin(boomC);
	handlerMaker.SpawnEntity();
	//Ducoup, on dit qu'il est à nouveau plaçable
 	blobsPlacable[michel] = 1;
	

	printl(\"FakeBoom() ---------------- Mise a jour du counter(\" + COUNTER_NAME + \") : -1\");
	UpdateCounter(-1);
	//SendToConsole(\"host_timescale 1\")

	// TODO: améliorer le code ici. Gros blob? Blob plus rapidement detruit?
}

function UpdateCounter(delta)
{
	counterTrack += delta;
	//local handlerCounter = Entities.FindByName(null,\"bomb_counter\");
	if (delta > 0) 
	{
		// EntFireByHandle(handlerCounter, \"Add\", delta.toString(), 0.00, null, null);
		EntFire(COUNTER_NAME, \"Add\", delta);
	}
	else if (delta < 0)
	{
		EntFire(COUNTER_NAME, \"Subtract\", -delta);
	}
	printl(\"UpdateCounter() ---------------- Valeur du counter apres modification: \" + counterTrack)
}


function Reset()
{
	for (local i=0; i < blobs.len() ;i++)
 	{
 		printl(\"Reset() ---------------- Reset des blobs dans leur configuration originale\");
 		// On teleporte le tout: blob et socket
    	blobsSocket[i].SetOrigin(blobsOrigine[i]);
    	blobs[i].SetOrigin(blobsOrigine[i]);
 		// Sauf qu'il faut en réalité faire spawn le blob plus haut que le trigger, sinon 

 		// On indique qu'il n'est plus disponible
 		blobsPlacable[i] = 1;
 	}
}

function Explode() //ToutPeterMonColonel()
{
	printl(\"Explode() ---------------- Appel de FakeBoom sur les blobs en suspension\")
	for (local i=0; i < blobs.len() ;i++)
 	{
 		// Si le blob n'est pas plaçable alors il est déjà placé
 		if (!blobsPlacable[i])
 		{
 			// on le FakeBoom
 			FakeBoom(i);
 		}
 	}
}




function Setup() 
{    
    // SendToConsole(\"sv_player_collide_with_laser 0\");
    SendToConsole(\"speed_paint_color 30 0 70 255\"); //splash
    SendToConsole(\"portal_paint_color 90 0 150 255\"); //painted colour
    
    SendToConsole(\"save quick\"); // reload immediately after map spawn
    SendToConsole(\"load quick\"); // to apply the correct paint color
}



function Debug()
{
	for(local i=0;i < blobsPlacable.len() ;i+=1)
	{	
		printl(blobs[i]   + \"         \" + blobsPlacable[i] +  \"       \" + blobsOrigine[i]);
	}
}

									

CONTACT

Fan? Drop a note!

Toulouse, France
Téléphone: +33 (0)7 68 74 73 90
Email: contact@davidbouet.fr
×

Messagé envoyé!