Adding Veterano Calizor and Casa de Piedra.

This commit is contained in:
Sergiotarxz 2023-07-15 09:11:12 +02:00
parent 8dbca09bd1
commit f124fcd2f8
10 changed files with 299 additions and 29 deletions

View File

@ -18,7 +18,7 @@ export default function PJListItem (props: PJListItemProps): JSX.Element {
return <></>
}
return (
<p>Experiencia: <span style={{ color: 'red' }}>{pj.experience_to_next_level_current}</span>
<p>Exp <span style={{ color: 'red' }}>{pj.experience_to_next_level_current}</span>
/<span style={{ color: 'green' }}>{pj.experience_to_next_level_complete}</span></p>
)
}
@ -30,17 +30,15 @@ export default function PJListItem (props: PJListItemProps): JSX.Element {
}
</div>
<div className="data">
<p>{pj.nick} Nivel <span style={{ color: 'red' }}>{pj.level}.</span></p>
<p>{pj.nick} Nvl <span style={{ color: 'red' }}>{pj.level}.</span></p>
{
printExperience()
}
<label className="bar-container">
Salud
<PJHealthLikeBar value={pj.health} max={pj.max_health}/>
S <PJHealthLikeBar value={pj.health} max={pj.max_health}/>
</label>
<label className="bar-container">
Mana
<PJHealthLikeBar value={pj.mana} max={pj.max_mana}/>
M <PJHealthLikeBar value={pj.mana} max={pj.max_mana}/>
</label>
</div>
</div>

View File

