123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- # coding: utf-8
- import random
- import time
- import typing
-
- from synergine2.simulation import Event
- from synergine2.simulation import disable_when
- from synergine2.simulation import config_value
-
- from opencombat.const import COLLECTION_ALIVE
- from opencombat.simulation.base import AliveSubjectBehaviour
- from opencombat.simulation.event import NoLongerVisibleOpponent
- from opencombat.simulation.event import FireEvent
- from opencombat.simulation.event import DieEvent
- from opencombat.simulation.event import NewVisibleOpponent
- from opencombat.simulation.mechanism import OpponentVisibleMechanism
-
-
- class LookAroundBehaviour(AliveSubjectBehaviour):
- """
- Behaviour who permit to reference visible things like enemies
- """
- visible_mechanism = OpponentVisibleMechanism
- use = [visible_mechanism]
-
- def __init__(self, *args, **kwargs) -> None:
- super().__init__(*args, **kwargs)
- self._seconds_frequency = float(self.config.resolve('game.look_around.frequency'))
-
- @property
- def seconds_frequency(self) -> typing.Optional[float]:
- return self._seconds_frequency
-
- def action(self, data) -> [Event]:
- new_visible_subject_events = []
- no_longer_visible_subject_events = []
-
- for no_longer_visible_subject_id in data['no_longer_visible_subject_ids']:
- no_longer_visible_subject_events.append(NoLongerVisibleOpponent(
- observer_subject_id=self.subject.id,
- observed_subject_id=no_longer_visible_subject_id,
- ))
- self.subject.visible_opponent_ids.remove(no_longer_visible_subject_id)
-
- for new_visible_subject_id in data['new_visible_subject_ids']:
- new_visible_subject_events.append(NewVisibleOpponent(
- observer_subject_id=self.subject.id,
- observed_subject_id=new_visible_subject_id,
- ))
- self.subject.visible_opponent_ids.append(new_visible_subject_id)
-
- return new_visible_subject_events + no_longer_visible_subject_events
-
- @disable_when(config_value('_runtime.placement_mode'))
- def run(self, data):
- visible_subjects = data[self.visible_mechanism]['visible_subjects']
- visible_subject_ids = [s.id for s in visible_subjects]
- new_visible_subject_ids = []
- no_longer_visible_subject_ids = []
-
- for subject_id in self.subject.visible_opponent_ids:
- if subject_id not in visible_subject_ids:
- no_longer_visible_subject_ids.append(subject_id)
-
- for subject in visible_subjects:
- if subject.id not in self.subject.visible_opponent_ids:
- new_visible_subject_ids.append(subject.id)
-
- return {
- 'new_visible_subject_ids': new_visible_subject_ids,
- 'no_longer_visible_subject_ids': no_longer_visible_subject_ids,
- }
-
-
- class EngageOpponent(AliveSubjectBehaviour):
- visible_mechanism = OpponentVisibleMechanism
- use = [visible_mechanism]
-
- def __init__(self, *args, **kwargs) -> None:
- super().__init__(*args, **kwargs)
- self._seconds_frequency = float(self.config.resolve('game.engage.frequency'))
-
- @property
- def seconds_frequency(self) -> typing.Optional[float]:
- return self._seconds_frequency
-
- def action(self, data) -> [Event]:
- kill = data['kill']
- target_subject_id = data['target_subject_id']
- target_subject = self.simulation.subjects.index[target_subject_id]
- target_position = data['target_position']
-
- events = list()
- events.append(FireEvent(
- shooter_subject_id=self.subject.id,
- target_position=target_position,
- ))
-
- # Must be check if target is not already dead (killed same cycle)
- if kill and COLLECTION_ALIVE in target_subject.collections:
- DieEvent.apply_subject_death(target_subject)
- events.append(DieEvent(
- shooter_subject_id=self.subject.id,
- shoot_subject_id=target_subject_id,
- ))
-
- return events
-
- @disable_when(config_value('_runtime.placement_mode'))
- def run(self, data):
- visible_subjects = data[self.visible_mechanism]['visible_subjects']
- if not visible_subjects:
- return
- # Manage selected target (can change, better visibility, etc ...)
- # Manage weapon munition to be able to fire
- # Manage fear/under fire ...
- # Manage weapon reload time
-
- # For dev fun, don't fire at random
- if random.randint(1, 3) == -1:
- # Executed but decided to fail
- self.last_execution_time = time.time()
- return False
-
- target_subject = random.choice(visible_subjects)
- kill = random.randint(0, 100) >= 75
-
- # Manage fire miss or touch (visibility, fear, opponent hiding, etc ...)
- return {
- 'kill': kill,
- 'target_subject_id': target_subject.id,
- 'target_position': target_subject.position,
- }
|