Skip to content

Instantly share code, notes, and snippets.

@zelinskiy
Created March 13, 2017 15:26
Show Gist options
  • Save zelinskiy/6429c4a0cc0515d63f6c00d4b4ab7940 to your computer and use it in GitHub Desktop.
Save zelinskiy/6429c4a0cc0515d63f6c00d4b4ab7940 to your computer and use it in GitHub Desktop.
-module(game).
-compile(export_all).
-record(unitS, {
colour,
inventory=[],
rank=soldier,
hp=300}).
just_soldier() -> #unitS{}.
startArmy(DefaultInventory, Colour, N) ->
[spawn(?MODULE, soldier, [#unitS{inventory=DefaultInventory, colour=Colour}]) || X <- lists:seq(1,N)].
startSoldier(DefaultInventory) ->
spawn(?MODULE, soldier, [#unitS{inventory=DefaultInventory}]).
give(Soldier, Item) ->
Soldier ! {self(), {give, Item}},
receive
{Soldier, Msg} -> Msg
end.
take(Soldier, Item) ->
Soldier ! {self(), {take, Item}},
receive
{Soldier, Msg} -> Msg
end.
getState(Soldier) ->
Soldier ! {self(), state},
receive
{Soldier, Msg} -> Msg
end.
promote(Soldier) ->
Soldier ! {self(), promote},
receive
{Soldier, Msg} -> Msg
end.
attack(SoldierA, SoldierB) ->
SoldierA ! {self(), {attack, SoldierB}},
receive
{Soldier, Msg} -> Msg
end.
nextRank(R) -> case R of
soldier -> sergeant;
sergeant -> colonel;
colonel -> general;
general -> general;
_ -> nothing
end.
soldier(S = #unitS{}) ->
receive
{From, {give, Item}} ->
From ! {self(), ok},
soldier(S#unitS{inventory = [Item|S#unitS.inventory]});
{From, state} ->
From ! {self(), S},
soldier(S);
{From, promote} ->
From ! {self(), nextRank(S#unitS.rank)},
soldier(S#unitS{rank=nextRank(S#unitS.rank)});
{From, {attack, Soldier}} ->
From ! {self(), ok},
Soldier ! {self(), hurt},
soldier(S);
{From, hurt} ->
From ! {self(), ok},
soldier(S#unitS{hp=S#unitS.hp - 10});
{From, {take, Item}} ->
case lists:member(Item, S#unitS.inventory) of
true ->
From ! {self(), {ok, Item}},
soldier(S#unitS{inventory = lists:delete(Item, S#unitS.inventory)});
false ->
From ! {self(), not_found},
soldier(S)
end;
terminate ->
ok
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment