WB Portes destructibles durant les sieges ?

Users who are viewing this thread

voila ,

un siège avec une porte destructible
PR9r8KC.jpg

les ennemis  (les assiégeants) se ruent vers cette porte, puis restent plantés là à crier  et sans rien faire

bon , c'est prévisible

du coté des défenseurs  :

si je place les soldats tout prêt de la porte , les assaillants commencent à réagir et finissent par enfoncer la porte
kE6OORE.jpg

wkRm6A5.jpg


mais si je les éloignes , les autres se calment , oublient la porte  et recommerce à beugler comme des %§#  :evil:

hG0r5b5.jpg

Je pense à utiliser un trigger qui fait disparaitre la porte (props) après un certain temps (1 minute) , mais je ne maitrise pas assez le code pour faire des trucs aussi compliqué ...

peut être une piste à suivre ?




 
Il y a t'il une seule porte de ce type sur la map? Si c'est le cas, ça rend les choses plus faciles.
Car pour manipuler les scene prop, il n'est pas possible de différencier les différentes instances de ces scene prop, en tout cas ce n'est pas possible en ayant aucune information sur cette scene prop.

Bref, pour faire disparaitre ta scene prop, tu peux utiliser cette opération:
Code:
(scene_prop_fade_out, <scene_prop_id>, <fade_out_time>)

Mais étant donné que ta porte est destructible, je te conseille d'utiliser celle-ci à la palce:
Code:
(prop_instance_receive_damage, <scene_prop_id>, <agent_id>, <damage_value>),

Après, comme je te l'ai dit, il n'est pas possible de déterminer quelle instance de la porte est la bonne, si tu n'en a qu'une seule sur ta map (ou tes maps, celles qui sont utilisés pour cette mission), c'est plus simple, il est possible d'utiliser ça directement:
Code:
(scene_prop_get_instance, ":instance", "spr_door", 0),
Sinon, il y a deux possibilités:
  • Faire des dégats sur toutes les portes existantes
    C'est pas très réaliste et jolie, mais c'est certain de fonctionner, et il n'est pas nécessaire d'avoir des connaissances sur la scene prop
  • Utiliser soit un entry point, soit une autre scene prop (c'est moins conseillé avec ça, pour les même raisons qui forcent à utiliser un autre élément sur la map)
    Dans ce cas la, il est possible de prendre la porte la plus proche de cet entry point, et ne faire des dégats que sur celle ci

Bon, pour résumer, si tu es sur qu'il n'y ai qu'une seule porte de ce type:
Code:
(5, 0, 0,
	[
		(store_mission_timer_a, ":time"),
		(gt, ":time", 60), # Si tu veux que ta porte ne soit détruite que après 60 secondes
	],
	[
		(scene_prop_get_instance, ":instance", "spr_door", 0),
		(scene_prop_get_hit_points, ":hp", ":instance"),
		(gt, ":hp", 0), 
		# Je ne suis pas sur de ce qui se passe si on fait des dégâts sur une porte detruite
		# Mais bon au moins ça évite de faire les calculs qui suivent quand la porte est détruite
		(get_player_agent_no, ":player_agent"),
		# On récupère le joueur car l'opération suivante nécessite un agent pour faire les dégats
		(prop_instance_receive_damage, ":instance", ":player_agent", 1337),
		# Si ta scene prop possède plus de points de vie que cette valeur, il faut l'augmenter
	]),

Si ce n'est pas le cas, ou si c'est incertain:
Code:
(5, 0, 0,
	[
		(store_mission_timer_a, ":time"),
		(gt, ":time", 60), # Si tu veux que ta porte ne soit détruite que après 60 secondes
	],
	[
		(scene_prop_get_num_instances, ":num_instances", "spr_door"),
		(try_for_range, ":instance_no", 0, ":num_instances"),
			(scene_prop_get_instance, ":instance", "spr_door", ":instance_no"),
			(scene_prop_get_hit_points, ":hp", ":instance"),
			(gt, ":hp", 0), 
			# C'est surement pas nécessaire de faire les deux opérations précédentes
			(get_player_agent_no, ":player_agent"),
			# On récupère le joueur car l'opération suivante nécessite un agent pour faire les dégats
			(prop_instance_receive_damage, ":instance", ":player_agent", 1337),
			# Si ta scene prop possède plus de points de vie que cette valeur, il faut l'augmenter
		(try_end),
	]),
Après, si tu as des entry points près de la porte, dans toutes les maps qui utilisent cette mission, tu peux tenter de comparer les distances, et prendre l'instance qui est la plus proche.
Il est aussi possible de faire une boucle sur tous les agents, et pour chacun proche d'une porte, celle ci prend un peu de dégâts.
C'est surement la meilleure solution, mais aussi la plus couteuse en terme de calculs (après, une boucle sur les agents, et une comparaison de distances, ce n'est rien avec les ordinateurs d'aujourd'hui).

