mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-17 19:03:46 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d1e0a41676 | |||
| 460ea27a48 | |||
| 22270f4bf7 | |||
| 0f24f19c71 | |||
| 34eaa3de37 | |||
| ed53c25ea1 | |||
| aca949c614 | |||
| 636dcb92b3 |
@@ -9,10 +9,8 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
ci-fe:
|
ci-fe:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup Node.js 18.x
|
- name: Setup Node.js 18.x
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -68,6 +66,70 @@ jobs:
|
|||||||
docker push registry.digitalocean.com/kemkas/kemkas:${GITHUB_SHA::8}
|
docker push registry.digitalocean.com/kemkas/kemkas:${GITHUB_SHA::8}
|
||||||
docker push ghcr.io/${{ github.repository_owner }}/kemkas:${GITHUB_SHA::8}
|
docker push ghcr.io/${{ github.repository_owner }}/kemkas:${GITHUB_SHA::8}
|
||||||
|
|
||||||
|
docker-fe-build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- name: Install doctl
|
||||||
|
uses: digitalocean/action-doctl@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.DO_ACCESS_TOKEN }}
|
||||||
|
- name: Log in to DigitalOcean Container Registry with short-lived credentials
|
||||||
|
run: doctl registry login --expiry-seconds 1200
|
||||||
|
- name: Log in to GitHub Container Registry
|
||||||
|
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
|
||||||
|
- uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: ./Kemkas.Web/frontend/
|
||||||
|
file: ./Kemkas.Web/frontend/Dockerfile
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
push: false
|
||||||
|
load: true
|
||||||
|
tags: kemkas/kemkas-fe:edge
|
||||||
|
- name: Tag container image
|
||||||
|
run: |
|
||||||
|
docker tag kemkas/kemkas-fe:edge registry.digitalocean.com/kemkas/kemkas-fe:${GITHUB_SHA::8}
|
||||||
|
docker tag kemkas/kemkas-fe:edge ghcr.io/${{ github.repository_owner }}/kemkas-fe:${GITHUB_SHA::8}
|
||||||
|
- name: Push image to Container Registry
|
||||||
|
run: |
|
||||||
|
docker push registry.digitalocean.com/kemkas/kemkas-fe:${GITHUB_SHA::8}
|
||||||
|
docker push ghcr.io/${{ github.repository_owner }}/kemkas-fe:${GITHUB_SHA::8}
|
||||||
|
|
||||||
|
docker-be-build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- name: Install doctl
|
||||||
|
uses: digitalocean/action-doctl@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.DO_ACCESS_TOKEN }}
|
||||||
|
- name: Log in to DigitalOcean Container Registry with short-lived credentials
|
||||||
|
run: doctl registry login --expiry-seconds 1200
|
||||||
|
- name: Log in to GitHub Container Registry
|
||||||
|
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
|
||||||
|
- uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: Kemkas.Web/Backend.Dockerfile
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
push: false
|
||||||
|
load: true
|
||||||
|
tags: kemkas/kemkas-be:edge
|
||||||
|
- name: Tag container image
|
||||||
|
run: |
|
||||||
|
docker tag kemkas/kemkas-be:edge registry.digitalocean.com/kemkas/kemkas-be:${GITHUB_SHA::8}
|
||||||
|
docker tag kemkas/kemkas-be:edge ghcr.io/${{ github.repository_owner }}/kemkas-be:${GITHUB_SHA::8}
|
||||||
|
- name: Push image to Container Registry
|
||||||
|
run: |
|
||||||
|
docker push registry.digitalocean.com/kemkas/kemkas-be:${GITHUB_SHA::8}
|
||||||
|
docker push ghcr.io/${{ github.repository_owner }}/kemkas-be:${GITHUB_SHA::8}
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs:
|
needs:
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
||||||
|
WORKDIR /app
|
||||||
|
EXPOSE 80
|
||||||
|
EXPOSE 443
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||||
|
WORKDIR /src
|
||||||
|
COPY ["Kemkas.Web/Kemkas.Web.csproj", "Kemkas.Web/"]
|
||||||
|
RUN dotnet restore "Kemkas.Web/Kemkas.Web.csproj"
|
||||||
|
COPY . .
|
||||||
|
WORKDIR "/src/Kemkas.Web"
|
||||||
|
RUN dotnet build "Kemkas.Web.csproj" -c Release -o /app/build
|
||||||
|
|
||||||
|
FROM build AS publish
|
||||||
|
RUN dotnet publish "Kemkas.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false
|
||||||
|
|
||||||
|
FROM base AS final
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=publish /app/publish .
|
||||||
|
ENTRYPOINT ["dotnet", "Kemkas.Web.dll"]
|
||||||
@@ -12,14 +12,14 @@ namespace Kemkas.Web.Controllers;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="validationService"></param>
|
/// <param name="validationService"></param>
|
||||||
/// <param name="dtoToDbModelService"></param>
|
/// <param name="dtoToDbModelService"></param>
|
||||||
/// <param name="dbModelToDtoService"></param>
|
/// <param name="dbModelToDto1EService"></param>
|
||||||
/// <param name="persistenceService"></param>
|
/// <param name="persistenceService"></param>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("[controller]")]
|
[Route("[controller]")]
|
||||||
public class Character1EController(
|
public class Character1EController(
|
||||||
ICharacterValidationService validationService,
|
ICharacterValidationService validationService,
|
||||||
ICharacter1EDtoToDbModelService dtoToDbModelService,
|
ICharacter1EDtoToDbModelService dtoToDbModelService,
|
||||||
ICharacterDbModelToDtoService dbModelToDtoService,
|
ICharacterDbModelToDto1EService dbModelToDto1EService,
|
||||||
ICharacterPersistenceService persistenceService)
|
ICharacterPersistenceService persistenceService)
|
||||||
: ControllerBase
|
: ControllerBase
|
||||||
{
|
{
|
||||||
@@ -58,7 +58,7 @@ public class Character1EController(
|
|||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
return dbModelToDtoService.Convert(entity);
|
return dbModelToDto1EService.Convert(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("{id:guid}")]
|
[HttpPost("{id:guid}")]
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ namespace Kemkas.Web.Controllers;
|
|||||||
[Route("[controller]")]
|
[Route("[controller]")]
|
||||||
public class Character2EController(
|
public class Character2EController(
|
||||||
ICharacter2EDtoToDbModelService dtoToDbModelService,
|
ICharacter2EDtoToDbModelService dtoToDbModelService,
|
||||||
ICharacterPersistenceService persistenceService
|
ICharacterPersistenceService persistenceService,
|
||||||
|
ICharacterDbModelToDto2EService dbModelToDtoService
|
||||||
) : ControllerBase
|
) : ControllerBase
|
||||||
{
|
{
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -39,5 +40,50 @@ public class Character2EController(
|
|||||||
var id = await persistenceService.StoreNewCharacter2E(model, isPublic);
|
var id = await persistenceService.StoreNewCharacter2E(model, isPublic);
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[HttpGet("{id:guid}")]
|
||||||
|
public async Task<ActionResult<Character2eDto>> GetCharacterById([FromRoute] Guid id)
|
||||||
|
{
|
||||||
|
var entity = await persistenceService.GetCharacter2EById(id);
|
||||||
|
if (entity is null)
|
||||||
|
{
|
||||||
|
return NotFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
return dbModelToDtoService.Convert(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost("{id:guid}")]
|
||||||
|
public async Task<ActionResult<Guid>> UpdateCharacter([FromRoute] Guid id, [FromBody] Character2eDto dto, [FromQuery]bool isPublic = true)
|
||||||
|
{
|
||||||
|
if (!ModelState.IsValid)
|
||||||
|
{
|
||||||
|
return BadRequest(ModelState);
|
||||||
|
}
|
||||||
|
// var errors = validationService.Validate(dto);
|
||||||
|
// if (errors != null)
|
||||||
|
// {
|
||||||
|
// return BadRequest(errors);
|
||||||
|
// }
|
||||||
|
|
||||||
|
var original = await persistenceService.GetCharacter2EById(id, tracking: true);
|
||||||
|
if (original is null)
|
||||||
|
{
|
||||||
|
return NotFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dtoToDbModelService.Update(original, dto);
|
||||||
|
}
|
||||||
|
catch (ValidationException ex)
|
||||||
|
{
|
||||||
|
return BadRequest(ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
await persistenceService.UpdateCharacter2E(original, isPublic);
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,7 @@ public enum Osztaly2E
|
|||||||
Harcos = 1,
|
Harcos = 1,
|
||||||
Ijasz = 2,
|
Ijasz = 2,
|
||||||
Amazon = 3,
|
Amazon = 3,
|
||||||
Kaloz = 4,
|
Tengeresz = 4,
|
||||||
Barbar = 5,
|
Barbar = 5,
|
||||||
Pap = 6,
|
Pap = 6,
|
||||||
Tolvaj = 7,
|
Tolvaj = 7,
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public static class OsztalyExtensions
|
|||||||
"o_2e_harcos" => Osztaly2E.Harcos,
|
"o_2e_harcos" => Osztaly2E.Harcos,
|
||||||
"o_2e_ijasz" => Osztaly2E.Ijasz,
|
"o_2e_ijasz" => Osztaly2E.Ijasz,
|
||||||
"o_2e_amazon" => Osztaly2E.Amazon,
|
"o_2e_amazon" => Osztaly2E.Amazon,
|
||||||
"o_2e_kaloz" => Osztaly2E.Kaloz,
|
"o_2e_tengeresz" => Osztaly2E.Tengeresz,
|
||||||
"o_2e_barbar" => Osztaly2E.Barbar,
|
"o_2e_barbar" => Osztaly2E.Barbar,
|
||||||
"o_2e_pap" => Osztaly2E.Pap,
|
"o_2e_pap" => Osztaly2E.Pap,
|
||||||
"o_2e_tolvaj" => Osztaly2E.Tolvaj,
|
"o_2e_tolvaj" => Osztaly2E.Tolvaj,
|
||||||
@@ -65,7 +65,7 @@ public static class OsztalyExtensions
|
|||||||
Osztaly2E.Harcos => "o_2e_harcos",
|
Osztaly2E.Harcos => "o_2e_harcos",
|
||||||
Osztaly2E.Ijasz => "o_2e_ijasz",
|
Osztaly2E.Ijasz => "o_2e_ijasz",
|
||||||
Osztaly2E.Amazon => "o_2e_amazon",
|
Osztaly2E.Amazon => "o_2e_amazon",
|
||||||
Osztaly2E.Kaloz => "o_2e_kaloz",
|
Osztaly2E.Tengeresz => "o_2e_tengeresz",
|
||||||
Osztaly2E.Barbar => "o_2e_barbar",
|
Osztaly2E.Barbar => "o_2e_barbar",
|
||||||
Osztaly2E.Pap => "o_2e_pap",
|
Osztaly2E.Pap => "o_2e_pap",
|
||||||
Osztaly2E.Tolvaj => "o_2e_tolvaj",
|
Osztaly2E.Tolvaj => "o_2e_tolvaj",
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using Kemkas.Web.Db;
|
|||||||
using Kemkas.Web.Db.Models;
|
using Kemkas.Web.Db.Models;
|
||||||
using Kemkas.Web.Services.FirstEdition.Character;
|
using Kemkas.Web.Services.FirstEdition.Character;
|
||||||
using Kemkas.Web.Services.Identity;
|
using Kemkas.Web.Services.Identity;
|
||||||
|
using Kemkas.Web.Services.SecondEdition.Character;
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
using Microsoft.AspNetCore.DataProtection;
|
||||||
using Microsoft.AspNetCore.HttpOverrides;
|
using Microsoft.AspNetCore.HttpOverrides;
|
||||||
using Microsoft.AspNetCore.Identity.UI.Services;
|
using Microsoft.AspNetCore.Identity.UI.Services;
|
||||||
@@ -51,7 +52,8 @@ builder.AddOpenTelemetry();
|
|||||||
|
|
||||||
builder.Services.AddHealthChecks();
|
builder.Services.AddHealthChecks();
|
||||||
|
|
||||||
builder.Services.AddCharacterServices();
|
builder.Services.AddCharacter1EServices();
|
||||||
|
builder.Services.AddCharacter2EServices();
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
app.UsePathBase("/api");
|
app.UsePathBase("/api");
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ using Kemkas.Web.ViewModels;
|
|||||||
|
|
||||||
namespace Kemkas.Web.Services.FirstEdition.Character;
|
namespace Kemkas.Web.Services.FirstEdition.Character;
|
||||||
|
|
||||||
public interface ICharacterDbModelToDtoService
|
public interface ICharacterDbModelToDto1EService
|
||||||
{
|
{
|
||||||
public Character1eDto Convert(V1Karakter entity);
|
public Character1eDto Convert(V1Karakter entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CharacterDbModelToDtoService : ICharacterDbModelToDtoService
|
public class CharacterDbModelToDto1EService : ICharacterDbModelToDto1EService
|
||||||
{
|
{
|
||||||
public Character1eDto Convert(V1Karakter entity)
|
public Character1eDto Convert(V1Karakter entity)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,13 +5,13 @@ namespace Kemkas.Web.Services.FirstEdition.Character;
|
|||||||
|
|
||||||
public static class ServiceCollectionExtensions
|
public static class ServiceCollectionExtensions
|
||||||
{
|
{
|
||||||
public static IServiceCollection AddCharacterServices(this IServiceCollection serviceCollection)
|
public static IServiceCollection AddCharacter1EServices(this IServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
serviceCollection.AddScoped<ICurrentUserService, CurrentUserService>();
|
serviceCollection.AddScoped<ICurrentUserService, CurrentUserService>();
|
||||||
|
|
||||||
serviceCollection.AddTransient<ICharacterValidationService, CharacterValidationService>();
|
serviceCollection.AddTransient<ICharacterValidationService, CharacterValidationService>();
|
||||||
serviceCollection.AddTransient<ICharacter1EDtoToDbModelService, Character1EDtoToDbModelService>();
|
serviceCollection.AddTransient<ICharacter1EDtoToDbModelService, Character1EDtoToDbModelService>();
|
||||||
serviceCollection.AddTransient<ICharacterDbModelToDtoService, CharacterDbModelToDtoService>();
|
serviceCollection.AddTransient<ICharacterDbModelToDto1EService, CharacterDbModelToDto1EService>();
|
||||||
serviceCollection.AddScoped<ICharacterPersistenceService, CharacterPersistenceService>();
|
serviceCollection.AddScoped<ICharacterPersistenceService, CharacterPersistenceService>();
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ public interface ICharacter2EDtoToDbModelService
|
|||||||
public void Update(V2Karakter original, Character2eDto dto);
|
public void Update(V2Karakter original, Character2eDto dto);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Character1EDtoToDbModelService : ICharacter2EDtoToDbModelService
|
public class Character2EDtoToDbModelService : ICharacter2EDtoToDbModelService
|
||||||
{
|
{
|
||||||
public V2Karakter Convert(Character2eDto dto)
|
public V2Karakter Convert(Character2eDto dto)
|
||||||
{
|
{
|
||||||
@@ -57,7 +57,38 @@ public class Character1EDtoToDbModelService : ICharacter2EDtoToDbModelService
|
|||||||
|
|
||||||
public void Update(V2Karakter original, Character2eDto dto)
|
public void Update(V2Karakter original, Character2eDto dto)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
original.Nev = dto.Nev;
|
||||||
|
original.Nem = dto.Nem;
|
||||||
|
original.Kor = dto.Kor;
|
||||||
|
original.Isten = dto.Isten;
|
||||||
|
original.Jellem = JellemExtensions.Convert(dto.Jellem);
|
||||||
|
original.Faj = FajExtensions.Convert2E(dto.Faj);
|
||||||
|
original.Ero = dto.Tulajdonsagok.Ero;
|
||||||
|
original.Ugyesseg = dto.Tulajdonsagok.Ugy;
|
||||||
|
original.Egeszseg = dto.Tulajdonsagok.Egs;
|
||||||
|
original.Intelligencia = dto.Tulajdonsagok.Int;
|
||||||
|
original.Bolcsesseg = dto.Tulajdonsagok.Bol;
|
||||||
|
original.Karizma = dto.Tulajdonsagok.Kar;
|
||||||
|
original.Szint = dto.Szint;
|
||||||
|
original.Pajzs = dto.Felszereles.PajzsId;
|
||||||
|
original.Pancel = dto.Felszereles.PancelId;
|
||||||
|
original.KarakterKepzettsegek = ConvertKarakterKepzettsegek(dto, original);
|
||||||
|
original.Felszereles = dto.Felszereles.FegyverIds.Select(x => new V2Felszereles
|
||||||
|
{
|
||||||
|
Karakter = original,
|
||||||
|
IsFegyver = true,
|
||||||
|
TargyId = x,
|
||||||
|
}).ToList();
|
||||||
|
original.Szintlepesek = dto.Szintlepesek.Select((x, i) => new V2Szintlepes
|
||||||
|
{
|
||||||
|
Karakter = original,
|
||||||
|
Osztaly = OsztalyExtensions.Convert2E(x.Osztaly),
|
||||||
|
KarakterSzint = (byte)(i + 1),
|
||||||
|
HpRoll = x.HProll,
|
||||||
|
FegyverSpecializacio = x.HarcosFegyver ?? x.KalozKritikus,
|
||||||
|
TulajdonsagNoveles = x.TulajdonsagNoveles == null ? null : TulajdonsagExtensions.Convert(x.TulajdonsagNoveles),
|
||||||
|
TolvajExtraKepzettseg = x.TolvajExtraKepzettseg == null ? null : KepzettsegExtensions.Convert2E(x.TolvajExtraKepzettseg),
|
||||||
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<V2KarakterKepzettseg> ConvertKarakterKepzettsegek(Character2eDto dto, V2Karakter karakter)
|
private static List<V2KarakterKepzettseg> ConvertKarakterKepzettsegek(Character2eDto dto, V2Karakter karakter)
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
using Kemkas.Web.Db.Enums;
|
||||||
|
using Kemkas.Web.Db.Models;
|
||||||
|
using Kemkas.Web.ViewModels;
|
||||||
|
|
||||||
|
namespace Kemkas.Web.Services.SecondEdition.Character;
|
||||||
|
|
||||||
|
public interface ICharacterDbModelToDto2EService
|
||||||
|
{
|
||||||
|
public Character2eDto Convert(V2Karakter entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CharacterDbModelToDto2EService : ICharacterDbModelToDto2EService
|
||||||
|
{
|
||||||
|
public Character2eDto Convert(V2Karakter entity)
|
||||||
|
{
|
||||||
|
return new Character2eDto
|
||||||
|
{
|
||||||
|
Nev = entity.Nev,
|
||||||
|
Nem = entity.Nem,
|
||||||
|
Kor = entity.Kor,
|
||||||
|
Jellem = entity.Jellem.Convert(),
|
||||||
|
Isten = entity.Isten,
|
||||||
|
Faj = entity.Faj.Convert(),
|
||||||
|
Tulajdonsagok = new KarakterTulajdonsagokDto
|
||||||
|
{
|
||||||
|
Ero = entity.Ero,
|
||||||
|
Ugy = entity.Ugyesseg,
|
||||||
|
Egs = entity.Egeszseg,
|
||||||
|
Int = entity.Intelligencia,
|
||||||
|
Bol = entity.Bolcsesseg,
|
||||||
|
Kar = entity.Karizma,
|
||||||
|
},
|
||||||
|
Kepzettsegek = entity.KarakterKepzettsegek.Where(x => !x.IsTolvajKepzettseg).Select(x => x.Kepzettseg.Convert()).ToList(),
|
||||||
|
Tolvajkepzettsegek = entity.KarakterKepzettsegek.Where(x => x.IsTolvajKepzettseg).Select(x => x.Kepzettseg.Convert()).ToList(),
|
||||||
|
Szint = entity.Szint,
|
||||||
|
Felszereles = new KarakterFelszerelesDto
|
||||||
|
{
|
||||||
|
PajzsId = entity.Pajzs,
|
||||||
|
PancelId = entity.Pancel,
|
||||||
|
FegyverIds = entity.Felszereles.Where(x => x.IsFegyver).Select(x => x.TargyId).ToList(),
|
||||||
|
},
|
||||||
|
IsPublic = entity.IsPublic,
|
||||||
|
Szintlepesek = entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(sz => new Szintlepes
|
||||||
|
{
|
||||||
|
Osztaly = sz.Osztaly.Convert(),
|
||||||
|
KalozKritikus = sz.Osztaly == Osztaly2E.Tengeresz ? sz.FegyverSpecializacio : null,
|
||||||
|
HarcosFegyver = sz.Osztaly == Osztaly2E.Harcos ? sz.FegyverSpecializacio : null,
|
||||||
|
TulajdonsagNoveles = sz.TulajdonsagNoveles?.Convert(),
|
||||||
|
HProll = sz.HpRoll,
|
||||||
|
TolvajExtraKepzettseg = sz.TolvajExtraKepzettseg?.Convert()
|
||||||
|
}).ToList()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace Kemkas.Web.Services.SecondEdition.Character;
|
||||||
|
|
||||||
|
public static class ServiceCollectionExtensions
|
||||||
|
{
|
||||||
|
public static IServiceCollection AddCharacter2EServices(this IServiceCollection serviceCollection)
|
||||||
|
{
|
||||||
|
serviceCollection.AddTransient<ICharacter2EDtoToDbModelService, Character2EDtoToDbModelService>();
|
||||||
|
serviceCollection.AddTransient<ICharacterDbModelToDto2EService, CharacterDbModelToDto2EService>();
|
||||||
|
return serviceCollection;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -54,13 +54,13 @@ public class CharacterPersistenceService(
|
|||||||
|
|
||||||
public async Task<V1Karakter?> GetCharacter1EById(Guid id, bool tracking = false)
|
public async Task<V1Karakter?> GetCharacter1EById(Guid id, bool tracking = false)
|
||||||
{
|
{
|
||||||
IQueryable<V1Karakter> queriable = dbContext.Karakterek.Include(x => x.KarakterKepzettsegek)
|
IQueryable<V1Karakter> queryable = dbContext.Karakterek.Include(x => x.KarakterKepzettsegek)
|
||||||
.Include(x => x.Szintlepesek)
|
.Include(x => x.Szintlepesek)
|
||||||
.Include(x => x.Felszereles);
|
.Include(x => x.Felszereles);
|
||||||
|
|
||||||
queriable = tracking ? queriable.AsTracking() : queriable.AsNoTracking();
|
queryable = tracking ? queryable.AsTracking() : queryable.AsNoTracking();
|
||||||
|
|
||||||
var entity = await queriable
|
var entity = await queryable
|
||||||
.FirstOrDefaultAsync(x => x.Id == id);
|
.FirstOrDefaultAsync(x => x.Id == id);
|
||||||
|
|
||||||
if (entity?.OwnerUserId is null || entity.IsPublic)
|
if (entity?.OwnerUserId is null || entity.IsPublic)
|
||||||
@@ -74,13 +74,13 @@ public class CharacterPersistenceService(
|
|||||||
|
|
||||||
public async Task<V2Karakter?> GetCharacter2EById(Guid id, bool tracking = false)
|
public async Task<V2Karakter?> GetCharacter2EById(Guid id, bool tracking = false)
|
||||||
{
|
{
|
||||||
IQueryable<V2Karakter> queriable = dbContext.Karakterek2E.Include(x => x.KarakterKepzettsegek)
|
IQueryable<V2Karakter> queryable = dbContext.Karakterek2E.Include(x => x.KarakterKepzettsegek)
|
||||||
.Include(x => x.Szintlepesek)
|
.Include(x => x.Szintlepesek)
|
||||||
.Include(x => x.Felszereles);
|
.Include(x => x.Felszereles);
|
||||||
|
|
||||||
queriable = tracking ? queriable.AsTracking() : queriable.AsNoTracking();
|
queryable = tracking ? queryable.AsTracking() : queryable.AsNoTracking();
|
||||||
|
|
||||||
var entity = await queriable
|
var entity = await queryable
|
||||||
.FirstOrDefaultAsync(x => x.Id == id);
|
.FirstOrDefaultAsync(x => x.Id == id);
|
||||||
|
|
||||||
if (entity?.OwnerUserId is null || entity.IsPublic)
|
if (entity?.OwnerUserId is null || entity.IsPublic)
|
||||||
@@ -113,7 +113,7 @@ public class CharacterPersistenceService(
|
|||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var characters2E = await dbContext.Karakterek2E
|
var characters2E = await dbContext.Karakterek2E.Include(k => k.Szintlepesek)
|
||||||
.Where(k => k.OwnerUserId == currentUser.Id)
|
.Where(k => k.OwnerUserId == currentUser.Id)
|
||||||
.Select(k => new CharacterListItemDto
|
.Select(k => new CharacterListItemDto
|
||||||
{
|
{
|
||||||
@@ -121,7 +121,7 @@ public class CharacterPersistenceService(
|
|||||||
Name = k.Nev,
|
Name = k.Nev,
|
||||||
Szint = k.Szint,
|
Szint = k.Szint,
|
||||||
Faj = k.Faj.Convert(),
|
Faj = k.Faj.Convert(),
|
||||||
Osztaly = "TODO!", // TODO: support for multiclass characters
|
Osztaly = k.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.Osztaly).First().Convert(),
|
||||||
Edition = "2e"
|
Edition = "2e"
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|||||||
@@ -13,5 +13,5 @@ RUN yarn build
|
|||||||
|
|
||||||
FROM nginx:latest as proxy
|
FROM nginx:latest as proxy
|
||||||
|
|
||||||
# COPY ./nginx/nginx.conf /etc/nginx/conf.d/default.conf
|
COPY --from=builder "/src/build" "/usr/share/nginx/html"
|
||||||
COPY --from=builder "/src/build" "/usr/share/nginx/html"
|
COPY ./nginx.conf /etc/nginx/nginx.conf
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
user nginx;
|
||||||
|
worker_processes auto;
|
||||||
|
|
||||||
|
error_log /var/log/nginx/error.log notice;
|
||||||
|
pid /var/run/nginx.pid;
|
||||||
|
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
access_log /var/log/nginx/access.log main;
|
||||||
|
sendfile on;
|
||||||
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@grafana/faro-web-sdk": "^1.2.2",
|
"@grafana/faro-web-sdk": "^1.3.9",
|
||||||
"@pdf-lib/fontkit": "^1.1.1",
|
"@pdf-lib/fontkit": "^1.1.1",
|
||||||
"@testing-library/jest-dom": "^6.1.4",
|
"@testing-library/jest-dom": "^6.1.4",
|
||||||
"@testing-library/react": "^14.0.0",
|
"@testing-library/react": "^14.0.0",
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -3,7 +3,7 @@ import './App.css';
|
|||||||
import {Faro} from "@grafana/faro-web-sdk";
|
import {Faro} from "@grafana/faro-web-sdk";
|
||||||
import {createBrowserRouter, redirect, RouterProvider} from "react-router-dom";
|
import {createBrowserRouter, redirect, RouterProvider} from "react-router-dom";
|
||||||
import CreateCharacter from "./first-edition/pages/CreateCharacter";
|
import CreateCharacter from "./first-edition/pages/CreateCharacter";
|
||||||
import CharacterList from "./first-edition/pages/CharacterList";
|
import CharacterList from "./shared/pages/CharacterList";
|
||||||
import ErrorBoundary from "./shared/ErrorBoundary";
|
import ErrorBoundary from "./shared/ErrorBoundary";
|
||||||
import Header from "./shared/Header";
|
import Header from "./shared/Header";
|
||||||
import Footer from "./shared/Footer";
|
import Footer from "./shared/Footer";
|
||||||
@@ -42,7 +42,7 @@ function App(props: {faro?: Faro}) {
|
|||||||
const router = createBrowserRouter([
|
const router = createBrowserRouter([
|
||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
loader: () => fetchedUser.data == null ? redirect("/1e/karakter") : redirect("/karaktereim")
|
loader: () => fetchedUser.data == null ? redirect("/2e/karakter") : redirect("/karaktereim")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/karaktereim",
|
path: "/karaktereim",
|
||||||
@@ -71,12 +71,12 @@ function App(props: {faro?: Faro}) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/2e/karakter",
|
path: "/2e/karakter",
|
||||||
element: <CreateCharacter2E />,
|
element: <CreateCharacter2E faro={props.faro}/>,
|
||||||
ErrorBoundary: ErrorBoundary,
|
ErrorBoundary: ErrorBoundary,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/2e/karakter/:id",
|
path: "/2e/karakter/:id",
|
||||||
element: <CreateCharacter faro={props.faro}/>,
|
element: <CreateCharacter2E faro={props.faro}/>,
|
||||||
loader: args => fetch(`${window.location.origin}/api/Character2E/${args.params.id}`),
|
loader: args => fetch(`${window.location.origin}/api/Character2E/${args.params.id}`),
|
||||||
ErrorBoundary: ErrorBoundary,
|
ErrorBoundary: ErrorBoundary,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -30,4 +30,3 @@ export async function UpdateCharacter(id: string, karakter: KarakterInputs, isPu
|
|||||||
throw Error(response.statusText)
|
throw Error(response.statusText)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
import * as React from "react";
|
|
||||||
import {Osztaly, OsztalyLabel} from "../domain-models/osztaly";
|
|
||||||
import {Faj, FajLabel} from "../domain-models/faj";
|
|
||||||
|
|
||||||
export interface CharacterListItemDto {
|
|
||||||
id: string,
|
|
||||||
name: string,
|
|
||||||
szint: number,
|
|
||||||
faj: Faj,
|
|
||||||
osztaly: Osztaly,
|
|
||||||
edition: "1e" | "2e"
|
|
||||||
}
|
|
||||||
|
|
||||||
function CharacterListItem(props: {
|
|
||||||
character: CharacterListItemDto,
|
|
||||||
}) {
|
|
||||||
const {character:c} = props
|
|
||||||
return <>
|
|
||||||
<td><a href={`/${c.edition}/karakter/${c.id}`}>{c.name}</a></td>
|
|
||||||
<td>{c.szint}. szintű</td>
|
|
||||||
<td>{FajLabel(c.faj)}</td>
|
|
||||||
<td>{OsztalyLabel(c.osztaly)}</td>
|
|
||||||
</>
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CharacterListItem;
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import * as React from "react";
|
|
||||||
import {useLoaderData} from "react-router-dom";
|
|
||||||
import CharacterListItem, {CharacterListItemDto} from "../components/CharacterListItem";
|
|
||||||
|
|
||||||
function CharacterList(props: {}) {
|
|
||||||
const characters = useLoaderData() as CharacterListItemDto[];
|
|
||||||
|
|
||||||
return <div className="container">
|
|
||||||
<div className="container-fluid p-5 bg-black text-white text-center">
|
|
||||||
<h1>Karakterek</h1>
|
|
||||||
</div>
|
|
||||||
<div className="d-grid gap-2 m-5">
|
|
||||||
<a className="btn btn-dark btn-lg" href="/" type="button">Új karakter létrehozása</a>
|
|
||||||
</div>
|
|
||||||
<table className="table mt-3">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Név</th>
|
|
||||||
<th scope="col">Szint</th>
|
|
||||||
<th scope="col">Faj</th>
|
|
||||||
<th scope="col">Osztály</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{characters.map(c => (
|
|
||||||
<tr key={c.id}>
|
|
||||||
<CharacterListItem character={c}/>
|
|
||||||
</tr>
|
|
||||||
))}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CharacterList;
|
|
||||||
@@ -40,13 +40,12 @@ function DrawFelszereles(draw: (text: string, x: number, y:number) => void, fels
|
|||||||
|
|
||||||
export async function CreatePDF(karakter: KarakterPdfView) {
|
export async function CreatePDF(karakter: KarakterPdfView) {
|
||||||
|
|
||||||
const existingPdfBytes = await fetch('/km_karakterlap_hysteria_1.2.pdf').then(res => res.arrayBuffer())
|
const existingPdfBytes = await fetch('/pdfs/km_karakterlap_hysteria_1.2.pdf').then(res => res.arrayBuffer())
|
||||||
const pdfDoc = await PDFDocument.load(existingPdfBytes)
|
const pdfDoc = await PDFDocument.load(existingPdfBytes)
|
||||||
pdfDoc.registerFontkit(fontkit)
|
pdfDoc.registerFontkit(fontkit)
|
||||||
|
|
||||||
const fontBytes = await fetch('/Merienda-Regular.ttf').then(res => res.arrayBuffer())
|
const fontBytes = await fetch('/fonts/Merienda-Regular.ttf').then(res => res.arrayBuffer())
|
||||||
const pdfFont = await pdfDoc.embedFont(fontBytes)
|
const pdfFont = await pdfDoc.embedFont(fontBytes)
|
||||||
// const pdfFont = await pdfDoc.embedFont(StandardFonts.TimesNewRoman)
|
|
||||||
const fontSizeBase = 12
|
const fontSizeBase = 12
|
||||||
|
|
||||||
const page = pdfDoc.getPage(0)
|
const page = pdfDoc.getPage(0)
|
||||||
@@ -80,7 +79,7 @@ export async function CreatePDF(karakter: KarakterPdfView) {
|
|||||||
DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF)
|
DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF)
|
||||||
|
|
||||||
const secondPage = pdfDoc.addPage()
|
const secondPage = pdfDoc.addPage()
|
||||||
const fontBoldBytes = await fetch('/Merienda-Bold.ttf').then(res => res.arrayBuffer())
|
const fontBoldBytes = await fetch('/fonts/Merienda-Bold.ttf').then(res => res.arrayBuffer())
|
||||||
const fontBold = await pdfDoc.embedFont(fontBoldBytes)
|
const fontBold = await pdfDoc.embedFont(fontBoldBytes)
|
||||||
DrawOsztalySpecialsPage(secondPage, pdfFont, fontBold, karakter)
|
DrawOsztalySpecialsPage(secondPage, pdfFont, fontBold, karakter)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
import {Karakter2E} from "../domain-models/karakter2E";
|
||||||
|
|
||||||
|
export async function StoreNewCharacter2E(karakter: Karakter2E, isPublic: boolean = false) {
|
||||||
|
let response = await axios.post(`${window.location.origin}/api/Character2E/`, karakter, {
|
||||||
|
withCredentials: true,
|
||||||
|
params: {
|
||||||
|
isPublic,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (response.status < 300){
|
||||||
|
return response.data as string
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw Error(response.statusText)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function UpdateCharacter2E(id: string, karakter: Karakter2E, isPublic: boolean = false) {
|
||||||
|
let response = await axios.post(`${window.location.origin}/api/Character2E/${id}`, karakter, {
|
||||||
|
withCredentials: true,
|
||||||
|
params: {
|
||||||
|
isPublic,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (response.status < 300){
|
||||||
|
return response.data as string
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw Error(response.statusText)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import {Fegyver} from "../domain-models/felszereles";
|
import {Fegyver} from "../domain-models/felszereles";
|
||||||
|
|
||||||
export function FegyverLabel(fegyver: Fegyver): string {
|
export function FegyverFlags(fegyver: Fegyver): string {
|
||||||
const flags = [] as string[]
|
const flags = [] as string[]
|
||||||
if (fegyver.Megterheltseg) {
|
if (fegyver.Megterheltseg) {
|
||||||
flags.push("M")
|
flags.push("M")
|
||||||
@@ -47,17 +47,15 @@ export function FegyverLabel(fegyver: Fegyver): string {
|
|||||||
if (fegyver.Rohamtoro) {
|
if (fegyver.Rohamtoro) {
|
||||||
flags.push("RT")
|
flags.push("RT")
|
||||||
}
|
}
|
||||||
// Replaced by new group "dobhato"
|
return flags.join(' ');
|
||||||
// if (fegyver.EroBonusz) {
|
}
|
||||||
// flags.push("ER")
|
|
||||||
// }
|
export function FegyverLabel(fegyver: Fegyver): string {
|
||||||
if (fegyver.Megjegyzes != null && fegyver.Megjegyzes.length > 0) {
|
const serializedFlags = FegyverFlags(fegyver) + (fegyver.Megjegyzes != null ? " " + fegyver.Megjegyzes : "");
|
||||||
flags.push(fegyver.Megjegyzes)
|
|
||||||
}
|
|
||||||
const serializedFlags = flags.reduce((p,c) => `${p}${c} `, '');
|
|
||||||
const sizeLabel = fegyver.Size < 1 && fegyver.Size > 0 ? ` [1/${Math.round(1 / fegyver.Size)}]` : (fegyver.Size > 1 ? ` [${fegyver.Size}]` : '');
|
const sizeLabel = fegyver.Size < 1 && fegyver.Size > 0 ? ` [1/${Math.round(1 / fegyver.Size)}]` : (fegyver.Size > 1 ? ` [${fegyver.Size}]` : '');
|
||||||
return `${fegyver.Name}${sizeLabel} ${serializedFlags.length > 0 ? "| " + serializedFlags : ''}| ${
|
return `${fegyver.Name}${sizeLabel} | ${serializedFlags.length > 0 ? serializedFlags + " |" : ''}${
|
||||||
fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${fegyver.DamageBonus > 0 ? ` +${fegyver.DamageBonus}` : ''} ${
|
fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${
|
||||||
|
fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${fegyver.DamageBonus > 0 ? ` +${fegyver.DamageBonus}` : ''} ${
|
||||||
fegyver.CritRangeStart < 20 ? `${fegyver.CritRangeStart}-20` : ''}x${fegyver.CritMultiplier}${
|
fegyver.CritRangeStart < 20 ? `${fegyver.CritRangeStart}-20` : ''}x${fegyver.CritMultiplier}${
|
||||||
fegyver.Price > 0 ? ` | ár: ${fegyver.Price} at ` : ''}${
|
fegyver.Price > 0 ? ` | ár: ${fegyver.Price} at ` : ''}${
|
||||||
fegyver.Range > 10 ? ` | táv: ${fegyver.Range}` : ''}`
|
fegyver.Range > 10 ? ` | táv: ${fegyver.Range}` : ''}`
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React from "react";
|
|||||||
|
|
||||||
import {Faj2E, FajLabel} from "../domain-models/faj2E";
|
import {Faj2E, FajLabel} from "../domain-models/faj2E";
|
||||||
import {Modifier} from "../domain-models/tulajdonsag2E";
|
import {Modifier} from "../domain-models/tulajdonsag2E";
|
||||||
import {SignedNumberToText} from "../../shared/helpers";
|
import {SignedNumberToText} from "../../shared/components/Helpers";
|
||||||
|
|
||||||
|
|
||||||
function fajiModositoText(faj: Faj2E, szamolas: (f: Faj2E) => number) : string {
|
function fajiModositoText(faj: Faj2E, szamolas: (f: Faj2E) => number) : string {
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ function setOsztalyForSzintLepes(szintlepesek: Szintlepes[], osztaly: Osztaly2E,
|
|||||||
export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Karakter2E {
|
export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Karakter2E {
|
||||||
return {
|
return {
|
||||||
...karakter,
|
...karakter,
|
||||||
szintlepesek: [{...karakter.szintlepesek[0], osztaly}, ...karakter.szintlepesek.slice(1)]
|
szintlepesek: [{...karakter.szintlepesek[0], HProll: BaseHP(osztaly) , osztaly}, ...karakter.szintlepesek.slice(1)]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,24 @@ export function HP(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'szintlepesek'>)
|
|||||||
.reduce((sum, val) => sum + val, 0)
|
.reduce((sum, val) => sum + val, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function VOegyeb(karakter: Pick<Karakter2E, 'faj'| 'szintlepesek'>): number {
|
||||||
|
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
||||||
|
let vo = 0;
|
||||||
|
if (osztalyok.has(Osztaly2E.Tengeresz)) {
|
||||||
|
const kalozSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length
|
||||||
|
vo += Math.floor(kalozSzintek / 3)
|
||||||
|
}
|
||||||
|
if (osztalyok.has(Osztaly2E.Amazon)) {
|
||||||
|
|
||||||
|
const amazonSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Amazon).length
|
||||||
|
vo += Math.floor(amazonSzintek / 2)
|
||||||
|
}
|
||||||
|
if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){
|
||||||
|
vo += 1
|
||||||
|
}
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintlepesek' | 'szint' | 'felszereles'>): number {
|
export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintlepesek' | 'szint' | 'felszereles'>): number {
|
||||||
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
||||||
const pancel = GetPancel(karakter.felszereles.pancelID)
|
const pancel = GetPancel(karakter.felszereles.pancelID)
|
||||||
@@ -63,20 +81,12 @@ export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintle
|
|||||||
if (pancel) {
|
if (pancel) {
|
||||||
abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO)
|
abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO)
|
||||||
}
|
}
|
||||||
if (osztalyok.has(Osztaly2E.Tengeresz)) {
|
if (osztalyok.has(Osztaly2E.Amazon)){
|
||||||
const kalozSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length
|
|
||||||
vo += Math.floor(kalozSzintek / 3)
|
|
||||||
}
|
|
||||||
if (osztalyok.has(Osztaly2E.Amazon)) {
|
|
||||||
if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) {
|
if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) {
|
||||||
abilityVO = Modifier(karakter.tulajdonsagok.t_kar)
|
abilityVO = Modifier(karakter.tulajdonsagok.t_kar)
|
||||||
}
|
}
|
||||||
const amazonSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Amazon).length
|
|
||||||
vo += Math.floor(amazonSzintek / 2)
|
|
||||||
}
|
|
||||||
if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){
|
|
||||||
vo += 1
|
|
||||||
}
|
}
|
||||||
|
vo += VOegyeb(karakter)
|
||||||
vo += abilityVO
|
vo += abilityVO
|
||||||
|
|
||||||
return vo
|
return vo
|
||||||
|
|||||||
@@ -9,9 +9,12 @@ import {AllowedFegyver} from "./allowed-fegyver";
|
|||||||
export interface Szintlepes {
|
export interface Szintlepes {
|
||||||
osztaly: Osztaly2E;
|
osztaly: Osztaly2E;
|
||||||
HProll: number;
|
HProll: number;
|
||||||
tolvajExtraKepzettseg?: KepzettsegId; // only at level 5 and 9
|
// only at level 5 and 9
|
||||||
harcosFegyver?: string; // every 3rd level
|
tolvajExtraKepzettseg?: KepzettsegId;
|
||||||
kalozKritikus?: string; // every odd level
|
// every odd level
|
||||||
|
harcosFegyver?: string;
|
||||||
|
// every 3rd level
|
||||||
|
kalozKritikus?: string;
|
||||||
tulajdonsagNoveles?: Tulajdonsag2E;
|
tulajdonsagNoveles?: Tulajdonsag2E;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React, {useState} from 'react'
|
import React, {useContext, useState} from 'react'
|
||||||
import {useParams} from "react-router-dom";
|
import {useLoaderData, useNavigate, useParams} from "react-router-dom";
|
||||||
import {Toast, ToastContainer} from "react-bootstrap";
|
import {Button, InputGroup, Modal, OverlayTrigger, Toast, ToastContainer} from "react-bootstrap";
|
||||||
import {ChangeLvl1Osztaly, DefaultKarakter} from "../domain-models/karakter2E";
|
import {ChangeLvl1Osztaly, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E";
|
||||||
import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag2E";
|
import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag2E";
|
||||||
import FajSelector2E from "../components/FajSelector2E";
|
import FajSelector2E from "../components/FajSelector2E";
|
||||||
import Tulajdonsagok2E from "../components/Tulajdonsagok2E";
|
import Tulajdonsagok2E from "../components/Tulajdonsagok2E";
|
||||||
@@ -24,12 +24,33 @@ import LevelUps from "../components/LevelUps";
|
|||||||
import {LevelDown, LevelUp} from "../domain-models/szintlepes";
|
import {LevelDown, LevelUp} from "../domain-models/szintlepes";
|
||||||
import HarcosFegyverSpecializacio from "../components/HarcosFegyverSpec";
|
import HarcosFegyverSpecializacio from "../components/HarcosFegyverSpec";
|
||||||
import {arraySetN} from "../../util";
|
import {arraySetN} from "../../util";
|
||||||
|
import saveOverlayTooltip from "../../first-edition/components/SaveOverlayTooltip";
|
||||||
|
import {UserContext} from "../../shared/contexts/UserContext";
|
||||||
|
import {
|
||||||
|
StoreNewCharacter2E,
|
||||||
|
UpdateCharacter2E
|
||||||
|
} from "../api/character.api";
|
||||||
|
import {Faro} from "@grafana/faro-web-sdk";
|
||||||
|
import Form from "react-bootstrap/Form";
|
||||||
|
import {CreatePDF} from "../pdf/character.pdf";
|
||||||
|
import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view";
|
||||||
|
|
||||||
function CreateCharacter2E(props: {}) {
|
function CreateCharacter2E(props: {
|
||||||
|
faro?: Faro
|
||||||
|
}) {
|
||||||
|
const {faro} = props
|
||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
|
const fetchedUser = useContext(UserContext);
|
||||||
|
const loaderData = useLoaderData() as Karakter2E & { isPublic: boolean } | undefined;
|
||||||
|
let initialKarakterInputs = DefaultKarakter;
|
||||||
|
if (loaderData != null) {
|
||||||
|
const { isPublic: t1, ...t2 } = loaderData;
|
||||||
|
initialKarakterInputs = t2
|
||||||
|
}
|
||||||
|
const initialIsPublic = loaderData?.isPublic ?? fetchedUser?.data == null;
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const [karakter, setKarakter] = useState(DefaultKarakter)
|
const [karakter, setKarakter] = useState(initialKarakterInputs)
|
||||||
const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
|
const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
|
||||||
const changeKepzettseg = (k: KepzettsegId[]) => setKarakter({...karakter, kepzettsegek: k})
|
const changeKepzettseg = (k: KepzettsegId[]) => setKarakter({...karakter, kepzettsegek: k})
|
||||||
const changeTolvajKepzettseg = (tk?: KepzettsegId[]) => setKarakter({...karakter, tolvajKepzettsegek: tk})
|
const changeTolvajKepzettseg = (tk?: KepzettsegId[]) => setKarakter({...karakter, tolvajKepzettsegek: tk})
|
||||||
@@ -37,9 +58,44 @@ function CreateCharacter2E(props: {}) {
|
|||||||
SetDefaultKepzettsegek({...karakter, tulajdonsagok: tulajdonsagokFajjal}, changeKepzettseg)
|
SetDefaultKepzettsegek({...karakter, tulajdonsagok: tulajdonsagokFajjal}, changeKepzettseg)
|
||||||
|
|
||||||
const changeFelszereles = (f: KarakterFelszereles) => setKarakter({...karakter, felszereles: f})
|
const changeFelszereles = (f: KarakterFelszereles) => setKarakter({...karakter, felszereles: f})
|
||||||
|
|
||||||
|
let [showSaveModal, setShowSaveModal] = useState(false);
|
||||||
|
let [newId, setNewId] = useState(null as string | null)
|
||||||
let [showSaved, setShowSaved] = useState(false);
|
let [showSaved, setShowSaved] = useState(false);
|
||||||
|
let [isPublic, setIsPublic] = useState(initialIsPublic);
|
||||||
|
const newCharacterUrl = () => `${window.location.origin}/2e/karakter/${newId}`
|
||||||
|
|
||||||
|
const handleSaveModalCopyAndClose = async () => {
|
||||||
|
|
||||||
|
await navigator.clipboard.writeText(newCharacterUrl());
|
||||||
|
handleSaveModalClose()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSaveModalClose = () => {
|
||||||
|
setShowSaveModal(false);
|
||||||
|
navigate(`/2e/karakter/${newId}`)
|
||||||
|
}
|
||||||
const hideSaved = () => setShowSaved(false);
|
const hideSaved = () => setShowSaved(false);
|
||||||
|
const onSaveClicked = async () => {
|
||||||
|
faro?.api.pushEvent('character_stored', {
|
||||||
|
osztaly: karakter.szintlepesek[0].osztaly.toString(),
|
||||||
|
szint: karakter.szint.toString(),
|
||||||
|
faj: karakter.faj.toString(),
|
||||||
|
is_public: isPublic.toString(),
|
||||||
|
edition: "2e",
|
||||||
|
})
|
||||||
|
if (id == null) {
|
||||||
|
let recievedId = await StoreNewCharacter2E(karakter, isPublic);
|
||||||
|
setNewId(recievedId)
|
||||||
|
setShowSaveModal(true);
|
||||||
|
} else {
|
||||||
|
await UpdateCharacter2E(id, karakter, isPublic);
|
||||||
|
setShowSaved(true);
|
||||||
|
setTimeout(() => {
|
||||||
|
hideSaved();
|
||||||
|
}, 5000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return <div>
|
return <div>
|
||||||
<div className='container-fluid p-5 bg-black text-white text-center'>
|
<div className='container-fluid p-5 bg-black text-white text-center'>
|
||||||
@@ -50,6 +106,28 @@ function CreateCharacter2E(props: {}) {
|
|||||||
<Toast.Header><strong>Karakter mentve!</strong></Toast.Header>
|
<Toast.Header><strong>Karakter mentve!</strong></Toast.Header>
|
||||||
</Toast>
|
</Toast>
|
||||||
</ToastContainer>
|
</ToastContainer>
|
||||||
|
<Modal show={showSaveModal} onHide={handleSaveModalClose}>
|
||||||
|
<Modal.Header closeButton>
|
||||||
|
<Modal.Title>Karakter mentve!</Modal.Title>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body>
|
||||||
|
<p>Karaktered az alábbi {isPublic ? 'publikus' : 'privát'} URLen érhető el.</p>
|
||||||
|
<p><a href={newCharacterUrl()}>{newCharacterUrl()}</a></p>
|
||||||
|
<InputGroup className="mb-3">
|
||||||
|
<Form.Control id="input" value={newCharacterUrl()} />
|
||||||
|
<Button variant={"outline-dark"} onClick={() => {
|
||||||
|
let copyText = document.querySelector("#input") as any;
|
||||||
|
copyText?.select()
|
||||||
|
document.execCommand("copy");
|
||||||
|
}}>Másolás</Button>
|
||||||
|
</InputGroup>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<Button variant="danger" onClick={handleSaveModalCopyAndClose}>
|
||||||
|
Másolás és bezárás
|
||||||
|
</Button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
<div className='p-3'>
|
<div className='p-3'>
|
||||||
<form onSubmit={async (event) => event.preventDefault()}>
|
<form onSubmit={async (event) => event.preventDefault()}>
|
||||||
<div className='row'>
|
<div className='row'>
|
||||||
@@ -107,10 +185,15 @@ function CreateCharacter2E(props: {}) {
|
|||||||
changeOsztaly={o => setKarakter(ChangeLvl1Osztaly(karakter, o))}
|
changeOsztaly={o => setKarakter(ChangeLvl1Osztaly(karakter, o))}
|
||||||
/>
|
/>
|
||||||
{karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos &&
|
{karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos &&
|
||||||
<HarcosFegyverSpecializacio
|
<HarcosFegyverSpecializacio
|
||||||
specialization={karakter.szintlepesek[0].harcosFegyver || 'kard_hosszu'}
|
specialization={karakter.szintlepesek[0].harcosFegyver || 'kard_hosszu'}
|
||||||
szint={1}
|
szint={1}
|
||||||
changeSpecialization={(spec) => setKarakter({...karakter, szintlepesek: arraySetN(karakter.szintlepesek, 0, {...karakter.szintlepesek[0], harcosFegyver: spec})})}
|
changeSpecialization={(spec) => setKarakter({...karakter,
|
||||||
|
szintlepesek: arraySetN(karakter.szintlepesek, 0, {
|
||||||
|
...karakter.szintlepesek[0],
|
||||||
|
harcosFegyver: spec
|
||||||
|
})
|
||||||
|
})}
|
||||||
existingSpecializations={karakter.szintlepesek.map(x => x.harcosFegyver)}
|
existingSpecializations={karakter.szintlepesek.map(x => x.harcosFegyver)}
|
||||||
/>}
|
/>}
|
||||||
<KarakterKepzettsegek
|
<KarakterKepzettsegek
|
||||||
@@ -121,23 +204,25 @@ function CreateCharacter2E(props: {}) {
|
|||||||
tolvajKepzettsegek={karakter.tolvajKepzettsegek || []}
|
tolvajKepzettsegek={karakter.tolvajKepzettsegek || []}
|
||||||
changeTolvajKepzettsegek={changeTolvajKepzettseg}
|
changeTolvajKepzettsegek={changeTolvajKepzettseg}
|
||||||
/>
|
/>
|
||||||
<hr />
|
<hr/>
|
||||||
{/* 1. szinten */}
|
{/* 1. szinten */}
|
||||||
<MasodlagosErtekek {...CalculateMasodlagosErtekek({
|
<MasodlagosErtekek {...CalculateMasodlagosErtekek({
|
||||||
...karakter,
|
...karakter,
|
||||||
tulajdonsagok: tulajdonsagokFajjal,
|
tulajdonsagok: tulajdonsagokFajjal,
|
||||||
szint: 1,
|
szint: 1,
|
||||||
szintlepesek: karakter.szintlepesek.slice(0,1)
|
szintlepesek: karakter.szintlepesek.slice(0, 1)
|
||||||
})} />
|
})} />
|
||||||
<hr />
|
<hr/>
|
||||||
<LevelUps karakter={karakter} changeKarakter={setKarakter}/>
|
<LevelUps karakter={karakter} changeKarakter={setKarakter}/>
|
||||||
{karakter.szint > 1 && <hr/>}
|
{karakter.szint > 1 && <hr/>}
|
||||||
<div className='d-grid gap-2 m-5'>
|
<div className='d-grid gap-2 m-5'>
|
||||||
{karakter.szint < 12 &&
|
{karakter.szint < 12 &&
|
||||||
<button className='btn btn-dark btn-lg' type='button' onClick={() => LevelUp(karakter, setKarakter)}>Szintlépés!
|
<button className='btn btn-dark btn-lg' type='button'
|
||||||
|
onClick={() => LevelUp(karakter, setKarakter)}>Szintlépés!
|
||||||
⇧</button>}
|
⇧</button>}
|
||||||
{karakter.szint > 1 &&
|
{karakter.szint > 1 &&
|
||||||
<button className='btn btn-dark btn-lg' type='button' onClick={() => LevelDown(karakter, setKarakter)}>Visszalépés!
|
<button className='btn btn-dark btn-lg' type='button'
|
||||||
|
onClick={() => LevelDown(karakter, setKarakter)}>Visszalépés!
|
||||||
⇩</button>}
|
⇩</button>}
|
||||||
</div>
|
</div>
|
||||||
<hr/>
|
<hr/>
|
||||||
@@ -145,9 +230,64 @@ function CreateCharacter2E(props: {}) {
|
|||||||
changeFelszereles={changeFelszereles}/>
|
changeFelszereles={changeFelszereles}/>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
<div className='row'>
|
||||||
|
<h5 className='col align-self-center'>Véglegesítés</h5>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{fetchedUser.data != null &&
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Publikus karakterlap?</label>
|
||||||
|
<select className="col form-select" value={isPublic.toString()}
|
||||||
|
onChange={(event) => setIsPublic(event.target.value === "true")}>
|
||||||
|
<option value="true">Igen</option>
|
||||||
|
<option value="false">Nem</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
<div className="row">
|
||||||
|
<div className="col-6">
|
||||||
|
<div className='d-grid gap-2 m-5'>
|
||||||
|
{fetchedUser.data == null
|
||||||
|
? <OverlayTrigger
|
||||||
|
placement='top'
|
||||||
|
overlay={saveOverlayTooltip}
|
||||||
|
delay={0}
|
||||||
|
defaultShow={false}
|
||||||
|
flip={false}
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className='btn btn-danger btn-lg'
|
||||||
|
type='button'
|
||||||
|
onClick={onSaveClicked}
|
||||||
|
>
|
||||||
|
Mentés
|
||||||
|
</button>
|
||||||
|
</OverlayTrigger>
|
||||||
|
: <button
|
||||||
|
className='btn btn-danger btn-lg'
|
||||||
|
type='button'
|
||||||
|
onClick={onSaveClicked}
|
||||||
|
>
|
||||||
|
Mentés
|
||||||
|
</button>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="col-6">
|
||||||
|
<div className='d-grid gap-2 m-5'>
|
||||||
|
<button className='btn btn-danger btn-lg' type='button' onClick={async () => {
|
||||||
|
faro?.api.pushEvent('character_created', {
|
||||||
|
osztaly: karakter.szintlepesek[0].osztaly,
|
||||||
|
szint: karakter.szint.toString(),
|
||||||
|
faj: karakter.faj.toString(),
|
||||||
|
})
|
||||||
|
await CreatePDF(KarakterInputToPdfView(karakter))
|
||||||
|
}}>PDF</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<hr/>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
import {KarakterPdfView} from "./karakter_pdf_view";
|
||||||
|
import {PDFDocument} from "pdf-lib";
|
||||||
|
import fontkit from "@pdf-lib/fontkit";
|
||||||
|
import download from "downloadjs";
|
||||||
|
import {SignedNumberToText} from "../../shared/components/Helpers";
|
||||||
|
|
||||||
|
export async function CreatePDF(karakter: KarakterPdfView) {
|
||||||
|
const existingPdfBytes = await fetch('/pdfs/kem2karakterlap_form.pdf').then(res => res.arrayBuffer())
|
||||||
|
const pdfDoc = await PDFDocument.load(existingPdfBytes)
|
||||||
|
pdfDoc.registerFontkit(fontkit)
|
||||||
|
|
||||||
|
const fontBytes = await fetch('/fonts/Milonga-Regular.ttf').then(res => res.arrayBuffer())
|
||||||
|
const pdfFont = await pdfDoc.embedFont(fontBytes)
|
||||||
|
|
||||||
|
const form = pdfDoc.getForm()
|
||||||
|
|
||||||
|
const osztalyok = karakter.Osztaly.length > 1 ? karakter.Osztaly.map(x => `${x.osztaly} (${x.szint})`).join(", ") : karakter.Osztaly[0].osztaly
|
||||||
|
form.getTextField("nev_faj_osztaly").setText(`${karakter.Nev}, ${karakter.Faj} ${osztalyok}`)
|
||||||
|
|
||||||
|
form.getTextField("szint").setText((karakter.SzintTotal.length > 1 ? " " : " ") + karakter.SzintTotal)
|
||||||
|
form.getTextField("jellem").setText(karakter.Jellem)
|
||||||
|
form.getTextField("istenseg").setText(karakter.Isten)
|
||||||
|
|
||||||
|
form.getTextField("vo").setText(karakter.VO.toString())
|
||||||
|
form.getTextField("pancel").setText(" " + karakter.PancelVO)
|
||||||
|
form.getTextField("pajzs").setText(" " + karakter.PajzsVO)
|
||||||
|
form.getTextField("egyeb_vo").setText(" " + karakter.EgyebVO)
|
||||||
|
|
||||||
|
form.getTextField("tul_ero").setText(` ${karakter.Tulajdonsagok.t_ero}`)
|
||||||
|
form.getTextField("tul_ero_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_ero))
|
||||||
|
form.getTextField("tul_ugy").setText(` ${karakter.Tulajdonsagok.t_ugy}`)
|
||||||
|
form.getTextField("tul_ugy_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_ugy))
|
||||||
|
form.getTextField("tul_egs").setText(` ${karakter.Tulajdonsagok.t_egs}`)
|
||||||
|
form.getTextField("tul_egs_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_egs))
|
||||||
|
form.getTextField("tul_int").setText(` ${karakter.Tulajdonsagok.t_int}`)
|
||||||
|
form.getTextField("tul_int_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_int))
|
||||||
|
form.getTextField("tul_bol").setText(` ${karakter.Tulajdonsagok.t_bol}`)
|
||||||
|
form.getTextField("tul_bol_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_bol))
|
||||||
|
form.getTextField("tul_kar").setText(` ${karakter.Tulajdonsagok.t_kar}`)
|
||||||
|
form.getTextField("tul_kar_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_kar))
|
||||||
|
|
||||||
|
form.getTextField("hp_rolls").setText(karakter.HPszintenkent.join(", "))
|
||||||
|
form.getTextField("hp_aktualis").setText(karakter.HP.toString())
|
||||||
|
|
||||||
|
form.getTextField("kitartas_alap").setText(" " + karakter.MentokAlap.kitartas.toString())
|
||||||
|
form.getTextField("kitartas_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.kitartas))
|
||||||
|
form.getTextField("kitartas_sum").setText(" " + karakter.MentokModositokkal.kitartas.toString())
|
||||||
|
|
||||||
|
form.getTextField("reflex_alap").setText(" " + karakter.MentokAlap.reflex.toString())
|
||||||
|
form.getTextField("reflex_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.reflex))
|
||||||
|
form.getTextField("reflex_sum").setText(" " + karakter.MentokModositokkal.reflex.toString())
|
||||||
|
|
||||||
|
form.getTextField("akaratero_alap").setText(" " + karakter.MentokAlap.akaratero.toString())
|
||||||
|
form.getTextField("akaratero_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.akaratero))
|
||||||
|
form.getTextField("akaratero_sum").setText(" " + karakter.MentokModositokkal.akaratero.toString())
|
||||||
|
|
||||||
|
form.getTextField("kezdemenyezes").setText(" " + SignedNumberToText(karakter.Kezdemenyezes))
|
||||||
|
|
||||||
|
form.getTextField("tamadas_bonusz_alap").setText(karakter.TamadasBonuszAlap.join("/"))
|
||||||
|
form.getTextField("tamadas_bonusz_ero").setText(" " + SignedNumberToText(karakter.TulajdonsagModositok.t_ero))
|
||||||
|
form.getTextField("tamadas_bonusz_kozelharc").setText(karakter.KozelharciTB.join("/"))
|
||||||
|
form.getTextField("tamadas_bonusz_ugy").setText(" " + SignedNumberToText(karakter.TulajdonsagModositok.t_ugy))
|
||||||
|
form.getTextField("tamadas_bonusz_tavolsagi").setText(karakter.CelzoTB.join("/"))
|
||||||
|
|
||||||
|
for (let i = 0; i < karakter.Kepzettsegek.length; i++) {
|
||||||
|
const kepzettseg = karakter.Kepzettsegek[i]
|
||||||
|
form.getTextField(`kepzettseg_${i}_nev`).setText(kepzettseg.nev)
|
||||||
|
form.getTextField(`kepzettseg_${i}_alap`).setText(kepzettseg.alap)
|
||||||
|
form.getTextField(`kepzettseg_${i}_bonusz`).setText(kepzettseg.bonusz)
|
||||||
|
form.getTextField(`kepzettseg_${i}_osszes`).setText(kepzettseg.osszes)
|
||||||
|
}
|
||||||
|
for (let i = 0; i < karakter.Fegyverek.length; i++) {
|
||||||
|
form.getTextField(`fegyver_${i+1}`).setText(karakter.Fegyverek[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < karakter.FelszerelesViselt.length && i < 8; i++) {
|
||||||
|
form.getTextField(`viselt_${i}`).setText(karakter.FelszerelesViselt[i])
|
||||||
|
}
|
||||||
|
for (let i = 0; i < karakter.FelszerelesCipelt.length && i < 8; i++) {
|
||||||
|
form.getTextField(`cipelt_${i}`).setText(karakter.FelszerelesCipelt[i])
|
||||||
|
}
|
||||||
|
for (let i = 0; i < karakter.FelszerelesAprosagok.length && i < 8; i++) {
|
||||||
|
form.getTextField(`aprosagok_${i}`).setText(karakter.FelszerelesAprosagok[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
form.updateFieldAppearances(pdfFont)
|
||||||
|
|
||||||
|
const pdfBytes = await pdfDoc.save();
|
||||||
|
download(pdfBytes, `${karakter.Nev}_${karakter.SzintTotal}.pdf`, "application/pdf");
|
||||||
|
}
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
import {Modifier, TulajdonsagokTotal} from "../domain-models/tulajdonsag2E";
|
||||||
|
import {Mentok, MentoModositok, MultiClassMentokAlap} from "../domain-models/mentok";
|
||||||
|
import {CalculateMasodlagosErtekek, VOegyeb} from "../domain-models/masodlagos_ertekek";
|
||||||
|
import {FajLabel} from "../domain-models/faj2E";
|
||||||
|
import {Osztaly2E, OsztalyLabel} from "../domain-models/osztaly2E";
|
||||||
|
import {CelzoTB, KozelharciTB, MultiClassTamadasBonusz} from "../domain-models/tamadas_bonusz";
|
||||||
|
import {Karakter2E} from "../domain-models/karakter2E";
|
||||||
|
import {GetJellem} from "../domain-models/jellem";
|
||||||
|
import {GetFegyver, GetPajzs, GetPancel} from '../domain-models/felszereles'
|
||||||
|
import {
|
||||||
|
KarakterTulajdonsagok,
|
||||||
|
TulajdonsagModosito
|
||||||
|
} from "../domain-models/tulajdonsag2E";
|
||||||
|
import {SignedNumberToText} from "../../shared/components/Helpers";
|
||||||
|
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek2E";
|
||||||
|
import {getClassLevels} from "../domain-models/szintlepes";
|
||||||
|
import {FegyverFlags} from "../components/FegyverSelector";
|
||||||
|
|
||||||
|
interface KepzettsegPdfView {
|
||||||
|
nev: string,
|
||||||
|
alap: string,
|
||||||
|
bonusz: string,
|
||||||
|
osszes: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface KarakterPdfView {
|
||||||
|
Nev: string
|
||||||
|
Isten: string
|
||||||
|
Jellem: string
|
||||||
|
Faj: string
|
||||||
|
Osztaly: {osztaly: string, szint: number}[]
|
||||||
|
Tulajdonsagok: KarakterTulajdonsagok,
|
||||||
|
TulajdonsagModositok: KarakterTulajdonsagok,
|
||||||
|
SzintTotal: string
|
||||||
|
HP: number
|
||||||
|
HPszintenkent: number[]
|
||||||
|
VO: number
|
||||||
|
PancelVO: string
|
||||||
|
PajzsVO: string
|
||||||
|
EgyebVO: string
|
||||||
|
Kezdemenyezes: number
|
||||||
|
TamadasBonuszAlap: number[]
|
||||||
|
KozelharciTB: number[]
|
||||||
|
CelzoTB: number[]
|
||||||
|
MentokAlap: Mentok
|
||||||
|
MentoModositok: Mentok
|
||||||
|
MentokModositokkal: Mentok,
|
||||||
|
Kepzettsegek: KepzettsegPdfView[],
|
||||||
|
Fegyverek: string[],
|
||||||
|
FelszerelesViselt: string[],
|
||||||
|
FelszerelesCipelt: string[],
|
||||||
|
FelszerelesAprosagok: string[],
|
||||||
|
}
|
||||||
|
|
||||||
|
export function KarakterInputToPdfView(karakter: Karakter2E): KarakterPdfView {
|
||||||
|
const tulajdonsagok = TulajdonsagokTotal(karakter)
|
||||||
|
karakter = {...karakter, tulajdonsagok}
|
||||||
|
const tulajdonsagModositok = TulajdonsagModosito(tulajdonsagok)
|
||||||
|
const masodlagosErtekek = CalculateMasodlagosErtekek(karakter)
|
||||||
|
const pancel = GetPancel(karakter.felszereles.pancelID)
|
||||||
|
const pajzs = GetPajzs(karakter.felszereles.pajzsID)
|
||||||
|
const kezdemenyezes = tulajdonsagModositok.t_ugy + (karakter.szintlepesek.some(x => x.osztaly === Osztaly2E.Tolvaj) ? 4 : 0)
|
||||||
|
|
||||||
|
const mentok = MultiClassMentokAlap(karakter.szintlepesek)
|
||||||
|
const mentoModositok = MentoModositok(tulajdonsagModositok)
|
||||||
|
|
||||||
|
const osztalyok = new Array(...(new Set(karakter.szintlepesek.map(x => x.osztaly))))
|
||||||
|
const osztaly = osztalyok.map(x => ({
|
||||||
|
osztaly: OsztalyLabel(x),
|
||||||
|
szint: karakter.szintlepesek.filter(sz => sz.osztaly === x).length
|
||||||
|
}))
|
||||||
|
|
||||||
|
const classLevels = getClassLevels(karakter.szintlepesek)
|
||||||
|
|
||||||
|
let felszereles = [] as string[]
|
||||||
|
if(pancel != null){
|
||||||
|
felszereles = felszereles.concat(FelszerelesToPdfView(pancel))
|
||||||
|
}
|
||||||
|
if(pajzs != null){
|
||||||
|
felszereles = felszereles.concat(FelszerelesToPdfView(pajzs))
|
||||||
|
}
|
||||||
|
|
||||||
|
felszereles = felszereles.concat(karakter.felszereles.fegyverIDk.map(x => {
|
||||||
|
const fegyver = GetFegyver(x)
|
||||||
|
if (fegyver == null) {
|
||||||
|
console.error("unknown fegyver: " + x)
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
return FelszerelesToPdfView(fegyver)
|
||||||
|
}).reduce((acc, item) => acc.concat(item), [] as string[]))
|
||||||
|
|
||||||
|
return {
|
||||||
|
Faj: FajLabel(karakter.faj).toLowerCase(),
|
||||||
|
Isten: karakter.isten || "",
|
||||||
|
Jellem: GetJellem(karakter.jellem).Label,
|
||||||
|
Nev: karakter.nev,
|
||||||
|
Tulajdonsagok: karakter.tulajdonsagok,
|
||||||
|
Osztaly: osztaly,
|
||||||
|
SzintTotal: karakter.szint.toString(),
|
||||||
|
TulajdonsagModositok: tulajdonsagModositok,
|
||||||
|
|
||||||
|
HP: masodlagosErtekek.HP,
|
||||||
|
HPszintenkent: karakter.szintlepesek.map(x => x.HProll),
|
||||||
|
|
||||||
|
Kezdemenyezes: kezdemenyezes,
|
||||||
|
|
||||||
|
TamadasBonuszAlap: MultiClassTamadasBonusz(karakter.szintlepesek),
|
||||||
|
KozelharciTB: KozelharciTB(karakter),
|
||||||
|
CelzoTB: CelzoTB(karakter),
|
||||||
|
|
||||||
|
MentoModositok: mentoModositok,
|
||||||
|
MentokAlap: mentok,
|
||||||
|
MentokModositokkal: masodlagosErtekek.Mentok,
|
||||||
|
|
||||||
|
VO: masodlagosErtekek.VO,
|
||||||
|
PajzsVO: SignedNumberToText(pajzs?.VO),
|
||||||
|
PancelVO: SignedNumberToText(pancel?.VO),
|
||||||
|
EgyebVO: SignedNumberToText(VOegyeb(karakter)),
|
||||||
|
|
||||||
|
Kepzettsegek:
|
||||||
|
karakter.kepzettsegek.map(k =>
|
||||||
|
mapKepzettsegToPdfView(Kepzettsegek[k], tulajdonsagok, karakter.szint))
|
||||||
|
.concat(karakter.tolvajKepzettsegek?.map(k =>
|
||||||
|
mapKepzettsegToPdfView(Kepzettsegek[k], tulajdonsagok, classLevels[Osztaly2E.Tolvaj])) || []),
|
||||||
|
|
||||||
|
Fegyverek: karakter.felszereles.fegyverIDk.slice(0, 4).map(fid => {
|
||||||
|
const fegyver = GetFegyver(fid)
|
||||||
|
if (fegyver == null) {
|
||||||
|
console.error("unknown fegyver: " + fid)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
const serializedFlags = FegyverFlags(fegyver);
|
||||||
|
const critStart = fegyver.CritRangeStart - karakter.szintlepesek.filter(x => x.kalozKritikus === fegyver.Id).length
|
||||||
|
const damageBonus = fegyver.DamageBonus +
|
||||||
|
(fegyver.KetkezesBonusz ? 1 : 0) +
|
||||||
|
(fegyver.Type !== "lofegyver" || fegyver.EroBonusz ? tulajdonsagModositok.t_ero : 0) +
|
||||||
|
(karakter.szintlepesek.filter(x => x.harcosFegyver === fegyver.Id).length * 2)
|
||||||
|
return `${fegyver.Name} ${serializedFlags.length > 0 ? serializedFlags + " " : ''} ${
|
||||||
|
fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${
|
||||||
|
fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${damageBonus !== 0 ? `${
|
||||||
|
SignedNumberToText(damageBonus)}` : ''} ${
|
||||||
|
critStart < 20 ? `${critStart}-20` : '20'}x${fegyver.CritMultiplier}`
|
||||||
|
}),
|
||||||
|
FelszerelesViselt: felszereles,
|
||||||
|
FelszerelesCipelt: [],
|
||||||
|
FelszerelesAprosagok: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FelszerelesPdf {
|
||||||
|
Name: string,
|
||||||
|
Size: number,
|
||||||
|
}
|
||||||
|
|
||||||
|
function FelszerelesToPdfView(item: FelszerelesPdf): string[] {
|
||||||
|
const ans = [item.Name]
|
||||||
|
for (let i = 1; i < item.Size; i ++) {
|
||||||
|
ans.push("+")
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
|
function mapKepzettsegToPdfView(kepzettseg: Kepzettseg, tulajdonsagok: KarakterTulajdonsagok, szint: number): KepzettsegPdfView {
|
||||||
|
const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) =>
|
||||||
|
tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek
|
||||||
|
? tulajdonsagok[currentTulajdonsag]
|
||||||
|
: maxTulajdonsagErtek,
|
||||||
|
tulajdonsagok[kepzettseg.Tulajdonsag[0]])
|
||||||
|
|
||||||
|
return {
|
||||||
|
nev: kepzettseg.Name,
|
||||||
|
alap: szint.toString(),
|
||||||
|
bonusz: SignedNumberToText(Modifier(tulajdonsagErtek)),
|
||||||
|
osszes: (szint + Modifier(tulajdonsagErtek)).toString(),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import {CharacterListItemViewModel} from "../pages/CharacterList";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function CharacterListItem(props: {
|
||||||
|
character: CharacterListItemViewModel,
|
||||||
|
}) {
|
||||||
|
const {character:c} = props
|
||||||
|
return <>
|
||||||
|
<td><a href={`/${c.edition}/karakter/${c.id}`}>{c.name}</a></td>
|
||||||
|
<td>{c.szint}. szintű</td>
|
||||||
|
<td>{c.faj}</td>
|
||||||
|
<td>{c.osztaly}</td>
|
||||||
|
<td>{c.edition}</td>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CharacterListItem;
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
export function SignedNumberToText(val: number) : string {
|
export function SignedNumberToText(val?: number) : string {
|
||||||
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString())
|
return (val === null || val === undefined) ? "" : (val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
export function SignedNumberToText(val: number) : string {
|
|
||||||
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString())
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import {useLoaderData} from "react-router-dom";
|
||||||
|
import CharacterListItem from "../components/CharacterListItem";
|
||||||
|
import {Faj, FajLabel as FajLabel1E} from "../../first-edition/domain-models/faj";
|
||||||
|
import {Faj2E, FajLabel as FajLabel2E} from "../../second-edition/domain-models/faj2E";
|
||||||
|
import {Osztaly, OsztalyLabel as OsztalyLabel1E} from "../../first-edition/domain-models/osztaly";
|
||||||
|
import {Osztaly2E, OsztalyLabel as OsztalyLabel2E} from "../../second-edition/domain-models/osztaly2E";
|
||||||
|
|
||||||
|
export interface CharacterListItemViewModel {
|
||||||
|
id: string,
|
||||||
|
name: string,
|
||||||
|
szint: number,
|
||||||
|
faj: string,
|
||||||
|
osztaly: string,
|
||||||
|
edition: "1e" | "2e"
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CharacterListItemDto1E {
|
||||||
|
id: string,
|
||||||
|
name: string,
|
||||||
|
szint: number,
|
||||||
|
faj: Faj,
|
||||||
|
osztaly: Osztaly,
|
||||||
|
edition: "1e"
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CharacterListItemDto2E {
|
||||||
|
id: string,
|
||||||
|
name: string,
|
||||||
|
szint: number,
|
||||||
|
faj: Faj2E,
|
||||||
|
osztaly: Osztaly2E,
|
||||||
|
edition: "2e"
|
||||||
|
}
|
||||||
|
|
||||||
|
type CharacterListItemDto = CharacterListItemDto1E | CharacterListItemDto2E;
|
||||||
|
|
||||||
|
function mapDtoToViewModel(dto: CharacterListItemDto): CharacterListItemViewModel {
|
||||||
|
if (dto.edition === "1e") {
|
||||||
|
return {
|
||||||
|
id: dto.id,
|
||||||
|
name: dto.name,
|
||||||
|
edition: dto.edition,
|
||||||
|
szint: dto.szint,
|
||||||
|
faj: FajLabel1E(dto.faj),
|
||||||
|
osztaly: OsztalyLabel1E(dto.osztaly),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return {
|
||||||
|
id: dto.id,
|
||||||
|
name: dto.name,
|
||||||
|
edition: dto.edition,
|
||||||
|
szint: dto.szint,
|
||||||
|
faj: FajLabel2E(dto.faj),
|
||||||
|
osztaly: OsztalyLabel2E(dto.osztaly),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function CharacterList(props: {}) {
|
||||||
|
const characters = useLoaderData() as CharacterListItemDto[];
|
||||||
|
|
||||||
|
return <div className="container">
|
||||||
|
<div className="container-fluid p-5 bg-black text-white text-center">
|
||||||
|
<h1>Karakterek</h1>
|
||||||
|
</div>
|
||||||
|
<div className="row">
|
||||||
|
<div className="col-6">
|
||||||
|
<div className="d-grid gap-1 m-3 m-lg-5">
|
||||||
|
<a className="btn btn-dark btn-lg" href="/2e/karakter/" type="button">Új 2e karakter létrehozása</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="col-6">
|
||||||
|
<div className="d-grid gap-1 m-3 m-lg-5">
|
||||||
|
<a className="btn btn-dark btn-lg" href="/1e/karakter/" type="button">Új 1e karakter létrehozása</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table className="table mt-3">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Név</th>
|
||||||
|
<th scope="col">Szint</th>
|
||||||
|
<th scope="col">Faj</th>
|
||||||
|
<th scope="col">Osztály</th>
|
||||||
|
<th scope="col">Kiadás</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{characters.map(c => (
|
||||||
|
<tr key={c.id}>
|
||||||
|
<CharacterListItem character={mapDtoToViewModel(c)}/>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CharacterList;
|
||||||
@@ -1322,21 +1322,20 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
|
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
|
||||||
integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
|
integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
|
||||||
|
|
||||||
"@grafana/faro-core@^1.3.6":
|
"@grafana/faro-core@^1.3.9":
|
||||||
version "1.3.6"
|
version "1.3.9"
|
||||||
resolved "https://registry.yarnpkg.com/@grafana/faro-core/-/faro-core-1.3.6.tgz#7e4f2754e35d683c259af2ee4851aceadbfca8ad"
|
resolved "https://registry.yarnpkg.com/@grafana/faro-core/-/faro-core-1.3.9.tgz#69d7c4239c3507028eb7a6f21f1213278b11194a"
|
||||||
integrity sha512-1N/VWOIuukvqJUbpGRmendbJSG8hEvMqUV79+jPrhSRjM2VlNsqtFC/0VdW9mpQPpZh2cOyI5bPjuAZsRe7+Xw==
|
integrity sha512-zBghaYNKwMwiyErUYEYbx/E/HTdy3tFS7Oy+1f5CiIi5+iUSYidgeQqKdd4vKB1EtDn1MI5iA2dXBavxLNYGlg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/api" "^1.7.0"
|
"@opentelemetry/api" "^1.7.0"
|
||||||
"@opentelemetry/otlp-transformer" "^0.45.1"
|
"@opentelemetry/otlp-transformer" "^0.48.0"
|
||||||
murmurhash-js "^1.0.0"
|
|
||||||
|
|
||||||
"@grafana/faro-web-sdk@^1.2.2":
|
"@grafana/faro-web-sdk@^1.3.9":
|
||||||
version "1.3.6"
|
version "1.3.9"
|
||||||
resolved "https://registry.yarnpkg.com/@grafana/faro-web-sdk/-/faro-web-sdk-1.3.6.tgz#96fecf122d3352a3867bde76a01ef38fe75d868c"
|
resolved "https://registry.yarnpkg.com/@grafana/faro-web-sdk/-/faro-web-sdk-1.3.9.tgz#ebf8c645cbcc3a22e31a89d0e7e94f9d09f88c5f"
|
||||||
integrity sha512-hxqHRZM1AERK6YZtJpCM1PJoj9/CLhCfQcfprcv751l5xkLCOzCoUWiH8CSW3gfiu7egIzEq0luHF7544Xezvg==
|
integrity sha512-lrUhzITfgpEtOP4I/HbhIh0UCTNpcAWveFN7bzdCJ/N/G3YULd6jXBuBoHcC25Fx3WtLChljzJ5IJ02HTA2Q9g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@grafana/faro-core" "^1.3.6"
|
"@grafana/faro-core" "^1.3.9"
|
||||||
ua-parser-js "^1.0.32"
|
ua-parser-js "^1.0.32"
|
||||||
web-vitals "^3.1.1"
|
web-vitals "^3.1.1"
|
||||||
|
|
||||||
@@ -1696,10 +1695,10 @@
|
|||||||
"@nodelib/fs.scandir" "2.1.5"
|
"@nodelib/fs.scandir" "2.1.5"
|
||||||
fastq "^1.6.0"
|
fastq "^1.6.0"
|
||||||
|
|
||||||
"@opentelemetry/api-logs@0.45.1":
|
"@opentelemetry/api-logs@0.48.0":
|
||||||
version "0.45.1"
|
version "0.48.0"
|
||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.45.1.tgz#9e4f2c652dcce798c5627939b22304c2b5ce19c5"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz#9521a0c1e920ed536f31cda117164c4afff44caf"
|
||||||
integrity sha512-zVGq/k70l+kB/Wuv3O/zhptP2hvDhEbhDu9EtHde1iWZJf3FedeYS/nWVcMBkkyPAjS/JKNk86WN4CBQLGUuOw==
|
integrity sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/api" "^1.0.0"
|
"@opentelemetry/api" "^1.0.0"
|
||||||
|
|
||||||
@@ -1708,63 +1707,63 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40"
|
||||||
integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==
|
integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==
|
||||||
|
|
||||||
"@opentelemetry/core@1.18.1":
|
"@opentelemetry/core@1.21.0":
|
||||||
version "1.18.1"
|
version "1.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.18.1.tgz#d2e45f6bd6be4f00d20d18d4f1b230ec33805ae9"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.21.0.tgz#8c16faf16edf861b073c03c9d45977b3f4003ee1"
|
||||||
integrity sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==
|
integrity sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/semantic-conventions" "1.18.1"
|
"@opentelemetry/semantic-conventions" "1.21.0"
|
||||||
|
|
||||||
"@opentelemetry/otlp-transformer@^0.45.1":
|
"@opentelemetry/otlp-transformer@^0.48.0":
|
||||||
version "0.45.1"
|
version "0.48.0"
|
||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.45.1.tgz#8f6590b93f177510983bea3055e5a3f3d30faad2"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz#969d52a767c7538552b88f7baaa001d3f88feb17"
|
||||||
integrity sha512-FhIHgfC0b0XtoBrS5ISfva939yWffNl47ypXR8I7Ru+dunlySpmf2TLocKHYLHGcWiuoeSNO5O4dZCmSKOtpXw==
|
integrity sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/api-logs" "0.45.1"
|
"@opentelemetry/api-logs" "0.48.0"
|
||||||
"@opentelemetry/core" "1.18.1"
|
"@opentelemetry/core" "1.21.0"
|
||||||
"@opentelemetry/resources" "1.18.1"
|
"@opentelemetry/resources" "1.21.0"
|
||||||
"@opentelemetry/sdk-logs" "0.45.1"
|
"@opentelemetry/sdk-logs" "0.48.0"
|
||||||
"@opentelemetry/sdk-metrics" "1.18.1"
|
"@opentelemetry/sdk-metrics" "1.21.0"
|
||||||
"@opentelemetry/sdk-trace-base" "1.18.1"
|
"@opentelemetry/sdk-trace-base" "1.21.0"
|
||||||
|
|
||||||
"@opentelemetry/resources@1.18.1":
|
"@opentelemetry/resources@1.21.0":
|
||||||
version "1.18.1"
|
version "1.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.18.1.tgz#e27bdc4715bccc8cd4a72d4aca3995ad0a496fe7"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.21.0.tgz#e773e918cc8ca26493a987dfbfc6b8a315a2ab45"
|
||||||
integrity sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA==
|
integrity sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core" "1.18.1"
|
"@opentelemetry/core" "1.21.0"
|
||||||
"@opentelemetry/semantic-conventions" "1.18.1"
|
"@opentelemetry/semantic-conventions" "1.21.0"
|
||||||
|
|
||||||
"@opentelemetry/sdk-logs@0.45.1":
|
"@opentelemetry/sdk-logs@0.48.0":
|
||||||
version "0.45.1"
|
version "0.48.0"
|
||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.45.1.tgz#d59a99147ab15eb36757932517dfc9a10e1645e9"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz#5248e4cbfc99bbee555ffd1a23b5db53d6553f2c"
|
||||||
integrity sha512-z0RRgW4LeKEKnhXS4F/HnqB6+7gsy63YK47F4XAJYHs4s1KKg8XnQ2RkbuL31i/a9nXkylttYtvsT50CGr487g==
|
integrity sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core" "1.18.1"
|
"@opentelemetry/core" "1.21.0"
|
||||||
"@opentelemetry/resources" "1.18.1"
|
"@opentelemetry/resources" "1.21.0"
|
||||||
|
|
||||||
"@opentelemetry/sdk-metrics@1.18.1":
|
"@opentelemetry/sdk-metrics@1.21.0":
|
||||||
version "1.18.1"
|
version "1.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.18.1.tgz#1dd334744a1e5d2eec27e9e9765c73cd2f43aef3"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz#40d71aaec5b696e58743889ce6d5bf2593f9a23d"
|
||||||
integrity sha512-TEFgeNFhdULBYiCoHbz31Y4PDsfjjxRp8Wmdp6ybLQZPqMNEb+dRq+XN8Xw3ivIgTaf9gYsomgV5ensX99RuEQ==
|
integrity sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core" "1.18.1"
|
"@opentelemetry/core" "1.21.0"
|
||||||
"@opentelemetry/resources" "1.18.1"
|
"@opentelemetry/resources" "1.21.0"
|
||||||
lodash.merge "^4.6.2"
|
lodash.merge "^4.6.2"
|
||||||
|
|
||||||
"@opentelemetry/sdk-trace-base@1.18.1":
|
"@opentelemetry/sdk-trace-base@1.21.0":
|
||||||
version "1.18.1"
|
version "1.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz#256605d90b202002d5672305c66dbcf377132379"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz#ffad912e453a92044fb220bd5d2f6743bf37bb8a"
|
||||||
integrity sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg==
|
integrity sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core" "1.18.1"
|
"@opentelemetry/core" "1.21.0"
|
||||||
"@opentelemetry/resources" "1.18.1"
|
"@opentelemetry/resources" "1.21.0"
|
||||||
"@opentelemetry/semantic-conventions" "1.18.1"
|
"@opentelemetry/semantic-conventions" "1.21.0"
|
||||||
|
|
||||||
"@opentelemetry/semantic-conventions@1.18.1":
|
"@opentelemetry/semantic-conventions@1.21.0":
|
||||||
version "1.18.1"
|
version "1.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz#8e47caf57a84b1dcc1722b2025693348cdf443b4"
|
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz#83f7479c524ab523ac2df702ade30b9724476c72"
|
||||||
integrity sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==
|
integrity sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==
|
||||||
|
|
||||||
"@pdf-lib/fontkit@^1.1.1":
|
"@pdf-lib/fontkit@^1.1.1":
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
@@ -6961,11 +6960,6 @@ multicast-dns@^7.2.5:
|
|||||||
dns-packet "^5.2.2"
|
dns-packet "^5.2.2"
|
||||||
thunky "^1.0.2"
|
thunky "^1.0.2"
|
||||||
|
|
||||||
murmurhash-js@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51"
|
|
||||||
integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==
|
|
||||||
|
|
||||||
mz@^2.7.0:
|
mz@^2.7.0:
|
||||||
version "2.7.0"
|
version "2.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
|
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=karakter/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Kemkas/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=Kemkas/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||||
Reference in New Issue
Block a user