@ -101,7 +101,7 @@ export default function UpperPanel (props: UpperPanelProps): JSX.Element {
function showThirdPanel (): JSX.Element {
if (isBattling === null || !isBattling || enemyTeamPJs === null) {
return (
<>
<div className="movement-menu">
{
showLocationMenuHeaderText()
}
@ -111,7 +111,7 @@ export default function UpperPanel (props: UpperPanelProps): JSX.Element {
{
availableLocationsToMove()
}
</>
</div>
)
}
return (

View File

@ -11,4 +11,7 @@ sub INTRO_MESSAGE_SENT_FLAG {
sub TALKED_WITH_OLD_MAN_AND_LEARNED_TO_SAY_DEVOTA {
return 'TALKED_WITH_OLD_MAN_AND_LEARNED_TO_SAY_DEVOTA';
}
sub TALKED_FIRST_TIME_VETERANO_CALIZOR {
return 'TALKED_FIRST_TIME_VETERANO_CALIZOR';
}
1;

View File

@ -0,0 +1,69 @@
package LasTres::Planet::Bahdder::BosqueDelHeroe::TribuDeLaLima::CasaDePiedra;
use v5.36.0;
use strict;
use warnings;
use feature 'signatures';
use utf8;
use Moo;
use LasTres::Planet::Bahdder::BosqueDelHeroe::TribuDeLaLima;
use LasTres::TalkingNPC::VeteranoCalizor;
with 'LasTres::Location';
sub identifier {
return 'casa_de_piedra';
}
sub name {
return 'Casa de piedra';
}
sub description($self, $pj = undef) {
return $self->first_description;
}
sub first_description($self) {
return
'Esta casa la construyo Veterano Cálizor cuando se vino a vivir a la tribu tras terminar la guerra, varias personas de la tribu viven aquí al haber ayudado durante su construcción, si estás buscando a Devota, Bruto o Veterano existe la posibilidad de que estén aquí.
Algunos la llaman la Casa de los Líderes porque tanto Veterano como Devota fueron líderes de la tribu; no obstante el líder actual no reside aquí.
La casa es monumental para los estándares del bosque.';
}
sub parent {
return LasTres::Planet::Bahdder::BosqueDelHeroe::TribuDeLaLima->instance;
}
sub actions($self, $pj) {
return [ ];
}
sub npcs($self, $pj) {
return [ LasTres::TalkingNPC::VeteranoCalizor->instance ];
}
sub connected_places {
return [];
}
my $singleton;
sub instance {
my $class = shift;
if ( !defined $singleton ) {
$singleton = $class->new(@_);
}
return $singleton;
}
sub is_spawn {
return 0;
}
1;

View File

@ -0,0 +1,133 @@
package LasTres::TalkingNPC::VeteranoCalizor;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Moo;
use LasTres::Flags;
use LasTres::Word::Devota;
use LasTres::Word::Ayazel;
use parent 'LasTres::TalkingNPC';
sub talk ( $self, $pj, $word = undef ) {
$self->SUPER::talk( $pj, $word );
if ( !defined $word ) {
$self->wordlessly_talk($pj);
return;
}
$self->word_talk($pj, $word);
}
sub word_talk($self, $pj, $word) {
require LasTres::Word::Devota;
if ($word->identifier eq LasTres::Word::Devota->instance->identifier) {
$self->word_devota($pj);
return;
}
if ($word->identifier eq LasTres::Word::Ayazel->instance->identifier) {
$self->word_ayazel($pj);
return;
}
$self->word_unknown($pj);
}
sub word_devota($self, $pj) {
$self->send_response_dialog(
$pj,
[
{
text => '¿Buscas a mi esposa? Seguramente este rezando o junto a ese'
. ' chamán de pacotilla, suele rezar en ese pequeño santuario a'
. ' Ayazel, visitalo ahora que todavía sigue en pie...'
. ' Maldito sea el día que le enseñé a la gente a edificar'
. ' en piedra.'
}
]
);
$pj->teach_word( LasTres::Word::Ayazel->instance );
}
sub word_ayazel($self, $pj) {
$self->send_response_dialog(
$pj,
[
{
text => 'Eso de la Diosa de la Luna me parece una tontería, no me'
. ' creo ni una palabra y ese chamán es un charlantán, pero creo'
. ' que algo tiene que haber. Los cálizor tenemos nuestro propio Dios y'
. ' es mucho más interesante que esa Diosa. ¿Qué nos importa'
. ' lo que pase en la Luna si vivimos en tierra firme?'
}
]
);
}
sub word_unknown($self, $pj) {
$self->send_response_dialog(
$pj,
[
{
text => 'Mmmm, me lo tengo que pensar.'
}
]
);
}
sub identifier {
return 'veterano_calizor_tribu_de_la_lima';
}
# sub icon {
# return '/img/anciano.png';
# }
sub name {
return 'Veterano Cálizor';
}
sub verb ( $self, $pj ) {
return 'vocifera';
}
sub wordlessly_talk ( $self, $pj ) {
if ($pj->get_flag(LasTres::Flags::TALKED_FIRST_TIME_VETERANO_CALIZOR)) {
$self->send_response_dialog(
$pj,
[
{
text => 'Echo de menos la cerveza de mi tierra, pero no volvería allí ni'
. ' loco, y eso a pesar de esos malditos conejos que no nos dejan vivir.'
}
]
);
return;
}
$self->send_response_dialog(
$pj,
[
{
text => (
'¿Ya te quieres marchar de la tribu hacia la torre?'
. ' ¡Qué rápido creceis los jovenes!'
. ' ¡Cuando te conocí me llegabas por aquí!.- Con su mano se señala la rodilla.-'
. ' Este bosque es un lugar peligroso y endiablado, deberías quedarte aquí,'
. ' tendrías más seguridad y harías feliz a este pobre viejo.'
. ' ¿Qué ya lo tienes decidido? No puedo hacer nada para'
. ' evitar que persigas tus sueños, en ese caso ven a buscarme'
. ' más tarde, estoy preparandote una sorpresa que quizás'
. ' te proteja aunque yo no esté.'
)
}
]
);
$pj->set_flag(LasTres::Flags::TALKED_FIRST_TIME_VETERANO_CALIZOR);
}
1;

View File

@ -0,0 +1,21 @@
package LasTres::Word::Ayazel;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Moo;
with 'LasTres::Word';
sub name {
return 'Ayazel';
}
sub identifier {
return 'ayazel';
}
1;

View File

@ -1,3 +1,6 @@
html, body {
overscroll-behavior-y: contain; }
@keyframes move-avatar {
0% {
padding-bottom: 0rem; }
@ -9,7 +12,7 @@
body {
margin: 0px;
padding: 0px;
height: 100vh;
height: 100%;
background: ghostwhite; }
body div.talk-npc div.detail {
display: flex;
@ -22,9 +25,11 @@ body {
justify-content: center; }
body div.talk-npc div.name-container {
display: flex;
padding: 10px; }
padding: 10px;
align-items: center; }
body div.talk-npc div.name-container div.avatar {
width: 100%;
max-width: 60%;
max-height: 8rem;
aspect-ratio: 1/1;
border-radius: 50%;
background: lightgray;
@ -49,6 +54,7 @@ body {
border-radius: 50%; }
body div.talk-npc div.name-container div.name {
width: 100%;
font-size: 0.85rem;
display: flex;
align-items: center; }
body div.talk-npc div.buttons {
@ -56,6 +62,7 @@ body {
body label.bar-container {
width: 90%; }
body label.bar-container div.bar {
margin-left: 3px;
width: 100%;
height: 1em;
border: solid 1px black; }
@ -75,9 +82,14 @@ body {
text-decoration: none; }
body div.pj-list-item {
display: flex;
font-size: 0.85rem;
align-items: center; }
body div.pj-list-item label.bar-container {
display: flex;
font-family: monospace; }
body div.pj-list-item div.avatar {
width: 30%;
max-width: 60%;
max-height: 8rem;
aspect-ratio: 1/1;
border-radius: 50%;
background: lightgray;
@ -101,20 +113,29 @@ body {
background: darkgray;
border-radius: 50%; }
body div.pj-list-item div.data {
width: 60%; }
width: 50%; }
body div.pj-list-item div.data p {
margin: 0; }
body div.presentation {
display: flex;
flex-direction: row;
width: 95%;
justify-content: center;
height: 50vh; }
height: 50%; }
body div.presentation div.presentation-item {
margin: 1%;
width: 30%;
font-size: 30px;
font-size: 1.7rem;
overflow-y: scroll; }
body div.presentation div.presentation-item code pre {
body div.presentation div.presentation-item * {
overflow-wrap: break-word;
white-space: pre-wrap; }
body div.presentation div.presentation-item code {
overflow-wrap: break-word; }
body div.presentation div.presentation-item code pre {
white-space: pre-wrap; }
body div.presentation div.presentation-item div.movement-menu {
font-size: 15px; }
body div.width-max-content {
width: max-content; }
body div#game-container {
@ -261,7 +282,7 @@ body {
color: black;
display: flex;
border: 1px solid black;
font-size: 30px;
font-size: 1.7rem;
height: 50px;
text-align: center;
flex-direction: column;

View File

@ -1,3 +1,7 @@
html, body {
overscroll-behavior-y: contain;
}
$padding_select_word: 10px;
@keyframes move-avatar {
0% {
@ -13,7 +17,7 @@ $padding_select_word: 10px;
body {
margin: 0px;
padding: 0px;
height: 100vh;
height: 100%;
background: ghostwhite;
div.talk-npc {
div.detail {
@ -29,8 +33,10 @@ body {
div.name-container {
display: flex;
padding: 10px;
align-items: center;
div.avatar {
width: 100%;
max-width: 60%;
max-height: 8rem;
aspect-ratio: 1/1;
border-radius: 50%;
background: lightgray;
@ -58,6 +64,7 @@ body {
}
div.name {
width: 100%;
font-size: 0.85rem;
display: flex;
align-items: center;
}
@ -69,6 +76,7 @@ body {
label.bar-container {
width: 90%;
div.bar {
margin-left: 3px;
width: 100%;
height: 1em;
border: solid 1px black;
@ -93,9 +101,15 @@ body {
}
div.pj-list-item {
display: flex;
font-size: 0.85rem;
align-items: center;
label.bar-container {
display: flex;
font-family: monospace;
}
div.avatar {
width: 30%;
max-width: 60%;
max-height: 8rem;
aspect-ratio: 1/1;
border-radius: 50%;
background: lightgray;
@ -122,7 +136,10 @@ body {
}
}
div.data {
width: 60%;
width: 50%;
p {
margin: 0;
}
}
}
@ -132,17 +149,25 @@ body {
width: 95%;
justify-content: center;
div.presentation-item {
* {
overflow-wrap: break-word;
white-space: pre-wrap;
}
code {
overflow-wrap: break-word;
pre {
white-space: pre-wrap;
}
}
margin: 1%;
width: 30%;
font-size: 30px;
font-size: 1.7rem;
overflow-y: scroll;
div.movement-menu {
font-size: 15px;
}
}
height: 50vh;
height: 50%;
}
div.width-max-content {
@ -317,7 +342,7 @@ body {
color: black;
display: flex;
border: 1px solid black;
font-size: 30px;
font-size: 1.7rem;
height: 50px;
text-align: center;
flex-direction: column;

File diff suppressed because one or more lines are too long

View File

@ -1,13 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="/css/styles.css"/>
<link rel="stylesheet" href="/css/styles.css?id=<%=int(rand(1000000))%>"/>
<meta name="viewport" content="height = device-height,
width = device-width,
initial-scale = 1.0,
minimum-scale = 1.0,
maximum-scale = 1.0,
user-scalable = no,
user-scalable = yes,
target-densitydpi = device-dpi"/>
</head>
<body>
@ -16,6 +16,6 @@
</noscript>
<div id="game-container">
</div>
<script src="/js/bundle.js"></script>
<script src="/js/bundle.js?id=<%=int(rand(1000000))%>"></script>
</body>
</html>