mirror of
https://github.com/Nioux/AideDeJeu.git
synced 2025-10-29 14:35:45 +00:00
Merge branch 'master' of https://github.com/Nioux/AideDeJeu
This commit is contained in:
commit
97ae49ed5c
880 changed files with 150112 additions and 8110 deletions
|
|
@ -81,13 +81,13 @@
|
|||
<Version>1.6.258-beta</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="SQLitePCLRaw.bundle_green">
|
||||
<Version>1.1.13</Version>
|
||||
<Version>1.1.14</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="SQLitePCLRaw.core">
|
||||
<Version>1.1.13</Version>
|
||||
<Version>1.1.14</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="SQLitePCLRaw.lib.e_sqlite3.linux">
|
||||
<Version>1.1.13</Version>
|
||||
<Version>1.1.14</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="System.Buffers">
|
||||
<Version>4.5.0</Version>
|
||||
|
|
@ -96,10 +96,10 @@
|
|||
<Version>1.1.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Forms">
|
||||
<Version>4.0.0.425677</Version>
|
||||
<Version>4.0.0.497661</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Forms.Visual.Material">
|
||||
<Version>4.0.0.425677</Version>
|
||||
<Version>4.0.0.497661</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="XamiTextSharpLGPLv2">
|
||||
<Version>1.0.0</Version>
|
||||
|
|
@ -432,8 +432,21 @@
|
|||
<AndroidAsset Include="Assets\pdfjs\web\locale\zh-CN\viewer.properties" />
|
||||
<AndroidAsset Include="Assets\pdfjs\web\locale\zh-TW\viewer.properties" />
|
||||
<AndroidAsset Include="Assets\pdfjs\web\locale\zu\viewer.properties" />
|
||||
<AndroidAsset Include="Assets\MarcellusSC-Regular.ttf" />
|
||||
<AndroidAsset Include="Assets\Cinzel-Black.otf" />
|
||||
<AndroidAsset Include="Assets\Cinzel-Bold.otf" />
|
||||
<AndroidAsset Include="Assets\CinzelDecorative-Black.otf" />
|
||||
<AndroidAsset Include="Assets\CinzelDecorative-Bold.otf" />
|
||||
<AndroidAsset Include="Assets\CinzelDecorative-Regular.otf" />
|
||||
<AndroidAsset Include="Assets\Cinzel-Regular.otf" />
|
||||
<None Include="Resources\AboutResources.txt" />
|
||||
<None Include="Assets\AboutAssets.txt" />
|
||||
<AndroidResource Include="Resources\font\cinzel_black.otf" />
|
||||
<AndroidResource Include="Resources\font\cinzel_bold.otf" />
|
||||
<AndroidResource Include="Resources\font\cinzel_regular.otf" />
|
||||
<AndroidResource Include="Resources\font\cinzeldecorative_black.otf" />
|
||||
<AndroidResource Include="Resources\font\cinzeldecorative_bold.otf" />
|
||||
<AndroidResource Include="Resources\font\cinzeldecorative_regular.otf" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\icon.png" />
|
||||
|
|
|
|||
BIN
AideDeJeu/AideDeJeu.Android/Assets/Cinzel-Black.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Assets/Cinzel-Black.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.Android/Assets/Cinzel-Bold.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Assets/Cinzel-Bold.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.Android/Assets/Cinzel-Regular.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Assets/Cinzel-Regular.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.Android/Assets/CinzelDecorative-Black.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Assets/CinzelDecorative-Black.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.Android/Assets/CinzelDecorative-Bold.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Assets/CinzelDecorative-Bold.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.Android/Assets/CinzelDecorative-Regular.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Assets/CinzelDecorative-Regular.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.Android/Assets/MarcellusSC-Regular.ttf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Assets/MarcellusSC-Regular.ttf
Normal file
Binary file not shown.
|
|
@ -6,6 +6,8 @@ using Android.Runtime;
|
|||
using Android.Views;
|
||||
using Android.Widget;
|
||||
using Android.OS;
|
||||
using System.Threading.Tasks;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace AideDeJeu.Droid
|
||||
{
|
||||
|
|
@ -19,6 +21,10 @@ namespace AideDeJeu.Droid
|
|||
ToolbarResource = Resource.Layout.Toolbar;
|
||||
|
||||
base.OnCreate(bundle);
|
||||
|
||||
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
|
||||
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
|
||||
|
||||
Xamarin.Essentials.Platform.Init(this, bundle);
|
||||
Xamarin.Essentials.ExperimentalFeatures.Enable(Xamarin.Essentials.ExperimentalFeatures.ShareFileRequest);
|
||||
|
||||
|
|
@ -30,6 +36,8 @@ namespace AideDeJeu.Droid
|
|||
//global::Xamarin.Forms.FormsMaterial.Init(this, bundle);
|
||||
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());
|
||||
|
||||
DisplayCrashReport();
|
||||
|
||||
LoadApplication(new App());
|
||||
}
|
||||
|
||||
|
|
@ -52,6 +60,71 @@ namespace AideDeJeu.Droid
|
|||
|
||||
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
}
|
||||
|
||||
|
||||
private static void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs)
|
||||
{
|
||||
var newExc = new Exception("TaskSchedulerOnUnobservedTaskException", unobservedTaskExceptionEventArgs.Exception);
|
||||
LogUnhandledException(newExc);
|
||||
}
|
||||
|
||||
private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
|
||||
{
|
||||
var newExc = new Exception("CurrentDomainOnUnhandledException", unhandledExceptionEventArgs.ExceptionObject as Exception);
|
||||
LogUnhandledException(newExc);
|
||||
}
|
||||
|
||||
internal static void LogUnhandledException(Exception exception)
|
||||
{
|
||||
try
|
||||
{
|
||||
const string errorFileName = "Fatal.log";
|
||||
var libraryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); // iOS: Environment.SpecialFolder.Resources
|
||||
var errorFilePath = System.IO.Path.Combine(libraryPath, errorFileName);
|
||||
var errorMessage = String.Format("Time: {0}\r\nError: Unhandled Exception\r\n{1}",
|
||||
DateTime.Now, exception.ToString());
|
||||
System.IO.File.WriteAllText(errorFilePath, errorMessage);
|
||||
|
||||
// Log to Android Device Logging.
|
||||
Android.Util.Log.Error("Crash Report", errorMessage);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// just suppress any error logging exceptions
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
// If there is an unhandled exception, the exception information is diplayed
|
||||
// on screen the next time the app is started (only in debug configuration)
|
||||
/// </summary>
|
||||
[Conditional("DEBUG")]
|
||||
private void DisplayCrashReport()
|
||||
{
|
||||
const string errorFilename = "Fatal.log";
|
||||
var libraryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
|
||||
var errorFilePath = System.IO.Path.Combine(libraryPath, errorFilename);
|
||||
|
||||
if (!System.IO.File.Exists(errorFilePath))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var errorText = System.IO.File.ReadAllText(errorFilePath);
|
||||
new AlertDialog.Builder(this)
|
||||
.SetPositiveButton("Clear", (sender, args) =>
|
||||
{
|
||||
System.IO.File.Delete(errorFilePath);
|
||||
})
|
||||
.SetNegativeButton("Close", (sender, args) =>
|
||||
{
|
||||
// User pressed Close.
|
||||
})
|
||||
.SetMessage(errorText)
|
||||
.SetTitle("Crash Report")
|
||||
.Show();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
5533
AideDeJeu/AideDeJeu.Android/Resources/Resource.designer.cs
generated
5533
AideDeJeu/AideDeJeu.Android/Resources/Resource.designer.cs
generated
File diff suppressed because it is too large
Load diff
BIN
AideDeJeu/AideDeJeu.Android/Resources/font/cinzel_black.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Resources/font/cinzel_black.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.Android/Resources/font/cinzel_bold.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Resources/font/cinzel_bold.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.Android/Resources/font/cinzel_regular.otf
Normal file
BIN
AideDeJeu/AideDeJeu.Android/Resources/font/cinzel_regular.otf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -8,4 +8,5 @@
|
|||
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
|
||||
app:tabIndicatorColor="@color/HDRed"
|
||||
app:tabGravity="fill"
|
||||
app:tabMode="scrollable" />
|
||||
app:tabMode="scrollable"
|
||||
app:tabTextAppearance="@style/TabBar.TitleText"/>
|
||||
|
|
|
|||
|
|
@ -1,9 +1,12 @@
|
|||
<android.support.v7.widget.Toolbar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/colorPrimary"
|
||||
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
|
||||
android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
|
||||
android:popupTheme="@style/ThemeOverlay.AppCompat.Light"
|
||||
app:titleTextAppearance="@style/Toolbar.TitleText"
|
||||
/>
|
||||
|
||||
|
|
|
|||
|
|
@ -42,4 +42,14 @@
|
|||
<style name="MyTheme.Splash" parent="MainTheme">
|
||||
<item name="android:windowBackground">@drawable/splash</item>
|
||||
</style>
|
||||
|
||||
<style name="Toolbar.TitleText" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
|
||||
<!--set your custom font properties-->
|
||||
<item name="android:fontFamily">@font/cinzel_bold</item>
|
||||
</style>
|
||||
|
||||
<style name="TabBar.TitleText" parent="TextAppearance.Design.Tab">
|
||||
<!--set your custom font properties-->
|
||||
<item name="android:fontFamily">@font/cinzel_bold</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\..\packages\Xamarin.Forms.4.0.0.425677\build\Xamarin.Forms.props" Condition="Exists('..\..\packages\Xamarin.Forms.4.0.0.425677\build\Xamarin.Forms.props')" />
|
||||
<Import Project="..\..\packages\Xamarin.Forms.4.0.0.497661\build\Xamarin.Forms.props" Condition="Exists('..\..\packages\Xamarin.Forms.4.0.0.497661\build\Xamarin.Forms.props')" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
|
|
@ -150,17 +150,17 @@
|
|||
<Reference Include="SQLite-net, Version=1.6.258.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\sqlite-net-pcl.1.6.258-beta\lib\netstandard1.1\SQLite-net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SQLitePCLRaw.batteries_green, Version=1.1.13.388, Culture=neutral, PublicKeyToken=a84b7dcfb1391f7f, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SQLitePCLRaw.bundle_green.1.1.13\lib\net45\SQLitePCLRaw.batteries_green.dll</HintPath>
|
||||
<Reference Include="SQLitePCLRaw.batteries_green, Version=1.1.14.520, Culture=neutral, PublicKeyToken=a84b7dcfb1391f7f, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SQLitePCLRaw.bundle_green.1.1.14\lib\net45\SQLitePCLRaw.batteries_green.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SQLitePCLRaw.batteries_v2, Version=1.1.13.388, Culture=neutral, PublicKeyToken=8226ea5df37bcae9, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SQLitePCLRaw.bundle_green.1.1.13\lib\net45\SQLitePCLRaw.batteries_v2.dll</HintPath>
|
||||
<Reference Include="SQLitePCLRaw.batteries_v2, Version=1.1.14.520, Culture=neutral, PublicKeyToken=8226ea5df37bcae9, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SQLitePCLRaw.bundle_green.1.1.14\lib\net45\SQLitePCLRaw.batteries_v2.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SQLitePCLRaw.core, Version=1.1.13.388, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SQLitePCLRaw.core.1.1.13\lib\net45\SQLitePCLRaw.core.dll</HintPath>
|
||||
<Reference Include="SQLitePCLRaw.core, Version=1.1.14.520, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SQLitePCLRaw.core.1.1.14\lib\net45\SQLitePCLRaw.core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SQLitePCLRaw.provider.e_sqlite3, Version=1.1.13.388, Culture=neutral, PublicKeyToken=9c301db686d0bd12, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.13\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll</HintPath>
|
||||
<Reference Include="SQLitePCLRaw.provider.e_sqlite3, Version=1.1.14.520, Culture=neutral, PublicKeyToken=9c301db686d0bd12, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.14\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
|
|
@ -206,28 +206,28 @@
|
|||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="webkit-sharp, Version=1.1.15.0, Culture=neutral, PublicKeyToken=eaa1d335d2e19745, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.Platform.GTK.4.0.0.425677\lib\net45\webkit-sharp.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.Platform.GTK.4.0.0.497661\lib\net45\webkit-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Essentials, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Essentials.1.1.0\lib\netstandard2.0\Xamarin.Essentials.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.4.0.0.425677\lib\netstandard2.0\Xamarin.Forms.Core.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.4.0.0.497661\lib\netstandard2.0\Xamarin.Forms.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.4.0.0.425677\lib\netstandard2.0\Xamarin.Forms.Platform.dll</HintPath>
|
||||
<Reference Include="Xamarin.Forms.Platform, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.4.0.0.497661\lib\netstandard2.0\Xamarin.Forms.Platform.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Platform.GTK, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.Platform.GTK.4.0.0.425677\lib\net45\Xamarin.Forms.Platform.GTK.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.Platform.GTK.4.0.0.497661\lib\net45\Xamarin.Forms.Platform.GTK.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.4.0.0.425677\lib\netstandard2.0\Xamarin.Forms.Xaml.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.4.0.0.497661\lib\netstandard2.0\Xamarin.Forms.Xaml.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="XamiTextSharpLGPLv2, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\XamiTextSharpLGPLv2.1.0.0\lib\netstandard2.0\XamiTextSharpLGPLv2.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="YamlDotNet, Version=6.0.0.0, Culture=neutral, PublicKeyToken=ec19458f3c15af5e, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\YamlDotNet.6.0.0\lib\net45\YamlDotNet.dll</HintPath>
|
||||
<HintPath>..\..\packages\YamlDotNet.6.1.1\lib\net45\YamlDotNet.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
@ -303,16 +303,16 @@
|
|||
<PropertyGroup>
|
||||
<ErrorText>Ce projet fait référence à des packages NuGet qui sont manquants sur cet ordinateur. Utilisez l'option de restauration des packages NuGet pour les télécharger. Pour plus d'informations, consultez http://go.microsoft.com/fwlink/?LinkID=322105. Le fichier manquant est : {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\SkiaSharp.1.68.0\build\net45\SkiaSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\SkiaSharp.1.68.0\build\net45\SkiaSharp.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.4.0.0.425677\build\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.4.0.0.425677\build\Xamarin.Forms.props'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.4.0.0.425677\build\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.4.0.0.425677\build\Xamarin.Forms.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.4.0.0.497661\build\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.4.0.0.497661\build\Xamarin.Forms.props'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.4.0.0.497661\build\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.4.0.0.497661\build\Xamarin.Forms.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\..\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets" Condition="Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" />
|
||||
<Import Project="..\..\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets" Condition="Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets')" />
|
||||
<Import Project="..\..\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets" Condition="Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.13\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets')" />
|
||||
<Import Project="..\..\packages\SkiaSharp.1.68.0\build\net45\SkiaSharp.targets" Condition="Exists('..\..\packages\SkiaSharp.1.68.0\build\net45\SkiaSharp.targets')" />
|
||||
<Import Project="..\..\packages\Xamarin.Forms.4.0.0.425677\build\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.4.0.0.425677\build\Xamarin.Forms.targets')" />
|
||||
<Import Project="..\..\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets" Condition="Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" />
|
||||
<Import Project="..\..\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets" Condition="Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets')" />
|
||||
<Import Project="..\..\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets" Condition="Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.14\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets')" />
|
||||
<Import Project="..\..\packages\Xamarin.Forms.4.0.0.497661\build\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.4.0.0.497661\build\Xamarin.Forms.targets')" />
|
||||
</Project>
|
||||
|
|
@ -44,11 +44,11 @@
|
|||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="SQLitePCLRaw.core" publicKeyToken="1488e028ca7ab535" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.1.13.388" newVersion="1.1.13.388" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.1.14.520" newVersion="1.1.14.520" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="SQLitePCLRaw.batteries_v2" publicKeyToken="8226ea5df37bcae9" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.1.13.388" newVersion="1.1.13.388" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.1.14.520" newVersion="1.1.14.520" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Microsoft.EntityFrameworkCore" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
||||
|
|
|
|||
|
|
@ -27,12 +27,12 @@
|
|||
<package id="SkiaSharp" version="1.68.0" targetFramework="net471" />
|
||||
<package id="SkiaSharp.Views" version="1.68.0" targetFramework="net471" />
|
||||
<package id="sqlite-net-pcl" version="1.6.258-beta" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.bundle_green" version="1.1.13" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.core" version="1.1.13" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.lib.e_sqlite3.linux" version="1.1.13" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.lib.e_sqlite3.osx" version="1.1.13" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.lib.e_sqlite3.v110_xp" version="1.1.13" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.provider.e_sqlite3.net45" version="1.1.13" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.bundle_green" version="1.1.14" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.core" version="1.1.14" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.lib.e_sqlite3.linux" version="1.1.14" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.lib.e_sqlite3.osx" version="1.1.14" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.lib.e_sqlite3.v110_xp" version="1.1.14" targetFramework="net471" />
|
||||
<package id="SQLitePCLRaw.provider.e_sqlite3.net45" version="1.1.14" targetFramework="net471" />
|
||||
<package id="System.Buffers" version="4.5.0" targetFramework="net471" />
|
||||
<package id="System.Collections.Immutable" version="1.5.0" targetFramework="net471" />
|
||||
<package id="System.ComponentModel.Annotations" version="4.5.0" targetFramework="net471" />
|
||||
|
|
@ -44,9 +44,9 @@
|
|||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net471" />
|
||||
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net471" />
|
||||
<package id="Xamarin.Essentials" version="1.1.0" targetFramework="net471" />
|
||||
<package id="Xamarin.Forms" version="4.0.0.425677" targetFramework="net471" />
|
||||
<package id="Xamarin.Forms.Platform.GTK" version="4.0.0.425677" targetFramework="net471" />
|
||||
<package id="Xamarin.Forms.Visual.Material" version="4.0.0.425677" targetFramework="net471" />
|
||||
<package id="Xamarin.Forms" version="4.0.0.497661" targetFramework="net471" />
|
||||
<package id="Xamarin.Forms.Platform.GTK" version="4.0.0.497661" targetFramework="net471" />
|
||||
<package id="Xamarin.Forms.Visual.Material" version="4.0.0.497661" targetFramework="net471" />
|
||||
<package id="XamiTextSharpLGPLv2" version="1.0.0" targetFramework="net471" />
|
||||
<package id="YamlDotNet" version="6.0.0" targetFramework="net471" />
|
||||
<package id="YamlDotNet" version="6.1.1" targetFramework="net471" />
|
||||
</packages>
|
||||
|
|
@ -309,6 +309,13 @@
|
|||
<Content Include="Assets\pdfjs\web\cmaps\V.bcmap" />
|
||||
<Content Include="Assets\pdfjs\web\cmaps\WP-Symbol.bcmap" />
|
||||
<Content Include="Assets\pdfjs\web\compressed.tracemonkey-pldi-09.pdf" />
|
||||
<Content Include="Assets\Fonts\Cinzel-Black.otf" />
|
||||
<Content Include="Assets\Fonts\Cinzel-Bold.otf" />
|
||||
<Content Include="Assets\Fonts\CinzelDecorative-Black.otf" />
|
||||
<Content Include="Assets\Fonts\CinzelDecorative-Bold.otf" />
|
||||
<Content Include="Assets\Fonts\CinzelDecorative-Regular.otf" />
|
||||
<Content Include="Assets\Fonts\Cinzel-Regular.otf" />
|
||||
<Content Include="Assets\Fonts\MarcellusSC-Regular.ttf" />
|
||||
<None Include="Assets\pdfjs\web\locale\ach\viewer.properties" />
|
||||
<None Include="Assets\pdfjs\web\locale\af\viewer.properties" />
|
||||
<None Include="Assets\pdfjs\web\locale\ak\viewer.properties" />
|
||||
|
|
@ -632,10 +639,10 @@
|
|||
<Version>1.1.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Forms">
|
||||
<Version>4.0.0.425677</Version>
|
||||
<Version>4.0.0.497661</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Forms.Visual.Material">
|
||||
<Version>4.0.0.425677</Version>
|
||||
<Version>4.0.0.497661</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="XamiTextSharpLGPLv2">
|
||||
<Version>1.0.0</Version>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices.WindowsRuntime;
|
||||
using System.Text;
|
||||
using Windows.ApplicationModel;
|
||||
using Windows.ApplicationModel.Activation;
|
||||
using Windows.Foundation;
|
||||
|
|
@ -61,6 +62,7 @@ namespace AideDeJeu.UWP
|
|||
|
||||
Xamarin.Forms.Forms.Init(e, Rg.Plugins.Popup.Popup.GetExtraAssemblies());
|
||||
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());
|
||||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||||
|
||||
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
|
||||
{
|
||||
|
|
|
|||
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/Cinzel-Black.otf
Normal file
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/Cinzel-Black.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/Cinzel-Bold.otf
Normal file
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/Cinzel-Bold.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/Cinzel-Regular.otf
Normal file
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/Cinzel-Regular.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/CinzelDecorative-Black.otf
Normal file
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/CinzelDecorative-Black.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/CinzelDecorative-Bold.otf
Normal file
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/CinzelDecorative-Bold.otf
Normal file
Binary file not shown.
Binary file not shown.
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/MarcellusSC-Regular.ttf
Normal file
BIN
AideDeJeu/AideDeJeu.UWP/Assets/Fonts/MarcellusSC-Regular.ttf
Normal file
Binary file not shown.
|
|
@ -450,10 +450,10 @@
|
|||
<Version>1.1.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Forms">
|
||||
<Version>4.0.0.425677</Version>
|
||||
<Version>4.0.0.497661</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Forms.Visual.Material">
|
||||
<Version>4.0.0.425677</Version>
|
||||
<Version>4.0.0.497661</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="XamiTextSharpLGPLv2">
|
||||
<Version>1.0.0</Version>
|
||||
|
|
|
|||
|
|
@ -23,6 +23,12 @@
|
|||
<None Remove="Pdf\178_hd_01_feuille_de_perso_v1.pdf" />
|
||||
<None Remove="Pdf\AlverataIrregularPEMedium.ttf" />
|
||||
<None Remove="Pdf\BLKCHCRY.TTF" />
|
||||
<None Remove="Pdf\Cinzel-Black.otf" />
|
||||
<None Remove="Pdf\Cinzel-Bold.otf" />
|
||||
<None Remove="Pdf\Cinzel-Regular.otf" />
|
||||
<None Remove="Pdf\CinzelDecorative-Black.otf" />
|
||||
<None Remove="Pdf\CinzelDecorative-Bold.otf" />
|
||||
<None Remove="Pdf\CinzelDecorative-Regular.otf" />
|
||||
<None Remove="Pdf\feuille_de_personnage_editable.pdf" />
|
||||
<None Remove="Pdf\LinLibertine_aBL.ttf" />
|
||||
<None Remove="Pdf\LinLibertine_aBS.ttf" />
|
||||
|
|
@ -40,7 +46,9 @@
|
|||
<None Remove="Pdf\LinLibertine_RI.ttf" />
|
||||
<None Remove="Pdf\LinLibertine_RZ.ttf" />
|
||||
<None Remove="Pdf\LinLibertine_RZI.ttf" />
|
||||
<None Remove="Pdf\MarcellusSC-Regular.ttf" />
|
||||
<None Remove="Pdf\MinionPro_It.ttf" />
|
||||
<None Remove="Pdf\poker_size.pdf" />
|
||||
<None Remove="test.svg" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
@ -49,6 +57,12 @@
|
|||
<EmbeddedResource Include="Pdf\178_hd_01_feuille_de_perso_v1.pdf" />
|
||||
<EmbeddedResource Include="Pdf\AlverataIrregularPEMedium.ttf" />
|
||||
<EmbeddedResource Include="Pdf\BLKCHCRY.TTF" />
|
||||
<EmbeddedResource Include="Pdf\Cinzel-Black.otf" />
|
||||
<EmbeddedResource Include="Pdf\Cinzel-Bold.otf" />
|
||||
<EmbeddedResource Include="Pdf\Cinzel-Regular.otf" />
|
||||
<EmbeddedResource Include="Pdf\CinzelDecorative-Black.otf" />
|
||||
<EmbeddedResource Include="Pdf\CinzelDecorative-Bold.otf" />
|
||||
<EmbeddedResource Include="Pdf\CinzelDecorative-Regular.otf" />
|
||||
<EmbeddedResource Include="Pdf\feuille_de_personnage_editable.pdf" />
|
||||
<EmbeddedResource Include="Pdf\LinLibertine_aBL.ttf" />
|
||||
<EmbeddedResource Include="Pdf\LinLibertine_aBS.ttf" />
|
||||
|
|
@ -66,7 +80,9 @@
|
|||
<EmbeddedResource Include="Pdf\LinLibertine_RI.ttf" />
|
||||
<EmbeddedResource Include="Pdf\LinLibertine_RZ.ttf" />
|
||||
<EmbeddedResource Include="Pdf\LinLibertine_RZI.ttf" />
|
||||
<EmbeddedResource Include="Pdf\MarcellusSC-Regular.ttf" />
|
||||
<EmbeddedResource Include="Pdf\MinionPro_It.ttf" />
|
||||
<EmbeddedResource Include="Pdf\poker_size.pdf" />
|
||||
<EmbeddedResource Include="test.svg" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
@ -80,10 +96,10 @@
|
|||
<PackageReference Include="SkiaSharp.Views.Forms" Version="1.68.0" />
|
||||
<PackageReference Include="sqlite-net-pcl" Version="1.6.258-beta" />
|
||||
<PackageReference Include="Xamarin.Essentials" Version="1.1.0" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="4.0.0.425677" />
|
||||
<PackageReference Include="Xamarin.Forms.Visual.Material" Version="4.0.0.425677" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="4.0.0.497661" />
|
||||
<PackageReference Include="Xamarin.Forms.Visual.Material" Version="4.0.0.497661" />
|
||||
<PackageReference Include="XamiTextSharpLGPLv2" Version="1.0.0" />
|
||||
<PackageReference Include="YamlDotNet" Version="6.0.0" />
|
||||
<PackageReference Include="YamlDotNet" Version="6.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -24,26 +24,26 @@
|
|||
|
||||
<OnPlatform x:Key="LinuxLibertineCapitals" x:TypeArguments="x:String">
|
||||
<On Platform="iOS" Value="Linux Libertine Capitals" />
|
||||
<On Platform="Android" Value="LinLibertine_aS.ttf#Linux Libertine Capitals" />
|
||||
<On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/LinLibertine_R.ttf#Linux Libertine" />
|
||||
<On Platform="Android" Value="Cinzel-Regular.otf#Cinzel" />
|
||||
<On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/Cinzel-Regular.otf#Cinzel" />
|
||||
</OnPlatform>
|
||||
|
||||
<OnPlatform x:Key="LinuxLibertineCapitalsBold" x:TypeArguments="x:String">
|
||||
<On Platform="iOS" Value="Linux Libertine Capitals" />
|
||||
<On Platform="Android" Value="LinLibertine_aBS.ttf#Linux Libertine Capitals" />
|
||||
<On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/LinLibertine_R.ttf#Linux Libertine" />
|
||||
<On Platform="Android" Value="Cinzel-Bold.otf#Cinzel Bold" />
|
||||
<On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/Cinzel-Bold.otf#Cinzel" />
|
||||
</OnPlatform>
|
||||
|
||||
<OnPlatform x:Key="LinuxLibertineCapitalsItal" x:TypeArguments="x:String">
|
||||
<On Platform="iOS" Value="Linux Libertine Capitals" />
|
||||
<On Platform="Android" Value="LinLibertine_aSI.ttf#Linux Libertine Capitals" />
|
||||
<On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/LinLibertine_R.ttf#Linux Libertine" />
|
||||
<On Platform="Android" Value="Cinzel-Regular.otf#Cinzel" />
|
||||
<On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/Cinzel-Regular.otf#Cinzel" />
|
||||
</OnPlatform>
|
||||
|
||||
<OnPlatform x:Key="LinuxLibertineCapitalsBoldItal" x:TypeArguments="x:String">
|
||||
<On Platform="iOS" Value="Linux Libertine Capitals" />
|
||||
<On Platform="Android" Value="LinLibertine_aSZI.ttf#Linux Libertine Capitals" />
|
||||
<On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/LinLibertine_R.ttf#Linux Libertine" />
|
||||
<On Platform="Android" Value="Cinzel-Bold.otf#Cinzel Bold" />
|
||||
<On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/Cinzel-Bold.otf#Cinzel" />
|
||||
</OnPlatform>
|
||||
|
||||
<OnPlatform x:Key="LinuxLibertine" x:TypeArguments="x:String">
|
||||
|
|
@ -117,35 +117,35 @@
|
|||
<Style TargetType="Label" x:Key="heading2">
|
||||
<Setter Property="FontSize" Value="25" />
|
||||
<Setter Property="TextColor" Value="{StaticResource HDBlack}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitalsBold}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitals}" />
|
||||
<Setter Property="FontAttributes" Value="Bold" />
|
||||
</Style>
|
||||
|
||||
<Style TargetType="Label" x:Key="heading3">
|
||||
<Setter Property="FontSize" Value="20" />
|
||||
<Setter Property="TextColor" Value="{StaticResource HDBlack}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitalsBold}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitals}" />
|
||||
<Setter Property="FontAttributes" Value="Bold" />
|
||||
</Style>
|
||||
|
||||
<Style TargetType="Label" x:Key="heading4">
|
||||
<Setter Property="FontSize" Value="18" />
|
||||
<Setter Property="TextColor" Value="{StaticResource HDBlack}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitalsBold}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitals}" />
|
||||
<Setter Property="FontAttributes" Value="Bold" />
|
||||
</Style>
|
||||
|
||||
<Style TargetType="Label" x:Key="heading5">
|
||||
<Setter Property="FontSize" Value="16" />
|
||||
<Setter Property="TextColor" Value="{StaticResource HDBlack}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitalsBold}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitals}" />
|
||||
<Setter Property="FontAttributes" Value="Bold" />
|
||||
</Style>
|
||||
|
||||
<Style TargetType="Label" x:Key="heading6">
|
||||
<Setter Property="FontSize" Value="15" />
|
||||
<Setter Property="TextColor" Value="{StaticResource HDBlack}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitalsBold}" />
|
||||
<Setter Property="FontFamily" Value="{DynamicResource LinuxLibertineCapitals}" />
|
||||
<Setter Property="FontAttributes" Value="Bold" />
|
||||
</Style>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using AideDeJeu.ViewModels;
|
||||
using AideDeJeu.Pdf;
|
||||
using AideDeJeu.ViewModels;
|
||||
using AideDeJeu.ViewModels.Library;
|
||||
using AideDeJeu.ViewModels.PlayerCharacter;
|
||||
using AideDeJeu.Views;
|
||||
|
|
@ -19,6 +20,7 @@ namespace AideDeJeu
|
|||
InitializeComponent();
|
||||
|
||||
DependencyService.Register<MainViewModel>();
|
||||
DependencyService.Register<PdfService>();
|
||||
DependencyService.Register<BookmarksViewModel>();
|
||||
DependencyService.Register<StoreViewModel>();
|
||||
DependencyService.Register<PlayerCharacterEditorViewModel>();
|
||||
|
|
|
|||
|
|
@ -64,13 +64,13 @@
|
|||
view.RenderMarkdown();
|
||||
}
|
||||
|
||||
private StackLayout stack;
|
||||
private StackLayout _Stack;
|
||||
|
||||
private List<KeyValuePair<string, string>> links = new List<KeyValuePair<string, string>>();
|
||||
|
||||
private void RenderMarkdown()
|
||||
{
|
||||
stack = new StackLayout()
|
||||
_Stack = new StackLayout()
|
||||
{
|
||||
Spacing = this.Theme.Margin,
|
||||
};
|
||||
|
|
@ -83,19 +83,27 @@
|
|||
{
|
||||
var pipeline = new Markdig.MarkdownPipelineBuilder().UseYamlFrontMatter().UsePipeTables().Build();
|
||||
var parsed = Markdig.Markdown.Parse(this.Markdown, pipeline);
|
||||
this.Render(parsed.AsEnumerable());
|
||||
var views = this.Render(parsed.AsEnumerable());
|
||||
views.ToList().ForEach(view => _Stack.Children.Add(view));
|
||||
}
|
||||
|
||||
this.Content = stack;
|
||||
this.Content = _Stack;
|
||||
|
||||
}
|
||||
|
||||
private void Render(IEnumerable<Block> blocks)
|
||||
private IEnumerable<View> Render(IEnumerable<Block> blocks)
|
||||
{
|
||||
var views = new List<View>();
|
||||
foreach (var block in blocks)
|
||||
{
|
||||
this.Render(block);
|
||||
var subviews = this.Render(block);
|
||||
if(subviews != null)
|
||||
{
|
||||
views.AddRange(subviews);
|
||||
//views.Add(view);
|
||||
}
|
||||
}
|
||||
return views;
|
||||
}
|
||||
|
||||
private void AttachLinks(View view)
|
||||
|
|
@ -103,24 +111,21 @@
|
|||
if (links.Any())
|
||||
{
|
||||
var blockLinks = links.Distinct().OrderBy(l => l.Key).ToList();
|
||||
if (blockLinks.Count > 1)
|
||||
{
|
||||
if (Device.RuntimePlatform == Device.GTK)
|
||||
if (blockLinks.Count > 1 && Device.RuntimePlatform == Device.GTK)
|
||||
{
|
||||
view.GestureRecognizers.Add(new TapGestureRecognizer
|
||||
{
|
||||
view.GestureRecognizers.Add(new TapGestureRecognizer
|
||||
Command = new Command(async () =>
|
||||
{
|
||||
Command = new Command(async () =>
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
var result = await Application.Current.MainPage.DisplayActionSheet("Ouvrir le lien", "Annuler", null, blockLinks.Select(x => x.Key).ToArray());
|
||||
var link = blockLinks.FirstOrDefault(x => x.Key == result);
|
||||
NavigateToLinkCommand?.Execute(link.Value);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}),
|
||||
});
|
||||
}
|
||||
var result = await Application.Current.MainPage.DisplayActionSheet("Ouvrir le lien", "Annuler", null, blockLinks.Select(x => x.Key).ToArray());
|
||||
var link = blockLinks.FirstOrDefault(x => x.Key == result);
|
||||
NavigateToLinkCommand?.Execute(link.Value);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}),
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -159,100 +164,118 @@
|
|||
|
||||
#region Rendering blocks
|
||||
|
||||
private void Render(Block block)
|
||||
private IEnumerable<View> Render(Block block)
|
||||
{
|
||||
var views = new List<View>();
|
||||
IEnumerable<View> subviews = null;
|
||||
switch (block)
|
||||
{
|
||||
case HeadingBlock heading:
|
||||
Render(heading);
|
||||
subviews = Render(heading);
|
||||
break;
|
||||
|
||||
case ParagraphBlock paragraph:
|
||||
Render(paragraph);
|
||||
subviews = Render(paragraph);
|
||||
break;
|
||||
|
||||
case QuoteBlock quote:
|
||||
Render(quote);
|
||||
subviews = Render(quote);
|
||||
break;
|
||||
|
||||
case CodeBlock code:
|
||||
Render(code);
|
||||
subviews = Render(code);
|
||||
break;
|
||||
|
||||
case ListBlock list:
|
||||
Render(list);
|
||||
subviews = Render(list);
|
||||
break;
|
||||
|
||||
case ThematicBreakBlock thematicBreak:
|
||||
Render(thematicBreak);
|
||||
subviews = Render(thematicBreak);
|
||||
break;
|
||||
|
||||
case HtmlBlock html:
|
||||
Render(html);
|
||||
subviews = Render(html);
|
||||
break;
|
||||
|
||||
case Markdig.Extensions.Tables.Table table:
|
||||
Render(table);
|
||||
subviews = Render(table);
|
||||
break;
|
||||
|
||||
default:
|
||||
Debug.WriteLine($"Can't render {block.GetType()} blocks.");
|
||||
break;
|
||||
}
|
||||
|
||||
if(queuedViews.Any())
|
||||
if(subviews != null)
|
||||
{
|
||||
foreach (var view in queuedViews)
|
||||
{
|
||||
this.stack.Children.Add(view);
|
||||
}
|
||||
queuedViews.Clear();
|
||||
views.AddRange(subviews);
|
||||
}
|
||||
|
||||
if (views != null)
|
||||
{
|
||||
if (queuedViews.Any())
|
||||
{
|
||||
foreach (var view in queuedViews)
|
||||
{
|
||||
views.Add(view);
|
||||
}
|
||||
queuedViews.Clear();
|
||||
}
|
||||
}
|
||||
return views;
|
||||
}
|
||||
|
||||
private int listScope;
|
||||
|
||||
private void Render(ThematicBreakBlock block)
|
||||
private IEnumerable<View> Render(ThematicBreakBlock block)
|
||||
{
|
||||
var style = this.Theme.Separator;
|
||||
|
||||
if (style.BorderSize > 0)
|
||||
{
|
||||
stack.Children.Add(new BoxView
|
||||
return new View[] { new BoxView
|
||||
{
|
||||
HeightRequest = style.BorderSize,
|
||||
BackgroundColor = style.BorderColor,
|
||||
});
|
||||
} };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void Render(ListBlock block)
|
||||
private IEnumerable<View> Render(ListBlock block)
|
||||
{
|
||||
listScope++;
|
||||
|
||||
var views = new List<View>();
|
||||
for (int i = 0; i < block.Count(); i++)
|
||||
{
|
||||
var item = block.ElementAt(i);
|
||||
|
||||
if (item is ListItemBlock itemBlock)
|
||||
{
|
||||
this.Render(block, i + 1, itemBlock);
|
||||
var subviews = this.Render(block, i + 1, itemBlock);
|
||||
if(subviews != null)
|
||||
{
|
||||
views.AddRange(subviews);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
listScope--;
|
||||
return views;
|
||||
}
|
||||
|
||||
private void Render(ListBlock parent, int index, ListItemBlock block)
|
||||
private IEnumerable<View> Render(ListBlock parent, int index, ListItemBlock block)
|
||||
{
|
||||
var initialStack = this.stack;
|
||||
//var initialStack = this.stack;
|
||||
|
||||
this.stack = new StackLayout()
|
||||
var stack = new StackLayout()
|
||||
{
|
||||
Spacing = this.Theme.Margin,
|
||||
};
|
||||
|
||||
this.Render(block.AsEnumerable());
|
||||
var subv = this.Render(block.AsEnumerable());
|
||||
subv.ToList().ForEach(v => stack.Children.Add(v));
|
||||
|
||||
var horizontalStack = new StackLayout
|
||||
{
|
||||
|
|
@ -299,13 +322,14 @@
|
|||
horizontalStack.Children.Add(bullet);
|
||||
}
|
||||
|
||||
horizontalStack.Children.Add(this.stack);
|
||||
initialStack.Children.Add(horizontalStack);
|
||||
horizontalStack.Children.Add(stack);
|
||||
//initialStack.Children.Add(horizontalStack);
|
||||
|
||||
this.stack = initialStack;
|
||||
//this.stack = initialStack;
|
||||
return new View[] { horizontalStack };
|
||||
}
|
||||
|
||||
private void Render(HeadingBlock block)
|
||||
private IEnumerable<View> Render(HeadingBlock block)
|
||||
{
|
||||
MarkdownStyle style;
|
||||
|
||||
|
|
@ -349,16 +373,16 @@
|
|||
HeightRequest = style.BorderSize,
|
||||
BackgroundColor = style.BorderColor,
|
||||
});
|
||||
stack.Children.Add(headingStack);
|
||||
return new View[] { headingStack };
|
||||
}
|
||||
else
|
||||
{
|
||||
stack.Children.Add(label);
|
||||
return new View[] { label };
|
||||
}
|
||||
}
|
||||
|
||||
private void Render(ParagraphBlock block)
|
||||
{
|
||||
private IEnumerable<View> Render(ParagraphBlock block)
|
||||
{
|
||||
var style = this.Theme.Paragraph;
|
||||
var foregroundColor = isQuoted ? this.Theme.Quote.ForegroundColor : style.ForegroundColor;
|
||||
var label = new Label
|
||||
|
|
@ -366,10 +390,10 @@
|
|||
FormattedText = CreateFormatted(block.Inline, style.FontFamily, style.Attributes, foregroundColor, style.BackgroundColor, style.FontSize),
|
||||
};
|
||||
AttachLinks(label);
|
||||
this.stack.Children.Add(label);
|
||||
return new View[] { label };
|
||||
}
|
||||
|
||||
private void Render(HtmlBlock block)
|
||||
private IEnumerable<View> Render(HtmlBlock block)
|
||||
{
|
||||
if(block.Type == HtmlBlockType.NonInterruptingBlock || block.Type == HtmlBlockType.Comment)
|
||||
{
|
||||
|
|
@ -380,7 +404,7 @@
|
|||
{
|
||||
Text = "\n",
|
||||
};
|
||||
this.stack.Children.Add(label);
|
||||
return new View[] { label };
|
||||
|
||||
}
|
||||
else
|
||||
|
|
@ -393,15 +417,17 @@
|
|||
// ?
|
||||
}
|
||||
// ?
|
||||
return null;
|
||||
}
|
||||
|
||||
private void Render(QuoteBlock block)
|
||||
private IEnumerable<View> Render(QuoteBlock block)
|
||||
{
|
||||
var initialIsQuoted = this.isQuoted;
|
||||
var initialStack = this.stack;
|
||||
//var initialStack = this.stack;
|
||||
var views = new List<View>();
|
||||
|
||||
this.isQuoted = true;
|
||||
this.stack = new StackLayout()
|
||||
var stack = new StackLayout()
|
||||
{
|
||||
Spacing = this.Theme.Margin,
|
||||
};
|
||||
|
|
@ -422,23 +448,25 @@
|
|||
BackgroundColor = style.BorderColor,
|
||||
});
|
||||
|
||||
horizontalStack.Children.Add(this.stack);
|
||||
initialStack.Children.Add(horizontalStack);
|
||||
horizontalStack.Children.Add(stack);
|
||||
views.Add(horizontalStack);
|
||||
}
|
||||
else
|
||||
{
|
||||
stack.BackgroundColor = this.Theme.Quote.BackgroundColor;
|
||||
initialStack.Children.Add(this.stack);
|
||||
views.Add(stack);
|
||||
}
|
||||
|
||||
this.Render(block.AsEnumerable());
|
||||
var subviews = this.Render(block.AsEnumerable());
|
||||
|
||||
this.isQuoted = initialIsQuoted;
|
||||
this.stack = initialStack;
|
||||
//this.stack = initialStack;
|
||||
return subviews;
|
||||
}
|
||||
|
||||
private void Render(CodeBlock block)
|
||||
private IEnumerable<View> Render(CodeBlock block)
|
||||
{
|
||||
var views = new List<View>();
|
||||
var style = this.Theme.Code;
|
||||
var label = new Label
|
||||
{
|
||||
|
|
@ -448,7 +476,7 @@
|
|||
FontSize = style.FontSize,
|
||||
Text = string.Join(Environment.NewLine, block.Lines),
|
||||
};
|
||||
stack.Children.Add(new Frame()
|
||||
views.Add(new Frame()
|
||||
{
|
||||
CornerRadius = 3,
|
||||
HasShadow = false,
|
||||
|
|
@ -456,9 +484,10 @@
|
|||
BackgroundColor = style.BackgroundColor,
|
||||
Content = label
|
||||
});
|
||||
return views;
|
||||
}
|
||||
|
||||
private void Render(Markdig.Extensions.Tables.Table tableBlock)
|
||||
private IEnumerable<View> Render(Markdig.Extensions.Tables.Table tableBlock)
|
||||
{
|
||||
var scroll = new ScrollView() { HorizontalScrollBarVisibility = ScrollBarVisibility.Default, Orientation = ScrollOrientation.Horizontal };
|
||||
var grid = new Grid() { HorizontalOptions = LayoutOptions.Start, Margin = 0, Padding = 1, BackgroundColor = Theme.TableHeader.BackgroundColor, RowSpacing = 1, ColumnSpacing = 1 };
|
||||
|
|
@ -514,8 +543,9 @@
|
|||
}
|
||||
top++;
|
||||
}
|
||||
stack.Children.Add(scroll);
|
||||
//stack.Children.Add(scroll);
|
||||
scroll.Content = grid;
|
||||
return new View[] { scroll };
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -586,7 +616,7 @@
|
|||
image.Source = url;
|
||||
}
|
||||
|
||||
queuedViews.Add(image);
|
||||
//queuedViews.Add(image);
|
||||
return new Span[0];
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -339,9 +339,14 @@ namespace AideDeJeuLib
|
|||
}
|
||||
else
|
||||
{
|
||||
id = id.Replace(".md#", "_");
|
||||
id = id.Replace(".md", "");
|
||||
}
|
||||
id = id.Replace("-", "_").Replace("?", "").Replace("’", "_").Replace("'", "_").Replace("__", "_").ToLower() + ".md";
|
||||
if (id.Contains("#"))
|
||||
{
|
||||
Console.WriteLine(id);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
using AideDeJeu;
|
||||
using AideDeJeu.Tools;
|
||||
using Markdig.Syntax;
|
||||
using SQLite;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
|
@ -12,10 +13,16 @@ namespace AideDeJeuLib
|
|||
{
|
||||
public class MonsterItem : Item
|
||||
{
|
||||
[Indexed]
|
||||
public string Family { get; set; }
|
||||
[Indexed]
|
||||
public string Type { get; set; }
|
||||
[Indexed]
|
||||
public string Size { get; set; }
|
||||
[Indexed]
|
||||
public string Alignment { get; set; }
|
||||
[Indexed]
|
||||
public string Terrain { get; set; }
|
||||
public string Legendary { get; set; }
|
||||
//public string Source { get; set; }
|
||||
public string ArmorClass { get; set; }
|
||||
|
|
@ -35,6 +42,7 @@ namespace AideDeJeuLib
|
|||
public string DamageResistances { get; set; }
|
||||
public string Senses { get; set; }
|
||||
public string Languages { get; set; }
|
||||
[Indexed]
|
||||
public string Challenge { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ namespace AideDeJeuLib
|
|||
public string Challenges { get; set; }
|
||||
public string Sizes { get; set; }
|
||||
public string Sources { get; set; }
|
||||
public string Terrains { get; set; }
|
||||
|
||||
public override FilterViewModel GetNewFilterViewModel()
|
||||
{
|
||||
|
|
@ -19,7 +20,8 @@ namespace AideDeJeuLib
|
|||
Split(Types),
|
||||
Split(Challenges),
|
||||
Split(Sizes),
|
||||
Split(Sources)
|
||||
Split(Sources),
|
||||
Split(Terrains)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
BIN
AideDeJeu/AideDeJeu/Pdf/Cinzel-Black.otf
Normal file
BIN
AideDeJeu/AideDeJeu/Pdf/Cinzel-Black.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu/Pdf/Cinzel-Bold.otf
Normal file
BIN
AideDeJeu/AideDeJeu/Pdf/Cinzel-Bold.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu/Pdf/Cinzel-Regular.otf
Normal file
BIN
AideDeJeu/AideDeJeu/Pdf/Cinzel-Regular.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu/Pdf/CinzelDecorative-Black.otf
Normal file
BIN
AideDeJeu/AideDeJeu/Pdf/CinzelDecorative-Black.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu/Pdf/CinzelDecorative-Bold.otf
Normal file
BIN
AideDeJeu/AideDeJeu/Pdf/CinzelDecorative-Bold.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu/Pdf/CinzelDecorative-Regular.otf
Normal file
BIN
AideDeJeu/AideDeJeu/Pdf/CinzelDecorative-Regular.otf
Normal file
Binary file not shown.
BIN
AideDeJeu/AideDeJeu/Pdf/MarcellusSC-Regular.ttf
Normal file
BIN
AideDeJeu/AideDeJeu/Pdf/MarcellusSC-Regular.ttf
Normal file
Binary file not shown.
442
AideDeJeu/AideDeJeu/Pdf/PdfService.cs
Normal file
442
AideDeJeu/AideDeJeu/Pdf/PdfService.cs
Normal file
|
|
@ -0,0 +1,442 @@
|
|||
using AideDeJeu.Tools;
|
||||
using iTextSharp.text;
|
||||
using iTextSharp.text.pdf;
|
||||
using Markdig;
|
||||
using Markdig.Syntax;
|
||||
using Markdig.Syntax.Inlines;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace AideDeJeu.Pdf
|
||||
{
|
||||
public class PdfService
|
||||
{
|
||||
public static PdfService Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
return DependencyService.Get<PdfService>();
|
||||
}
|
||||
}
|
||||
public static void DrawText(PdfContentByte cb, string text, iTextSharp.text.Font font, float x, float y, float width, float height, int alignment)
|
||||
{
|
||||
cb.SetRGBColorFill(127, 127, 127);
|
||||
//cb.Rectangle(x, y, width, height);
|
||||
//cb.Stroke();
|
||||
ColumnText ct = new ColumnText(cb);
|
||||
ct.SetSimpleColumn(x, y, x + width, y + height);
|
||||
var p = new Paragraph(text); //, font);
|
||||
p.Alignment = alignment;
|
||||
ct.AddElement(p);
|
||||
ct.Go();
|
||||
|
||||
}
|
||||
|
||||
Document _Document = null;
|
||||
PdfWriter _Writer = null;
|
||||
|
||||
public string BasePdfDirectory
|
||||
{
|
||||
get
|
||||
{
|
||||
return Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory, "pdf");
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string> MarkdownToPDF(List<string> mds)
|
||||
{
|
||||
var basePath = BasePdfDirectory;
|
||||
Directory.CreateDirectory(basePath);
|
||||
using (var stream = new FileStream(Path.Combine(BasePdfDirectory, "test.pdf"), FileMode.Create))
|
||||
{
|
||||
MarkdownToPdf(mds, stream);
|
||||
}
|
||||
return "test.pdf";
|
||||
}
|
||||
public void MarkdownToPdf(List<string> mds, Stream stream)
|
||||
{
|
||||
var pipeline = new Markdig.MarkdownPipelineBuilder().UseYamlFrontMatter().UsePipeTables().Build();
|
||||
|
||||
_Document = new Document(new iTextSharp.text.Rectangle(822, 1122));
|
||||
_Writer = PdfWriter.GetInstance(_Document, stream);
|
||||
_Document.Open();
|
||||
//PdfReader reader = null;
|
||||
//reader = new PdfReader(AideDeJeu.Tools.Helpers.GetResourceStream("AideDeJeu.Pdf.poker_size.pdf"));
|
||||
//PdfStamper stamper = null;
|
||||
//stamper = new PdfStamper(reader, stream);
|
||||
|
||||
foreach (var md in mds)
|
||||
{
|
||||
var parsed = Markdig.Markdown.Parse(md, pipeline);
|
||||
Render(parsed.AsEnumerable(), _Document);
|
||||
}
|
||||
|
||||
_Document.Close();
|
||||
_Writer.Close();
|
||||
//stamper.Close();
|
||||
//reader.Close();
|
||||
}
|
||||
|
||||
private BaseFont GetBaseFont(string fontName)
|
||||
{
|
||||
string fontPath = fontName;
|
||||
if(Xamarin.Essentials.DeviceInfo.Platform != Xamarin.Essentials.DevicePlatform.Unknown)
|
||||
{
|
||||
fontPath = Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory, fontPath);
|
||||
}
|
||||
using (var inFont = AideDeJeu.Tools.Helpers.GetResourceStream($"AideDeJeu.Pdf.{fontName}"))
|
||||
{
|
||||
using (var outFont = new FileStream(fontPath, FileMode.Create, FileAccess.ReadWrite))
|
||||
{
|
||||
inFont.CopyTo(outFont);
|
||||
}
|
||||
}
|
||||
FontFactory.Register(fontPath);
|
||||
|
||||
return iTextSharp.text.pdf.BaseFont.CreateFont(fontPath, iTextSharp.text.pdf.BaseFont.IDENTITY_H, iTextSharp.text.pdf.BaseFont.EMBEDDED);
|
||||
}
|
||||
|
||||
BaseFont _CinzelRegular = null;
|
||||
public BaseFont CinzelRegular
|
||||
{
|
||||
get
|
||||
{
|
||||
return _CinzelRegular ?? (_CinzelRegular = GetBaseFont("Cinzel-Regular.otf"));
|
||||
}
|
||||
}
|
||||
BaseFont _CinzelBold = null;
|
||||
public BaseFont CinzelBold
|
||||
{
|
||||
get
|
||||
{
|
||||
return _CinzelBold ?? (_CinzelBold = GetBaseFont("Cinzel-Bold.otf"));
|
||||
}
|
||||
}
|
||||
BaseFont _LinuxLibertine = null;
|
||||
public BaseFont LinuxLibertine
|
||||
{
|
||||
get
|
||||
{
|
||||
return _LinuxLibertine ?? (_LinuxLibertine = GetBaseFont("LinLibertine_R.ttf"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
iTextSharp.text.Font _Header1Font = null;
|
||||
public iTextSharp.text.Font Header1Font
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Header1Font ?? (_Header1Font = new iTextSharp.text.Font(CinzelBold, 30));
|
||||
}
|
||||
}
|
||||
iTextSharp.text.Font _Header2Font = null;
|
||||
public iTextSharp.text.Font Header2Font
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Header2Font ?? (_Header2Font = new iTextSharp.text.Font(CinzelRegular, 25));
|
||||
}
|
||||
}
|
||||
iTextSharp.text.Font _Header3Font = null;
|
||||
public iTextSharp.text.Font Header3Font
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Header3Font ?? (_Header3Font = new iTextSharp.text.Font(CinzelRegular, 20));
|
||||
}
|
||||
}
|
||||
iTextSharp.text.Font _Header4Font = null;
|
||||
public iTextSharp.text.Font Header4Font
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Header4Font ?? (_Header4Font = new iTextSharp.text.Font(CinzelRegular, 18));
|
||||
}
|
||||
}
|
||||
iTextSharp.text.Font _Header5Font = null;
|
||||
public iTextSharp.text.Font Header5Font
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Header5Font ?? (_Header5Font = new iTextSharp.text.Font(CinzelRegular, 16));
|
||||
}
|
||||
}
|
||||
iTextSharp.text.Font _Header6Font = null;
|
||||
public iTextSharp.text.Font Header6Font
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Header6Font ?? (_Header6Font = new iTextSharp.text.Font(CinzelRegular, 15));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
iTextSharp.text.Font _ParagraphFont = null;
|
||||
iTextSharp.text.Font ParagraphFont
|
||||
{
|
||||
get
|
||||
{
|
||||
return _ParagraphFont ?? (_ParagraphFont = new iTextSharp.text.Font(LinuxLibertine, 15));
|
||||
}
|
||||
}
|
||||
|
||||
private void Render(IEnumerable<Block> blocks, Document document)
|
||||
{
|
||||
//if(ParagraphFont == null)
|
||||
//{
|
||||
// if(CinzelRegular == null)
|
||||
// {
|
||||
|
||||
// }
|
||||
// //var fontPath = Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory, "Cinzel-Regular.otf");
|
||||
// //var fontPath = @"C:\Users\yanma\Documents\Visual Studio 2017\Projects\AideDeJeu\AideDeJeu\AideDeJeuCmd\bin\Debug\netcoreapp2.1\Cinzel-Regular.otf";
|
||||
// var fontPath = @"Cinzel-Regular.otf";
|
||||
// using (var inFont = AideDeJeu.Tools.Helpers.GetResourceStream("AideDeJeu.Pdf.Cinzel-Regular.otf"))
|
||||
// {
|
||||
// using (var outFont = new FileStream(fontPath, FileMode.Create, FileAccess.ReadWrite))
|
||||
// {
|
||||
// inFont.CopyTo(outFont);
|
||||
// }
|
||||
// }
|
||||
// FontFactory.Register(fontPath);
|
||||
|
||||
// //var mafont = FontFactory.GetFont("cinzel", 20, iTextSharp.text.Font.NORMAL);
|
||||
// var mafont = iTextSharp.text.pdf.BaseFont.CreateFont(fontPath, iTextSharp.text.pdf.BaseFont.IDENTITY_H, iTextSharp.text.pdf.BaseFont.EMBEDDED);
|
||||
// //var font = mafont.BaseFont;
|
||||
// var bigFont = new iTextSharp.text.Font(mafont, 20);
|
||||
|
||||
// var fonts = FontFactory.RegisteredFonts;
|
||||
|
||||
// ParagraphFont = bigFont;
|
||||
//}
|
||||
var phrases = Render(blocks);
|
||||
|
||||
|
||||
ColumnText ct = new ColumnText(_Writer.DirectContent);
|
||||
|
||||
int column = 0;
|
||||
ct.SetSimpleColumn(10, 10 + 200 * column, 200, 200 + 200 * column);
|
||||
int status = 0;
|
||||
Phrase p = null;
|
||||
float y = 0;
|
||||
foreach (var phrase in phrases)
|
||||
{
|
||||
//var pphrase = new Phrase("test", bigFont);
|
||||
//phrase.Font = ParagraphFont;
|
||||
y = ct.YLine;
|
||||
|
||||
document.Add(phrase);
|
||||
//ct.AddText(phrase);
|
||||
//status = ct.Go(true);
|
||||
//if(ColumnText.HasMoreText(status))
|
||||
//{
|
||||
|
||||
// column++;
|
||||
// ct.SetSimpleColumn(10, 10 + 200 * column, 200, 200 + 200 * column);
|
||||
// y += 200;
|
||||
//}
|
||||
//ct.YLine = y;
|
||||
//ct.SetText(phrase);
|
||||
//status = ct.Go(false);
|
||||
|
||||
|
||||
|
||||
//ColumnText ct = new ColumnText(_Writer.DirectContent);
|
||||
//ct.AddText(CreateFormatted(block.Inline, Font.HELVETICA, 0, new Color(0, 0, 0), 12));
|
||||
//ct.Alignment = Element.ALIGN_JUSTIFIED;
|
||||
//ct.SetSimpleColumn(10, 10, 200, 200);
|
||||
//ct.Go();
|
||||
}
|
||||
}
|
||||
private IEnumerable<Phrase> Render(IEnumerable<Block> blocks)
|
||||
{
|
||||
var phrases = new List<Phrase>();
|
||||
foreach (var block in blocks)
|
||||
{
|
||||
var phrase = this.Render(block);
|
||||
if(phrase != null)
|
||||
{
|
||||
phrases.Add(phrase);
|
||||
}
|
||||
if (block.IsBreakable)
|
||||
{
|
||||
phrases.Add(new Phrase(Chunk.NEWLINE));
|
||||
}
|
||||
}
|
||||
return phrases;
|
||||
}
|
||||
private Phrase Render(Block block)
|
||||
{
|
||||
switch (block)
|
||||
{
|
||||
case HeadingBlock heading:
|
||||
return Render(heading);
|
||||
|
||||
case ParagraphBlock paragraph:
|
||||
return Render(paragraph);
|
||||
|
||||
//case QuoteBlock quote:
|
||||
// Render(quote);
|
||||
// break;
|
||||
|
||||
//case CodeBlock code:
|
||||
// Render(code);
|
||||
// break;
|
||||
|
||||
//case ListBlock list:
|
||||
// Render(list);
|
||||
// break;
|
||||
|
||||
//case ThematicBreakBlock thematicBreak:
|
||||
// Render(thematicBreak);
|
||||
// break;
|
||||
|
||||
//case HtmlBlock html:
|
||||
// Render(html);
|
||||
// break;
|
||||
|
||||
//case Markdig.Extensions.Tables.Table table:
|
||||
// Render(table);
|
||||
// break;
|
||||
|
||||
default:
|
||||
Debug.WriteLine($"Can't render {block.GetType()} blocks.");
|
||||
return null;
|
||||
}
|
||||
|
||||
//if (queuedViews.Any())
|
||||
//{
|
||||
// foreach (var view in queuedViews)
|
||||
// {
|
||||
// this.stack.Children.Add(view);
|
||||
// }
|
||||
// queuedViews.Clear();
|
||||
//}
|
||||
}
|
||||
|
||||
private Phrase Render(HeadingBlock block)
|
||||
{
|
||||
var fonts = new iTextSharp.text.Font[] { Header1Font, Header2Font, Header3Font, Header4Font, Header5Font, Header6Font };
|
||||
var colors = new iTextSharp.text.Color[] { new iTextSharp.text.Color(0x9B1C47), new iTextSharp.text.Color(0, 0, 0), new iTextSharp.text.Color(0, 0, 0), new iTextSharp.text.Color(0, 0, 0), new iTextSharp.text.Color(0, 0, 0), new iTextSharp.text.Color(0, 0, 0) };
|
||||
return CreateFormatted(block.Inline, fonts[block.Level - 1], 0, colors[block.Level - 1]);
|
||||
}
|
||||
|
||||
private Phrase Render(ParagraphBlock block)
|
||||
{
|
||||
return CreateFormatted(block.Inline, ParagraphFont, 0, new iTextSharp.text.Color(0, 0, 0));
|
||||
//_Document.Add(CreateFormatted(block.Inline, Font.HELVETICA, 0, new Color(0, 0, 0), 20));
|
||||
}
|
||||
|
||||
private Phrase CreateFormatted(ContainerInline inlines, iTextSharp.text.Font fontFamily, int fontStyle, iTextSharp.text.Color fontColor)
|
||||
{
|
||||
var phrase = new Phrase();
|
||||
foreach (var inline in inlines)
|
||||
{
|
||||
var spans = CreateChunks(inline, fontFamily, fontStyle, fontColor);
|
||||
if (spans != null)
|
||||
{
|
||||
foreach (var span in spans)
|
||||
{
|
||||
phrase.Add(span);
|
||||
}
|
||||
}
|
||||
}
|
||||
return phrase;
|
||||
}
|
||||
private Chunk[] CreateChunks(Inline inline, iTextSharp.text.Font fontFamily, int fontStyle, iTextSharp.text.Color fontColor)
|
||||
{
|
||||
switch (inline)
|
||||
{
|
||||
case LiteralInline literal:
|
||||
return new Chunk[]
|
||||
{
|
||||
new Chunk()
|
||||
{
|
||||
Content = literal.Content.Text.Substring(literal.Content.Start, literal.Content.Length),
|
||||
Font = new iTextSharp.text.Font(fontFamily.BaseFont, fontFamily.Size, fontStyle, fontColor)
|
||||
}
|
||||
};
|
||||
case EmphasisInline emphasis:
|
||||
var childStyle = fontStyle | (emphasis.DelimiterCount == 2 ? iTextSharp.text.Font.BOLD : iTextSharp.text.Font.ITALIC);
|
||||
var espans = emphasis.SelectMany(x => CreateChunks(x, fontFamily, childStyle, fontColor));
|
||||
return espans.ToArray();
|
||||
|
||||
case LineBreakInline breakline:
|
||||
return new Chunk[] { Chunk.NEWLINE };
|
||||
|
||||
case LinkInline link:
|
||||
case CodeInline code:
|
||||
|
||||
case HtmlInline html:
|
||||
|
||||
default:
|
||||
return new Chunk[] { };
|
||||
}
|
||||
//var cb = stamper.GetOverContent(1);
|
||||
////ColumnText.ShowTextAligned(cb, iTextSharp.text.Element.ALIGN_LEFT, new Phrase("Galefrin"), 40, 40, 0);
|
||||
|
||||
|
||||
//ColumnText ct = new ColumnText(cb);
|
||||
//ct.SetSimpleColumn(10f, 48f, 200f, 600f);
|
||||
//Font f = new Font();
|
||||
//Paragraph pz = new Paragraph(new Phrase(20, "Hello World!", f));
|
||||
//ct.AddElement(pz);
|
||||
//ct.Go();
|
||||
//BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, "Cp1252", BaseFont.EMBEDDED);
|
||||
//f = new Font(bf, 13);
|
||||
//ct = new ColumnText(cb);
|
||||
//ct.SetSimpleColumn(10f, 48f, 200f, 700f);
|
||||
//pz = new Paragraph("Hello World!", f);
|
||||
//ct.AddElement(pz);
|
||||
//ct.Go();
|
||||
|
||||
|
||||
|
||||
|
||||
//return;
|
||||
/*
|
||||
var text = block.ToMarkdownString();
|
||||
//DrawText(content, md, null, 100, 100, 300, 300, 0);
|
||||
|
||||
float x = 10;
|
||||
float y = 10;
|
||||
float width = 300;
|
||||
float height = 300;
|
||||
cb.SetRGBColorFill(127, 127, 127);
|
||||
//cb.Rectangle(x, y, width, height);
|
||||
//cb.Stroke();
|
||||
ColumnText ct = new ColumnText(cb);
|
||||
ct.SetSimpleColumn(x, y, x + width, y + height);
|
||||
|
||||
Font font = new Font(BaseFont.CreateFont());
|
||||
//int rectWidth = 80;
|
||||
//float maxFontSize = getMaxFontSize(BaseFont.CreateFont(), "text", rectWidth);
|
||||
font.Size = 20;
|
||||
|
||||
|
||||
var p = new Paragraph(text, font);
|
||||
//p.Alignment = alignment;
|
||||
ct.AddElement(p);
|
||||
ct.Go();
|
||||
|
||||
|
||||
|
||||
//var style = this.Theme.Paragraph;
|
||||
//var foregroundColor = isQuoted ? this.Theme.Quote.ForegroundColor : style.ForegroundColor;
|
||||
//var label = new Label
|
||||
//{
|
||||
// FormattedText = CreateFormatted(block.Inline, style.FontFamily, style.Attributes, foregroundColor, style.BackgroundColor, style.FontSize),
|
||||
//};
|
||||
//AttachLinks(label);
|
||||
//this.stack.Children.Add(label);
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
1045
AideDeJeu/AideDeJeu/Pdf/poker_size.pdf
Normal file
1045
AideDeJeu/AideDeJeu/Pdf/poker_size.pdf
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -98,6 +98,7 @@ namespace AideDeJeu.ViewModels.Library
|
|||
MaxWeight,
|
||||
Rarity,
|
||||
Attunement,
|
||||
Terrain,
|
||||
}
|
||||
|
||||
public class Filter : BaseViewModel
|
||||
|
|
@ -298,6 +299,7 @@ namespace AideDeJeu.ViewModels.Library
|
|||
new Filter() { Key = FilterKeys.Size, Name = "Taille", KeyValues = Sizes, _Index = 0 },
|
||||
//new Filter() { Key = FilterKeys.Legendary, Name = "Légendaire", KeyValues = Legendaries, _Index = 0 },
|
||||
new Filter() { Key = FilterKeys.Source, Name = "Source", KeyValues = Sources, _Index = 0 },
|
||||
new Filter() { Key = FilterKeys.Terrain, Name = "Terrain", KeyValues = Terrains, _Index = 0 },
|
||||
};
|
||||
RegisterFilters();
|
||||
}
|
||||
|
|
@ -312,13 +314,15 @@ namespace AideDeJeu.ViewModels.Library
|
|||
List<KeyValuePair<string, string>> types,
|
||||
List<KeyValuePair<string, string>> challenges,
|
||||
List<KeyValuePair<string, string>> sizes,
|
||||
List<KeyValuePair<string, string>> sources)
|
||||
List<KeyValuePair<string, string>> sources,
|
||||
List<KeyValuePair<string, string>> terrains)
|
||||
{
|
||||
this.Family = family;
|
||||
this.Types = types;
|
||||
this.Challenges = challenges;
|
||||
this.Sizes = sizes;
|
||||
this.Sources = sources;
|
||||
this.Terrains = terrains;
|
||||
}
|
||||
|
||||
public List<KeyValuePair<string, string>> Categories { get; }
|
||||
|
|
@ -332,6 +336,7 @@ namespace AideDeJeu.ViewModels.Library
|
|||
public List<KeyValuePair<string, string>> Legendaries { get; }
|
||||
|
||||
public List<KeyValuePair<string, string>> Sources { get; }
|
||||
public List<KeyValuePair<string, string>> Terrains { get; }
|
||||
|
||||
public string ChallengeConverter(string challenge)
|
||||
{
|
||||
|
|
@ -347,6 +352,7 @@ namespace AideDeJeu.ViewModels.Library
|
|||
var maxChallenge = ChallengeConverter(Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MaxChallenge).SelectedKey) ?? "30 (155000 PX)";
|
||||
var size = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Size).SelectedKey ?? "";
|
||||
var source = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Source).SelectedKey ?? "";
|
||||
var terrain = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Terrain).SelectedKey ?? "";
|
||||
token.ThrowIfCancellationRequested();
|
||||
|
||||
try
|
||||
|
|
@ -355,17 +361,12 @@ namespace AideDeJeu.ViewModels.Library
|
|||
using (var context = await StoreViewModel.GetLibraryContextAsync())
|
||||
{
|
||||
return context.Monsters.Where(monster =>
|
||||
monster != null &&
|
||||
monster.Family == this.Family &&
|
||||
monster.Type.Contains(type) &&
|
||||
(string.IsNullOrEmpty(size) || monster.Size.Equals(size)) &&
|
||||
(string.IsNullOrEmpty(source) || (monster.Source != null && monster.Source.Contains(source))) &&
|
||||
challengeComparer.Compare(monster.Challenge, minChallenge) >= 0 &&
|
||||
challengeComparer.Compare(monster.Challenge, maxChallenge) <= 0 &&
|
||||
(
|
||||
(Helpers.RemoveDiacritics(monster.Name).ToLower().Contains(Helpers.RemoveDiacritics(SearchText ?? string.Empty).ToLower())) ||
|
||||
(Helpers.RemoveDiacritics(monster.AltNameText ?? string.Empty).ToLower().Contains(Helpers.RemoveDiacritics(SearchText ?? string.Empty).ToLower()))
|
||||
)
|
||||
MatchEquals(monster.Family, this.Family) &&
|
||||
MatchContains(monster.Type, type) &&
|
||||
MatchEquals(monster.Size, size) &&
|
||||
MatchContains(monster.Terrain, terrain) &&
|
||||
MatchRange(monster.Challenge, minChallenge, maxChallenge, challengeComparer) &&
|
||||
MatchSearch(monster)
|
||||
).OrderBy(monster => Helpers.RemoveDiacritics(monster.Name)).ToList();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,14 @@
|
|||
using AideDeJeu.Tools;
|
||||
using AideDeJeu.Pdf;
|
||||
using AideDeJeu.Tools;
|
||||
using AideDeJeu.ViewModels.Library;
|
||||
using AideDeJeu.Views;
|
||||
using AideDeJeu.Views.Library;
|
||||
using AideDeJeu.Views.PlayerCharacter;
|
||||
using AideDeJeuLib;
|
||||
using Rg.Plugins.Popup.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
|
@ -152,11 +155,11 @@ namespace AideDeJeu.ViewModels
|
|||
var lastPage = navigationPage.Navigation.NavigationStack.LastOrDefault();
|
||||
var context = lastPage.BindingContext;
|
||||
Item item = null;
|
||||
if(context is ItemDetailViewModel)
|
||||
if (context is ItemDetailViewModel)
|
||||
{
|
||||
item = (context as ItemDetailViewModel).Item;
|
||||
}
|
||||
else if(context is ItemsViewModel)
|
||||
else if (context is ItemsViewModel)
|
||||
{
|
||||
item = (context as ItemsViewModel).AllItems;
|
||||
}
|
||||
|
|
@ -165,10 +168,10 @@ namespace AideDeJeu.ViewModels
|
|||
var result = await Application.Current.MainPage.DisplayActionSheet("Ajouter à", "Annuler", "Nouvelle liste", vm.BookmarkCollectionNames.ToArray<string>());
|
||||
if (result != "Annuler")
|
||||
{
|
||||
if(result == "Nouvelle liste")
|
||||
if (result == "Nouvelle liste")
|
||||
{
|
||||
int i = 1;
|
||||
while(vm.BookmarkCollectionNames.Contains(result = $"Nouvelle liste ({i})"))
|
||||
while (vm.BookmarkCollectionNames.Contains(result = $"Nouvelle liste ({i})"))
|
||||
{
|
||||
i++;
|
||||
}
|
||||
|
|
@ -230,7 +233,7 @@ namespace AideDeJeu.ViewModels
|
|||
{
|
||||
get
|
||||
{
|
||||
return _NavigateToLinkCommand ?? (_NavigateToLinkCommand = new Command<string>(async(s) => await NavigateToLinkAsync(s)));
|
||||
return _NavigateToLinkCommand ?? (_NavigateToLinkCommand = new Command<string>(async (s) => await NavigateToLinkAsync(s)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -261,7 +264,7 @@ namespace AideDeJeu.ViewModels
|
|||
var filterViewModel = items.GetNewFilterViewModel();
|
||||
var itemsViewModel = new ItemsViewModel() { AllItems = items, Filter = filterViewModel };
|
||||
itemsViewModel.LoadItemsCommand.Execute(null);
|
||||
if(!string.IsNullOrEmpty(with))
|
||||
if (!string.IsNullOrEmpty(with))
|
||||
{
|
||||
var swith = with.Split('_');
|
||||
for (int i = 0; i < swith.Length / 2; i++)
|
||||
|
|
@ -306,7 +309,7 @@ namespace AideDeJeu.ViewModels
|
|||
// create the Transparent Popup Page
|
||||
// of type string since we need a string return
|
||||
var popup = new InputAlertDialogBase<Tuple<string, PopupResultEnum>>(inputView);
|
||||
|
||||
|
||||
|
||||
// subscribe to the TextInputView's Button click event
|
||||
inputView.SaveButtonEventHandler +=
|
||||
|
|
@ -349,5 +352,24 @@ namespace AideDeJeu.ViewModels
|
|||
return result;
|
||||
}
|
||||
|
||||
private Command<string> _GeneratePDFCommand = null;
|
||||
public Command<string> GeneratePDFCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
return _GeneratePDFCommand ?? (_GeneratePDFCommand = new Command<string>(async (markdown) => await ExecuteGeneratePDFCommandAsync(markdown)));
|
||||
}
|
||||
}
|
||||
|
||||
public async Task ExecuteGeneratePDFCommandAsync(string markdown)
|
||||
{
|
||||
var page = new PdfViewPage();
|
||||
page.PdfFile = new Tools.NotifyTaskCompletion<string>(Task.Run(async() =>
|
||||
{ return await PdfService.Instance.MarkdownToPDF(new List<string>() { markdown }); }
|
||||
));
|
||||
page.BindingContext = page;
|
||||
await Navigation.PushAsync(page, true);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -125,9 +125,8 @@
|
|||
<Label>
|
||||
<Label.FormattedText>
|
||||
<FormattedString>
|
||||
<Span Text="Le contenu provient du jeu " />
|
||||
<Span Text="Héros & Dragons" FontAttributes="Bold" />
|
||||
<Span Text=" et du SRD VO" />
|
||||
<Span Text="Héros & Dragons est édité par " />
|
||||
<Span Text="Black Book Editions" FontAttributes="Bold" />
|
||||
</FormattedString>
|
||||
</Label.FormattedText>
|
||||
<Label.GestureRecognizers>
|
||||
|
|
@ -135,6 +134,19 @@
|
|||
</Label.GestureRecognizers>
|
||||
</Label>
|
||||
|
||||
<Label>
|
||||
<Label.FormattedText>
|
||||
<FormattedString>
|
||||
<Span Text="Le contenu provient du DRS de " />
|
||||
<Span Text="Héros & Dragons" FontAttributes="Bold" />
|
||||
<Span Text=" et du SRD de la 5è édition" />
|
||||
</FormattedString>
|
||||
</Label.FormattedText>
|
||||
<Label.GestureRecognizers>
|
||||
<TapGestureRecognizer Command="{Binding OpenWebCommand}" CommandParameter="https://heros-et-dragons.fr/" />
|
||||
</Label.GestureRecognizers>
|
||||
</Label>
|
||||
|
||||
<Label Text="Il est soumis à la licence OGL" />
|
||||
|
||||
<Label Text="{Binding OGL}" />
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.ToolbarItems>
|
||||
<ToolbarItem Name="Print" Text="Générer un PDF" Order="Secondary" Icon="round_star.png" Command="{Binding Main.Navigator.GeneratePDFCommand}" CommandParameter="{Binding Item.Markdown}" />
|
||||
<ToolbarItem Name="AddToFavorites" Text="Ajouter aux favoris" Order="Primary" Icon="round_star.png" Command="{Binding Main.Navigator.AddToFavoritesCommand}" />
|
||||
</ContentPage.ToolbarItems>
|
||||
<Grid>
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.ToolbarItems>
|
||||
<ToolbarItem Name="Print" Text="Générer un PDF" Order="Secondary" Icon="round_star.png" Command="{Binding Main.Navigator.GeneratePDFCommand}" CommandParameter="{Binding BindingContext.Items.Markdown, Source={x:Reference This}}" />
|
||||
<ToolbarItem Name="AddToFavorites" Text="Ajouter aux favoris" Order="Primary" Icon="round_star.png" Command="{Binding Main.Navigator.AddToFavoritesCommand}" />
|
||||
</ContentPage.ToolbarItems>
|
||||
<Grid>
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
}
|
||||
grid label {
|
||||
text-align: center;
|
||||
font-family: LinuxLibertineCapitalsBold;
|
||||
font-family: LinuxLibertineCapitals;
|
||||
-xf-vertical-text-alignment: end;
|
||||
vertical-align: end;
|
||||
}
|
||||
|
|
@ -87,19 +87,19 @@
|
|||
<!--<Label Text="{Binding Main.Navigator.TestNotify}" TextColor="Transparent" />-->
|
||||
<Frame>
|
||||
<Grid>
|
||||
<Label Text="Personnages" />
|
||||
<Label Text="Personnages" FontFamily="{StaticResource LinuxLibertineCapitals}" />
|
||||
<ImageButton Source="battle_axe.png" Command="{Binding Main.Navigator.PlayerCharacterEditorCommand}" />
|
||||
</Grid>
|
||||
</Frame>
|
||||
<Frame>
|
||||
<Grid>
|
||||
<Label Text="Dés" />
|
||||
<Label Text="Dés" FontFamily="{StaticResource LinuxLibertineCapitals}" />
|
||||
<ImageButton Source="d20.png" Command="{Binding Main.Navigator.DicesCommand}" />
|
||||
</Grid>
|
||||
</Frame>
|
||||
<Frame>
|
||||
<Grid>
|
||||
<Label Text="Bibliothèque" />
|
||||
<Label Text="Bibliothèque" FontFamily="{StaticResource LinuxLibertineCapitals}" />
|
||||
<ImageButton Source="spell_book.png" Command="{Binding Main.Navigator.LibraryCommand}" />
|
||||
</Grid>
|
||||
</Frame>
|
||||
|
|
@ -117,7 +117,7 @@
|
|||
</Frame>-->
|
||||
<Frame>
|
||||
<Grid>
|
||||
<Label Text="A propos de..." />
|
||||
<Label Text="A propos de..." FontFamily="{StaticResource LinuxLibertineCapitals}" />
|
||||
<ImageButton Source="wooden_sign.png" Command="{Binding Main.Navigator.AboutCommand}" />
|
||||
</Grid>
|
||||
</Frame>
|
||||
|
|
|
|||
|
|
@ -12,11 +12,13 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="HtmlAgilityPack" Version="1.11.7" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.4" />
|
||||
<PackageReference Include="sqlite-net-pcl" Version="1.6.258-beta" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.5.1" />
|
||||
<PackageReference Include="Xamarin.Essentials" Version="1.1.0" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="4.0.0.425677" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="4.0.0.497661" />
|
||||
<PackageReference Include="XamiTextSharpLGPLv2" Version="1.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using AideDeJeu.Tools;
|
||||
using AideDeJeu.Pdf;
|
||||
using AideDeJeu.Tools;
|
||||
using AideDeJeu.ViewModels;
|
||||
using AideDeJeuLib;
|
||||
using Markdig;
|
||||
|
|
@ -132,16 +133,16 @@ namespace AideDeJeuCmd
|
|||
var anchors = new List<string>();
|
||||
var allitems = new Dictionary<string, Item>();
|
||||
var names = Helpers.GetResourceNames();
|
||||
foreach(var name in names)
|
||||
foreach (var name in names)
|
||||
{
|
||||
//if (name.Contains("_hd."))
|
||||
//{
|
||||
var md = await Helpers.GetResourceStringAsync(name);
|
||||
var item = DependencyService.Get<StoreViewModel>().ToItem(name, md, null);
|
||||
allitems.Add(name, item);
|
||||
var md = await Helpers.GetResourceStringAsync(name);
|
||||
var item = DependencyService.Get<StoreViewModel>().ToItem(name, md, null);
|
||||
allitems.Add(name, item);
|
||||
//}
|
||||
}
|
||||
foreach(var allitem in allitems)
|
||||
foreach (var allitem in allitems)
|
||||
{
|
||||
if (allitem.Value is Items)
|
||||
{
|
||||
|
|
@ -155,7 +156,7 @@ namespace AideDeJeuCmd
|
|||
}
|
||||
}
|
||||
}
|
||||
else if(allitem.Value != null)
|
||||
else if (allitem.Value != null)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(allitem.Value.Name))
|
||||
{
|
||||
|
|
@ -266,15 +267,15 @@ namespace AideDeJeuCmd
|
|||
}
|
||||
else
|
||||
{
|
||||
if(levelType != null)
|
||||
if (levelType != null)
|
||||
{
|
||||
await writer.WriteLineAsync(levelType);
|
||||
if(castingTime != null) await writer.WriteLineAsync(castingTime);
|
||||
if(range != null) await writer.WriteLineAsync(range);
|
||||
if(components != null) await writer.WriteLineAsync(components);
|
||||
if(duration != null) await writer.WriteLineAsync(duration);
|
||||
if(classes != null) await writer.WriteLineAsync(classes);
|
||||
if(source != null) await writer.WriteLineAsync(source);
|
||||
if (castingTime != null) await writer.WriteLineAsync(castingTime);
|
||||
if (range != null) await writer.WriteLineAsync(range);
|
||||
if (components != null) await writer.WriteLineAsync(components);
|
||||
if (duration != null) await writer.WriteLineAsync(duration);
|
||||
if (classes != null) await writer.WriteLineAsync(classes);
|
||||
if (source != null) await writer.WriteLineAsync(source);
|
||||
levelType = null;
|
||||
castingTime = null;
|
||||
range = null;
|
||||
|
|
@ -299,7 +300,7 @@ namespace AideDeJeuCmd
|
|||
|
||||
public static async Task PreloadAllItemsFromFilesAsync(StoreViewModel store)
|
||||
{
|
||||
foreach (var fileName in Directory.GetFiles(inDir, "*.md", new EnumerationOptions() { MatchType = MatchType.Simple, RecurseSubdirectories = false }))
|
||||
foreach (var fileName in Directory.GetFiles(inDir, "*.md", new EnumerationOptions() { MatchType = MatchType.Simple, RecurseSubdirectories = false }))
|
||||
{
|
||||
//foreach (var resourceName in Tools.Helpers.GetResourceNames())
|
||||
//{
|
||||
|
|
@ -318,7 +319,7 @@ namespace AideDeJeuCmd
|
|||
var item = store.ToItem(source, md, store._AllItems);
|
||||
if (item != null)
|
||||
{
|
||||
if(item.NewId == "hd_aasimar_aasimar.md")
|
||||
if (item.NewId == "hd_aasimar_aasimar.md")
|
||||
{
|
||||
Debug.WriteLine("");
|
||||
}
|
||||
|
|
@ -355,6 +356,7 @@ namespace AideDeJeuCmd
|
|||
Console.WriteLine("l : build library");
|
||||
Console.WriteLine("o : check orphan links");
|
||||
Console.WriteLine("p : test pdf");
|
||||
Console.WriteLine("h : extract html");
|
||||
Console.WriteLine("q : quitter");
|
||||
var key = Console.ReadKey(true);
|
||||
switch (key.KeyChar)
|
||||
|
|
@ -368,24 +370,413 @@ namespace AideDeJeuCmd
|
|||
case 'p':
|
||||
await TestPdfAsync();
|
||||
break;
|
||||
case 'h':
|
||||
await ExtractHtmlAsync();
|
||||
break;
|
||||
case 'q':
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static async Task ExtractHtmlAsync()
|
||||
{
|
||||
using (var output = new StreamWriter(@"..\..\..\..\..\Data\tome_of_beasts.md", false, Encoding.UTF8))
|
||||
{
|
||||
var parser = new HtmlParser();
|
||||
for (int i = 10; i <= 428; i++)
|
||||
//for (int i = 256; i <= 256; i++)
|
||||
{
|
||||
var doc = new HtmlAgilityPack.HtmlDocument();
|
||||
doc.Load($@"..\..\..\..\..\Ignore\tome_of_beasts\page{i}.html");
|
||||
parser.OutputMarkdown(parser.Parse(doc), output, Console.Error);
|
||||
//parser.OutputMarkdown(parser.Parse(doc), Console.Out, Console.Error);
|
||||
}
|
||||
output.Write("\n<!--/MonsterItem-->\n\n<!--/MonsterItems-->\n");
|
||||
}
|
||||
}
|
||||
|
||||
class HtmlParser
|
||||
{
|
||||
string key = "";
|
||||
string value = "";
|
||||
enum State
|
||||
{
|
||||
Before,
|
||||
Name,
|
||||
Type,
|
||||
TopKeyValues,
|
||||
Abilities,
|
||||
BottomKeyValues,
|
||||
Competencies,
|
||||
Actions,
|
||||
Reactions,
|
||||
|
||||
}
|
||||
|
||||
public class ParsedSpan
|
||||
{
|
||||
public string Text;
|
||||
public string Style;
|
||||
public string IdStyle;
|
||||
public string DivStyle;
|
||||
}
|
||||
public class FullLine : List<ParsedSpan>
|
||||
{
|
||||
}
|
||||
|
||||
public class FullText : List<FullLine>
|
||||
{
|
||||
|
||||
}
|
||||
public FullText Parse(HtmlAgilityPack.HtmlDocument doc)
|
||||
{
|
||||
var styles = doc.DocumentNode.SelectSingleNode("/html/head/style").InnerText.Split('\n');
|
||||
var txtDivs = doc.DocumentNode.SelectNodes("//div[@class='txt']");
|
||||
var fullText = new FullText();
|
||||
var fullLine = new FullLine();
|
||||
if (txtDivs != null)
|
||||
{
|
||||
foreach (var txtDiv in txtDivs)
|
||||
{
|
||||
var spans = txtDiv.Elements("span");
|
||||
for (var i = 0; i < spans.Count(); i++)
|
||||
{
|
||||
var span = spans.ToArray()[i];
|
||||
var spanId = span.GetAttributeValue("id", "");
|
||||
var spanStyle = span.GetAttributeValue("style", "");
|
||||
var spanIdStyle = new string(styles.SingleOrDefault(s => s.StartsWith($"#{spanId} ")).SkipWhile(c => c != '{').ToArray());
|
||||
var divStyle = txtDiv.GetAttributeValue("style", "");
|
||||
var parsedSpan = new ParsedSpan()
|
||||
{
|
||||
Text = span.InnerText.Replace(" ",""),
|
||||
Style = spanStyle,
|
||||
IdStyle = spanIdStyle,
|
||||
DivStyle = divStyle,
|
||||
};
|
||||
if (i == 0)
|
||||
{
|
||||
var previousParsedSpan = fullLine.LastOrDefault();
|
||||
if (previousParsedSpan == null)
|
||||
{
|
||||
var previousFullLine = fullText.LastOrDefault();
|
||||
if (previousFullLine != null)
|
||||
{
|
||||
previousParsedSpan = previousFullLine.LastOrDefault();
|
||||
}
|
||||
}
|
||||
|
||||
if (previousParsedSpan != null)
|
||||
{
|
||||
if (previousParsedSpan.Style != parsedSpan.Style || previousParsedSpan.IdStyle != parsedSpan.IdStyle)
|
||||
{
|
||||
fullText.Add(fullLine);
|
||||
fullLine = new FullLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
fullLine.Add(parsedSpan);
|
||||
}
|
||||
}
|
||||
fullText.Add(fullLine);
|
||||
}
|
||||
|
||||
return fullText;
|
||||
}
|
||||
|
||||
string idssnn = "{ font-family:sans-serif; font-weight:normal; font-style:normal; }";
|
||||
string idssni = "{ font-family:sans-serif; font-weight:normal; font-style:italic; }";
|
||||
string idssbn = "{ font-family:sans-serif; font-weight:bold; font-style:normal; }";
|
||||
string idssbi = "{ font-family:sans-serif; font-weight:bold; font-style:italic; }";
|
||||
string idsbn = "{ font-family:serif; font-weight:bold; font-style:normal; }";
|
||||
string idsnn = "{ font-family:serif; font-weight:normal; font-style:normal; }";
|
||||
string idsni = "{ font-family:serif; font-weight:normal; font-style:italic; }";
|
||||
|
||||
string st23_255 = "font-size:23px;vertical-align:baseline;color:rgba(255,207,52,1);";
|
||||
string st16_255 = "font-size:16px;vertical-align:baseline;color:rgba(255,207,52,1);";
|
||||
string st11_255 = "font-size:11px;vertical-align:baseline;color:rgba(255,207,52,1);";
|
||||
string st48_0 = "font-size:48px;vertical-align:baseline;color:rgba(0,0,0,1);";
|
||||
string st14_137 = "font-size:14px;vertical-align:baseline;color:rgba(137,23,26,1);";
|
||||
string st8_0 = "font-size:8px;vertical-align:baseline;color:rgba(0,0,0,1);";
|
||||
string st8_121 = "font-size:8px;vertical-align:baseline;color:rgba(121,27,16,1);";
|
||||
string st8_137 = "font-size:8px;vertical-align:baseline;color:rgba(137,23,26,1);";
|
||||
string st9_203 = "font-size:9px;vertical-align:baseline;color:rgba(203,0,0,1);";
|
||||
|
||||
bool started = false;
|
||||
|
||||
public string MDStyle(string text, string style)
|
||||
{
|
||||
text = text.Trim();
|
||||
if (style.Contains("italic"))
|
||||
{
|
||||
text = $"_{text}_";
|
||||
}
|
||||
if (style.Contains("bold"))
|
||||
{
|
||||
text = $"**{text}**";
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
List<KeyValuePair<string, string>> MDSizes = new List<KeyValuePair<string, string>>()
|
||||
{
|
||||
new KeyValuePair<string, string>("Petite/Très Grande", "P/TG"),
|
||||
new KeyValuePair<string, string>("Très Petite", "TP"),
|
||||
new KeyValuePair<string, string>("Très Grande", "TG"),
|
||||
new KeyValuePair<string, string>("Grande", "G"),
|
||||
new KeyValuePair<string, string>("Moyenne", "M"),
|
||||
new KeyValuePair<string, string>("Gigantesque", "Gig"),
|
||||
//new KeyValuePair<string, string>("Moyenne (métamorphe)", "M"),
|
||||
//new KeyValuePair<string, string>("Très Petite taille ", "TP"),
|
||||
new KeyValuePair<string, string>("Petite", "P"),
|
||||
//new KeyValuePair<string, string>("Petite taille (cynome)", "P"),
|
||||
//new KeyValuePair<string, string>("Grande taille d’élémentaires de taille Minuscule", "G"),
|
||||
};
|
||||
|
||||
string ToMDSize(string size)
|
||||
{
|
||||
foreach(var mdsize in MDSizes)
|
||||
{
|
||||
if(size.Contains(mdsize.Key))
|
||||
{
|
||||
return mdsize.Value;
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
public void OutputMarkdown(FullText fullText, TextWriter output, TextWriter error)
|
||||
{
|
||||
var page = fullText.Where(l => l.FirstOrDefault().Style.Contains(st16_255))?.FirstOrDefault()?.FirstOrDefault()?.Text;
|
||||
Console.ForegroundColor = ConsoleColor.Yellow;
|
||||
error.WriteLine($"Page : {page}");
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
string abilities = null;
|
||||
foreach (var line in fullText)
|
||||
{
|
||||
var keySpan = line.FirstOrDefault();
|
||||
string value = "";
|
||||
if (line.Count > 1)
|
||||
{
|
||||
value = line.Skip(1).Select(p => MDStyle(p.Text, p.Style)).Aggregate((p1, p2) => p1.Trim() + " " + p2.Trim());
|
||||
}
|
||||
string text = MDStyle(keySpan.Text, keySpan.Style);
|
||||
Console.ForegroundColor = ConsoleColor.DarkGray;
|
||||
error.Write($"{text}");
|
||||
error.WriteLine($" {value}");
|
||||
|
||||
if (keySpan.Style.Contains(st48_0) && keySpan.IdStyle.Contains(idsnn))
|
||||
{ // titre de page
|
||||
Console.ForegroundColor = ConsoleColor.Blue;
|
||||
error.Write($"{text} {value}\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st9_203) && keySpan.IdStyle.Contains(idssnn))
|
||||
{ // bloodmark
|
||||
Console.ForegroundColor = ConsoleColor.Blue;
|
||||
error.Write($"{text} {value}\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st16_255) && keySpan.IdStyle.Contains(idsbn))
|
||||
{ // page
|
||||
Console.ForegroundColor = ConsoleColor.Blue;
|
||||
error.Write($"{text} {value}\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st8_0) && keySpan.IdStyle.Contains(idsnn))
|
||||
{ // encadré
|
||||
Console.ForegroundColor = ConsoleColor.Blue;
|
||||
error.Write($"{text} {value}\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st11_255) && keySpan.IdStyle.Contains(idssnn))
|
||||
{ // nom
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
if(!started)
|
||||
{
|
||||
started = true;
|
||||
output.Write("\n<!--MonsterItems Family=\"TomeOfBeasts\" Types=\"Humanoïde|Aberration|Bête|Céleste|Créature artificielle|Créature monstrueuse|Dragon|Élémentaire|Fée|Fiélon|Géant|Mort-vivant|Plante|Vase\" Challenges=\"0 (0 PX)|1/8 (25 PX)|1/4 (50 PX)|1/2 (100 PX)|1 (200 PX)|2 (450 PX)|3 (700 PX)|4 (1100 PX)|5 (1800 PX)|6 (2300 PX)|7 (2900 PX)|8 (3900 PX)|9 (5000 PX)|10 (5900 PX)|11 (7200 PX)|12 (8400 PX)|13 (10000 PX)|14 (11500 PX)|15 (13000 PX)|16 (15000 PX)|17 (18000 PX)|18 (20000 PX)|19 (22000 PX)|20 (25000 PX)|21 (33000 PX)|22 (41000 PX)|23 (50000 PX)|24 (62000 PX)|30 (155000 PX)\" Sizes=\"TP|P|M|G|TG|Gig\" Sources=\"CEO|SRD\" Terrains=\"Arctique / Subarctique|Bois / Forêt|Collines / Vallées|Désert chaud|Jungle|Littoral|Mangrove / Marécage|Mer / Océan|Montagnes|Plaine / Champs / Prairie / Savane|Plans élémentaires|Caverne aménagée|Caverne naturelle|Caverne sous-marine|Donjon maçonné|Ruines extérieures|Ruines souterraines|Ruines sous-marines\"-->\n\n");
|
||||
output.Write("# <!--Name-->Livre des monstres<!--/Name-->\n\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
output.Write("\n<!--/MonsterItem-->\n\n");
|
||||
}
|
||||
output.Write("<!--MonsterItem Family=\"TomeOfBeasts\"-->\n\n");
|
||||
output.Write($"# <!--Name-->{CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text.ToLower())}<!--/Name-->\n\n- Source: <!--Source-->(LDM p{page})<!--/Source-->\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st8_0) && keySpan.IdStyle.Contains(idssni) && text.Contains("taille"))
|
||||
{ // type / size / alignment
|
||||
// todo : découper type / size / alignment
|
||||
var regex = new Regex("^(?<type>.*?) de (taille )?(?<size>.*?)( taille)?, (?<alignment>.*?)$");
|
||||
var match = regex.Match(text);
|
||||
var type = match.Groups["type"].Value;
|
||||
var size = match.Groups["size"].Value;
|
||||
var alignment = match.Groups["alignment"].Value;
|
||||
if (type.Length > 0)
|
||||
{
|
||||
text = text.Replace(type, $"<!--Type-->{type}<!--/Type-->");
|
||||
text = text.Replace(",", $" (<!--Size-->{ToMDSize(size)}<!--/Size-->),");
|
||||
text = text.Replace(alignment, $"<!--Alignment-->{alignment}<!--/Alignment-->");
|
||||
}
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
output.Write($"- {text}\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st8_121) && keySpan.IdStyle.Contains(idssbn))
|
||||
{ // key / ...
|
||||
string tag = "";
|
||||
if (KeyTags.ContainsKey(text.Trim()))
|
||||
{
|
||||
tag = KeyTags[text.Trim()];
|
||||
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
output.Write($"- **{text.Trim()}** <!--{tag}-->{value}<!--/{tag}-->\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
//error.WriteLine($"ABILITIES");
|
||||
if (abilities == null)
|
||||
{
|
||||
abilities = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (keySpan.Style.Contains(st8_0) && keySpan.IdStyle.Contains(idssnn))
|
||||
{ // ... / value
|
||||
if (abilities != null)
|
||||
{
|
||||
abilities += text;
|
||||
if(value.Length > 0)
|
||||
{
|
||||
abilities += $" {value}";
|
||||
}
|
||||
if (abilities.Count(c => c == '(') == 6)
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
output.Write($"\n|FOR|DEX|CON|INT|SAG|CHA|\n|---|---|---|---|---|---|\n|{abilities.Replace(") ", ")").Replace(")", ")|")}\n\n");
|
||||
abilities = null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
output.Write($"{text} {value}\n");
|
||||
}
|
||||
}
|
||||
else if (keySpan.Style.Contains(st14_137) && keySpan.IdStyle.Contains(idsnn))
|
||||
{ // actions / réactions
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
output.Write($"\n## {text}\n{value}\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st8_0) && keySpan.IdStyle.Contains(idssnn))
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
output.Write($"{text.Trim()} {value}\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st8_0) && keySpan.IdStyle.Contains(idssbi))
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
output.Write($"\n**_{text.Trim()}_** {value}\n");
|
||||
}
|
||||
else if (keySpan.Style.Contains(st8_0) && keySpan.IdStyle.Contains(idssbn))
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
output.Write($"\n**{text.Trim()}** {value}\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
error.Write($"{text} {value}\n");
|
||||
error.Write($"{keySpan.Style}\n");
|
||||
error.Write($"{keySpan.IdStyle}\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StripLine()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Dictionary<string, string> KeyTags = new Dictionary<string, string>()
|
||||
{
|
||||
{ "Jets de sauvegarde", "SavingThrows" },
|
||||
{ "Classe d’armure" , "ArmorClass" },
|
||||
{ "Points de vie", "HitPoints" },
|
||||
{ "Vitesse", "Speed" },
|
||||
{ "Compétences", "Skills" },
|
||||
{ "Sens", "Senses" },
|
||||
{ "Langues", "Languages" },
|
||||
{ "Dangerosité", "Challenge" },
|
||||
{ "Résistance aux dégâts", "DamageResistances" },
|
||||
{ "Immunité contre les dégâts", "DamageImmunities" },
|
||||
{ "Immunité contre les états", "ConditionImmunities" },
|
||||
{ "Immunité contre l’état", "ConditionImmunities" },
|
||||
{ "Vulnérabilité aux dégâts", "DamageVulnerabilities" },
|
||||
//{ "", "" },
|
||||
//{ "", "" },
|
||||
//{ "", "" },
|
||||
//{ "", "" },
|
||||
//{ "", "" },
|
||||
};
|
||||
List<string> KeyCaracs = new List<string>()
|
||||
{
|
||||
"FOR", "DEX", "CON", "INT", "SAG", "CHA"
|
||||
};
|
||||
|
||||
string caracs = null;
|
||||
bool CloseKeyValue()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(key))
|
||||
{
|
||||
if (KeyTags.ContainsKey(key.Trim()))
|
||||
{
|
||||
var tag = KeyTags[key.Trim()];
|
||||
Console.WriteLine($"- **{key.Trim()}** <!--{tag}-->{value.Trim()}<!--/{tag}-->");
|
||||
}
|
||||
else if (KeyCaracs.Contains(key.Trim()))
|
||||
{
|
||||
if (key.Trim() == "FOR")
|
||||
{
|
||||
Console.WriteLine("|FOR|DEX|CON|INT|SAG|CHA|\n|---|---|---|---|---|---|");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine(value);
|
||||
}
|
||||
key = "";
|
||||
value = "";
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
static async Task TestPdfAsync()
|
||||
{
|
||||
Tests.Xamarin.Forms.Mocks.MockForms.Init();
|
||||
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());
|
||||
DependencyService.Register<INativeAPI, AideDeJeu.Cmd.Version_CMD>();
|
||||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||||
//Xamarin.Essentials.Platform.Init(this, bundle);
|
||||
//Xamarin.Essentials.ExperimentalFeatures.Enable(Xamarin.Essentials.ExperimentalFeatures.ShareFileRequest);
|
||||
|
||||
var pc = new AideDeJeu.ViewModels.PlayerCharacter.PlayerCharacterViewModel();
|
||||
var pce = new AideDeJeu.ViewModels.PlayerCharacter.PlayerCharacterEditorViewModel();
|
||||
var stream = new MemoryStream();
|
||||
pce.GeneratePdfToStream(pc, stream);
|
||||
var store = new StoreViewModel();
|
||||
|
||||
var item = await store.GetItemFromDataAsync("spells_hd", "aide");
|
||||
|
||||
using (var context = await StoreViewModel.GetLibraryContextAsync())
|
||||
{
|
||||
var spells = await context.Spells.ToListAsync();
|
||||
|
||||
var pdfService = new PdfService();
|
||||
//var pc = new AideDeJeu.ViewModels.PlayerCharacter.PlayerCharacterViewModel();
|
||||
//var pce = new AideDeJeu.ViewModels.PlayerCharacter.PlayerCharacterEditorViewModel();
|
||||
using (var stream = new FileStream("test.pdf", FileMode.Create))
|
||||
{
|
||||
//pdfService.MarkdownToPdf("# mon titre\n\nhop", stream);
|
||||
pdfService.MarkdownToPdf(spells.Select(s => s.Markdown).Take(3).ToList(), stream);
|
||||
//pdfService.MarkdownToPdf(new List<string>() { item.Markdown }, stream);
|
||||
//var stream = new MemoryStream();
|
||||
//pce.GeneratePdfToStream(pc, stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static async Task BuildLibraryAsync()
|
||||
|
|
@ -670,19 +1061,19 @@ namespace AideDeJeuCmd
|
|||
{
|
||||
//var file = "";
|
||||
var files = new Dictionary<string, string>();
|
||||
foreach(var aalinks in alllinks)
|
||||
foreach (var aalinks in alllinks)
|
||||
{
|
||||
var found = aalinks.Value.FirstOrDefault(t => t.Item2 == Helpers.IdFromName(unlinkedref));
|
||||
if(found != null)
|
||||
if (found != null)
|
||||
{
|
||||
files[found.Item1] = $"{found.Item1}.md";
|
||||
//file = $"{found.Item1}.md";
|
||||
//Console.WriteLine($"[{unlinkedref}]: {file}#{Helpers.IdFromName(unlinkedref)}");
|
||||
}
|
||||
}
|
||||
foreach(var aanchors in allanchors)
|
||||
foreach (var aanchors in allanchors)
|
||||
{
|
||||
if(aanchors.Value.Contains(Helpers.IdFromName(unlinkedref)))
|
||||
if (aanchors.Value.Contains(Helpers.IdFromName(unlinkedref)))
|
||||
{
|
||||
files[aanchors.Key] = $"{aanchors.Key}.md";
|
||||
//file = $"{aanchors.Key}.md";
|
||||
|
|
@ -690,7 +1081,7 @@ namespace AideDeJeuCmd
|
|||
//break;
|
||||
}
|
||||
}
|
||||
if(files.Count == 0)
|
||||
if (files.Count == 0)
|
||||
{
|
||||
files[""] = "";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,10 +10,10 @@
|
|||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.4" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
|
||||
<PackageReference Include="sqlite-net-pcl" Version="1.6.258-beta" />
|
||||
<PackageReference Include="Xamarin.Essentials" Version="1.1.0" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="4.0.0.425677" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="4.0.0.497661" />
|
||||
<PackageReference Include="XamiTextSharpLGPLv2" Version="1.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
|
|
@ -14,8 +14,9 @@
|
|||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.4" />
|
||||
<PackageReference Include="sqlite-net-pcl" Version="1.6.258-beta" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.5.1" />
|
||||
<PackageReference Include="Xamarin.Essentials" Version="1.1.0" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="4.0.0.425677" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="4.0.0.497661" />
|
||||
<PackageReference Include="XamiTextSharpLGPLv2" Version="1.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
42
Data/HD/baby_bestiary_aboleth_rejeton.md
Normal file
42
Data/HD/baby_bestiary_aboleth_rejeton.md
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Aboleth, rejeton
|
||||
|
||||
Voir [Aboleth](hd_monsters_aboleth.md)
|
||||
|
||||
- Aberration de taille M, Loyal Mauvais
|
||||
- **Terrain** Mer / Océan, Ruines sous-marines
|
||||
- **Classe d'armure** 15 (armure naturelle)
|
||||
- **Points de vie** 39 (6d8+12)
|
||||
- **Vitesse** 3 m, nage 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|13 (+1)| 9 (-1)|15 (+2)|14 (+2)|15 (+2)|14 (+2)|
|
||||
|
||||
- **Jets de sauvegarde** Con +4, Int +4
|
||||
- **Compétence** Perception +6
|
||||
- **Sens** vision dans le noir 36 m, Perception passive 16
|
||||
- **Langues** profond, télépathie 36 m
|
||||
- **Dangerosité** 2 (450 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Amphibie._** L'aboleth peut respirer à l'air libre et sous l'eau.
|
||||
|
||||
**_Nuage muqueux._** Sous l'eau, l'aboleth est entouré de mucosités aux propriétés transformatives. Les créatures qui touchent l'aboleth ou qui réussissent une attaque au corps-à-corps contre lui à une distance maximale de 1,50 mètre doivent effectuer un jet de sauvegarde de Constitution DD 12. En cas d'échec, la créature est malade pendant 1d4 heures. Une créature victime de cette maladie peut respirer uniquement sous l'eau.
|
||||
|
||||
**_Télépathie inquisitrice._** Si une créature communique par télépathie avec l'aboleth, celui-ci prend connaissance des plus grands désirs de la créature, à condition qu'elle soit dans son champ de vision.
|
||||
|
||||
**_Asservir (3/jour)._** L'aboleth cible une créature située à 9 mètres ou moins et dans son champ de vision. La cible doit réussir un jet de sauvegarde de Sagesse DD 12 pour ne pas être magiquement charmée par l'aboleth. Le charme disparaît quand l'aboleth meurt ou s'il se trouve sur un plan d'existence différent de celui de la cible. La cible charmée est sous le contrôle de l'aboleth et ne peut entreprendre aucune réaction. L'aboleth et la cible peuvent communiquer par télépathie, quelle que soit la distance qui les sépare. Chaque fois que la cible charmée subit des dégâts, elle peut retenter le jet de sauvegarde. En cas de réussite, l'effet prend fin. La cible peut retenter le jet de sauvegarde dès que l'aboleth s'éloigne de plus de 1,5 kilomètre d'elle, mais pas plus d'une fois toutes les 24 heures.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** L'aboleth effectue trois attaques de tentacule.
|
||||
|
||||
**_Tentacule._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 3 m, une cible.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts contondants. Si la cible est une créature, elle doit réussir un jet de sauvegarde de Constitution DD 12 pour ne pas tomber malade. La maladie ne produit aucun effet pendant 1 minute et peut être soignée par tout effet magique qui soigne les maladies. Au bout d'une minute, la peau de la créature malade devient translucide et visqueuse, la victime ne peut récupérer de points de vie que lorsqu'elle est sous l'eau et la maladie ne peut être soignée qu'avec une guérison ou un autre sort de niveau 6 ou plus qui soigne les maladies. Quand la créature n'est pas dans l'eau, elle subit 6 (1d12) dégâts d'acide toutes les 10 minutes, à moins que sa peau ne soit humidifée toutes les dix minutes.
|
||||
|
||||
45
Data/HD/baby_bestiary_ancien_dieu_rejeton.md
Normal file
45
Data/HD/baby_bestiary_ancien_dieu_rejeton.md
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Ancien dieu, rejeton
|
||||
|
||||
- Fiélon (titan) de taille G, Chaotique Mauvais
|
||||
- **Classe d'armure** 17 (armure naturelle)
|
||||
- **Points de vie** 100 (8d10+56)
|
||||
- **Vitesse** 9 m, nage 12 m, vol 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|20 (+5)|14 (+2)|24 (+7)|18 (+4)|18 (+4)|18 (+4)|
|
||||
|
||||
- **Jets de sauvegarde** Dex +6, Con +11, Sag +8
|
||||
- **Résistance aux dégâts** de feu, de froid, d'électricité ; contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Résistance aux dégâts** d'acide, de feu et de poison
|
||||
- **Immunité contre l'état** empoisonné
|
||||
- **Sens** vision parfaite 36 m, Perception passive 14
|
||||
- **Langue** infernal, télépathie 36 m
|
||||
- **Dangerosité** 8 (3 900 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Armes magiques._** Les attaques d'arme du rejeton divin sont magiques.
|
||||
|
||||
**_Aura de terreur._** Toutes les créatures hostiles envers le rejeton divin qui commencent leur tour à 6 mètres ou moins de lui doivent chacune effectuer un jet de sauvegarde de Sagesse DD 15, sauf si le rejeton est neutralisé. Les créatures qui ratent leur jet de sauvegarde sont terrorisées jusqu'au début de leur prochain tour. Celles qui réussissent leur jet de sauvegarde sont immunisées contre l'aura de terreur pendant 24 heures.
|
||||
|
||||
**_Incantation innée._** La caractéristique d'incantation du rejeton est l'Intelligence (DD du jet de sauvegarde contre les sorts 15). Le rejeton peut lancer les sorts suivants de manière innée sans composante matérielle : à volonté : explosion occulte (3 rayons), flamboiement funeste, putréfaction, strangulation
|
||||
|
||||
**_Résistance à la magie._** Le rejeton obtient un avantage lors des jets de sauvegarde contre les sorts et autres effets magiques.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** Le rejeton effectue deux attaques : une avec sa morsure, une avec ses griffes. De plus, il peut lancer un sort en action bonus.
|
||||
|
||||
**_Griffes._** Attaque d'arme au corps-à-corps : +9 pour toucher, allonge 3 m, une cible.
|
||||
|
||||
_Touché :_ 14 (2d8+5) dégâts tranchants.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +9 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 15 (3d6+5) dégâts perforants et la cible est empoignée (évasion DD 15). La cible est entravée jusqu'au terme de cette empoignade.
|
||||
|
||||
42
Data/HD/baby_bestiary_archon_canin_chiot.md
Normal file
42
Data/HD/baby_bestiary_archon_canin_chiot.md
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Archon canin, chiot
|
||||
|
||||
- Céleste de taille P, Loyal Bon
|
||||
- **Classe d'armure** 13 (armure naturelle)
|
||||
- **Points de vie** 16 (3d6+6)
|
||||
- **Vitesse** 9 m, vol 12 m (forme humanoïde)
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|6 (-2)|12 (+1)|14 (+2)|10 (+0)|13 (+1)|12 (+1)|
|
||||
|
||||
- **Compétence** Perception +3
|
||||
- **Résistance aux dégâts** d'électricité, nécrotiques, de poison ; contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Immunité contre les états** charmé et terrorisé
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 13
|
||||
- **Langues** toutes
|
||||
- **Dangerosité** 1/2 (100 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Métamorphe._** L'archon peut utiliser son action pour se métamorphoser en humanoïde ou en chien. Ses statistiques, à l'exception de sa CA, restent les mêmes, quelle que soit la forme adoptée. Ses objets équipés ou transportés ne sont pas transformés. L'archon reprend forme de chien s'il meurt.
|
||||
|
||||
**_Morsure magique._** La morsure de l'archon est magique.
|
||||
|
||||
**_Odorat._** L'archon obtient un avantage lors des tests de Sagesse (Perception) basés sur l'odorat.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples (forme humanoïde uniquement)._** L'archon effectue deux attaques : une avec sa morsure et une avec son arme.
|
||||
|
||||
**_Épée courte (forme humanoïde uniquement)._** Attaque d'arme au corps-à-corps ou à distance : +3 pour toucher, allonge 1,50 m, une créature.
|
||||
|
||||
_Touché :_ 4 (1d6+1) dégâts perforants.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 3 (1d4+1) dégâts perforants.
|
||||
|
||||
35
Data/HD/baby_bestiary_baku_elephanteau.md
Normal file
35
Data/HD/baby_bestiary_baku_elephanteau.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Baku, éléphanteau
|
||||
|
||||
- Aberration de taille P, Neutre
|
||||
- **Classe d'armure** 12
|
||||
- **Points de vie** 11 (2d8+2)
|
||||
- **Vitesse** 6 m, vol 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|6 (-2)|14 (+2)|13 (+1)|12 (+1)|14 (+2)|14 (+2)|
|
||||
|
||||
- **Résistance aux dégâts** contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Immunité contre les états** entravé, empoigné, empoisonné, épuisé, paralysé, pétrifé
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 12
|
||||
- **Langues** toutes
|
||||
- **Dangerosité** 1/2 (100 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Absorption des rêves._** Le baku peut se nourrir des rêves d'une créature endormie située dans un rayon de 12 m. La créature peut résister avec un jet de sauvegarde de Charisme DD 12. Le baku peut consommer les cauchemars ou tous les rêves. S'il ne dévore que les cauchemars, la créature ciblée est immunisée aux effets et aux sorts qui produisent des cauchemars pendant son sommeil. Si le baku se nourrit de tous les rêves de la créature, celle-ci subit un niveau d'épuisement à son réveil et ne bénéfcie d'aucun repos (long ou court).
|
||||
|
||||
**_Déplacement intangible._** Le baku peut traverser créatures et objets en les considérant comme un terrain difcile. Il subit 1d6 dégâts s'il termine son tour à l'intérieur d'un objet.
|
||||
|
||||
**_Griffes oniriques._** Les griffes du baku sont considérées comme magiques.
|
||||
|
||||
## Action
|
||||
|
||||
**_Griffes intangibles._** Attaque d'arme au corps-à-corps : +4 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 5 (1d6+2) dégâts psychiques.
|
||||
|
||||
41
Data/HD/baby_bestiary_balor_brandon.md
Normal file
41
Data/HD/baby_bestiary_balor_brandon.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Balor, brandon
|
||||
|
||||
Voir [Balor](hd_monsters_balor.md)
|
||||
|
||||
- Fiélon de taille P, Mauvais
|
||||
- **Terrain**
|
||||
- **Classe d'armure** 15 (armure naturelle)
|
||||
- **Points de vie** 37 (5d6+20)
|
||||
- **Vitesse** 6 m, vol 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|12 (+1)|10 (+0)|20 (+5)|10 (+0)|12 (+1)|10 (+0)|
|
||||
|
||||
- **Résistance aux dégâts** de froid ; contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Résistance aux dégâts** de feu et de poison
|
||||
- **Immunité contre l'état** empoisonné
|
||||
- **Sens** vision parfaite 18 m, Perception passive 11
|
||||
- **Langue** commun, télépathie 18 m
|
||||
- **Dangerosité** 2 (450 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Corps de feu._** Le balor peut traverser un interstice d'une largeur minimale de 20 centimètres sans devoir se faufiler. Une créature qui touche le balor ou réussit une attaque au corps-à-corps contre lui subit 3 (1d6) dégâts de feu.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** Le balor effectue deux attaques : une avec sa morsure, une avec ses griffes.
|
||||
|
||||
**_Griffes._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,5 m, une cible.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts tranchants.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts perforants plus 3 (1d6) dégâts de feu.
|
||||
|
||||
29
Data/HD/baby_bestiary_basilic_lezardeau.md
Normal file
29
Data/HD/baby_bestiary_basilic_lezardeau.md
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Basilic, lézardeau
|
||||
|
||||
Voir [Basilic](hd_monsters_basilic.md)
|
||||
|
||||
- Créature monstrueuse de taille P, non aligné
|
||||
- **Terrain** Collines / Vallées, Montagnes, Caverne naturelle, Ruines souterraines
|
||||
- **Classe d'armure** 14 (armure naturelle)
|
||||
- **Points de vie** 22 (4d6+8)
|
||||
- **Vitesse** 6 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|10 (+0)|12 (+1)|15 (+2)|2 (-4)|8 (-1)|7 (-2)|
|
||||
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 9
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Regard pétrifant._** Si une créature commence son tour à 9 mètres ou moins du basilic et que les deux peuvent se voir, le basilic, s'il n'est pas neutralisé, peut forcer la créature à effectuer un jet de sauvegarde de Constitution DD 10. En cas d'échec, la créature commence à se transformer en pierre par magie et devient entravée. Elle doit retenter le jet de sauvegarde à la fin de son prochain tour. En cas de réussite, l'effet prend fin. En cas d'échec, la créature est pétrifée tant qu'elle n'est pas libérée par un sort de restauration supérieure ou une magie similaire. Une créature qui n'est pas surprise peut détourner le regard au début de son tour pour ne pas avoir à faire le jet de sauvegarde. Si elle agit de la sorte, elle ne peut pas voir le basilic jusqu'au début de son prochain tour, moment où elle peut détourner le regard à nouveau. Elle doit effectuer le jet de sauvegarde immédiatement si elle regarde le basilic entre-temps. Si le basilic voit son reflet sous une lumière vive à une distance maximale de 9 mètres, il le prend pour un ennemi et le cible de son regard.
|
||||
|
||||
## Action
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible. Touché: 6 (2d4+1) dégâts perforants plus 3 (1d6) dégâts de poison.
|
||||
|
||||
33
Data/HD/baby_bestiary_beithir.md
Normal file
33
Data/HD/baby_bestiary_beithir.md
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Beithir
|
||||
|
||||
- Créature monstrueuse de taille M, non aligné
|
||||
- **Classe d'armure** 14 (armure naturelle)
|
||||
- **Points de vie** 43 (5d8+20)
|
||||
- **Vitesse** 9 m, escalade 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|14 (+2)|14 (+2)|18 (+4)|5 (-3)|14 (+2)|12 (+1)|
|
||||
|
||||
- **Compétences** Discrétion +4, Perception +4
|
||||
- **Résistance aux dégâts** de foudre
|
||||
- **Sens** vision dans le noir 27 m, Perception passive 16
|
||||
- **Langue** aucune
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** Le beithir effectue deux attaques : une avec sa morsure et une pour saisir.
|
||||
|
||||
**_Engloutir._** Le beithir effectue une attaque de morsure contre une cible de taille petite qu'il empoigne. Si l'attaque est réussie, la cible est également engloutie et l'empoignade prend fin. Tant qu'elle est engloutie, la cible est aveuglée et entravée, elle bénéfcie d'un abri total contre les attaques et autres effets provenant de l'extérieur du beithir et elle subit 7 (2d6) dégâts d'acide au début de chacun des tours du beithir. Un beithir ne peut engloutir qu'une seule créature à la fois. Si le beithir subit 10 dégâts ou plus infligés lors d'un seul tour par la créature engloutie, il doit réussir un jet de sauvegarde de Constitution DD 14 à la fin de ce tour pour ne pas régurgiter la créature qui tombe alors à terre à un emplacement situé à 3 mètres ou moins de lui. Si le beithir meurt, une créature engloutie n'est plus entravée et peut s'extirper de la carcasse en dépensant 3 mètres de déplacement. Elle tombe à terre en sortant.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +4 pour toucher, allonge 1,5 m, une cible.
|
||||
|
||||
_Touché :_ 9 (2d6+2) dégâts perforants.
|
||||
|
||||
**_Saisir._** Attaque d'arme au corps-à-corps : +4 pour toucher, allonge 1,50 m, une créature de taille P ou plus petite. La cible est empoignée (DD 16 pour se libérer) si le beithir n'est pas déjà en train de saisir une créature et elle est entravée jusqu'au terme de cette empoignade.
|
||||
|
||||
30
Data/HD/baby_bestiary_bulette_chevreau.md
Normal file
30
Data/HD/baby_bestiary_bulette_chevreau.md
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Bulette, chevreau
|
||||
|
||||
Voir [Bulette](hd_monsters_bulette.md)
|
||||
|
||||
- Créature monstrueuse de taille M, non aligné
|
||||
- **Terrain** Bois / Forêt, Collines / Vallées, Caverne naturelle
|
||||
- **Classe d'armure** 15 (armure naturelle)
|
||||
- **Points de vie** 38 (4d8+20)
|
||||
- **Vitesse** 9 m, fouissement 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|12 (+1)|13 (+1)|21 (+5)|2 (-4)|10 (+0)|5 (-3)|
|
||||
|
||||
- **Compétence** Perception +4
|
||||
- **Sens** perception des vibrations 18 m, vision dans le noir 18 m, Perception passive 14
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Saut sans élan._** La bulette saute sur une longueur maximale de 6 mètres et une hauteur maximale de 3 mètres, avec ou sans élan préalable.
|
||||
|
||||
## Action
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.Touché : 10 (2d8+1) dégâts perforants.
|
||||
|
||||
34
Data/HD/baby_bestiary_centaure_poulain.md
Normal file
34
Data/HD/baby_bestiary_centaure_poulain.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Centaure, poulain
|
||||
|
||||
Voir [Centaure](hd_monsters_centaure.md)
|
||||
|
||||
- Créature monstrueuse de taille M, Neutre Bon
|
||||
- **Terrain** Désert chaud, Plaine / Champs / Prairie / Savane
|
||||
- **Classe d'armure** 12
|
||||
- **Points de vie** 19 (3d8+6)
|
||||
- **Vitesse** 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|10 (+0)|15 (+2)|14 (+2)|9 (+0)|13 (+1)|10 (+0)|
|
||||
|
||||
- **Compétence** Athlétisme +2
|
||||
- **Sens** Perception passive 11
|
||||
- **Dangerosité** 1/4 (50 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** Le centaure effectue deux attaques, l'une avec son arme (s'il en possède une) et l'autre avec ses sabots.
|
||||
|
||||
**_Sabots._** Attaque d'arme au corps-à-corps : +2 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 5 (2d4) dégâts.
|
||||
|
||||
**_Arme._** Attaque d'arme au corps-à-corps : +2 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ selon arme.
|
||||
|
||||
34
Data/HD/baby_bestiary_cerbere_chiot.md
Normal file
34
Data/HD/baby_bestiary_cerbere_chiot.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Cerbère, chiot
|
||||
|
||||
Voir [Cerbère](hd_monsters_cerbere.md)
|
||||
|
||||
- Créature monstrueuse de taille M, Neutre Mauvais
|
||||
- **Terrain** Bois / Forêt, Jungle, Montagnes
|
||||
- **Classe d'armure** 13
|
||||
- **Points de vie** 45 (6d8+18)
|
||||
- **Vitesse** 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|10 (+0)|14 (+2)|16 (+3)|5 (-3)|14 (+2)|10 (+0)|
|
||||
|
||||
- **Compétence** Perception +6
|
||||
- **Résistance aux dégâts** de poison
|
||||
- **Immunité contre les états** assourdi, aveuglé et empoisonné
|
||||
- **Sens** vision parfaite 12 m, Perception passive 16
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Détection des proies._** Le petit cerbère peut détecter la direction de la créature à sang chaud de taille moyenne (ou petite, faute de mieux) la plus proche de lui dans un rayon de 100 mètres. Pour cela, il doit faire un test de Sagesse (Perception) opposé à la Dextérité (Discrétion) de sa cible. Si la cible est située à plus de 50 mètres de distance, il subit un désavantage à son test.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** Le cerbère effectue trois attaques, une pour chaque tête.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +2 pour toucher, allonge 1,50 m, une cible.Touché : 5 (2d4) dégâts perforants et la cible doit réussir un jet de sauvegarde de Constitution DD 10 ou être empoisonnée par la salive.
|
||||
|
||||
34
Data/HD/baby_bestiary_chien_esquiveur_chiot.md
Normal file
34
Data/HD/baby_bestiary_chien_esquiveur_chiot.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Chien esquiveur, chiot
|
||||
|
||||
Voir [Chien esquiveur](hd_monsters_chien_esquiveur.md)
|
||||
|
||||
- Fée de taille P, Loyal Bon
|
||||
- **Terrain** Plaine / Champs / Prairie / Savane
|
||||
- **Classe d'armure** 13
|
||||
- **Points de vie** 9 (2d6+2)
|
||||
- **Vitesse** 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|7 (-2)|17 (+3)|12 (+1)|8 (-1)|13 (+1)|11 (+0)|
|
||||
|
||||
- **Compétences** Discrétion +5, Perception +3
|
||||
- **Sens** Perception passive 13
|
||||
- **Dangerosité** 1/8 (25 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Odorat et ouïe aiguisés._** Le chien obtient un avantage lors des tests de Sagesse (Perception) basés sur l'odorat ou l'ouïe.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +0 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 1 dégât perforant.
|
||||
|
||||
**_Téléportation (Recharge 5-6)._** Le chien se téléporte par magie avec tous ses objets équipés et transportés vers un emplacement inoccupé situé dans son champ de vision à une distance maximale de 12 mètres. Le chien peut effectuer une attaque de morsure avant ou après s'être téléporté.
|
||||
|
||||
40
Data/HD/baby_bestiary_chimere_lionceau.md
Normal file
40
Data/HD/baby_bestiary_chimere_lionceau.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Chimère, lionceau
|
||||
|
||||
Voir [Chimère](hd_monsters_chimere.md)
|
||||
|
||||
- Créature monstrueuse de taille M, Chaotique Mauvais
|
||||
- **Terrain** Bois / Forêt, Montagnes, Ruines extérieures
|
||||
- **Classe d'armure** 13 (armure naturelle)
|
||||
- **Points de vie** 37 (5d8+15)
|
||||
- **Vitesse** 9 m, vol 12 m (dès 16 mois)
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|13 (+1)|11 (+0)|16 (+3)|3 (-4)|14 (+2)|10 (+0)|
|
||||
|
||||
- **Compétence** Perception +6
|
||||
- **Sens** vision parfaite 12 m, Perception passive 16
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** La chimère effectue trois attaques : une avec sa morsure, une avec ses cornes et une avec ses griffes. Quand son souffle de feu est disponible, elle peut l'utiliser à la place de sa morsure ou de ses cornes.
|
||||
|
||||
**_Cornes._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 5 (1d8+1) dégâts contondants.
|
||||
|
||||
**_Griffes._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts tranchants.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts perforants.
|
||||
|
||||
**_Souffle de feu (Recharge 6)._** La tête de dragon souffle un cône de feu de 4,50 mètres. Les créatures dans le cône doivent chacune effectuer un jet de sauvegarde de Dextérité DD 12 ; elles subissent 18 (4d8) dégâts de feu en cas de jet de sauvegarde raté ou la moitié de ces dégâts seulement en cas de réussite.
|
||||
|
||||
26
Data/HD/baby_bestiary_cocatrice_poussin.md
Normal file
26
Data/HD/baby_bestiary_cocatrice_poussin.md
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Cocatrice, poussin
|
||||
|
||||
Voir [Cockatrice](hd_monsters_cockatrice.md)
|
||||
|
||||
- Créature monstrueuse de taille TP, non aligné
|
||||
- **Terrain** Collines / Vallées, Plaine / Champs / Prairie / Savane
|
||||
- **Classe d'armure** 13
|
||||
- **Points de vie** 7 (2d4+2)
|
||||
- **Vitesse** 6 m, vol 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|2 (-4)|12 (+1)|12 (+1)|2 (-4)|13 (+1)|5 (-3)|
|
||||
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 11 Dangerosité 1/4 (50 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +0 pour toucher, allonge 1,50 m, une créature.
|
||||
|
||||
_Touché :_ 1 dégât perforant et la cible doit réussir un jet de sauvegarde de Constitution DD 8 pour ne pas être pétrifée par magie. En cas de jet de sauvegarde raté, le corps de la créature commence à se transformer en pierre et elle est entravée. Elle doit retenter le jet de sauvegarde à la fin de son prochain tour. En cas de réussite, l'effet prend fin. En cas d'échec, la créature est pétrifée pendant 24 heures.
|
||||
|
||||
41
Data/HD/baby_bestiary_couatl_nouveau_ne.md
Normal file
41
Data/HD/baby_bestiary_couatl_nouveau_ne.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Couatl, nouveau-né
|
||||
|
||||
Voir [Couatl](hd_monsters_couatl.md)
|
||||
|
||||
- Créature monstrueuse de taille P, Loyal Bon
|
||||
- **Terrain** Jungle, Mangrove / Marécage
|
||||
- **Classe d'armure** 16 (armure naturelle)
|
||||
- **Points de vie** 39 (6d6+18)
|
||||
- **Vitesse** 6 m, vol 18 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|9 (-1)|18 (+4)|16 (+3)|12 (+1)|14 (+2)|14 (+2)|
|
||||
|
||||
- **Compétence** Perception +4
|
||||
- **Résistance aux dégâts** radiants
|
||||
- **Résistance aux dégâts** psychiques ; contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Sens** vision parfaite 36 m, Perception passive 14
|
||||
- **Langues** toutes, télépathie 36 m
|
||||
- **Dangerosité** 1/2 (100 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Armes magiques._** Les attaques d'arme du couatl sont magiques.
|
||||
|
||||
**_Esprit protégé._** Le couatl est immunisé contre la scrutation et tous les effets susceptibles de percevoir ses émotions, de lire ses pensées ou de savoir où il se trouve.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Comprimer._** Attaque d'arme au corps-à-corps : +1 pour toucher, allonge 1,5 m, une créature de taille P ou plus petite.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts contondants et la cible est empoignée (DD 10 pour se libérer). Jusqu'au terme de l'empoignade, la cible est entravée et le couatl ne peut pas comprimer une autre cible.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +1 pour toucher, allonge 1,50 m, une créature.
|
||||
|
||||
_Touché :_ 2 (1d6-1) dégâts perforants et la cible doit réussir un jet de sauvegarde de Constitution DD 10 pour ne pas être empoisonnée pendant 24 heures. Elle est inconsciente tant que le poison fait effet. Une autre créature peut effectuer une action pour secouer la cible afin qu'elle reprenne connaissance.
|
||||
|
||||
31
Data/HD/baby_bestiary_criard_bouton.md
Normal file
31
Data/HD/baby_bestiary_criard_bouton.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Criard, bouton
|
||||
|
||||
Voir [Criard](hd_monsters_criard.md)
|
||||
|
||||
- Plante de taille P, non aligné
|
||||
- **Terrain** Caverne aménagée, Caverne naturelle, Ruines souterraines
|
||||
- **Classe d'armure** 5
|
||||
- **Points de vie** 3 (1d6)
|
||||
- **Vitesse** 0 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|1 (-5)|1 (-5)|10 (+0)|1 (-5)|3 (-4)|1 (-5)|
|
||||
|
||||
- **Immunité contre les états** assourdi, aveuglé et terrorisé
|
||||
- **Sens** vision aveugle 9 m (aveugle au-delà de cette distance), Perception passive 6
|
||||
- **Langues** —
|
||||
- **Dangerosité** 0 (10 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Faux-semblant._** Aussi longtemps que le criard reste immobile, il est impossible de le différencier d'un champignon ordinaire.
|
||||
|
||||
## Réactions
|
||||
|
||||
**_Hurlement._** Quand une lumière vive ou une créature s'approche à 9 mètres ou moins du criard, celui-ci émet un hurlement audible jusqu'à 30 mètres. Le criard continue de hurler jusqu'à ce que la source de gêne se déplace hors de portée et pendant ses 1d4 prochains tours.
|
||||
|
||||
34
Data/HD/baby_bestiary_cube_gelatineux_bebe.md
Normal file
34
Data/HD/baby_bestiary_cube_gelatineux_bebe.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Cube gélatineux, bébé
|
||||
|
||||
Voir [Cube gélatineux](hd_monsters_cube_gelatineux.md)
|
||||
|
||||
- Vase de taille P, non aligné
|
||||
- **Terrain** Donjon maçonné, Ruines souterraines
|
||||
- **Classe d'armure** 6
|
||||
- **Points de vie** 17 (2d6+10)
|
||||
- **Vitesse** 4,5 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|8 (-2)|3 (-4)|20 (+5)|1 (-5)|6 (-2)|1 (-5)|
|
||||
|
||||
- **Immunité contre les états** à terre, assourdi, aveuglé, charmé, terrorisé et épuisé
|
||||
- **Sens** vision aveugle 18 m (aveugle au-delà de ce rayon), Perception passive 8
|
||||
- **Dangerosité** 1/4 (50 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Transparent._** Même quand le cube est visible de tous, il faut réussir un test de Sagesse (Perception) DD 15 pour le repérer, à condition qu'il n'attaque pas ni ne se déplace. Une créature qui tente d'entrer dans l'emplacement qu'il occupe sans être consciente de sa présence est surprise par le cube.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Enveloppement._** Le cube se déplace d'une distance maximale égale à sa vitesse. Pendant ce déplacement, il peut entrer dans les emplacements occupés par des créatures de taille P ou plus petites. Chaque fois que le cube entre dans l'emplacement d'une créature, celle-ci doit effectuer un jet de sauvegarde de Dextérité DD 12. En cas de jet de sauvegarde réussi, la créature peut décider qu'elle est repoussée de 1,50 mètre vers l'arrière ou sur le côté du cube. Une créature qui décide de rester subit les conséquences d'un jet de sauvegarde raté. En cas de jet de sauvegarde raté, le cube entre dans l'emplacement de la créature ; elle subit 3 (1d6) dégâts d'acide et elle est enveloppée. La créature enveloppée ne peut plus respirer, elle est entravée et subit 7 (2d6) dégâts d'acide au début de chacun des tours du cube. Quand le cube se déplace, la créature enveloppée se déplace avec lui. Une créature enveloppée peut tenter de s'échapper en faisant une action pour effectuer un test de Force DD 8. En cas de réussite, la créature s'échappe et entre dans un emplacement de son choix situé à 1,50 mètre du cube.
|
||||
|
||||
**_Pseudopode._** Attaque d'arme au corps-à-corps : +0 pour toucher, allonge 1,50 m, une créature.
|
||||
|
||||
_Touché :_ 3 (1d6) dégâts d'acide.
|
||||
|
||||
34
Data/HD/baby_bestiary_destrier_noir_poulain.md
Normal file
34
Data/HD/baby_bestiary_destrier_noir_poulain.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Destrier noir, poulain
|
||||
|
||||
Voir [Destrier noir](hd_monsters_destrier_noir.md)
|
||||
|
||||
- Créature monstrueuse de taille M, Neutre Mauvais
|
||||
- **Terrain**
|
||||
- **Classe d'armure** 13 (armure naturelle)
|
||||
- **Points de vie** 30 (4d8+12)
|
||||
- **Vitesse** 12 m, vol 18 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|10 (+0)|15 (+2)|16 (+3)|10 (+0)|13 (+1)|15 (+2)|
|
||||
|
||||
- **Résistance aux dégâts** de feu
|
||||
- **Sens** Perception passive 11
|
||||
- **Dangerosité** 1/2 (100 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Conférer une résistance au feu._** Le destrier noir peut conférer une résistance aux dégâts de feu à quiconque le chevauche.
|
||||
|
||||
**_Illumination._** Le destrier noir diffuse une lumière vive sur un rayon de 3 mètres et une faible lumière sur un rayon de 3 mètres supplémentaires.
|
||||
|
||||
## Action
|
||||
|
||||
**_Sabots._** Attaque d'arme au corps-à-corps : +2 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 7 (2d6) dégâts contondants plus 3 (1d6) dégâts de feu.
|
||||
|
||||
37
Data/HD/baby_bestiary_djinayni.md
Normal file
37
Data/HD/baby_bestiary_djinayni.md
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Djinayni
|
||||
|
||||
Voir [Djinn](hd_monsters_djinn.md)
|
||||
|
||||
- Élémentaire de taille P, Chaotique Bon
|
||||
- **Terrain** Montagnes, Plans élémentaires
|
||||
- **Classe d'armure** 17 (armure naturelle)
|
||||
- **Points de vie** 41 (5d6+24)
|
||||
- **Vitesse** 6 m, vol 18 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|12 (+1)|15 (+2)|22 (+6)|11 (+1)|14 (+2)|14 (+2)|
|
||||
|
||||
- **Jets de sauvegarde** Dex +4, Sag +4
|
||||
- **Immunité aux dégâts** de foudre et de tonnerre
|
||||
- **Sens** vision dans le noir 36 m, Perception passive 12
|
||||
- **Langue** aérien
|
||||
- **Dangerosité** 2 (400 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Incantation innée._** La caractéristique d'incantation du djinn est le Charisme (DD du jet de sauvegarde contre les sorts 14, +4 pour toucher avec les attaques de sort). Le djinn peut lancer les sorts suivants de manière innée sans aucune composante matérielle :
|
||||
|
||||
* _à volonté :_ détection de la magie, vague tonnante ;
|
||||
* _1/jour chacun :_ forme gazeuse, invisibilité.
|
||||
|
||||
**_Trépas élémentaire._** Quand le djinn meurt, son corps se dissout en une brise chaude en ne laissant derrière lui que ses objets équipés ou transportés.
|
||||
|
||||
## Action
|
||||
|
||||
**_Création d'un tourbillon._** Un cylindre d'air tourbillonnant de 1,50 mètre de rayon et de 9 mètres de haut apparaît à un point situé à 36 mètres ou moins du djinn dans son champ de vision. Le tourbillon dure tant que le djinn reste concentré (comme s'il se concentrait sur un sort). Toutes les créatures (à l'exception du djinn) qui entrent dans le tourbillon doivent réussir un jet de sauvegarde de Force DD 12 pour ne pas être entravées par ce phénomène. Le djinn peut déplacer le tourbillon sur une distance maximale de 18 mètres par une action et les créatures entravées par le tourbillon se déplacent avec lui. Le tourbillon disparaît s'il sort du champ de vision du djinn. Une créature peut consacrer une action à dégager une créature entravée par le tourbillon, elle-même y compris, en réussissant un test de Force DD 12. Si le test est réussi, la créature n'est plus entravée et se déplace vers l'emplacement le plus proche à l'extérieur du tourbillon.
|
||||
|
||||
33
Data/HD/baby_bestiary_dodomeki_petit_oeil.md
Normal file
33
Data/HD/baby_bestiary_dodomeki_petit_oeil.md
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Dodomeki, petit oeil
|
||||
|
||||
- Aberration de taille P, Loyal Mauvais
|
||||
- **Classe d'armure** 12
|
||||
- **Points de vie** 45 (6d6+24)
|
||||
- **Vitesse** vol 6 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|6 (-4)|14 (+2)|18 (+4)|14 (+2)|14 (+2)|10 (+0)|
|
||||
|
||||
- **Sauvegardes** Int +4
|
||||
- **Compétence** Perception +4
|
||||
- **Immunité contre l'état** à terre
|
||||
- **Sens** vision dans le noir 36 m, Perception passive 14
|
||||
- **Dangerosité** 2 (450 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Cône de dissipation de la magie._** Le petit œil peut dissiper la magie dans une zone conique de 12 mètres de côté. Cet effet est équivalent à l'utilisation du sort dissipation de la magie dans toute la zone affectée.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaque de sort._** Selon son stade de développement le petit œil connaît de 1 à 10 sorts de votre choix de niveau 1 à 3. Il peut lancer un sort à chaque round en plus de son attaque de morsure, comme un lanceur de sort de niveau 5.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +0 pour toucher, allonge 1,50 m, une créature.
|
||||
|
||||
_Touché :_ 3 (1d6) dégâts perforants.
|
||||
|
||||
30
Data/HD/baby_bestiary_dragonnet.md
Normal file
30
Data/HD/baby_bestiary_dragonnet.md
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Dragonnet
|
||||
|
||||
- Dragon de taille P, alignement variable
|
||||
- **Classe d'armure** 16 (armure naturelle)
|
||||
- **Points de vie** 35 (5d6+15)
|
||||
- **Vitesse** 9 m, escalade 9 m, vol 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|14 (+2)|10 (+0)|17 (+3)|12 (+1)|11 (+0)|12 (+1)|
|
||||
|
||||
- **Jets de sauvegarde** Dex +2, Con +5
|
||||
- **Compétences** Discrétion +2, Perception +4
|
||||
- **Résistance aux dégâts** selon sa couleur
|
||||
- **Sens** vision aveugle 3 m, vision dans le noir 18 m, Perception passive 14
|
||||
- **Langue** draconique
|
||||
- **Dangerosité** 2 (450 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +4 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 6 (1d8+2) dégâts perforants plus 2 (1d4) dégâts élémentaires (selon la couleur du dragon).
|
||||
|
||||
**_Souffle (Recharge 5-6)._** Le dragon souffle du feu sur un cône de 3 mètres. Les créatures dans ce cône doivent chacune effectuer un jet de sauvegarde de Dextérité DD 11 ; elles subissent 14 (4d6) dégâts de feu en cas d'échec ou la moitié de ces dégâts seulement en cas de réussite.
|
||||
|
||||
31
Data/HD/baby_bestiary_dragonnet_tortue.md
Normal file
31
Data/HD/baby_bestiary_dragonnet_tortue.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Dragonnet, tortue
|
||||
|
||||
Voir [Dragon-tortue](hd_monsters_dragon_tortue.md)
|
||||
|
||||
- Dragon de taille P, alignement variable
|
||||
- **Terrain** Littoral, Mer / Océan, Caverne sous-marine
|
||||
- **Classe d'armure** 16 (armure naturelle)
|
||||
- **Points de vie** 19 (3d6+9)
|
||||
- **Vitesse** 6 m, nage 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|10 (+0)|10 (+0)|17 (+3)|10 (+0)|12 (+1)|12 (+1)|
|
||||
|
||||
- **Résistance aux dégâts** de feu
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 11
|
||||
- **Langue** draconique
|
||||
- **Dangerosité** 1/2 (100 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +2 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 7 (2d6) dégâts perforants.
|
||||
|
||||
**_Souffle (Recharge 5-6)._** Le dragon souffle de la vapeur brûlante sur un cône de 6 mètres. Les créatures dans ce cône doivent chacune effectuer un jet de sauvegarde de Constitution DD 11 ; elles subissent 10 (3d6) dégâts de feu en cas d'échec ou la moitié de ces dégâts seulement en cas de réussite.
|
||||
|
||||
37
Data/HD/baby_bestiary_elementeau_dair.md
Normal file
37
Data/HD/baby_bestiary_elementeau_dair.md
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Élémenteau d'air
|
||||
|
||||
Voir [Élémentaire de l'air](hd_monsters_elementaire_de_lair.md)
|
||||
|
||||
- Élémentaire de taille P, Neutre
|
||||
- **Terrain** Montagnes, Plans élémentaires
|
||||
- **Classe d'armure** 14
|
||||
- **Points de vie** 22 (4d6+8)
|
||||
- **Vitesse** 0 m, vol 27 m (vol stationnaire)
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|8 (-2)|18 (+4)|14 (+2)|6 (-2)|10 (+0)|6 (-2)|
|
||||
|
||||
- **Résistances aux dégâts** de foudre, de tonnerre ; contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Immunité contre les dégâts** de poison
|
||||
- **Immunité contre les états** à terre, empoigné, empoisonné, entravé, épuisé, inconscient, paralysé et pétrifé
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 10
|
||||
- **Langue** aérien
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Corps d'air._** L'élémentaire peut entrer dans l'emplacement occupé par une créature hostile et s'y arrêter. Il peut traverser un interstice d'une largeur minimale de 2 à 3 centimètres sans devoir se faufiler.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Coup._** Attaque d'arme au corps-à-corps : +6 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 9 (2d4+4) dégâts contondants.
|
||||
|
||||
**_Tourbillon (Recharge 4-6)._** Les créatures dans l'emplacement occupé par l'élémentaire doivent chacune effectuer un jet de sauvegarde de Force DD 10. Celles qui ratent le jet de sauvegarde subissent 5 (3d4-2) dégâts contondants, elles sont repoussées sur une distance de 3 mètres dans une direction aléatoire et jetées à terre. Si le jet de sauvegarde est réussi, la cible subit la moitié des dégâts contondants seulement, elle n'est pas repoussée et n'est pas jetée à terre.
|
||||
|
||||
39
Data/HD/baby_bestiary_elementeau_de_feu.md
Normal file
39
Data/HD/baby_bestiary_elementeau_de_feu.md
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Élémenteau de feu
|
||||
|
||||
Voir [Élémentaire du feu](hd_monsters_elementaire_du_feu.md)
|
||||
|
||||
- Élémentaire de taille P, Neutre
|
||||
- **Terrain** Plans élémentaires
|
||||
- **Classe d'armure** 13
|
||||
- **Points de vie** 26 (4d6+12)
|
||||
- **Vitesse** 15 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|4 (-3)|17 (+3)|16 (+3)|6 (-2)|10 (+0)|7 (-2)|
|
||||
|
||||
- **Résistance aux dégâts** contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Immunité contre les dégâts** de feu et de poison
|
||||
- **Immunité contre les états** à terre, empoigné, empoisonné, épuisé, inconscient, entravé, paralysé et pétrifé
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 10
|
||||
- **Langue** ignée
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Corps de feu._** L'élémentaire peut traverser un interstice d'une largeur minimale de 2 à 3 centimètres sans devoir se faufiler. Une créature qui touche l'élémentaire ou réussit une attaque au corps-à-corps contre lui subit 3 (1d6) dégâts de feu. De plus, l'élémentaire peut entrer dans l'emplacement occupé par une créature hostile et s'y arrêter. La première fois qu'il entre dans un emplacement occupé par une créature lors d'un tour, celle-ci subit 3 (1d6) dégâts de feu et prend feu. Elle subit 3 (1d6) dégâts de feu au début de chacun de ses tours, à moins que quelqu'un ne consacre une action à éteindre le feu.
|
||||
|
||||
**_Illumination._** L'élémentaire diffuse une lumière vive sur un rayon de 3 mètres et une faible lumière sur un rayon de 3 mètres supplémentaires.
|
||||
|
||||
**_Vulnérabilité à l'eau._** Si l'élémentaire se déplace dans l'eau ou s'il est aspergé d'eau, il subit 1 dégât de froid par tranche de 1,50 mètre traversée ou tous les 5 litres déversés.
|
||||
|
||||
## Action
|
||||
|
||||
**_Contact._** Attaque d'arme au corps-à-corps : +5 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 8 (2d4+3) dégâts de feu. Si la cible est un objet inflammable ou une créature, elle prend feu. La cible subit 3 (1d6) dégâts de feu au début de chacun de ses tours, à moins que quelqu'un ne consacre une action à éteindre le feu.
|
||||
|
||||
40
Data/HD/baby_bestiary_elementeau_de_terre.md
Normal file
40
Data/HD/baby_bestiary_elementeau_de_terre.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Élémenteau de terre
|
||||
|
||||
Voir [Élémentaire de l'air](hd_monsters_elementaire_de_lair.md)
|
||||
|
||||
- Élémentaire de terre taille P, Neutre
|
||||
- **Terrain** Bois / Forêt, Plans élémentaires
|
||||
- **Classe d'armure** 16 (armure naturelle)
|
||||
- **Points de vie** 34 (4d6+20)
|
||||
- **Vitesse** 9 m, fouissement 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|12 (+1)|8 (-1)|20 (+5)|5 (-3)|10 (+0)|5 (-3)|
|
||||
|
||||
- **Vulnérabilité aux dégâts** de tonnerre
|
||||
- **Résistance aux dégâts** contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Immunité contre les dégâts** de poison
|
||||
- **Immunité contre les états** empoisonné, épuisé, inconscient, paralysé et pétrifé
|
||||
- **Sens** perception des vibrations 18 m, vision dans le noir 18 m, Perception passive 10
|
||||
- **Langue** terreux
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Monstre assiégeur._** L'élémentaire inflige des dégâts doublés aux objets et aux structures.
|
||||
|
||||
**_Traverser la terre._** L'élémentaire peut creuser à travers la terre et la pierre non travaillées et non magiques. Quand il se déplace de cette façon, il ne laisse aucune trace ou tunnel derrière lui.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** L'élémentaire effectue deux attaques de coup.
|
||||
|
||||
**_Coup._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,5 m, une cible.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts contondants.
|
||||
|
||||
41
Data/HD/baby_bestiary_elementeau_deau.md
Normal file
41
Data/HD/baby_bestiary_elementeau_deau.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Élémenteau d'eau
|
||||
|
||||
Voir [Élémentaire de l'eau](hd_monsters_elementaire_de_leau.md)
|
||||
|
||||
- Élémentaire de taille P, Neutre
|
||||
- **Terrain** Mer / Océan, Plans élémentaires, Caverne sous-marine
|
||||
- **Classe d'armure** 14 (armure naturelle)
|
||||
- **Points de vie** 30 (4d6+16)
|
||||
- **Vitesse** 9 m, nage 27 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|10 (+0)|14 (+2)|18 (+4)|5 (-3)|10 (+0)|8 (-1)|
|
||||
|
||||
- **Résistance aux dégâts** d'acide ; contondants, perforants et tranchants infligés par des attaques non magiques
|
||||
- **Immunité contre les dégâts** de poison
|
||||
- **Immunité contre les états** à terre, empoigné, empoisonné, épuisé, inconscient, entravé, paralysé et pétrifé
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 10
|
||||
- **Langue** aquatique
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Corps d'eau._** L'élémentaire peut entrer dans un emplacement occupé par une créature hostile et s'y arrêter. Il peut traverser un interstice d'une largeur minimale de 2 à 3 centimètres sans devoir se faufiler.
|
||||
|
||||
**_Gel._** Les dégâts de froid subis par l'élémentaire le gèlent partiellement. Le cas échéant, sa vitesse est réduite de 6 mètres jusqu'à la fin de son prochain tour.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** L'élémentaire effectue deux attaques de coup.
|
||||
|
||||
**_Coup._** Attaque d'arme au corps-à-corps : +2 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 5 (2d4) dégâts contondants.
|
||||
|
||||
**_Trombe (Recharge 4-6)._** Les créatures présentes dans l'emplacement occupé par l'élémentaire doivent chacune effectuer un jet de sauvegarde de Force DD 12. En cas d'échec, une cible subit 7 (2d6) dégâts contondants.
|
||||
|
||||
35
Data/HD/baby_bestiary_enfield_renardeau.md
Normal file
35
Data/HD/baby_bestiary_enfield_renardeau.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Enfield, renardeau
|
||||
|
||||
- Fée de taille TP, Neutre Bon
|
||||
- **Classe d'armure** 13 (armure naturelle)
|
||||
- **Points de vie** 9 (2d4+4)
|
||||
- **Vitesse** 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|6 (-3)|15 (+2)|12 (+1)|8 (-2)|14 (+2)|12 (+1)|
|
||||
|
||||
- **Compétences** Discrétion +4, Perception +4
|
||||
- **Résistance aux dégâts** nécrotiques
|
||||
- **Sens** Perception passive 14
|
||||
- **Langues** —
|
||||
- **Dangerosité** 1/2 (50 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Fléaux des morts._** Les renards d'Enfeld obtiennent l'avantage lorsqu'ils attaquent des morts-vivants et leurs attaques sont considérées comme magiques. Lorsqu'un mort-vivant est blessé par un renard d'Enfeld, il devient vulnérable aux dégâts de tous les alliés du renard pendant 1d4 rounds.
|
||||
|
||||
**_Odorat et ouïe aiguisés._** Le renard obtient un avantage lors des tests de Sagesse (Perception) basés sur l'odorat ou l'ouïe.
|
||||
|
||||
**_Porte-bonheur._** Trois fois par jour, le renardeau peut donner l'avantage à un allié situé à moins de 18 mètres et dans son champ de vision.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +4 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 4 (1d4+2) dégâts perforants.
|
||||
|
||||
41
Data/HD/baby_bestiary_gargouille_moulure.md
Normal file
41
Data/HD/baby_bestiary_gargouille_moulure.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Gargouille, moulure
|
||||
|
||||
Voir [Gargouille](hd_monsters_gargouille.md)
|
||||
|
||||
- Élémentaire de taille P, Chaotique Mauvais
|
||||
- **Terrain** Plans élémentaires, Ruines extérieures
|
||||
- **Classe d'armure** 15 (armure naturelle)
|
||||
- **Points de vie** 11 (2d8+6)
|
||||
- **Vitesse** 6 m, vol 12m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|6 (-2)|11 (+0)|16 (+3)|6 (-2)|11 (+0)|7 (-2)|
|
||||
|
||||
- **Résistances aux dégâts** contondants, perforants et tranchants infligés par des attaques non magiques qui ne sont pas en adamantium
|
||||
- **Résistance aux dégâts** de poison
|
||||
- **Immunité contre les états** empoisonné, épuisé et pétrifé
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 10
|
||||
- **Langue** selon l'âme
|
||||
- **Dangerosité** 1/4 (50 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Faux-semblant._** Aussi longtemps que la gargouille reste immobile, il est impossible de la distinguer d'une statue inanimée.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** La gargouille effectue deux attaques : une avec sa morsure et une avec ses griffes.
|
||||
|
||||
**_Griffes._** Attaque d'arme au corps-à-corps : +2 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 2 (1d4) dégâts tranchants.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +2 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 2 (1d4) dégâts perforants.
|
||||
|
||||
32
Data/HD/baby_bestiary_gnoll_chiot.md
Normal file
32
Data/HD/baby_bestiary_gnoll_chiot.md
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Gnoll, chiot
|
||||
|
||||
Voir [Gnoll](hd_monsters_gnoll.md)
|
||||
|
||||
- Humanoïde (gnoll) de taille P, Chaotique Mauvais
|
||||
- **Terrain** Collines / Vallées, Plaine / Champs / Prairie / Savane, Ruines extérieures
|
||||
- **Classe d'armure** 11
|
||||
- **Points de vie** 4 (1d8)
|
||||
- **Vitesse** 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|8 (-2)|12 (+1)|11 (+0)|4 (-3)|10 (+0)|7 (-2)|
|
||||
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 10
|
||||
- **Langue** gnoll
|
||||
- **Dangerosité** 0 (0 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Déchaîné._** Quand le gnoll réduit les points de vie d'une créature à 0 suite à une attaque au corps-à-corps lors de son tour, il peut effectuer une action bonus pour se déplacer sur une distance maximale égale à la moitié de sa vitesse et effectuer une attaque de morsure.
|
||||
|
||||
## Action
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +0 pour toucher, allonge 1,50 m, une créature.
|
||||
|
||||
_Touché :_ 1 dégât perforant.
|
||||
|
||||
35
Data/HD/baby_bestiary_gobelours_petit.md
Normal file
35
Data/HD/baby_bestiary_gobelours_petit.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Gobelours, petit
|
||||
|
||||
Voir [Gobelours](hd_monsters_gobelours.md)
|
||||
|
||||
- Humanoïde (gobelinoïde) de taille P, Chaotique Mauvais
|
||||
- **Terrain** Collines / Vallées, Caverne aménagée
|
||||
- **Classe d'armure** 12
|
||||
- **Points de vie** 9 (2d6+2)
|
||||
- **Vitesse** 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|8 (-1)|14 (+2)|13 (+1)|8 (-1)|11 (+0)|9 (-1)|
|
||||
|
||||
- **Compétences** Discrétion +6, Survie +2
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 10
|
||||
- **Langues** commun, gobelin
|
||||
- **Dangerosité** 1/8 (25 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Attaque surprise._** Si le gobelours surprend une créature et réussit une attaque contre elle lors du premier round de combat, cette attaque inflige 3 (1d6) dégâts supplémentaires à la cible.
|
||||
|
||||
**_Brutal._** Une arme de corps-à-corps inflige un dé de dégâts supplémentaires quand le gobelours touche son ennemi avec elle (déjà inclus dans l'attaque).
|
||||
|
||||
## Action
|
||||
|
||||
**_Griffes et morsure._** Attaque d'arme au corps-à-corps : +1 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 4 (2d4-1) dégâts perforants.
|
||||
|
||||
39
Data/HD/baby_bestiary_griffon_poussin.md
Normal file
39
Data/HD/baby_bestiary_griffon_poussin.md
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Griffon, poussin
|
||||
|
||||
Voir [Griffon](hd_monsters_griffon.md)
|
||||
|
||||
- Créature monstrueuse de taille M, non aligné
|
||||
- **Terrain** Montagnes
|
||||
- **Classe d'armure** 12
|
||||
- **Points de vie** 19 (3d8+6)
|
||||
- **Vitesse** 9 m, vol 18 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|12 (+1)|15 (+2)|16 (+3)|2 (-4)|13 (+1)|8 (-1)|
|
||||
|
||||
- **Compétence** Perception +3
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 13
|
||||
- **Langue** —
|
||||
- **Dangerosité** 1/2 (100 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Vue aiguisée._** Le griffon obtient un avantage lors des tests de Sagesse (Perception) basés sur la vue.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** Le griffon effectue deux attaques : une avec son bec et une avec ses griffes.
|
||||
|
||||
**_Bec._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 4 (1d6+1) dégâts perforants.
|
||||
|
||||
**_Griffes._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts tranchants.
|
||||
|
||||
30
Data/HD/baby_bestiary_harpie_fille.md
Normal file
30
Data/HD/baby_bestiary_harpie_fille.md
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Harpie, fille
|
||||
|
||||
Voir [Harpie](hd_monsters_harpie.md)
|
||||
|
||||
- Créature monstrueuse de taille P, Chaotique Mauvais
|
||||
- **Terrain** Littoral, Montagnes, Ruines extérieures
|
||||
- **Classe d'armure** 11
|
||||
- **Points de vie** 9 (2d6+2)
|
||||
- **Vitesse** 6 m, vol 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|6 (-3)|13 (+1)|12 (+1)|7 (-2)|10 (+0)|13 (+1)|
|
||||
|
||||
- **Sens** Perception passive 10
|
||||
- **Langue** commun
|
||||
- **Dangerosité** 1/4 (50 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Chant captivant._** La harpie chante une mélodie magique. Les humanoïdes et les géants situés à 60 mètres ou moins de la harpie et qui peuvent entendre le chant doivent chacun réussir un jet de sauvegarde de Sagesse DD 10 pour ne pas être charmés jusqu'à la fin du chant. La harpie doit effectuer une action bonus lors de chacun de ses tours suivants pour continuer à chanter. Elle peut arrêter de chanter quand elle le souhaite. Le chant prend fin si la harpie est neutralisée. Une cible charmée par la harpie est neutralisée et ignore le chant d'autres harpies. Si la cible charmée est à plus de 1,50 mètre de la harpie, elle doit se déplacer vers elle lors de son tour en empruntant la trajectoire le plus courte, pour tenter de se retrouver à 1,50 mètre d'elle. Elle n'évite pas les attaques d'opportunité mais peut retenter un jet de sauvegarde avant de se déplacer sur un terrain nuisible, tel que la lave ou une fosse, et chaque fois qu'elle subit des dégâts infligés par une source autre que la harpie. Une cible charmée peut également retenter le jet de sauvegarde à la fin de chacun de ses tours. L'effet dont elle est victime prend fin si le jet de sauvegarde est réussi. Une cible qui réussit le jet de sauvegarde est immunisée contre le chant de cette harpie pendant 24 heures.
|
||||
|
||||
**_Serres._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 3 (1d4+1) dégâts tranchants.
|
||||
|
||||
34
Data/HD/baby_bestiary_hippocampe_fretin.md
Normal file
34
Data/HD/baby_bestiary_hippocampe_fretin.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Hippocampe, fretin
|
||||
|
||||
Voir [Hippocampe](hd_monsters_hippocampe.md)
|
||||
|
||||
- Bête de taille M, non aligné
|
||||
- **Terrain** Ruines sous-marines
|
||||
- **Classe d'armure** 13 (armure naturelle)
|
||||
- **Points de vie** 5 (1d10)
|
||||
- **Vitesse** 0 m, nage 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|8 (-1)|15 (+2)|11 (+0)|2 (-4)|12 (+1)|5 (-3)|
|
||||
|
||||
- **Sens** Perception passive 11
|
||||
- **Langues** —
|
||||
- **Dangerosité** 1/8 (25 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Charge._** Si l'hippocampe se déplace en ligne droite sur une distance minimale de 6 mètres vers une cible contre laquelle il réussit ensuite une attaque de coup de bélier lors du même tour, celle-ci subit 5 (2d4) dégâts contondants supplémentaires. Si la cible est une créature, elle doit réussir un jet de sauvegarde de Force DD 10 pour ne pas être jetée à terre.
|
||||
|
||||
**_Respiration aquatique._** L'hippocampe peut respirer uniquement sous l'eau.
|
||||
|
||||
## Action
|
||||
|
||||
**_Coup de bélier._** Attaque d'arme au corps-à-corps : +1 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 2 (1d6-1) dégâts contondants.
|
||||
|
||||
39
Data/HD/baby_bestiary_hippogriffe_poulain.md
Normal file
39
Data/HD/baby_bestiary_hippogriffe_poulain.md
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Hippogriffe, poulain
|
||||
|
||||
Voir [Hippogriffe](hd_monsters_hippogriffe.md)
|
||||
|
||||
- Créature monstrueuse de taille M, non aligné
|
||||
- **Terrain** Littoral, Montagnes
|
||||
- **Classe d'armure** 11
|
||||
- **Points de vie** 5 (1d8+1)
|
||||
- **Vitesse** 9 m, vol 12 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|9 (-1)|13 (+1)|13 (+1)|2 (-4)|12 (+1)|8 (-1)|
|
||||
|
||||
- **Compétence** Perception +5
|
||||
- **Sens** Perception passive 15
|
||||
- **Langue** —
|
||||
- **Dangerosité** 1/4 (50 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Vue aiguisée._** L'hippogriffe obtient un avantage lors des tests de Sagesse (Perception) basés sur la vue.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** L'hippogriffe effectue deux attaques : une avec son bec et une avec ses griffes.
|
||||
|
||||
**_Bec._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 4 (1d6+1) dégâts perforants.
|
||||
|
||||
**_Griffes._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 4 (1d6+1) dégâts tranchants.
|
||||
|
||||
33
Data/HD/baby_bestiary_homme_lezard_bebe.md
Normal file
33
Data/HD/baby_bestiary_homme_lezard_bebe.md
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Homme-lézard, bébé
|
||||
|
||||
Voir [Homme-lézard](hd_monsters_homme_lezard.md)
|
||||
|
||||
- Humanoïde (homme-lézard) de taille M, Neutre
|
||||
- **Terrain** Mangrove / Marécage, Caverne sous-marine
|
||||
- **Classe d'armure** 15 (armure naturelle, bouclier)
|
||||
- **Points de vie** 4 (1d6+1)
|
||||
- **Vitesse** 6 m, nage 6 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|8 (-1)|10 (+0)|13 (+1)|7 (-2)|12 (+1)|7 (-2)|
|
||||
|
||||
- **Compétences** Discrétion +4, Perception +3, Survie +5
|
||||
- **Sens** Perception passive 13
|
||||
- **Langues** draconique
|
||||
- **Dangerosité** 0 (0 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Retenir son souffle._** L'homme-lézard peut retenir son souffle pendant 15 minutes.
|
||||
|
||||
## Action
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +1 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 1 (1d4-1) dégâts perforants.
|
||||
|
||||
41
Data/HD/baby_bestiary_hydre_serpenteau.md
Normal file
41
Data/HD/baby_bestiary_hydre_serpenteau.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Hydre, serpenteau
|
||||
|
||||
Voir [Hydre](hd_monsters_hydre.md)
|
||||
|
||||
- Créature monstrueuse de taille M, non aligné
|
||||
- **Terrain** Littoral, Caverne sous-marine
|
||||
- **Classe d'armure** 13 (armure naturelle)
|
||||
- **Points de vie** 47 (5d8+25)
|
||||
- **Vitesse** 9 m, nage 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|12 (+1)|12 (+1)|20 (+5)|2 (-4)|10 (+0)|7 (-2)|
|
||||
|
||||
- **Compétence** Perception +4
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 14
|
||||
- **Langue** —
|
||||
- **Dangerosité** 2 (450 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Retenir son souffle._** L'hydre peut retenir son souffle pendant 1 heure.
|
||||
|
||||
**_Têtes multiples._** L'hydre a cinq têtes. Tant qu'il lui reste plus d'une tête, l'hydre obtient un avantage lors des jets de sauvegarde effectués pour ne pas être assourdie, aveuglée, charmée, étourdie, inconsciente ou terrorisée. Chaque fois que l'hydre subit 15 dégâts ou plus lors d'un même tour, une de ses têtes meurt. Si toutes ses têtes meurent, l'hydre meurt également. À la fin de son tour, deux têtes repoussent pour chacune des têtes mortes lors du dernier tour, à moins qu'elle n'ait subit des dégâts de feu depuis son dernier tour. L'hydre récupère 5 points de vie pour chaque nouvelle tête repoussée de cette façon.
|
||||
|
||||
**_Poison (option, Dangerosité +1)._** l'hydre émet une aura empoisonnée dans un rayon de 3 mètres autour d'elle. Si elle est immobile ce rayon augmente de 3 mètres par round jusqu'à atteindre un rayon maximum de 30 mètres. Pour une hydre adulte ces distances sont multipliées par trois. À chaque round, toutes les créatures dans la zone doivent faire un jet de sauvegarde de Constitution DD 10 (Adulte 15) ou subir l'état empoisonné et 3 (1d6) dégâts de poison (adulte 2d6). L'état empoisonné cesse 1d6 rounds après que la victime est sortie de la zone d'effet.
|
||||
|
||||
**_Têtes réactives._** Pour chaque tête que possède l'hydre au-delà de la première, elle dispose d'une réaction supplémentaire qu'elle peut utiliser pour effectuer des attaques d'opportunité uniquement.
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** L'hydre effectue autant d'attaques de morsure qu'elle possède de têtes.
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 3 m, une cible.
|
||||
|
||||
_Touché :_ 4 (1d6+1) dégâts perforants.
|
||||
|
||||
40
Data/HD/baby_bestiary_kirin_poulain.md
Normal file
40
Data/HD/baby_bestiary_kirin_poulain.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Kirin, poulain
|
||||
|
||||
- Créature monstrueuse de taille M, Loyal-Bon
|
||||
- **Classe d'armure** 16 (armure naturelle)
|
||||
- **Points de vie** 30 (4d8+12)
|
||||
- **Vitesse** 9 m, vol 18 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|12 (+1)|18 (+4)|16 (+3)|12 (+2)|14 (+2)|14 (+2)|
|
||||
|
||||
- **Résistance aux dégâts** radiants, feu, électricité
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 14
|
||||
- **Langues** toutes, télépathie 36 m
|
||||
- **Dangerosité** 2 (100 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Armes magiques._** Les attaques d'arme du kirin sont magiques.
|
||||
|
||||
**_Incantation._** Un jeune kirin pratique la magie comme un ensorceleur de niveau 4 (Charisme, DD du jet de sauvegarde contre les sorts 12, +4 pour toucher avec les attaques de sort).
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples._** Le poulain effectue deux attaques : une avec ses cornes et l'autre avec ses sabots.
|
||||
|
||||
**_Cornes._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,5 m.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts perforants.
|
||||
|
||||
**_Sabots._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 1,5 m.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts contondants.
|
||||
|
||||
**_Souffle de lumière (Recharge 5-6)._** Le kirin souffle un éclair de lumière 6 mètres de long. Les créatures sur la trajectoire doivent chacune effectuer un jet de sauvegarde de Dextérité DD 12 ; elles subissent 18 (4d8) dégâts radiants en cas de jet de sauvegarde raté ou la moitié de ces dégâts seulement en cas de réussite.
|
||||
|
||||
40
Data/HD/baby_bestiary_kitsune_chiot.md
Normal file
40
Data/HD/baby_bestiary_kitsune_chiot.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Kitsune, chiot
|
||||
|
||||
- Fée (métamorphe) de taille P, Neutre
|
||||
- **Classe d'armure** 12 sous forme humanoïde, 13 (armure naturelle) sous forme hybride ou de renard
|
||||
- **Points de vie** 16 (3d6+6)
|
||||
- **Vitesse** 9 m (12 m sous forme de renard)
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|6 (-2)|15 (+2)|14 (+2)|10 (+0)|14 (+2)|15 (+2)|
|
||||
|
||||
- **Compétences** Discrétion +3, Perception +4
|
||||
- **Sens** Perception passive 14
|
||||
- **Langue** commun (ne peut pas parler sous forme de renard)
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Métamorphe._** La kitsune peut utiliser son action pour se métamorphoser en hybride d'humanoïde et de renard (tête et queue de renard), en renard ou en humanoïde. Ses statistiques, à l'exception de sa CA, restent les mêmes, quelle que soit la forme adoptée. Ses objets équipés ou transportés ne sont pas transformés. La kitsune reprend forme humanoïde si elle meurt.
|
||||
|
||||
**_Odorat et ouïe aiguisés._** La kitsune obtient un avantage lors des tests de Sagesse (Perception) basés sur l'odorat ou l'ouïe.
|
||||
|
||||
**_Magie._** La kitsune apprend un sort d'ensorceleur de niveau 1 à 3 par queue, les queues poussent au rythme d'une par an dès qu'elle apprend à se transformer en renard. Les sorts de niveau 0 sont lancés à volonté, les sorts de niveau 1 peuvent être lancés trois fois par jour, les sorts de niveau 2 sont lancés 2 fois par jour et enfin les sorts de niveau 3, une seule fois par jour. La kitsune pratique la magie comme un ensorceleur de niveau 4 (Charisme, DD du jet de sauvegarde contre les sorts 12, +4 pour toucher avec les attaques de sort).
|
||||
|
||||
## Actions
|
||||
|
||||
**_Attaques multiples (forme hybride uniquement)._** La kitsune effectue deux attaques : une avec sa morsure et une avec son arme.
|
||||
|
||||
**_Dague (forme humanoïde uniquement)._** Attaque d'arme au corps-à-corps ou à distance : +4 pour toucher, allonge 1,50 m ou portée 6/18 m, une créature.
|
||||
|
||||
_Touché :_ 4 (1d4+2) dégâts perforants.
|
||||
|
||||
**_Morsure (forme hybride ou de renard uniquement)._** Attaque d'arme au corps-à-corps : +4 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 4 (1d4+2) dégâts perforants.
|
||||
|
||||
32
Data/HD/baby_bestiary_kobold_petit.md
Normal file
32
Data/HD/baby_bestiary_kobold_petit.md
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Kobold, petit
|
||||
|
||||
Voir [Kobold](hd_monsters_kobold.md)
|
||||
|
||||
- Humanoïde (kobold) de taille P, Loyal Mauvais
|
||||
- **Terrain** Jungle, Mangrove / Marécage, Caverne aménagée
|
||||
- **Classe d'armure** 12
|
||||
- **Point de vie** 1 (1d6-2)
|
||||
- **Vitesse** 9 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|5 (-3)|15 (+2)|9 (-1)|8 (-1)|7 (-2)|8 (-1)|
|
||||
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 8
|
||||
- **Langues** commun, draconique
|
||||
- **Dangerosité** 0 (0 PX)
|
||||
|
||||
## Capacité
|
||||
|
||||
**_Sensibilité à la lumière du soleil._** Le kobold subit un désavantage lors des jets d'attaque et des tests de Sagesse (Perception) basés sur la vue lorsqu'il est exposé à la lumière du soleil.
|
||||
|
||||
## Action
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +0 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 1 dégât perforant.
|
||||
|
||||
41
Data/HD/baby_bestiary_kraken_larve.md
Normal file
41
Data/HD/baby_bestiary_kraken_larve.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Kraken, larve
|
||||
|
||||
(Pieuvre géante)
|
||||
|
||||
Utilisez le profl de la [pieuvre](hd_monsters_pieuvre.md) (H&D, p. 317 pour le kraken nouveau-né).
|
||||
|
||||
Voir [Kraken](hd_monsters_kraken.md)
|
||||
|
||||
- Bête de taille M, non aligné
|
||||
- **Terrain** Littoral, Mer / Océan, Caverne sous-marine, Ruines sous-marines
|
||||
- **Classe d'armure** 11
|
||||
- **Points de vie** 13 (3d6+3)
|
||||
- **Vitesse** 3 m, nage 15 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|10 (+0)|13 (+1)|13 (+1)|6 (-2)|10 (+0)|4 (-3)|
|
||||
|
||||
- **Compétences** Discrétion +5, Perception +4
|
||||
- **Sens** vision dans le noir 18 m, Perception passive 14
|
||||
- **Langues** —
|
||||
- **Dangerosité** 1 (200 PX)
|
||||
|
||||
## Capacités
|
||||
|
||||
**_Camouflage sous l'eau._** Le kraken obtient un avantage lors des tests de Dextérité (Discrétion) effectués sous l'eau.
|
||||
|
||||
**_Respiration aquatique._** Le kraken peut respirer uniquement sous l'eau.
|
||||
|
||||
**_Retenir son souffle._** Le kraken peut retenir son souffle pendant 1 heure lorsqu'il n'est plus dans l'eau.
|
||||
|
||||
## Action
|
||||
|
||||
**_Tentacules._** Attaque d'arme au corps-à-corps : +3 pour toucher, allonge 4,50 m, une cible.
|
||||
|
||||
_Touché :_ 6 (2d4+1) dégâts contondants, et si la cible est une créature elle est empoignée (évasion DD 13). Jusqu'au terme de cette empoignade, la cible est entravée et le kraken ne peut pas utiliser ses tentacules contre une autre cible.
|
||||
|
||||
27
Data/HD/baby_bestiary_leviathan_petit.md
Normal file
27
Data/HD/baby_bestiary_leviathan_petit.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Léviathan, petit
|
||||
|
||||
- Créature monstrueuse (titan) de taille TG, non aligné
|
||||
- **Classe d'armure** 15 (armure naturelle)
|
||||
- **Points de vie** 95 (10d12+30)
|
||||
- **Vitesse** nage 15 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|21 (+5)|10 (+0)|17 (+3)|2 (-4)|10 (+0)|7 (-2)|
|
||||
|
||||
- **Jets de sauvegarde** For +7, Con +5
|
||||
- **Immunité contre l'état** terrorisé
|
||||
- **Sens** vision dans le noir 36 m, Perception passive 10
|
||||
- **Langues** —
|
||||
- **Dangerosité** 5 (1 800 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +7 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 21 (3d10+5) dégâts perforants et la cible est avalée si elle ne réussit pas un jet de sauvegarde de Force DD15. Une fois avalée, la créature est aveuglée et entravée, elle bénéfcie d'un abri total contre les attaques et autres effets provenant de l'extérieur du léviathan et subit 14 (4d6) dégâts d'acide au début de chacun des tours du léviathan. S'il subit 25 dégâts ou plus lors d'un seul tour infligés par les créatures à l'intérieur de lui, le léviathan doit réussir un jet de sauvegarde de Constitution DD 15 à la fin de ce tour pour ne pas régurgiter toutes les créatures avalées – qui tombent alors à terre dans un emplacement situé à 3 mètres ou moins du léviathan. Si le léviathan meurt, les créatures avalées ne sont plus entravées par lui et peuvent s'extirper du cadavre en dépensant 4,50 mètres de déplacement. Elles en sortent à terre.
|
||||
|
||||
26
Data/HD/baby_bestiary_lezardeau_de_foudre.md
Normal file
26
Data/HD/baby_bestiary_lezardeau_de_foudre.md
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
> [Monstrueusement mignons](baby_bestiary.md)
|
||||
|
||||
---
|
||||
|
||||
# Lézardeau de foudre
|
||||
|
||||
- Bête de taille TP, non aligné
|
||||
- **Classe d'armure** 10
|
||||
- **Points de vie** 2 (1d4)
|
||||
- **Vitesse** 6 m, escalade 6 m
|
||||
|
||||
|FOR|DEX|CON|INT|SAG|CHA|
|
||||
|---|---|---|---|---|---|
|
||||
|2 (-4)|11 (+0)|10 (+0)|1 (-5)|8 (-1)|3 (-4)|
|
||||
|
||||
- **Résistance aux dégâts** de foudre
|
||||
- **Sens** vision dans le noir 9 m, Perception passive 9
|
||||
- **Langues** —
|
||||
- **Dangerosité** 0 (10 PX)
|
||||
|
||||
## Actions
|
||||
|
||||
**_Morsure._** Attaque d'arme au corps-à-corps : +0 pour toucher, allonge 1,50 m, une cible.
|
||||
|
||||
_Touché :_ 1 dégât perforant + 1 dégât de foudre.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue