summaryrefslogtreecommitdiff
blob: 63045a74776d63111ed0b7e8584157931794700c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
-module(character_instance).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-record
(
   character_instance,
   {
      x,
      y,
      health,
      team,
      active_wp,
      stats
   }
).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Accessors
-export
(
   [
      get_location/1,
      get_current_health/1,
      get_owner/1,
      get_active_weapon/2,
      get_statistics/1,
      set_location/3,
      mod_health/3
   ]
).

%%%% Utils
-export
(
   [
      new_instance_of/3,
      switch_weapon/2,
      is_dead/1 % is_alive is reserved.
   ]
).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
get_new_weapon(CharInst, Char) ->
   case CharInst#character_instance.active_wp of
      0 ->
         {_, Weapon} = character:get_weapons(Char),
         {1, Weapon};

      1 ->
         {Weapon, _} = character:get_weapons(Char),
         {0, Weapon}
   end.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Accessors
get_location (CharInst) ->
   {CharInst#character_instance.x, CharInst#character_instance.y}.

get_current_health (CharInst) -> CharInst#character_instance.health.

get_owner (CharInst) -> CharInst#character_instance.team.

get_active_weapon (CharInst, Char) ->
   case CharInst#character_instance.active_wp of
      0 ->
         {_, Weapon} = character:get_weapons(Char),
         Weapon;

      1 ->
         {Weapon, _} = character:get_weapons(Char),
         Weapon
   end.

get_statistics (CharInst) -> CharInst#character_instance.stats.

set_location (CharInst, X, Y) ->
   CharInst#character_instance
   {
      x = X,
      y = Y
   }.

mod_health (CharInst, MaxHealth, HealthMod) ->
   NewHealth = (CharInst#character_instance.health + HealthMod),
   if
      (NewHealth < 0) ->
         CharInst#character_instance{ health = 0 };

      (NewHealth > MaxHealth) ->
         CharInst#character_instance{ health = MaxHealth };

      true ->
         CharInst#character_instance{ health = NewHealth }
   end.

%%%% Utils
new_instance_of (Char, Owner, {X, Y}) ->
   {Weapon, _} = character:get_weapons(Char),
   Stats = statistics:calc_for(character:get_attributes(Char), Weapon),
   #character_instance
   {
      x = X,
      y = Y,
      health = statistics:get_health(Stats),
      team = Owner,
      stats = Stats,
      active_wp = 0
   }.

switch_weapon (CharInst, Char) ->
   {NewWpIndex, Weapon} = get_new_weapon(CharInst, Char),
   CharInst#character_instance
   {
      active_wp = NewWpIndex,
      stats = statistics:calc_for(character:get_attributes(Char), Weapon)
   }.

is_dead (CharInst) -> (CharInst#character_instance.health == 0).