diff --git a/lib/viral_spiral/canon/card.ex b/lib/viral_spiral/canon/card.ex new file mode 100644 index 0000000..802a13e --- /dev/null +++ b/lib/viral_spiral/canon/card.ex @@ -0,0 +1,6 @@ +defmodule ViralSpiral.Canon.Card do + alias ViralSpiral.Canon.Card.Bias + alias ViralSpiral.Affinity + + @type t :: Affinity.t() | Bias.t() +end diff --git a/lib/viral_spiral/canon/card/affinity.ex b/lib/viral_spiral/canon/card/affinity.ex index 66df421..f69fe34 100644 --- a/lib/viral_spiral/canon/card/affinity.ex +++ b/lib/viral_spiral/canon/card/affinity.ex @@ -8,6 +8,11 @@ defmodule ViralSpiral.Canon.Card.Affinity do headline: nil, image: nil, article_id: nil + + @type t :: %__MODULE__{ + id: String.t(), + tgb: integer() + } end # defmodule ViralSpiral.Canon.Card.Affinity.Cat do diff --git a/lib/viral_spiral/canon/card/bias.ex b/lib/viral_spiral/canon/card/bias.ex index c09c2ec..c7518fe 100644 --- a/lib/viral_spiral/canon/card/bias.ex +++ b/lib/viral_spiral/canon/card/bias.ex @@ -8,4 +8,9 @@ defmodule ViralSpiral.Canon.Card.Bias do headline: nil, image: nil, article_id: nil + + @type t :: %__MODULE__{ + id: String.t(), + tgb: integer() + } end diff --git a/lib/viral_spiral/room/factory.ex b/lib/viral_spiral/room/factory.ex index 8ac6d21..11108eb 100644 --- a/lib/viral_spiral/room/factory.ex +++ b/lib/viral_spiral/room/factory.ex @@ -2,6 +2,7 @@ defmodule ViralSpiral.Gameplay.Factory do @moduledoc """ Create entities for a Game Room """ + alias ViralSpiralWeb.GameRoomState alias ViralSpiral.Entity.Deck alias ViralSpiral.Canon.Deck, as: CanonDeck alias ViralSpiral.Canon.DrawTypeRequirements @@ -70,4 +71,37 @@ defmodule ViralSpiral.Gameplay.Factory do store: CanonDeck.create_store(cards) } end + + def make_gameroom(%State{} = state) do + %GameRoomState{ + room: %{ + name: state.room.name, + chaos: state.room.chaos + }, + players: + for( + {_id, player} <- state.players, + do: %{ + name: player.name, + clout: player.clout, + affinities: player.affinities, + biases: player.biases, + is_active: state.turn.current == player.id, + cards: + player.active_cards + |> Enum.map(&state.deck.store[{&1, true}]) + |> Enum.map( + &%{ + id: &1.id, + type: &1.type, + veracity: &1.veracity, + headline: &1.headline, + image: &1.image, + article_id: &1.article_id + } + ) + } + ) + } + end end diff --git a/lib/viral_spiral/room/reducer.ex b/lib/viral_spiral/room/reducer.ex index 43b6d9c..b7ddd2b 100644 --- a/lib/viral_spiral/room/reducer.ex +++ b/lib/viral_spiral/room/reducer.ex @@ -10,7 +10,7 @@ defmodule ViralSpiral.Room.Reducer do alias ViralSpiral.Canon.Deck alias ViralSpiral.Room.Action - @spec reduce(State.t(), Action.t()) :: State.t() + # @spec reduce(State.t(), Action.t()) :: State.t() def reduce(%State{} = state, %{type: :draw_card} = action) do draw_type = action.payload.draw_type diff --git a/lib/viral_spiral_web/components/atoms.ex b/lib/viral_spiral_web/components/atoms.ex new file mode 100644 index 0000000..25d87a9 --- /dev/null +++ b/lib/viral_spiral_web/components/atoms.ex @@ -0,0 +1,13 @@ +defmodule ViralSpiralWeb.Atoms do + use ViralSpiralWeb, :html + + attr :card, :map, required: true + + def card(assigns) do + ~H""" +
+

<%= @card.headline %>

