Pour faire une porte dérobée, je vois quatre solutions différentes:
1) créer un objet de type "door" avec un mesh de static et lui assigner une destination:
exemple: Dans une cave, avoir un tonneau qui est une "door". En cliquant dessus, le joueur est téléporté dans une autre cell, ou plus loin dans la même cell (comme avec une porte normale reliant deux cells différentes).
inconvénient: Sur la carte locale on voit le petit carré indiquant la présence d'une cell.
2) créer un objet de type "activator" avec un mesh de static et lui assigner un script qui remplira la fonction de téléportation qu'une "door" aurait assuré.
if ( OnActivate == 1 )
Player->PositionCell, "ID de la cell", x, y, z
endif
Avantage: - Pas de carré dévoilant le passage sur la map.
- On peut en cas de besoin ajouter une condition de journal qui fasse en sorte que rien ne se passe tant que l'existence du passage n'a pas été dévoilé au PJ.
Inconvénient: Ce script ne tient pas compte des compagnons éventuels du PJ. Si on peut compenser en ajoutant des conditions pour les compagnons propre au mod, c'est l'impasse pour les compagnons venant d'autres mods.
3) employer la porte secrète du jeu (dans les doors, celle qui ressemble à un mur de fort impérial). Pour qu'elle soit moins repérable, la masquer en partie avec un static (genre tenture ou tapisserie): cela réduit les chances que le joueur la repère immédiatement parce que le curseur passant dessus par hasard indiquerait "porte secrète".
4) pour le cas d'une porte secrète avec un levier: créer deux activators unique: le levier et la porte secrète (qui peut avoir par exemple l'apparence d'un static). Créer une variable globale qui serve de déclencheur (mettons VarPorte ).
Script à attacher sur le levier:
Begin Levier
if ( MenuMode == 1 )
Return
endif
if ( OnActivate == 1 )
if ( VarPorte == 0 )
Set VarPorte to 1
else
Return
endif
endif
End Levier
Script à attacher sur la porte (il devrait te rappeler quelque chose
)
Begin PorteDerobee
Short position
Short ouvrir
Short phase
Short attend
Float timer
;VarPorte une globale short qui sert de "déclencheur" à l'action
; position == 0 porte ouverte (position initiale de la porte (sous le sol))
; position == 2 porte fermée
if ( MenuMode == 1 )
Return
endif
if ( VarPorte == 1 ); si le levier est activé...
if ( attend == 0 )
if ( ouvrir == 0 ); si l'état de la porte est: fermer
Set ouvrir to 1; elle se met en état: ouvrir
PlaySound "IDduSon"; son de la porte
elseif ( ouvrir == 1 ); si elle est en état: ouvrir
Set ouvrir to 0; elle se met en état: fermer
PlaySound "IDduSon"; son de la porte
endif
Set phase to 1
endif
endif
if ( phase == 0 )
Return
elseif ( phase == 1 )
Set attend to 1
Set phase to 2
elseif ( phase == 2 )
if ( timer <= 7.0 )
if ( ouvrir == 1 )
"IDdelaPorteDérobée"->Move z 35; la porte remonte du sol pour se refermer (l'axe peut être changé selon convenance en x ou y) (Les chiffres sont purement indicatifs.)
elseif ( ouvrir == 0 )
"IDdelaPorteDérobée"->Move z -35; la porte s'enfonce dans le sol: elle s'ouvre
endif
else
if ( ouvrir == 0 )
Set "VarPorte" to 0; globale réinitialisée
endif
if ( ouvrir == 1 )
Set "VarPorte" to 0; globale réinitialisée
endif
Set timer to 0
Set phase to 0
Set attend to 0
endif
Set timer to ( timer + GetSecondsPassed )
endif
End PorteDerobee
Voilà. Je crois n'avoir rien oublié.
En espérant ne pas avoir fait d'erreur dans les scripts.