Ant.set_position()   A
last analyzed

Complexity

Conditions 4

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 6
rs 9.2
cc 4
1
from intelligine.core.exceptions import MoleculeException
2
from intelligine.synergy.object.Bug import Bug
3
from intelligine.cst import CARRYING, TRANSPORTER, ATTACKER, COL_TRANSPORTER, COL_TRANSPORTER_NOT_CARRYING, \
4
    COL_FIGHTER, MODE_EXPLO, MODE_GOHOME, BODY_PART_PHEROMONE_GLAND, TYPE, TYPE_ANT, \
5
    COL_TRANSPORTER_CARRYING, MODE_NURSE, MODE_HOME, CARRY, PUT_FAIL_COUNT
6
from intelligine.synergy.object.Food import Food
7
from intelligine.simulation.object.molecule.MovementMoleculeGland import MovementMoleculeGland
8
from intelligine.simulation.object.brain.AntBrain import AntBrain
9
import random
10
11
12
class Ant(Bug):
13
14
    _body_parts = {
15
        BODY_PART_PHEROMONE_GLAND: MovementMoleculeGland
16
    }
17
    _brain_class = AntBrain
18
19
    def __init__(self, collection, context):
20
        super().__init__(collection, context)
21
        context.metas.states.add_list(self.get_id(), [TRANSPORTER, ATTACKER])
22
        context.metas.collections.add_list(self.get_id(), [COL_TRANSPORTER,
23
                                                           COL_TRANSPORTER_NOT_CARRYING,
24
                                                           COL_FIGHTER])
25
        self._carried = None
26
        #  TODO: Comme pour lorsque une action put est faite, lancer un algo de choix de la mission a suivre.
27
        if random.choice([1, 0]):
28
            self._brain.switch_to_mode(MODE_EXPLO)
29
        else:
30
            self._brain.switch_to_mode(MODE_NURSE)
31
        context.metas.list.add(TYPE, self.get_id(), TYPE_ANT)
32
        self._put_fail_count = 0
33
34
    def die(self):
35
        super().die()
36
        self._remove_state(TRANSPORTER)
37
        self._remove_state(ATTACKER)
38
        self._remove_col(COL_TRANSPORTER)
39
        self._remove_col(COL_TRANSPORTER_NOT_CARRYING)
40
        self._remove_col(COL_TRANSPORTER_CARRYING, allow_not_in=True)
41
        self._remove_col(COL_FIGHTER)
42
43
    def get_movement_molecule_gland(self):
44
        return self.get_body_part(BODY_PART_PHEROMONE_GLAND)
45
46 View Code Duplication
    def put_carry(self, obj, position=None):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
47
        if position is None:
48
            position = self._get_position()
49
        self._carried = None
50
        obj.set_position(position)
51
        obj.set_is_carried(False, self)
52
        self._context.metas.states.remove(self.get_id(), CARRYING)
53
        self._context.metas.value.unset(CARRY, self.get_id())
54
        self._add_col(COL_TRANSPORTER_NOT_CARRYING)
55
        self._remove_col(COL_TRANSPORTER_CARRYING)
56
57
    def get_carried(self):
58
        return self._carried
59
60 View Code Duplication
    def carry(self, obj):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
61
        self._carried = obj
62
        self._context.metas.states.add(self.get_id(), CARRYING)
63
        self._add_col(COL_TRANSPORTER_CARRYING)
64
        self._remove_col(COL_TRANSPORTER_NOT_CARRYING)
65
        obj.set_is_carried(True, self)
66
        self._context.metas.value.set(CARRY, self.get_id(), obj.get_id())
67
        # TODO: pour le moment hardcode, a gerer dans AntTakeBrainPart (callback en fct de ce qui est depose)
68
        if isinstance(obj, Food):
69
            self.get_brain().switch_to_mode(MODE_GOHOME)
70
            self.get_movement_molecule_gland().appose()
71
72
    def is_carrying(self):
73
        if self._carried:
74
            return True
75
        return False
76
77
    def set_position(self, position):
78
        if self._position is not None and position != self._position:
79
            self._brain.host_moved()
80
        super().set_position(position)
81
        if self.is_carrying():
82
            self._carried.set_position(position)
83
84
    def initialize(self):
85
        super().initialize()
86
        if self.get_movement_molecule_gland().is_enabled():
87
            try:
88
                self.get_movement_molecule_gland().appose()
89
            except MoleculeException:
90
                pass
91
92
    def get_colony(self):
93
        return self.get_collection()
94
95
    def get_put_fail_count(self):
96
        return self._put_fail_count
97
98
    def increment_put_fail_count(self):
99
        self._put_fail_count += 1
100
        self._context.metas.value.set(PUT_FAIL_COUNT, self.get_id(), self._put_fail_count)
101
102
    def reinit_put_fail_count(self):
103
        self._put_fail_count = 0
104
        self._context.metas.value.set(PUT_FAIL_COUNT, self.get_id(), self._put_fail_count)
105