From cbecf68f9f8da0cac88c758714cb36ed0f82d87a Mon Sep 17 00:00:00 2001 From: Sergiotarxz Date: Sun, 9 Jul 2023 18:41:21 +0200 Subject: [PATCH] Adding known word, npcs in locations, auto empty npcs and actions in locations, etc. --- js-src/components/bottom-panel.tsx | 46 ++++++++++- js-src/components/game.tsx | 12 ++- js-src/input-packets.ts | 10 ++- .../Websocket/InputPacket/ExecuteAction.pm | 2 + .../Controller/Websocket/InputPacket/Init.pm | 15 +++- .../Controller/Websocket/OutputPacket/Info.pm | 8 +- lib/LasTres/Flags.pm | 3 + lib/LasTres/Location.pm | 21 ++++- .../GolpearArbolCentralTribuDeLaLima.pm | 9 ++- .../BosqueDelHeroe/BosqueDelHeroeI/Llano.pm | 8 -- .../BosqueDelHeroeI/TribuDeLaLima.pm | 8 -- .../TribuDeLaLima/ArbolCentral.pm | 4 +- .../BosqueDelHeroe/TribuDeLaLima/Entrada.pm | 8 -- lib/LasTres/Schema.pm | 2 +- lib/LasTres/Schema/Result/PJ.pm | 76 +++++++++++++++++- lib/LasTres/Schema/Result/PJKnownWord.pm | 36 +++++++++ lib/LasTres/TalkingNPC.pm | 35 +++++--- lib/LasTres/TalkingNPC/AncianoTribuLima.pm | 15 ++++ lib/LasTres/Word.pm | 12 +++ lib/LasTres/Word/Devota.pm | 16 ++++ public/css/styles.css | 42 ++++++++++ public/css/styles.scss | 51 ++++++++++++ public/img/anciano.png | Bin 0 -> 79858 bytes public/js/bundle.js | 6 +- 24 files changed, 389 insertions(+), 56 deletions(-) create mode 100644 lib/LasTres/Schema/Result/PJKnownWord.pm create mode 100644 lib/LasTres/Word/Devota.pm create mode 100644 public/img/anciano.png diff --git a/js-src/components/bottom-panel.tsx b/js-src/components/bottom-panel.tsx index a8e3d21..2238b67 100644 --- a/js-src/components/bottom-panel.tsx +++ b/js-src/components/bottom-panel.tsx @@ -1,6 +1,8 @@ import * as React from 'react' import type { Action, ActionHash } from '@lastres/action' +import type { TalkNPCs, TalkNPC } from '@lastres/talk-npc' + import OutputPacketExecuteAction from '@lastres/output-packet/execute_action' import PresentationItem from '@lastres/components/presentation-item' @@ -9,7 +11,7 @@ import Presentation from '@lastres/components/presentation' export interface BottomPanelProps { websocket: WebSocket | null actionHash: ActionHash | null - + talkNPCs: TalkNPCs | null } export interface Style { @@ -71,6 +73,45 @@ export default function BottomPanel (props: BottomPanelProps): JSX.Element { } } + function printAvatar (npc: TalkNPC): JSX.Element { + if (npc.icon === undefined) { + return <> + } + return
+
+
+ } + function printTalkNpcs (): JSX.Element { + const npcs = props.talkNPCs + if (npcs === null) { + return <> + } + return ( + <> + { + Object.keys(npcs).map((identifier) => { + const npc = npcs[identifier] + return
+
+
+ { + printAvatar(npc) + } +
+

{npc.name}

+
+
+
+ + +
+
+
+ }) + } + + ) + } return ( @@ -79,6 +120,9 @@ export default function BottomPanel (props: BottomPanelProps): JSX.Element { } + { + printTalkNpcs() + } diff --git a/js-src/components/game.tsx b/js-src/components/game.tsx index 37d6d54..6a01866 100644 --- a/js-src/components/game.tsx +++ b/js-src/components/game.tsx @@ -4,6 +4,7 @@ import type { PJ } from '@lastres/pj' import type { Location } from '@lastres/location' import type { LogLine } from '@lastres/log-line' import type { ActionHash } from '@lastres/action' +import type { TalkNPCs } from '@lastres/talk-npc' import UpperPanel from '@lastres/components/upper-panel' import BottomPanel from '@lastres/components/bottom-panel' @@ -49,13 +50,14 @@ export default function Game (props: GameProps): JSX.Element { const [movingTo, setMovingTo] = React.useState(null) const [remainingFrames, setRemainingFrames] = React.useState(null) const [actionHash, setActionHash] = React.useState(null) + const [talkNPCs, setTalkNPCs] = React.useState(null) const logPresentationRef = React.useRef(null) const websocket = props.websocket const setWebsocket = props.setWebsocket window.setTimeout(() => { setWebsocket((websocket): WebSocket | null => { if (websocket === null) { - console.log('Opening websocket'); + console.log('Opening websocket') const locationProtocol = window.location.protocol if (locationProtocol == null) { return null @@ -74,7 +76,7 @@ export default function Game (props: GameProps): JSX.Element { return } window.clearInterval(interval) - }, 1000) + }, 100000) } const inputPackets = new InputPackets(setTeamPJs, setEnemyTeamPJs, setIsBattling, @@ -82,7 +84,7 @@ export default function Game (props: GameProps): JSX.Element { logLines, setLogLines, setError, setScrollLog, logPresentationRef, setMovingTo, setRemainingFrames, - setActionHash) + setActionHash, setTalkNPCs) webSocket.onmessage = (event) => { const packet = JSON.parse(event.data) inputPackets.handle(packet) @@ -111,7 +113,9 @@ export default function Game (props: GameProps): JSX.Element { logPresentationRef={logPresentationRef} movingTo={movingTo} remainingFrames={remainingFrames}/> - + ) } diff --git a/js-src/input-packets.ts b/js-src/input-packets.ts index 88090b3..a23622a 100644 --- a/js-src/input-packets.ts +++ b/js-src/input-packets.ts @@ -3,6 +3,7 @@ import type { Location } from '@lastres/location' import type InputPacket from '@lastres/input-packet' import type { LogLine } from '@lastres/log-line' import type { ActionHash } from '@lastres/action' +import type { TalkNPCs } from '@lastres/talk-npc' import InputPacketInfo from '@lastres/input-packet/info' import InputPacketPong from '@lastres/input-packet/pong' @@ -21,6 +22,7 @@ type LogPresentationRef = React.RefObject type SetMovingTo = (set: Location | null) => void type SetRemainingFrames = (set: number | null) => void type SetActionHash = (set: ActionHash | null) => void +type SetTalkNPCs = (set: TalkNPCs | null) => void interface Packet { command: string @@ -44,6 +46,7 @@ export default class InputPackets { setMovingTo: SetMovingTo setRemainingFrames: SetRemainingFrames setActionHash: SetActionHash + setTalkNPCs: SetTalkNPCs constructor (setTeamPJs: SetTeamPJs, setEnemyTeamPJs: SetEnemyTeamPJs, setIsBattling: SetIsBattling, @@ -56,7 +59,8 @@ export default class InputPackets { logPresentationRef: LogPresentationRef, setMovingTo: SetMovingTo, setRemainingFrames: SetRemainingFrames, - setActionHash: SetActionHash) { + setActionHash: SetActionHash, + setTalkNPCs: SetTalkNPCs) { this.setTeamPJs = setTeamPJs this.setEnemyTeamPJs = setEnemyTeamPJs this.setCurrentLocation = setCurrentLocation @@ -70,6 +74,7 @@ export default class InputPackets { this.setRemainingFrames = setRemainingFrames this.setIsBattling = setIsBattling this.setActionHash = setActionHash + this.setTalkNPCs = setTalkNPCs } handle (packet: Packet): void { @@ -143,6 +148,9 @@ export default class InputPackets { this.setMovingTo(null) } } + if (data.npcs !== undefined) { + this.setTalkNPCs(data.npcs) + } if (data.remaining_frames !== undefined) { this.setRemainingFrames(data.remaining_frames) } diff --git a/lib/LasTres/Controller/Websocket/InputPacket/ExecuteAction.pm b/lib/LasTres/Controller/Websocket/InputPacket/ExecuteAction.pm index aabba59..ab54976 100644 --- a/lib/LasTres/Controller/Websocket/InputPacket/ExecuteAction.pm +++ b/lib/LasTres/Controller/Websocket/InputPacket/ExecuteAction.pm @@ -8,6 +8,8 @@ use utf8; use Moo; use List::AllUtils; +use JSON qw/to_json/; + sub identifier { return 'execute_action'; } diff --git a/lib/LasTres/Controller/Websocket/InputPacket/Init.pm b/lib/LasTres/Controller/Websocket/InputPacket/Init.pm index b28eedc..5549f78 100644 --- a/lib/LasTres/Controller/Websocket/InputPacket/Init.pm +++ b/lib/LasTres/Controller/Websocket/InputPacket/Init.pm @@ -79,6 +79,7 @@ sub handle ( $self, $ws, $session, $data ) { $self->_enemy_team_pjs($session), clear => $JSON::true, $self->_available_actions($pj), + $self->_npcs($pj), ); $info_packet_to_send->send($ws); my $redis = LasTres::Redis->new; @@ -104,6 +105,15 @@ sub _enemy_team_pjs ( $self, $session ) { ); } +sub _npcs ( $self, $pj ) { + my $npcs_hash = $pj->talk_npcs; + for my $identifier ( keys %$npcs_hash ) { + my $npc = $npcs_hash->{$identifier}; + $npcs_hash->{$identifier} = $npc->hash; + } + return ( npcs => $npcs_hash ); +} + sub _location_data ( $self, $pj ) { my $connected_places = $self->_get_connected_places($pj); my $team = $pj->team->get_from_storage; @@ -163,11 +173,12 @@ sub _on_redis_event ( $self, $ws, $session, $message, $topic, $topics ) { } if ( $data->{command} eq 'update-actions' ) { LasTres::Controller::Websocket::OutputPacket::Info->new( - $self->_available_actions($pj) )->send($ws); + $self->_available_actions($pj), + $self->_npcs($pj) )->send($ws); } } -sub _available_actions ($self, $pj) { +sub _available_actions ( $self, $pj ) { return ( available_actions => { map { $_->identifier => $_->hash($pj) } $pj->actions->@* }, ); } diff --git a/lib/LasTres/Controller/Websocket/OutputPacket/Info.pm b/lib/LasTres/Controller/Websocket/OutputPacket/Info.pm index bda8fda..c2542ae 100644 --- a/lib/LasTres/Controller/Websocket/OutputPacket/Info.pm +++ b/lib/LasTres/Controller/Websocket/OutputPacket/Info.pm @@ -27,6 +27,7 @@ has is_battling => ( is => 'rw' ); has remaining_frames => ( is => 'rw' ); has available_actions => ( is => 'rw' ); +has npcs => ( is => 'rw' ); sub identifier { return 'info'; @@ -42,6 +43,7 @@ sub data ($self) { my $remaining_frames = $self->remaining_frames; my $is_battling = $self->is_battling; my $available_actions = $self->available_actions; + my $npcs = $self->npcs; if ( defined $is_battling ) { $is_battling = $is_battling ? $JSON::true : $JSON::false; @@ -82,7 +84,11 @@ sub data ($self) { ? ( available_actions => $available_actions ) : () ), - + ( + (defined $npcs) + ? ( npcs => $npcs) + : () + ) }; } diff --git a/lib/LasTres/Flags.pm b/lib/LasTres/Flags.pm index ae12ff4..1c23104 100644 --- a/lib/LasTres/Flags.pm +++ b/lib/LasTres/Flags.pm @@ -8,4 +8,7 @@ use warnings; sub INTRO_MESSAGE_SENT_FLAG { return 'INTRO_MESSAGE_FLAG_SENT'; } +sub TALKED_WITH_OLD_MAN_AND_LEARNED_TO_SAY_DEVOTA { + return 'TALKED_WITH_OLD_MAN_AND_LEARNED_TO_SAY_DEVOTA'; +} 1; diff --git a/lib/LasTres/Location.pm b/lib/LasTres/Location.pm index 0db6d88..c7b71f8 100644 --- a/lib/LasTres/Location.pm +++ b/lib/LasTres/Location.pm @@ -13,16 +13,31 @@ use Moo::Role; use JSON qw/to_json from_json/; use utf8; -requires qw/identifier name description parent actions npcs/; +requires qw/identifier name description parent/; -## Implement action($self, $pj); -## Implement npcs($self, $pj); ## Implement description($self, $pj = undef); +# Will be printed to the user. ## Implement name($self, $pj = undef); ## Implement identifier($self, $pj = undef); +# Must be unique across locations of this area. my $planets = LasTres::Planets->new; +## OVERRIDE +# The available actions to do in +# this location, must return hashref, +# can be an empty one though. +sub actions($self, $pj) { + return []; +} +## OVERRIDE +# The available persons to talk with +# Must return a hashref, can be a empty +# one though. +sub npcs($self, $pj) { + return []; +} + ## OVERRIDE # Whenever a player can visit this place. # The player to compute will always be the leader. diff --git a/lib/LasTres/PJAction/GolpearArbolCentralTribuDeLaLima.pm b/lib/LasTres/PJAction/GolpearArbolCentralTribuDeLaLima.pm index 2aed226..fe2a875 100644 --- a/lib/LasTres/PJAction/GolpearArbolCentralTribuDeLaLima.pm +++ b/lib/LasTres/PJAction/GolpearArbolCentralTribuDeLaLima.pm @@ -90,12 +90,19 @@ sub _start_battle ( $self, $pj ) { } ]); + my $max_level_rabbit = 3; + if ($pj->level > 7) { + $max_level_rabbit = 4; + } + if ($pj->level > 9) { + $max_level_rabbit = 8; + } my $battle = LasTres::Battle->start_battle_machine($team, [ LasTres::EnemyArea->new( race => 'conejo', nick => 'Conejo territorial.', - level => LasTres::Util::rand_range_int(1,3), + level => LasTres::Util::rand_range_int(1,$max_level_rabbit), ) ] ); diff --git a/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/BosqueDelHeroeI/Llano.pm b/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/BosqueDelHeroeI/Llano.pm index 7a445ee..69f8864 100644 --- a/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/BosqueDelHeroeI/Llano.pm +++ b/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/BosqueDelHeroeI/Llano.pm @@ -27,14 +27,6 @@ sub parent { return LasTres::Planet::Bahdder::BosqueDelHeroe::BosqueDelHeroeI->instance; } -sub actions { - return []; -} - -sub npcs { - return []; -} - sub connected_places { return [ LasTres::Planet::Bahdder::BosqueDelHeroe::TribuDeLaLima::Entrada->instance, diff --git a/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/BosqueDelHeroeI/TribuDeLaLima.pm b/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/BosqueDelHeroeI/TribuDeLaLima.pm index bcfdf20..d2a8243 100644 --- a/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/BosqueDelHeroeI/TribuDeLaLima.pm +++ b/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/BosqueDelHeroeI/TribuDeLaLima.pm @@ -30,14 +30,6 @@ sub parent { return LasTres::Planet::Bahdder::BosqueDelHeroe::BosqueDelHeroeI->instance; } -sub actions { - return []; -} - -sub npcs { - return []; -} - sub connected_places { return [ LasTres::Planet::Bahdder::BosqueDelHeroe::TribuDeLaLima::Entrada->instance, diff --git a/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/TribuDeLaLima/ArbolCentral.pm b/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/TribuDeLaLima/ArbolCentral.pm index ac48355..6eb93eb 100644 --- a/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/TribuDeLaLima/ArbolCentral.pm +++ b/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/TribuDeLaLima/ArbolCentral.pm @@ -34,11 +34,11 @@ sub parent { return LasTres::Planet::Bahdder::BosqueDelHeroe::TribuDeLaLima->instance; } -sub actions { +sub actions($self, $pj) { return [ LasTres::PJAction::GolpearArbolCentralTribuDeLaLima->new ]; } -sub npcs { +sub npcs($self, $pj) { return [ LasTres::TalkingNPC::AncianoTribuLima->new ]; } diff --git a/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/TribuDeLaLima/Entrada.pm b/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/TribuDeLaLima/Entrada.pm index 1092211..13d91f6 100644 --- a/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/TribuDeLaLima/Entrada.pm +++ b/lib/LasTres/Planet/Bahdder/BosqueDelHeroe/TribuDeLaLima/Entrada.pm @@ -42,14 +42,6 @@ sub _build_parent { return LasTres::Planet::Bahdder::BosqueDelHeroe::TribuDeLaLima->instance; } -sub actions { - return []; -} - -sub npcs { - return []; -} - sub connected_places { return [ LasTres::Planet::Bahdder::BosqueDelHeroe::BosqueDelHeroeI::TribuDeLaLima->instance, diff --git a/lib/LasTres/Schema.pm b/lib/LasTres/Schema.pm index 5f4b060..d52e52a 100644 --- a/lib/LasTres/Schema.pm +++ b/lib/LasTres/Schema.pm @@ -5,7 +5,7 @@ use v5.36.0; use strict; use warnings; -our $VERSION = 12; +our $VERSION = 13; use feature 'signatures'; diff --git a/lib/LasTres/Schema/Result/PJ.pm b/lib/LasTres/Schema/Result/PJ.pm index f500f54..7a3adc1 100644 --- a/lib/LasTres/Schema/Result/PJ.pm +++ b/lib/LasTres/Schema/Result/PJ.pm @@ -6,9 +6,10 @@ use strict; use warnings; use feature 'signatures'; -use parent 'DBIx::Class::Core'; use utf8; +use parent 'DBIx::Class::Core'; + use UUID::URandom qw/create_uuid_string/; use List::AllUtils; use Data::Dumper; @@ -122,6 +123,8 @@ __PACKAGE__->has_many( 'logs', 'LasTres::Schema::Result::PJLog', 'owner' ); __PACKAGE__->has_many( 'known_places', 'LasTres::Schema::Result::PJKnownPlaces', 'owner' ); __PACKAGE__->has_many( 'flags', 'LasTres::Schema::Result::PJFlag', 'owner' ); +__PACKAGE__->has_many( 'known_words', 'LasTres::Schema::Result::PJKnownWord', + 'owner' ); __PACKAGE__->belongs_to( 'born_stats', 'LasTres::Schema::Result::Stats' ); __PACKAGE__->belongs_to( 'training_stats', 'LasTres::Schema::Result::Stats' ); __PACKAGE__->belongs_to( 'inventory', 'LasTres::Schema::Result::Inventory' ); @@ -131,6 +134,53 @@ __PACKAGE__->belongs_to( 'equipment', 'LasTres::Schema::Result::Equipment' ); __PACKAGE__->belongs_to( 'team', 'LasTres::Schema::Result::Team' ); __PACKAGE__->belongs_to( 'owner', 'LasTres::Schema::Result::Player' ); +sub knows_word ( $self, $word ) { + $self = $self->get_from_storage; + if ( !$word->does('LasTres::Word') ) { + die 'The received word does not implement LasTres::Word.'; + } + my @words = + $self->known_words->search( { identifier => $word->identifier } ); + if ( !scalar @words ) { + return 0; + } + return 1; +} + +sub teach_word ( $self, $word ) { + require LasTres::Schema; + my $schema = LasTres::Schema->Schema; + my $result_set_words = $schema->resultset('PJKnownWord'); + $self = $self->get_from_storage; + if ( !$word->does('LasTres::Word') ) { + die 'The received word does not implement LasTres::Word.'; + } + if ($self->knows_word($word)) { + return; + } + my $known_word = $result_set_words->new( + { identifier => $word->identifier, owner => $self->uuid } ); + $known_word->insert; + my $team = $self->team; + $team->append_log_line([ + { + color => 'green', + text => $self->nick, + }, + { + text => ' aprendió la palabra ' + }, + { + color => 'purple', + text => $word->name, + }, + { + text => '.' + } + ]); + +} + sub knows_location ( $self, $location ) { require LasTres::Schema; my $schema = LasTres::Schema->Schema; @@ -470,7 +520,7 @@ sub update_location ($self) { to_json( { command => 'update-location' } ) ); } -sub update_actions($self) { +sub update_actions ($self) { require LasTres::Redis; my $redis = LasTres::Redis->new; $redis->publish( $redis->pj_subscription($self), @@ -503,7 +553,27 @@ sub actions ($self) { return \@actions; } -sub talking_npcs($self) { +sub talk_npcs ($self) { + my @npcs; + $self = $self->get_from_storage; + my $team = $self->team; + my $location = $team->location; + if ( defined $team->battle ) { + return $self->_npc_list_to_hash( \@npcs ); + } + if ( $team->is_moving ) { + return $self->_npc_list_to_hash( \@npcs ); + } + my $location_npcs = $location->npcs($self); + @npcs = ( @npcs, @$location_npcs ); + return $self->_npc_list_to_hash( \@npcs ); +} + +sub _npc_list_to_hash ( $self, $npcs ) { + return { map { ( $_->identifier => $_ ) } @$npcs }; +} + +sub talking_npcs ($self) { return []; } diff --git a/lib/LasTres/Schema/Result/PJKnownWord.pm b/lib/LasTres/Schema/Result/PJKnownWord.pm new file mode 100644 index 0000000..bc18c83 --- /dev/null +++ b/lib/LasTres/Schema/Result/PJKnownWord.pm @@ -0,0 +1,36 @@ +package LasTres::Schema::Result::PJKnownWord; + +use v5.36.0; +use strict; +use warnings; + +use feature 'signatures'; + +use parent 'DBIx::Class::Core'; + +use Data::Dumper; + +use Moo; + +__PACKAGE__->table('player_pjs_known_words'); + +__PACKAGE__->add_columns( + identifier => { + data_type => 'text', + is_nullable => 0, + }, + owner => { + data_type => 'uuid', + is_nullable => 0, + is_foreign_key => 1, + }, +); + +__PACKAGE__->set_primary_key( 'owner', 'identifier' ); + +__PACKAGE__->belongs_to( 'owner', 'LasTres::Schema::Result::PJ' ); + +sub sqlt_deploy_hook ( $self, $sqlt_table ) { + $sqlt_table->add_index( name => 'index_known_word', fields => [qw/owner identifier/] ); +} +1; diff --git a/lib/LasTres/TalkingNPC.pm b/lib/LasTres/TalkingNPC.pm index b56f88d..f024322 100644 --- a/lib/LasTres/TalkingNPC.pm +++ b/lib/LasTres/TalkingNPC.pm @@ -24,21 +24,34 @@ requires qw/identifier name/; ## IMPLEMENTORS MUST EXTEND # sub talk($self,$pj,$word); +## DO NOT EXTEND NOT SUPPORTED. +sub hash ($self) { + return { + identifier => $self->identifier, + name => $self->name, + ( + ( defined $self->icon ) + ? ( icon => $self->icon ) + : () + ), + }; +} + ## OVERRIDE sub icon { - return undef; + return; } ## OVERRIDE sub color ( $self, $pj ) { - return 'blue',; + return 'blue'; } ## OVERRIDE # Refer to show_wordlessly_talk_started for # detail about when it is convenient to # override. -sub show_told_word($self, $pj, $word) { +sub show_told_word ( $self, $pj, $word ) { my $team = $pj->team; $team->append_log_line( [ @@ -85,7 +98,7 @@ sub show_told_word($self, $pj, $word) { # }, # { # text => ' ladra a ', -# +# # }, # { # text => $pj, @@ -97,7 +110,7 @@ sub show_told_word($self, $pj, $word) { # ] # ); # } -sub show_wordlessly_talk_started($self, $pj) { +sub show_wordlessly_talk_started ( $self, $pj ) { my $team = $pj->team; $team->append_log_line( [ @@ -133,14 +146,14 @@ sub talk ( $self, $pj, $word ) { $pj = $pj->get_from_storage; my $team = $pj->team; if ( defined $word ) { - $self->show_told_word($pj, $word); + $self->show_told_word( $pj, $word ); return; } } ## OVERRIDE -sub verb($self, $pj) { +sub verb ( $self, $pj ) { return 'dice'; } @@ -154,7 +167,8 @@ sub send_response_dialog ( $self, $pj, $array_text ) { $team->append_log_line( [ { text => $self->name($pj), color => $self->color($pj) }, - { text => " @{[$self->verb($pj)]}.- " }, @$array_text + { text => " @{[$self->verb($pj)]}.- " }, + @$array_text ] ); } @@ -162,8 +176,9 @@ sub send_response_dialog ( $self, $pj, $array_text ) { ## DO NOT EXTEND NOT SUPPORTED. { my %hash; - sub instance($class) { - if (!exists $hash{$class}) { + + sub instance ($class) { + if ( !exists $hash{$class} ) { $hash{$class} = $class->new; } return $hash{$class}; diff --git a/lib/LasTres/TalkingNPC/AncianoTribuLima.pm b/lib/LasTres/TalkingNPC/AncianoTribuLima.pm index 299aa19..61f2715 100644 --- a/lib/LasTres/TalkingNPC/AncianoTribuLima.pm +++ b/lib/LasTres/TalkingNPC/AncianoTribuLima.pm @@ -9,6 +9,8 @@ use feature 'signatures'; use Moo; +use LasTres::Flags; + with 'LasTres::TalkingNPC'; sub talk ( $self, $pj, $word ) { @@ -22,11 +24,23 @@ sub identifier { return 'anciano_tribu_de_la_lima'; } +sub icon { + return '/img/anciano.png'; +} + sub name { return 'Anciano'; } sub wordlessly_talk ( $self, $pj ) { + if ($pj->get_flag(LasTres::Flags::TALKED_WITH_OLD_MAN_AND_LEARNED_TO_SAY_DEVOTA)) { + $self->send_response_dialog([ + { + text => '¿A que esperas, ve a hablar con la Devota?' + } + ]); + return; + } $self->send_response_dialog( [ { @@ -43,5 +57,6 @@ sub wordlessly_talk ( $self, $pj ) { } ] ); + $pj->set_flag(LasTres::Flags::TALKED_WITH_OLD_MAN_AND_LEARNED_TO_SAY_DEVOTA); } 1; diff --git a/lib/LasTres/Word.pm b/lib/LasTres/Word.pm index b696358..4c98bc5 100644 --- a/lib/LasTres/Word.pm +++ b/lib/LasTres/Word.pm @@ -17,4 +17,16 @@ requires qw/name identifier/; # Identifier must be unique across words, failure # to do so can result in a error or undefined # behavior. + +## DO NOT EXTEND NOT SUPPORTED. +{ + my %hash; + + sub instance ($class) { + if ( !exists $hash{$class} ) { + $hash{$class} = $class->new; + } + return $hash{$class}; + } +} 1; diff --git a/lib/LasTres/Word/Devota.pm b/lib/LasTres/Word/Devota.pm new file mode 100644 index 0000000..3532e77 --- /dev/null +++ b/lib/LasTres/Word/Devota.pm @@ -0,0 +1,16 @@ +package LasTres::Word::Devota; + +use v5.36.0; +use strict; +use warnings; +use utf8; + +use feature 'signatures'; + +sub name { + return 'Devota'; +} + +sub identifier { + return 'devota'; +} diff --git a/public/css/styles.css b/public/css/styles.css index 172ba52..b082cfb 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -11,6 +11,48 @@ body { padding: 0px; height: 100vh; background: ghostwhite; } + body div.talk-npc div.detail { + display: flex; + flex-direction: column; + border-radius: 3px; + min-height: 100px; + border: solid 1px black; + align-items: center; + align-content: center; + justify-content: center; } + body div.talk-npc div.name-container { + display: flex; + padding: 10px; } + body div.talk-npc div.name-container div.avatar { + width: 100%; + aspect-ratio: 1/1; + border-radius: 50%; + background: lightgray; + margin-right: 2%; + display: flex; + align-items: center; + justify-content: center; + position: relative; } + body div.talk-npc div.name-container div.avatar img { + animation-name: move-avatar; + animation-duration: 0.5s; + animation-iteration-count: infinite; + width: 80%; + aspect-ratio: 1/1; + z-index: 1; } + body div.talk-npc div.name-container div.avatar div.shadow { + top: 78%; + position: absolute; + width: 50%; + aspect-ratio: 7/2; + background: darkgray; + border-radius: 50%; } + body div.talk-npc div.name-container div.name { + width: 100%; + display: flex; + align-items: center; } + body div.talk-npc div.buttons { + padding: 10px; } body label.bar-container { width: 90%; } body label.bar-container div.bar { diff --git a/public/css/styles.scss b/public/css/styles.scss index 437215f..fd1c0a0 100644 --- a/public/css/styles.scss +++ b/public/css/styles.scss @@ -14,6 +14,57 @@ body { padding: 0px; height: 100vh; background: ghostwhite; + div.talk-npc { + div.detail { + display: flex; + flex-direction: column; + border-radius: 3px; + min-height: 100px; + border: solid 1px black; + align-items: center; + align-content: center; + justify-content: center; + } + div.name-container { + display: flex; + padding: 10px; + div.avatar { + width: 100%; + aspect-ratio: 1/1; + border-radius: 50%; + background: lightgray; + margin-right: 2%; + display: flex; + align-items: center; + justify-content: center; + position: relative; + img { + animation-name: move-avatar; + animation-duration: 0.5s; + animation-iteration-count: infinite; + width: 80%; + aspect-ratio: 1/1; + z-index: 1; + } + div.shadow { + top: 78%; + position: absolute; + width: 50%; + aspect-ratio: 7/2; + background: darkgray; + border-radius: 50%; + } + } + div.name { + width: 100%; + display: flex; + align-items: center; + } + } + div.buttons { + padding: 10px; + } + } label.bar-container { width: 90%; div.bar { diff --git a/public/img/anciano.png b/public/img/anciano.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7d8e00d399d0fa7c899a654136543bf318e583 GIT binary patch literal 79858 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 { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BottomPanel)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lastres_output_packet_execute_action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/output-packet/execute_action */ \"./js-src/output-packet/execute_action.ts\");\n/* harmony import */ var _lastres_components_presentation_item__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lastres/components/presentation-item */ \"./js-src/components/presentation-item.tsx\");\n/* harmony import */ var _lastres_components_presentation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lastres/components/presentation */ \"./js-src/components/presentation.tsx\");\n\n\n\n\nfunction BottomPanel(props) {\n const actionHash = props.actionHash;\n function printListActions() {\n if (actionHash === null) {\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n }\n const listOfActionKeys = Object.keys(actionHash).sort((a, b) => {\n const isDisabledComparisionValue = +actionHash[a].is_disabled - +actionHash[b].is_disabled;\n if (isDisabledComparisionValue !== 0) {\n return isDisabledComparisionValue;\n }\n if (actionHash[a].name < actionHash[b].name) {\n return -1;\n }\n if (actionHash[a].name > actionHash[b].name) {\n return 1;\n }\n return 0;\n });\n function printDisabledReason(action) {\n if (!action.is_disabled || action.disabled_reason === null) {\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n }\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", { className: \"disabled-reason\", style: { color: 'red' } }, action.disabled_reason));\n }\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", null, \"Acciones disponibles.\"),\n listOfActionKeys.map((key) => {\n const style = {};\n const action = actionHash[key];\n if (action.is_disabled) {\n style.background = 'lightgray';\n }\n function onClick() {\n if (action.is_disabled) {\n return;\n }\n if (props.websocket !== null) {\n new _lastres_output_packet_execute_action__WEBPACK_IMPORTED_MODULE_1__[\"default\"](action.identifier)\n .send(props.websocket);\n }\n }\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"a\", { onClick: onClick, className: \"action\", style: style, key: action.identifier },\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", null, action.name),\n printDisabledReason(action));\n }));\n }\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_presentation__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_presentation_item__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, printListActions()),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_presentation_item__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_presentation_item__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null)));\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/components/bottom-panel.tsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BottomPanel)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lastres_output_packet_execute_action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/output-packet/execute_action */ \"./js-src/output-packet/execute_action.ts\");\n/* harmony import */ var _lastres_components_presentation_item__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lastres/components/presentation-item */ \"./js-src/components/presentation-item.tsx\");\n/* harmony import */ var _lastres_components_presentation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lastres/components/presentation */ \"./js-src/components/presentation.tsx\");\n\n\n\n\nfunction BottomPanel(props) {\n const actionHash = props.actionHash;\n function printListActions() {\n if (actionHash === null) {\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n }\n const listOfActionKeys = Object.keys(actionHash).sort((a, b) => {\n const isDisabledComparisionValue = +actionHash[a].is_disabled - +actionHash[b].is_disabled;\n if (isDisabledComparisionValue !== 0) {\n return isDisabledComparisionValue;\n }\n if (actionHash[a].name < actionHash[b].name) {\n return -1;\n }\n if (actionHash[a].name > actionHash[b].name) {\n return 1;\n }\n return 0;\n });\n function printDisabledReason(action) {\n if (!action.is_disabled || action.disabled_reason === null) {\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n }\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", { className: \"disabled-reason\", style: { color: 'red' } }, action.disabled_reason));\n }\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", null, \"Acciones disponibles.\"),\n listOfActionKeys.map((key) => {\n const style = {};\n const action = actionHash[key];\n if (action.is_disabled) {\n style.background = 'lightgray';\n }\n function onClick() {\n if (action.is_disabled) {\n return;\n }\n if (props.websocket !== null) {\n new _lastres_output_packet_execute_action__WEBPACK_IMPORTED_MODULE_1__[\"default\"](action.identifier)\n .send(props.websocket);\n }\n }\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"a\", { onClick: onClick, className: \"action\", style: style, key: action.identifier },\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", null, action.name),\n printDisabledReason(action));\n }));\n }\n function printAvatar(npc) {\n if (npc.icon === undefined) {\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n }\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", { className: \"avatar\" },\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"img\", { src: npc.icon }),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", { className: \"shadow\" }));\n }\n function printTalkNpcs() {\n const npcs = props.talkNPCs;\n if (npcs === null) {\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n }\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, Object.keys(npcs).map((identifier) => {\n const npc = npcs[identifier];\n return react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", { key: npc.identifier, className: \"talk-npc\" },\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", { className: \"detail\" },\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", { className: \"name-container\" },\n printAvatar(npc),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", { className: \"name\" },\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", null, npc.name))),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", { className: \"buttons\" },\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", null, \"Hablar.\"),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", null, \"Decir palabra.\"))));\n })));\n }\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_presentation__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_presentation_item__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, printListActions()),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_presentation_item__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, printTalkNpcs()),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_presentation_item__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null)));\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/components/bottom-panel.tsx?"); /***/ }), @@ -96,7 +96,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Game)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lastres_components_upper_panel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/components/upper-panel */ \"./js-src/components/upper-panel.tsx\");\n/* harmony import */ var _lastres_components_bottom_panel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lastres/components/bottom-panel */ \"./js-src/components/bottom-panel.tsx\");\n/* harmony import */ var _lastres_components_pj_selection_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lastres/components/pj-selection-menu */ \"./js-src/components/pj-selection-menu.tsx\");\n/* harmony import */ var _lastres_output_packet_init__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @lastres/output-packet/init */ \"./js-src/output-packet/init.ts\");\n/* harmony import */ var _lastres_output_packet_ping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @lastres/output-packet/ping */ \"./js-src/output-packet/ping.ts\");\n/* harmony import */ var _lastres_input_packets__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @lastres/input-packets */ \"./js-src/input-packets.ts\");\n\n\n\n\n\n\n\nfunction Game(props) {\n const selectedPJ = props.selectedPJ;\n if (selectedPJ === null) {\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_pj_selection_menu__WEBPACK_IMPORTED_MODULE_3__[\"default\"], { setSelectedPJ: props.setSelectedPJ, userWantsToCreatePJ: props.userWantsToCreatePJ, setUserWantsToCreatePJ: props.setUserWantsToCreatePJ, error: props.error, setError: props.setError })));\n }\n const [teamPJs, setTeamPJs] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [enemyTeamPJs, setEnemyTeamPJs] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [isBattling, setIsBattling] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [currentLocation, setCurrentLocation] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [connectedLocations, setConnectedLocations] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [logLines, setLogLines] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [error, setError] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [scrollLog, setScrollLog] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [movingTo, setMovingTo] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [remainingFrames, setRemainingFrames] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [actionHash, setActionHash] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const logPresentationRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n const websocket = props.websocket;\n const setWebsocket = props.setWebsocket;\n window.setTimeout(() => {\n setWebsocket((websocket) => {\n if (websocket === null) {\n console.log('Opening websocket');\n const locationProtocol = window.location.protocol;\n if (locationProtocol == null) {\n return null;\n }\n const protocol = locationProtocol.match(/https:/) != null ? 'wss' : 'ws';\n const webSocket = new WebSocket(`${protocol}://${window.location.host}/ws`);\n webSocket.onopen = () => {\n new _lastres_output_packet_init__WEBPACK_IMPORTED_MODULE_4__[\"default\"](selectedPJ.uuid).send(webSocket);\n let interval = 0;\n interval = window.setInterval(() => {\n if (webSocket.readyState === WebSocket.CONNECTING) {\n return;\n }\n if (webSocket.readyState === WebSocket.OPEN) {\n new _lastres_output_packet_ping__WEBPACK_IMPORTED_MODULE_5__[\"default\"]().send(webSocket);\n return;\n }\n window.clearInterval(interval);\n }, 1000);\n };\n const inputPackets = new _lastres_input_packets__WEBPACK_IMPORTED_MODULE_6__[\"default\"](setTeamPJs, setEnemyTeamPJs, setIsBattling, setCurrentLocation, setConnectedLocations, logLines, setLogLines, setError, setScrollLog, logPresentationRef, setMovingTo, setRemainingFrames, setActionHash);\n webSocket.onmessage = (event) => {\n const packet = JSON.parse(event.data);\n inputPackets.handle(packet);\n };\n webSocket.onerror = (event) => {\n console.log(event);\n };\n webSocket.onclose = (event) => {\n console.log('Websocket closed');\n setWebsocket(null);\n };\n return webSocket;\n }\n return websocket;\n });\n }, 300);\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_upper_panel__WEBPACK_IMPORTED_MODULE_1__[\"default\"], { teamPJs: teamPJs, enemyTeamPJs: enemyTeamPJs, isBattling: isBattling, currentLocation: currentLocation, connectedLocations: connectedLocations, logLines: logLines, websocket: websocket, logPresentationRef: logPresentationRef, movingTo: movingTo, remainingFrames: remainingFrames }),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_bottom_panel__WEBPACK_IMPORTED_MODULE_2__[\"default\"], { actionHash: actionHash, websocket: websocket })));\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/components/game.tsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Game)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lastres_components_upper_panel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/components/upper-panel */ \"./js-src/components/upper-panel.tsx\");\n/* harmony import */ var _lastres_components_bottom_panel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lastres/components/bottom-panel */ \"./js-src/components/bottom-panel.tsx\");\n/* harmony import */ var _lastres_components_pj_selection_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lastres/components/pj-selection-menu */ \"./js-src/components/pj-selection-menu.tsx\");\n/* harmony import */ var _lastres_output_packet_init__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @lastres/output-packet/init */ \"./js-src/output-packet/init.ts\");\n/* harmony import */ var _lastres_output_packet_ping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @lastres/output-packet/ping */ \"./js-src/output-packet/ping.ts\");\n/* harmony import */ var _lastres_input_packets__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @lastres/input-packets */ \"./js-src/input-packets.ts\");\n\n\n\n\n\n\n\nfunction Game(props) {\n const selectedPJ = props.selectedPJ;\n if (selectedPJ === null) {\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_pj_selection_menu__WEBPACK_IMPORTED_MODULE_3__[\"default\"], { setSelectedPJ: props.setSelectedPJ, userWantsToCreatePJ: props.userWantsToCreatePJ, setUserWantsToCreatePJ: props.setUserWantsToCreatePJ, error: props.error, setError: props.setError })));\n }\n const [teamPJs, setTeamPJs] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [enemyTeamPJs, setEnemyTeamPJs] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [isBattling, setIsBattling] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [currentLocation, setCurrentLocation] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [connectedLocations, setConnectedLocations] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [logLines, setLogLines] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [error, setError] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [scrollLog, setScrollLog] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [movingTo, setMovingTo] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [remainingFrames, setRemainingFrames] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [actionHash, setActionHash] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [talkNPCs, setTalkNPCs] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const logPresentationRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n const websocket = props.websocket;\n const setWebsocket = props.setWebsocket;\n window.setTimeout(() => {\n setWebsocket((websocket) => {\n if (websocket === null) {\n console.log('Opening websocket');\n const locationProtocol = window.location.protocol;\n if (locationProtocol == null) {\n return null;\n }\n const protocol = locationProtocol.match(/https:/) != null ? 'wss' : 'ws';\n const webSocket = new WebSocket(`${protocol}://${window.location.host}/ws`);\n webSocket.onopen = () => {\n new _lastres_output_packet_init__WEBPACK_IMPORTED_MODULE_4__[\"default\"](selectedPJ.uuid).send(webSocket);\n let interval = 0;\n interval = window.setInterval(() => {\n if (webSocket.readyState === WebSocket.CONNECTING) {\n return;\n }\n if (webSocket.readyState === WebSocket.OPEN) {\n new _lastres_output_packet_ping__WEBPACK_IMPORTED_MODULE_5__[\"default\"]().send(webSocket);\n return;\n }\n window.clearInterval(interval);\n }, 100000);\n };\n const inputPackets = new _lastres_input_packets__WEBPACK_IMPORTED_MODULE_6__[\"default\"](setTeamPJs, setEnemyTeamPJs, setIsBattling, setCurrentLocation, setConnectedLocations, logLines, setLogLines, setError, setScrollLog, logPresentationRef, setMovingTo, setRemainingFrames, setActionHash, setTalkNPCs);\n webSocket.onmessage = (event) => {\n const packet = JSON.parse(event.data);\n inputPackets.handle(packet);\n };\n webSocket.onerror = (event) => {\n console.log(event);\n };\n webSocket.onclose = (event) => {\n console.log('Websocket closed');\n setWebsocket(null);\n };\n return webSocket;\n }\n return websocket;\n });\n }, 300);\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_upper_panel__WEBPACK_IMPORTED_MODULE_1__[\"default\"], { teamPJs: teamPJs, enemyTeamPJs: enemyTeamPJs, isBattling: isBattling, currentLocation: currentLocation, connectedLocations: connectedLocations, logLines: logLines, websocket: websocket, logPresentationRef: logPresentationRef, movingTo: movingTo, remainingFrames: remainingFrames }),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_bottom_panel__WEBPACK_IMPORTED_MODULE_2__[\"default\"], { actionHash: actionHash, websocket: websocket, talkNPCs: talkNPCs })));\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/components/game.tsx?"); /***/ }), @@ -266,7 +266,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InputPackets)\n/* harmony export */ });\n/* harmony import */ var _lastres_input_packet_info__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lastres/input-packet/info */ \"./js-src/input-packet/info.ts\");\n/* harmony import */ var _lastres_input_packet_pong__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/input-packet/pong */ \"./js-src/input-packet/pong.ts\");\n\n\nclass InputPackets {\n constructor(setTeamPJs, setEnemyTeamPJs, setIsBattling, setCurrentLocation, setConnectedLocations, logLines, setLogLines, setError, setScrollLog, logPresentationRef, setMovingTo, setRemainingFrames, setActionHash) {\n this.cachedHash = null;\n this.cachedArray = null;\n this.setTeamPJs = setTeamPJs;\n this.setEnemyTeamPJs = setEnemyTeamPJs;\n this.setCurrentLocation = setCurrentLocation;\n this.setConnectedLocations = setConnectedLocations;\n this.logLines = logLines;\n this.setLogLines = setLogLines;\n this.setError = setError;\n this.setScrollLog = setScrollLog;\n this.logPresentationRef = logPresentationRef;\n this.setMovingTo = setMovingTo;\n this.setRemainingFrames = setRemainingFrames;\n this.setIsBattling = setIsBattling;\n this.setActionHash = setActionHash;\n }\n handle(packet) {\n const hash = this.hashAvailablePackets();\n const identifier = packet.command;\n const inputPacket = hash[identifier];\n inputPacket.recv(packet);\n }\n listAvailablePackets() {\n let firstTime = true;\n if (this.cachedArray === null) {\n const infoPacket = new _lastres_input_packet_info__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n const pongPacket = new _lastres_input_packet_pong__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n infoPacket.onReceive((data) => {\n const logPresentationRef = this.logPresentationRef;\n let scrollData = [];\n function saveScroll() {\n if (logPresentationRef.current === null) {\n return;\n }\n scrollData = [\n logPresentationRef.current.scrollHeight,\n logPresentationRef.current.scrollTop,\n logPresentationRef.current.offsetHeight\n ];\n }\n function applyScroll() {\n if (scrollData.length < 3) {\n return;\n }\n if (logPresentationRef.current === null) {\n console.log('Not defined');\n return;\n }\n const logPresentation = logPresentationRef.current;\n const [scrollHeight, scrollTop, offsetHeight] = scrollData;\n if (firstTime) {\n firstTime = false;\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n return;\n }\n if (scrollHeight <= scrollTop + offsetHeight * (3 / 2)) {\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n }\n }\n if (data.error !== undefined) {\n this.setError(data.error);\n return;\n }\n if (data.team_pjs !== undefined) {\n this.setTeamPJs(data.team_pjs);\n }\n if (data.enemy_team_pjs !== undefined) {\n this.setEnemyTeamPJs(data.enemy_team_pjs);\n }\n if (data.is_battling !== undefined) {\n this.setIsBattling(data.is_battling);\n }\n if (data.location_data !== undefined) {\n console.log(data.location_data);\n if (data.location_data.connected_places !== undefined) {\n this.setConnectedLocations(data.location_data.connected_places);\n }\n if (data.location_data.current !== undefined) {\n this.setCurrentLocation(data.location_data.current);\n }\n if (data.location_data.moving_to !== undefined) {\n this.setMovingTo(data.location_data.moving_to);\n }\n else {\n this.setMovingTo(null);\n }\n }\n if (data.remaining_frames !== undefined) {\n this.setRemainingFrames(data.remaining_frames);\n }\n if (data.set_log !== undefined) {\n saveScroll();\n this.setLogLines(data.set_log);\n window.setTimeout(() => {\n applyScroll();\n }, 10);\n }\n if (data.append_log !== undefined) {\n const logHash = {};\n saveScroll();\n this.setLogLines((logLines) => {\n if (logLines !== null) {\n for (const item of logLines) {\n logHash[item.uuid] = item;\n }\n logHash[data.append_log.uuid] = data.append_log;\n const outputLog = Object.keys(logHash).map((item, i) => {\n return logHash[item];\n });\n return outputLog;\n }\n return [];\n });\n window.setTimeout(() => {\n applyScroll();\n }, 10);\n }\n if (data.available_actions !== undefined) {\n this.setActionHash(data.available_actions);\n }\n });\n this.cachedArray = [infoPacket, pongPacket];\n }\n return this.cachedArray;\n }\n hashAvailablePackets() {\n if (this.cachedHash === null) {\n this.cachedHash = {};\n for (const inputPacket of this.listAvailablePackets()) {\n this.cachedHash[inputPacket.identifier()] = inputPacket;\n }\n }\n return this.cachedHash;\n }\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/input-packets.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InputPackets)\n/* harmony export */ });\n/* harmony import */ var _lastres_input_packet_info__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lastres/input-packet/info */ \"./js-src/input-packet/info.ts\");\n/* harmony import */ var _lastres_input_packet_pong__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/input-packet/pong */ \"./js-src/input-packet/pong.ts\");\n\n\nclass InputPackets {\n constructor(setTeamPJs, setEnemyTeamPJs, setIsBattling, setCurrentLocation, setConnectedLocations, logLines, setLogLines, setError, setScrollLog, logPresentationRef, setMovingTo, setRemainingFrames, setActionHash, setTalkNPCs) {\n this.cachedHash = null;\n this.cachedArray = null;\n this.setTeamPJs = setTeamPJs;\n this.setEnemyTeamPJs = setEnemyTeamPJs;\n this.setCurrentLocation = setCurrentLocation;\n this.setConnectedLocations = setConnectedLocations;\n this.logLines = logLines;\n this.setLogLines = setLogLines;\n this.setError = setError;\n this.setScrollLog = setScrollLog;\n this.logPresentationRef = logPresentationRef;\n this.setMovingTo = setMovingTo;\n this.setRemainingFrames = setRemainingFrames;\n this.setIsBattling = setIsBattling;\n this.setActionHash = setActionHash;\n this.setTalkNPCs = setTalkNPCs;\n }\n handle(packet) {\n const hash = this.hashAvailablePackets();\n const identifier = packet.command;\n const inputPacket = hash[identifier];\n inputPacket.recv(packet);\n }\n listAvailablePackets() {\n let firstTime = true;\n if (this.cachedArray === null) {\n const infoPacket = new _lastres_input_packet_info__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n const pongPacket = new _lastres_input_packet_pong__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n infoPacket.onReceive((data) => {\n const logPresentationRef = this.logPresentationRef;\n let scrollData = [];\n function saveScroll() {\n if (logPresentationRef.current === null) {\n return;\n }\n scrollData = [\n logPresentationRef.current.scrollHeight,\n logPresentationRef.current.scrollTop,\n logPresentationRef.current.offsetHeight\n ];\n }\n function applyScroll() {\n if (scrollData.length < 3) {\n return;\n }\n if (logPresentationRef.current === null) {\n console.log('Not defined');\n return;\n }\n const logPresentation = logPresentationRef.current;\n const [scrollHeight, scrollTop, offsetHeight] = scrollData;\n if (firstTime) {\n firstTime = false;\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n return;\n }\n if (scrollHeight <= scrollTop + offsetHeight * (3 / 2)) {\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n }\n }\n if (data.error !== undefined) {\n this.setError(data.error);\n return;\n }\n if (data.team_pjs !== undefined) {\n this.setTeamPJs(data.team_pjs);\n }\n if (data.enemy_team_pjs !== undefined) {\n this.setEnemyTeamPJs(data.enemy_team_pjs);\n }\n if (data.is_battling !== undefined) {\n this.setIsBattling(data.is_battling);\n }\n if (data.location_data !== undefined) {\n console.log(data.location_data);\n if (data.location_data.connected_places !== undefined) {\n this.setConnectedLocations(data.location_data.connected_places);\n }\n if (data.location_data.current !== undefined) {\n this.setCurrentLocation(data.location_data.current);\n }\n if (data.location_data.moving_to !== undefined) {\n this.setMovingTo(data.location_data.moving_to);\n }\n else {\n this.setMovingTo(null);\n }\n }\n if (data.npcs !== undefined) {\n this.setTalkNPCs(data.npcs);\n }\n if (data.remaining_frames !== undefined) {\n this.setRemainingFrames(data.remaining_frames);\n }\n if (data.set_log !== undefined) {\n saveScroll();\n this.setLogLines(data.set_log);\n window.setTimeout(() => {\n applyScroll();\n }, 10);\n }\n if (data.append_log !== undefined) {\n const logHash = {};\n saveScroll();\n this.setLogLines((logLines) => {\n if (logLines !== null) {\n for (const item of logLines) {\n logHash[item.uuid] = item;\n }\n logHash[data.append_log.uuid] = data.append_log;\n const outputLog = Object.keys(logHash).map((item, i) => {\n return logHash[item];\n });\n return outputLog;\n }\n return [];\n });\n window.setTimeout(() => {\n applyScroll();\n }, 10);\n }\n if (data.available_actions !== undefined) {\n this.setActionHash(data.available_actions);\n }\n });\n this.cachedArray = [infoPacket, pongPacket];\n }\n return this.cachedArray;\n }\n hashAvailablePackets() {\n if (this.cachedHash === null) {\n this.cachedHash = {};\n for (const inputPacket of this.listAvailablePackets()) {\n this.cachedHash[inputPacket.identifier()] = inputPacket;\n }\n }\n return this.cachedHash;\n }\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/input-packets.ts?"); /***/ }),