Bien sur, le tout à mettre dans module_mission_templates :grin:.
 
Excellent comme d'habitude , un vrai OSP que tu m'a concocté là :grin:

heureusement , je n'ai qu'une seule instance et dans une seule scène et je vais tester tout ça ce soir

au fait, tes idées ouvrent d'autre perspectives  très intéressante:  par exemple , un bélier (un soldat à l’intérieur d'une "armure bélier"), en s'approchant d'une porte destructible cause des dégâts à celle-ci ( calculs -distances -agents-  que tu as mentionnés ... )  mais j'ai pas encore le niveau nécessaire  :sad:

Encore merci Bouya

edit : ça a marché comme un charme  :grin:
 
Hello

Excellent sujet, fladin !
Et que du lourd dans les intervenants !  :grin:

Il y a une partie de la question, et de la réponse qui m'intéressent, j'imagine que l'on peut adapter tout ça pour une scène pacifique... ?  :grin:
J'ai une scène intérieure avec plusieurs issues condamnées par des portes indestructibles au début du jeu, et chaque issue sera accessible au fil de l'évolution de la partie, mon option actuelle est de faire un changement de scène pour continuer derrière la porte...
Le sujet m'ouvre d'autres perspectives, soit en rendant la porte destructible, soit en la faisant disparaître, ce sont des options très intéressantes !  :cool:

Tchin !
:twisted:
 
salut BerTolkien

effectivement , on peut faire des merveilles avec ce prop_instance_?

un coup d’œil sur  la base de donné de Swyter  :shock: ( enorme ce gars) :

Code:
(prop_instance_animate_to_position,prop_instance_id, position_no, duration-in-1/100-seconds),
(prop_instance_stop_animating,prop_instance_id),
(prop_instance_is_animating,destination, prop_instance_id/c>),
(prop_instance_get_animation_target_position,position_no, prop_instance_id),
(prop_instance_enable_physics,prop_instance_id, value),
(prop_instance_rotate_to_position,prop_instance_id, position_no, duration-in-1/100-seconds, total_rotate_angle),
(prop_instance_initialize_rotation_angles,prop_instance_id),
(prop_instance_refill_hit_points,prop_instance_id),
(prop_instance_dynamics_set_properties,prop_instance_id, mass_friction),
(prop_instance_dynamics_set_velocity,prop_instance_id, linear_velocity),
(prop_instance_dynamics_set_omega,prop_instance_id, angular_velocity),
(prop_instance_dynamics_apply_impulse,prop_instance_id, impulse_force),
(prop_instance_receive_damage,prop_instance_id, agent_id, damage_value),
(prop_instance_intersects_with_prop_instance,prop_instance_id, prop_instance_id),
(replace_prop_instance,prop_instance_id, new_prop_instance_id),
(replace_scene_props,old_scene_prop_id, new_scene_prop_id),
(replace_scene_items_with_scene_props,old_item_id, new_scene_prop_id),
...

ça  donne des idées hein ?!  (des missions avec des scène dynamiques , des objet qui apparaissent et disparaissent  , qui volent et qui explosent même ! )

 
Back
Top Bottom