summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/struct/character_instance.erl')
-rw-r--r--src/struct/character_instance.erl126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/struct/character_instance.erl b/src/struct/character_instance.erl
new file mode 100644
index 0000000..63045a7
--- /dev/null
+++ b/src/struct/character_instance.erl
@@ -0,0 +1,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).