+
+ """ + end +end diff --git a/lib/viral_spiral_web/components/layouts/app.html.heex b/lib/viral_spiral_web/components/layouts/app.html.heex index 74698cb..2bb6e75 100644 --- a/lib/viral_spiral_web/components/layouts/app.html.heex +++ b/lib/viral_spiral_web/components/layouts/app.html.heex @@ -2,25 +2,19 @@
- +

- v<%= Application.spec(:phoenix, :vsn) %> + <%= Application.spec(:viral_spiral, :vsn) %>

- - @elixirphoenix + + Website - + GitHub - - Get Started -
diff --git a/lib/viral_spiral_web/live/game_room.ex b/lib/viral_spiral_web/live/game_room.ex index 7b6c02c..5042092 100644 --- a/lib/viral_spiral_web/live/game_room.ex +++ b/lib/viral_spiral_web/live/game_room.ex @@ -1,21 +1,46 @@ defmodule ViralSpiralWeb.GameRoom do + import ViralSpiralWeb.Atoms + alias ViralSpiral.Canon.Card + alias ViralSpiral.Entity.Player + alias ViralSpiral.Canon.Deck + alias ViralSpiral.Gameplay.Factory + alias ViralSpiral.Room.Actions + alias ViralSpiral.Room.Reducer alias ViralSpiral.Room.State alias ViralSpiral.Entity.Room use ViralSpiralWeb, :live_view def mount(params, session, socket) do - room = - Room.new() - |> Room.start(4) + room = Room.new() |> Room.start(4) + state = State.new(room, ["adhiraj", "krys", "aman", "farah"]) + requirements = Factory.draw_type(state) + draw_type = Deck.draw_type(requirements) + state = Reducer.reduce(state, Actions.draw_card(draw_type)) - root = State.new(room, ["adhiraj", "krys", "aman", "farah"]) - IO.inspect(root) - IO.puts("hi") + gameroom_state = Factory.make_gameroom(state) - {:ok, assign(socket, :root, root)} + {:ok, assign(socket, :state, gameroom_state)} end def handle_event("start_game", _params, socket) do {:noreply, socket} end + + def handle_event("pass_to", params, socket) do + # card = socket.assigns.card + + # state = Reducers.reduce(state, Actions.pass_card()) + + {:noreply, socket} + end + + def player_options(state, player) do + pass_to_ids = state.turn.pass_to + + pass_to_names = + pass_to_ids + |> Enum.map(&state.players[&1].name) + + pass_to_names + end end diff --git a/lib/viral_spiral_web/live/game_room.html.heex b/lib/viral_spiral_web/live/game_room.html.heex index 9c82ea1..c66f013 100644 --- a/lib/viral_spiral_web/live/game_room.html.heex +++ b/lib/viral_spiral_web/live/game_room.html.heex @@ -1,20 +1,61 @@
- <%= @root.room.name %> - <%= @root.room.id %> - <%= @root.room.state %> - <%= @root.room.chaos_counter %> + <%= @state.room.name %> + <%!-- <%= @state.room.id %> + <%= @state.room.state %> --%> + <%= @state.room.chaos %>
-
- <%= for player <- Enum.map(@root.players, fn {_id, player} -> player end) do %> -
+
- <%= player.name %> + ]} + > + <%= player.name %> + + <%!-- <%= player.identity %> --%> +
+
+

Clout

+ <%= player.clout %>
- <% end %> +
+
+

Affinities

+
+ <%= elem(affinity, 0) %> + <%= elem(affinity, 1) %> +
+ +
+

Bias

+
+ <%= elem(bias, 0) %> + <%= elem(bias, 1) %> +
+ +
+ +
+ <.card card={card}> +
+
+ + <%!--
+ <%= if current_player?(@state, player) do %> + <.card> +

<%= card(@state, player).headline %>

+ + +

Pass to

+ <%= for pass_to <- player_options(@state, player) do %> + <%= pass_to %> + <% end %> + <% end %> --%> +
diff --git a/lib/viral_spiral_web/live/game_room_state.ex b/lib/viral_spiral_web/live/game_room_state.ex new file mode 100644 index 0000000..aa64574 --- /dev/null +++ b/lib/viral_spiral_web/live/game_room_state.ex @@ -0,0 +1,15 @@ +defmodule ViralSpiralWeb.GameRoomState do + defstruct room: %{}, players: [] + + @type t :: %__MODULE__{ + room: %{ + name: String.t(), + chaos: integer() + }, + players: + list(%{ + name: String.t(), + affinities: %{atom() => integer()} + }) + } +end diff --git a/priv/static/images/logo.png b/priv/static/images/logo.png new file mode 100644 index 0000000..bf8cdb4 Binary files /dev/null and b/priv/static/images/logo.png differ