Merge branch 'dev' into SES-150

This commit is contained in:
Karol Górzyński 2021-01-13 09:30:06 +01:00
commit d146ea3b78
59 changed files with 2349 additions and 114 deletions

View File

@ -127,3 +127,4 @@ namespace SessionCompanion.Database
} }
} }
} }

View File

@ -0,0 +1,985 @@
[
{
"id": 1,
"userId": -1,
"statistics": {
"ExperiencePoints": 0,
"Level": 1,
"Speed": 4,
"Initiative": 2,
"HealthPoints": 8,
"CurrentHealthPoints": 8,
"ArmorClass": 5,
"Proficiency": 2
},
"biography": {
"Name": "Ulora",
"ClassId": 2,
"RaceId": 3,
"AlignmentId": "LawfulGood",
"BackgroundId": 2,
"Sex": "Female",
"Languages": "Common",
"background": {
"Origin": "No origin",
"History": "Nothing much"
}
},
"characterWeapons": [
{
"WeaponId": 11,
"InUse": true,
"HoldInRightHand": true,
"HoldInLeftHand": false
},
{
"WeaponId": 12,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
}
],
"characterSpells": [
{
"SpellId": 44
},
{
"SpellId": 57
}
],
"charisma": {
"Value": 5,
"Modification": -2,
"SavingThrows": 0,
"CanSavingThrows": false,
"Deception": 0,
"CanDeception": false,
"Intimidation": 0,
"CanIntimidation": false,
"Performance": 0,
"CanPerformance": false,
"Persuasion": 0,
"CanPersuasion": false
},
"constitution": {
"Value": 12,
"Modification": 2,
"SavingThrows": 2,
"CanSaveThrows": true
},
"dexterity": {
"Value": 15,
"Modification": 2,
"SavingThrows": 3,
"CanSaveThrows": true,
"Acrobatics": 3,
"CanAcrobatics": true,
"SleightOfHand": 2,
"CanSleightOfHand": true,
"Stealth": 3,
"canStealth": true
},
"intelligence": {
"Value": 14,
"Modification": 4,
"SavingThrows": 2,
"CanSaveThrows": true,
"arcana": 2,
"canArcana": true,
"History": 4,
"CanHistory": true,
"Investigation": 3,
"CanInvestigation": true,
"Nature": 1,
"CanNature": true,
"Religion": 0,
"canReligion": false
},
"strength": {
"Value": 8,
"Modification": -1,
"SavingThrows": 0,
"CanSaveThrows": false,
"Athletics": 0,
"canAthletics": false
},
"wisdom": {
"Value": 10,
"Modification": 0,
"SavingThrows": 0,
"CanSaveThrows": false,
"AnimalHandling": 1,
"CanAnimalHandling": true,
"Insight": 0,
"canInsight": false,
"medicine": 0,
"CanMedicine": false,
"Perception": 2,
"CanPerception": true,
"Survival": 0,
"CanSurvival": false
}
},
{
"id": 2,
"userId": -1,
"statistics": {
"ExperiencePoints": 0,
"Level": 1,
"Speed": 3,
"Initiative": 5,
"HealthPoints": 12,
"CurrentHealthPoints": 11,
"ArmorClass": 4,
"Proficiency": 1
},
"biography": {
"Name": "Nucate",
"ClassId": 1,
"RaceId": 1,
"AlignmentId": "LawfulGood",
"BackgroundId": 1,
"Sex": "Male",
"Languages": "Common",
"background": {
"Origin": "No origin",
"History": "Nothing much"
}
},
"characterWeapons": [
{
"WeaponId": 30,
"InUse": true,
"HoldInRightHand": true,
"HoldInLeftHand": false
},
{
"WeaponId": 25,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
}
],
"characterSpells": [
{
"SpellId": 2
},
{
"SpellId": 42
}
],
"charisma": {
"Value": 10,
"Modification": 3,
"SavingThrows": 0,
"CanSavingThrows": false,
"Deception": 0,
"CanDeception": false,
"Intimidation": 1,
"CanIntimidation": true,
"Performance": 2,
"CanPerformance": true,
"Persuasion": 0,
"CanPersuasion": false
},
"constitution": {
"Value": 11,
"Modification": 4,
"SavingThrows": 2,
"CanSaveThrows": true
},
"dexterity": {
"Value": 10,
"Modification": 1,
"SavingThrows": 4,
"CanSaveThrows": true,
"Acrobatics": 3,
"CanAcrobatics": true,
"SleightOfHand": 1,
"CanSleightOfHand": true,
"Stealth": 2,
"canStealth": true
},
"intelligence": {
"Value": 6,
"Modification": -2,
"SavingThrows": 1,
"CanSaveThrows": true,
"arcana": 1,
"canArcana": true,
"History": 4,
"CanHistory": true,
"Investigation": 0,
"CanInvestigation": false,
"Nature": 1,
"CanNature": true,
"Religion": 3,
"canReligion": true
},
"strength": {
"Value": 10,
"Modification": 1,
"SavingThrows": 0,
"CanSaveThrows": false,
"Athletics": 2,
"canAthletics": true
},
"wisdom": {
"Value": 11,
"Modification": 3,
"SavingThrows": 1,
"CanSaveThrows": true,
"AnimalHandling": 2,
"canAnimalHandling": true,
"Insight": 1,
"canInsight": true,
"medicine": 0,
"CanMedicine": false,
"Perception": 5,
"CanPerception": true,
"Survival": 2,
"CanSurvival": true
}
},
{
"id": 3,
"userId": -1,
"statistics": {
"ExperiencePoints": 0,
"Level": 1,
"Speed": 4,
"Initiative": 2,
"HealthPoints": 17,
"CurrentHealthPoints": 16,
"ArmorClass": 6,
"Proficiency": 3
},
"biography": {
"Name": "Muraraj",
"ClassId": 2,
"RaceId": 2,
"AlignmentId": "LawfulGood",
"BackgroundId": 1,
"Sex": "Male",
"Languages": "Common",
"background": {
"Origin": "No origin",
"History": "Nothing much"
}
},
"characterWeapons": [
{
"WeaponId": 1,
"InUse": true,
"HoldInRightHand": true,
"HoldInLeftHand": false
},
{
"WeaponId": 2,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
},
{
"WeaponId": 10,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
}
],
"characterSpells": [
{
"SpellId": 42
}
],
"charisma": {
"Value": 15,
"Modification": 2,
"SavingThrows": 2,
"CanSaveThrows": true,
"Deception": 1,
"CanDeception": true,
"Intimidation": 4,
"CanIntimidation": true,
"Performance": 2,
"CanPerformance": true,
"Persuasion": 2,
"CanPersuasion": true
},
"constitution": {
"Value": 15,
"Modification": 4,
"SavingThrows": 2,
"CanSaveThrows": true
},
"dexterity": {
"Value": 8,
"Modification": -1,
"SavingThrows": 0,
"CanSaveThrows": false,
"Acrobatics": 0,
"CanAcrobatics": false,
"SleightOfHand": 0,
"CanSleightOfHand": false,
"Stealth": 0,
"canStealth": false
},
"intelligence": {
"Value": 8,
"Modification": -1,
"SavingThrows": 0,
"CanSaveThrows": false,
"arcana": 0,
"canArcana": false,
"History": 0,
"CanHistory": false,
"Investigation": 0,
"CanInvestigation": false,
"Nature": 0,
"CanNature": false,
"Religion": 0,
"canReligion": false
},
"strength": {
"Value": 18,
"Modification": 4,
"SavingThrows": 3,
"CanSaveThrows": true,
"Athletics": 5,
"canAthletics": true
},
"wisdom": {
"Value": 6,
"Modification": -3,
"SavingThrows": 0,
"CanSaveThrows": false,
"AnimalHandling": 0,
"CanAnimalHandling": false,
"Insight": 0,
"canInsight": false,
"medicine": 0,
"CanMedicine": false,
"Perception": 0,
"CanPerception": false,
"Survival": 0,
"CanSurvival": false
}
},
{
"id": 5,
"userId": -1,
"statistics": {
"ExperiencePoints": 0,
"Level": 1,
"Speed": 8,
"Initiative": 7,
"HealthPoints": 7,
"CurrentHealthPoints": 7,
"ArmorClass": 2,
"Proficiency": 3
},
"biography": {
"Name": "Amarena",
"ClassId": 2,
"RaceId": 1,
"AlignmentId": "LawfulGood",
"BackgroundId": 2,
"Sex": "Female",
"Languages": "Common",
"background": {
"Origin": "No origin",
"History": "Nothing much"
}
},
"characterWeapons": [
{
"WeaponId": 2,
"InUse": true,
"HoldInRightHand": true,
"HoldInLeftHand": false
},
{
"WeaponId": 14,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
},
{
"WeaponId": 4,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
}
],
"characterSpells": [
{
"SpellId": 2
}
],
"charisma": {
"Value": 7,
"Modification": -2,
"SavingThrows": 0,
"CanSavingThrows": false,
"Deception": 0,
"CanDeception": false,
"Intimidation": 0,
"CanIntimidation": false,
"Performance": 0,
"CanPerformance": false,
"Persuasion": 0,
"CanPersuasion": false
},
"constitution": {
"Value": 11,
"Modification": 1,
"SavingThrows": 1,
"CanSaveThrows": true
},
"dexterity": {
"Value": 17,
"Modification": 4,
"SavingThrows": 3,
"CanSaveThrows": true,
"Acrobatics": 4,
"CanAcrobatics": true,
"SleightOfHand": 2,
"CanSleightOfHand": true,
"Stealth": 5,
"canStealth": true
},
"intelligence": {
"Value": 10,
"Modification": 0,
"SavingThrows": 0,
"CanSaveThrows": false,
"arcana": 0,
"canArcana": false,
"History": 0,
"CanHistory": false,
"Investigation": 0,
"CanInvestigation": false,
"Nature": 0,
"CanNature": false,
"Religion": 0,
"canReligion": false
},
"strength": {
"Value": 14,
"Modification": 2,
"SavingThrows": 1,
"CanSaveThrows": true,
"Athletics": 3,
"canAthletics": true
},
"wisdom": {
"Value": 7,
"Modification": 0,
"SavingThrows": 0,
"CanSaveThrows": false,
"AnimalHandling": 0,
"canAnimalHandling": false,
"Insight": 0,
"canInsight": false,
"medicine": 0,
"CanMedicine": false,
"Perception": 0,
"CanPerception": false,
"Survival": 0,
"CanSurvival": false
}
},
{
"id": 6,
"userId": -1,
"statistics": {
"ExperiencePoints": 0,
"Level": 1,
"Speed": 2,
"Initiative": 3,
"HealthPoints": 17,
"CurrentHealthPoints": 17,
"ArmorClass": 5,
"Proficiency": 1
},
"biography": {
"Name": "Yaz' uw Emul",
"ClassId": 1,
"RaceId": 3,
"AlignmentId": "LawfulGood",
"BackgroundId": 3,
"Sex": "Male",
"Languages": "Common",
"background": {
"Origin": "No origin",
"History": "Nothing much"
}
},
"characterWeapons": [
{
"WeaponId": 16,
"InUse": true,
"HoldInRightHand": true,
"HoldInLeftHand": false
},
{
"WeaponId": 14,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
}
],
"characterSpells": [
{
"SpellId": 2
},
{
"SpellId": 65
},
{
"SpellId": 44
}
],
"charisma": {
"Value": 10,
"Modification": 0,
"SavingThrows": 0,
"CanSavingThrows": false,
"Deception": 1,
"CanDeception": true,
"Intimidation": 2,
"CanIntimidation": true,
"Performance": 0,
"CanPerformance": false,
"Persuasion": 0,
"CanPersuasion": false
},
"constitution": {
"Value": 14,
"Modification": 4,
"SavingThrows": 1,
"CanSaveThrows": true
},
"dexterity": {
"Value": 6,
"Modification": -3,
"SavingThrows": 0,
"CanSaveThrows": false,
"Acrobatics": 0,
"CanAcrobatics": false,
"SleightOfHand": 0,
"CanSleightOfHand": false,
"Stealth": 0,
"canStealth": false
},
"intelligence": {
"Value": 11,
"Modification": 1,
"SavingThrows": 1,
"CanSaveThrows": true,
"arcana": 0,
"canArcana": false,
"History": 2,
"CanHistory": true,
"Investigation": 1,
"CanInvestigation": true,
"Nature": 0,
"CanNature": false,
"Religion": 4,
"canReligion": true
},
"strength": {
"Value": 18,
"Modification": 4,
"SavingThrows": 2,
"CanSaveThrows": true,
"Athletics": 4,
"canAthletics": true
},
"wisdom": {
"Value": 9,
"Modification": -1,
"SavingThrows": 0,
"CanSaveThrows": false,
"AnimalHandling": 0,
"canAnimalHandling": false,
"Insight": 0,
"canInsight": false,
"medicine": 0,
"CanMedicine": false,
"Perception": 0,
"CanPerception": false,
"Survival": 0,
"CanSurvival": false
}
},
{
"id": 7,
"userId": -1,
"statistics": {
"ExperiencePoints": 0,
"Level": 1,
"Speed": 5,
"Initiative": 4,
"HealthPoints": 13,
"CurrentHealthPoints": 13,
"ArmorClass": 2,
"Proficiency": 1
},
"biography": {
"Name": "Kamul",
"ClassId": 2,
"RaceId": 1,
"AlignmentId": "LawfulGood",
"BackgroundId": 1,
"Sex": "Female",
"Languages": "Common",
"background": {
"Origin": "No origin",
"History": "Nothing much"
}
},
"characterWeapons": [
{
"WeaponId": 18,
"InUse": true,
"HoldInRightHand": true,
"HoldInLeftHand": false
},
{
"WeaponId": 1,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
}
],
"characterSpells": [
{
"SpellId": 3
},
{
"SpellId": 85
},
{
"SpellId": 94
}
],
"charisma": {
"Value": 10,
"Modification": 0,
"SavingThrows": 0,
"CanSavingThrows": false,
"Deception": 2,
"CanDeception": true,
"Intimidation": 0,
"CanIntimidation": false,
"Performance": 1,
"CanPerformance": true,
"Persuasion": 2,
"CanPersuasion": true
},
"constitution": {
"Value": 8,
"Modification": -2,
"SavingThrows": 0,
"CanSaveThrows": false
},
"dexterity": {
"Value": 12,
"Modification": 1,
"SavingThrows": 1,
"CanSaveThrows": true,
"Acrobatics": 2,
"CanAcrobatics": true,
"SleightOfHand": 1,
"CanSleightOfHand": true,
"Stealth": 0,
"canStealth": false
},
"intelligence": {
"Value": 15,
"Modification": 4,
"SavingThrows": 2,
"CanSaveThrows": true,
"arcana": 4,
"canArcana": true,
"History": 1,
"CanHistory": true,
"Investigation": 1,
"CanInvestigation": true,
"Nature": 6,
"CanNature": true,
"Religion": 0,
"canReligion": false
},
"strength": {
"Value": 13,
"Modification": 1,
"SavingThrows": 1,
"CanSaveThrows": true,
"Athletics": 2,
"canAthletics": true
},
"wisdom": {
"Value": 13,
"Modification": 2,
"SavingThrows": 2,
"CanSaveThrows": true,
"AnimalHandling": 1,
"canAnimalHandling": true,
"Insight": 4,
"canInsight": true,
"medicine": 2,
"CanMedicine": true,
"Perception": 5,
"CanPerception": true,
"Survival": 2,
"CanSurvival": true
}
},
{
"id": 8,
"userId": -1,
"statistics": {
"ExperiencePoints": 0,
"Level": 1,
"Speed": 9,
"Initiative": 6,
"HealthPoints": 7,
"CurrentHealthPoints": 7,
"ArmorClass": 4,
"Proficiency": 1
},
"biography": {
"Name": "Mu",
"ClassId": 1,
"RaceId": 3,
"AlignmentId": "LawfulGood",
"BackgroundId": 2,
"Sex": "Male",
"Languages": "Common",
"background": {
"Origin": "No origin",
"History": "Nothing much"
}
},
"characterWeapons": [
{
"WeaponId": 1,
"InUse": true,
"HoldInRightHand": true,
"HoldInLeftHand": false
},
{
"WeaponId": 17,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
},
{
"WeaponId": 27,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
}
],
"characterSpells": [
{
"SpellId": 3
}
],
"charisma": {
"Value": 11,
"Modification": 1,
"SavingThrows": 1,
"CanSavingThrows": true,
"Deception": 1,
"CanDeception": true,
"Intimidation": 0,
"CanIntimidation": false,
"Performance": 0,
"CanPerformance": false,
"Persuasion": 0,
"CanPersuasion": false
},
"constitution": {
"Value": 13,
"Modification": 2,
"SavingThrows": 1,
"CanSaveThrows": true
},
"dexterity": {
"Value": 17,
"Modification": 4,
"SavingThrows": 3,
"CanSaveThrows": true,
"Acrobatics": 3,
"CanAcrobatics": true,
"SleightOfHand": 4,
"CanSleightOfHand": true,
"Stealth": 1,
"canStealth": true
},
"intelligence": {
"Value": 8,
"Modification": -2,
"SavingThrows": 0,
"CanSaveThrows": false,
"arcana": 0,
"canArcana": false,
"History": 0,
"CanHistory": false,
"Investigation": 0,
"CanInvestigation": false,
"Nature": 0,
"CanNature": false,
"Religion": 0,
"canReligion": false
},
"strength": {
"Value": 18,
"Modification": 4,
"SavingThrows": 3,
"CanSaveThrows": true,
"Athletics": 5,
"canAthletics": true
},
"wisdom": {
"Value": 8,
"Modification": -2,
"SavingThrows": 0,
"CanSaveThrows": false,
"AnimalHandling": 0,
"canAnimalHandling": false,
"Insight": 0,
"canInsight": false,
"medicine": 0,
"CanMedicine": false,
"Perception": 0,
"CanPerception": false,
"Survival": 0,
"CanSurvival": false
}
},
{
"id": 9,
"userId": -1,
"statistics": {
"ExperiencePoints": 0,
"Level": 1,
"Speed": 4,
"Initiative": 3,
"HealthPoints": 12,
"CurrentHealthPoints": 12,
"ArmorClass": 3,
"Proficiency": 1
},
"biography": {
"Name": "Aarak",
"ClassId": 2,
"RaceId": 3,
"AlignmentId": "LawfulGood",
"BackgroundId": 2,
"Sex": "Female",
"Languages": "Common",
"background": {
"Origin": "No origin",
"History": "Nothing much"
}
},
"characterWeapons": [
{
"WeaponId": 4,
"InUse": true,
"HoldInRightHand": true,
"HoldInLeftHand": false
},
{
"WeaponId": 7,
"InUse": false,
"HoldInRightHand": false,
"HoldInLeftHand": false
}
],
"characterSpells": [
{
"SpellId": 1
},
{
"SpellId": 55
}
],
"charisma": {
"Value": 12,
"Modification": 2,
"SavingThrows": 1,
"CanSavingThrows": true,
"Deception": 0,
"CanDeception": false,
"Intimidation": 0,
"CanIntimidation": false,
"Performance": 0,
"CanPerformance": false,
"Persuasion": 3,
"CanPersuasion": true
},
"constitution": {
"Value": 11,
"Modification": 1,
"SavingThrows": 1,
"CanSaveThrows": true
},
"dexterity": {
"Value": 15,
"Modification": 3,
"SavingThrows": 2,
"CanSaveThrows": true,
"Acrobatics": 2,
"CanAcrobatics": true,
"SleightOfHand": 1,
"CanSleightOfHand": true,
"Stealth": 4,
"canStealth": true
},
"intelligence": {
"Value": 12,
"Modification": 1,
"SavingThrows": 1,
"CanSaveThrows": true,
"arcana": 0,
"canArcana": false,
"History": 0,
"CanHistory": false,
"Investigation": 0,
"CanInvestigation": false,
"Nature": 2,
"CanNature": true,
"Religion": 0,
"canReligion": false
},
"strength": {
"Value": 15,
"Modification": 4,
"SavingThrows": 3,
"CanSaveThrows": true,
"Athletics": 2,
"canAthletics": true
},
"wisdom": {
"Value": 6,
"Modification": -4,
"SavingThrows": 0,
"CanSaveThrows": false,
"AnimalHandling": 0,
"canAnimalHandling": false,
"Insight": 0,
"canInsight": false,
"medicine": 0,
"CanMedicine": false,
"Perception": 0,
"CanPerception": false,
"Survival": 0,
"CanSurvival": false
}
}
]

View File

@ -0,0 +1,14 @@
using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables;
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.Database.Repositories
{
public class GameActionRepository : Repository<GameAction>, IRepository<GameAction>
{
public GameActionRepository(ApplicationDbContext _dbContext) : base(_dbContext)
{ }
}
}

View File

@ -0,0 +1,14 @@
using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables;
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.Database.Repositories
{
public class LegendaryActionRepository : Repository<LegendaryAction>, IRepository<LegendaryAction>
{
public LegendaryActionRepository(ApplicationDbContext _dbContext) : base(_dbContext)
{ }
}
}

View File

@ -0,0 +1,14 @@
using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables;
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.Database.Repositories
{
public class MonsterActionsRepository : Repository<MonsterAction>, IRepository<MonsterAction>
{
public MonsterActionsRepository(ApplicationDbContext _dbContext) : base(_dbContext)
{ }
}
}

View File

@ -0,0 +1,14 @@
using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables;
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.Database.Repositories
{
public class MonsterLegendaryActionsRepository : Repository<MonsterLegendaryAction>, IRepository<MonsterLegendaryAction>
{
public MonsterLegendaryActionsRepository(ApplicationDbContext _dbContext) : base(_dbContext)
{ }
}
}

View File

@ -0,0 +1,14 @@
using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables;
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.Database.Repositories
{
public class MonsterRepository : Repository<Monster>, IRepository<Monster>
{
public MonsterRepository(ApplicationDbContext _dbContext) : base(_dbContext)
{ }
}
}

View File

@ -0,0 +1,14 @@
using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables;
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.Database.Repositories
{
public class MonsterSpecialAbilitiesRepository : Repository<MonsterSpecialAbility>, IRepository<MonsterSpecialAbility>
{
public MonsterSpecialAbilitiesRepository(ApplicationDbContext _dbContext) : base(_dbContext)
{ }
}
}

View File

@ -0,0 +1,14 @@
using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables;
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.Database.Repositories
{
public class SpecialAbilityRepository : Repository<SpecialAbility>, IRepository<SpecialAbility>
{
public SpecialAbilityRepository(ApplicationDbContext _dbContext) : base(_dbContext)
{ }
}
}

View File

@ -21,8 +21,4 @@
<ProjectReference Include="..\SessionCompanion.ViewModels\SessionCompanion.ViewModels.csproj" /> <ProjectReference Include="..\SessionCompanion.ViewModels\SessionCompanion.ViewModels.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="JsonData\" />
</ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionCompanion.Database.Tables
{
public class GameAction : BaseEntity
{
// <summary>
/// Nazwa akcji
/// </summary>
public string Name { get; set; }
/// <summary>
/// Opis akcji
/// </summary>
public string Description { get; set; }
public int AttackBonus { get; set; }
public int? DamageDice { get; set; }
public int? DamageDiceAmount { get; set; }
public int? DamageBonus { get; set; }
public virtual ICollection<MonsterAction> MonsterActions { get; set; }
}
}

View File

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionCompanion.Database.Tables
{
public class LegendaryAction : BaseEntity
{
// <summary>
/// Nazwa legendarnej akcji
/// </summary>
public string Name { get; set; }
/// <summary>
/// Opis akcji
/// </summary>
public string Description { get; set; }
public virtual ICollection<MonsterLegendaryAction> MonsterLegendaryActions { get; set; }
}
}

View File

@ -0,0 +1,162 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionCompanion.Database.Tables
{
public class Monster : BaseEntity
{
/// <summary>
/// Nazwa potwora
/// </summary>
public string Name { get; set; }
/// <summary>
/// Rozmiar potwora
/// </summary>
public string Size { get; set; }
/// <summary>
/// Rodzaj potwora
/// </summary>
public string Type { get; set; }
/// <summary>
/// Podtyp potwora
/// </summary>
public string Subtype { get; set; }
/// <summary>
/// Charakter potwora
/// </summary>
public string Alignment { get; set; }
/// <summary>
/// Poziom pancerza potwora
/// </summary>
public int ArmorClass { get; set; }
/// <summary>
/// Iloś punktów zycia potwora
/// </summary>
public int HitPoints { get; set; }
/// <summary>
/// Ilość kości określajacych punkty życia potwora
/// </summary>
public int HitDiceAmount { get; set; }
/// <summary>
/// Kość którą rzucamy aby określić punkty życia potwora
/// </summary>
public int HitDiceType { get; set; }
/// <summary>
/// Szybkość chodzenia potwora
/// </summary>
public string WalkSpeed { get; set; }
/// <summary>
/// Szybkość pływania potwora
/// </summary>
public string SwimSpeed { get; set; }
/// <summary>
/// Szybkość latania potwora
/// </summary>
public string FlySpeed { get; set; }
/// <summary>
/// Punkty zręczności potwora
/// </summary>
public int Dexterity { get; set; }
public int? DexteritySave { get; set; }
/// <summary>
/// Punkty siły potwora
/// </summary>
public int Strength { get; set; }
public int? StrengthSave { get; set; }
/// <summary>
/// Punkty kondycji potwora
/// </summary>
public int Constitution { get; set; }
public int? ConstitutionSave { get; set; }
/// <summary>
/// Punkty inteligencji potwora
/// </summary>
public int Intelligence { get; set; }
public int? IntelligenceSave { get; set; }
/// <summary>
/// Punkty mądrości potwora
/// </summary>
public int Wisdom { get; set; }
public int? WisdomSave { get; set; }
/// <summary>
/// Punkty charyzmy potwora
/// </summary>
public int Charisma { get; set; }
public int? CharismaSave { get; set; }
/// <summary>
/// Poziom trudności potwora
/// </summary>
public int ChallengeRating { get; set; }
/// <summary>
/// Punkty doświadczenia za zabicie potwora
/// </summary>
public int ExperiencePoints { get; set; }
/// <summary>
/// Połączenie z tabelą MonsterActions
/// </summary>
public virtual ICollection<MonsterAction> MonsterAction { get; set; }
/// <summary>
/// Na jakie stany odporny jest potwor
/// </summary>
public string MonsterConditionImmunities { get; set; }
/// <summary>
/// Na jakie obrazenia odporny jest potwor
/// </summary>
public string MonsterDamageImmunities { get; set; }
/// <summary>
/// Na jakie obrazenia potwor ma zmniejszoną słabosc
/// </summary>
public string MonsterDamageResistances { get; set; }
/// <summary>
/// Na co potwor jest wrazliwy
/// </summary>
public string MonsterDamageVulnerabilities { get; set; }
/// <summary>
/// Jezyki jakimi wlada potwor
/// </summary>
public string MonsterLanguages { get; set; }
/// <summary>
/// Połączenie z tabelą MonsterLegendaryActions
/// </summary>
public virtual ICollection<MonsterLegendaryAction> MonsterLegendaryAction { get; set; }
/// <summary>
/// Połączenie z tabelą MonsterSenses
/// </summary>
public string MonsterSenses { get; set; }
/// <summary>
/// Połączenie z tabelą MonsterSpecialAbilities
/// </summary>
public virtual ICollection<MonsterSpecialAbility> MonsterSpecialAbility { get; set; }
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionCompanion.Database.Tables
{
public class MonsterAction : BaseEntity
{
/// <summary>
/// Id potwora
/// </summary>
public int MonsterId { get; set; }
/// <summary>
/// Połączenie z tabelą Monsters
/// </summary>
public virtual Monster Monster { get; set; }
public int GameActionId { get; set; }
public virtual GameAction GameAction { get; set; }
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionCompanion.Database.Tables
{
public class MonsterLegendaryAction : BaseEntity
{
/// <summary>
/// Id potwora
/// </summary>
public int MonsterId { get; set; }
public int LegendaryActionId { get; set; }
/// <summary>
/// Połączenie z tabelą Monster
/// </summary>
public virtual Monster Monster { get; set; }
public virtual LegendaryAction LegendaryActions { get; set; }
}
}

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionCompanion.Database.Tables
{
public class MonsterSpecialAbility : BaseEntity
{
public int SpecialAbilityId { get; set; }
public int? DamageDice { get; set; }
public int? DamageDiceAmount { get; set; }
/// <summary>
/// Id potwora
/// </summary>
public int? MonsterId { get; set; }
public virtual SpecialAbility SpecialAbility { get; set; }
/// <summary>
/// Połączenie z tabelą Monster
/// </summary>
public virtual Monster Monster { get; set; }
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionCompanion.Database.Tables
{
public class SpecialAbility : BaseEntity
{
// <summary>
/// Nazwa umiejętności
/// </summary>
public string Name { get; set; }
/// <summary>
/// Opis umiejętności
/// </summary>
public string Description { get; set; }
public int? DamageDice { get; set; }
public int? DamageDiceAmount { get; set; }
public virtual ICollection<MonsterSpecialAbility> MonsterSpecialAbilities { get; set; }
}
}

View File

@ -12,5 +12,6 @@ namespace SessionCompanion.Services.Interfaces
public interface ICharacterArmorService : IServiceBase<CharacterArmorViewModel, CharacterArmor> public interface ICharacterArmorService : IServiceBase<CharacterArmorViewModel, CharacterArmor>
{ {
Task<List<CharacterArmorViewModelDetails>> GetCharacterArmorsTaskList(int characterId);
} }
} }

View File

@ -12,5 +12,6 @@ namespace SessionCompanion.Services.Interfaces
public interface ICharacterOtherEquipmentService : IServiceBase<CharacterOtherEquipmentViewModel, CharacterOtherEquipment> public interface ICharacterOtherEquipmentService : IServiceBase<CharacterOtherEquipmentViewModel, CharacterOtherEquipment>
{ {
Task<List<CharacterOtherEquipmentWithDetailsViewModel>> GetCharacterOtherEquipmentList(int characterId);
} }
} }

View File

@ -1,6 +1,8 @@
using SessionCompanion.Database.Tables; using SessionCompanion.Database.Tables;
using SessionCompanion.Services.Base; using SessionCompanion.Services.Base;
using SessionCompanion.ViewModels.CharacterViewModels; using SessionCompanion.ViewModels.CharacterViewModels;
using SessionCompanion.ViewModels.ClassViewModels;
using SessionCompanion.ViewModels.RaceViewModels;
using SessionCompanion.ViewModels.UniversalModels; using SessionCompanion.ViewModels.UniversalModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -15,5 +17,6 @@ namespace SessionCompanion.Services.Interfaces
Task<IEnumerable<CharacterForLoginViewModel>> GetUserLoginCharacters(int userId); Task<IEnumerable<CharacterForLoginViewModel>> GetUserLoginCharacters(int userId);
Task<List<UniversalStatisticViewModel>> GetCharacterStatistics(int characterId); Task<List<UniversalStatisticViewModel>> GetCharacterStatistics(int characterId);
Task<CharacterBasicInfoViewModel> GetBasicCharacterbasicInfo(int characterId); Task<CharacterBasicInfoViewModel> GetBasicCharacterbasicInfo(int characterId);
Task<IEnumerable<CharacterFromTemplatesSimpleViewModel>> GetCharactersFromTemplate(List<RaceViewModel> raceViewModels, List<ClassViewModel> classViewModels);
} }
} }

View File

@ -4,7 +4,11 @@ using SessionCompanion.ViewModels.CharacterWeaponViewModels;
namespace SessionCompanion.Services.Interfaces namespace SessionCompanion.Services.Interfaces
{ {
using System.Collections.Generic;
using System.Threading.Tasks;
public interface ICharacterWeaponService : IServiceBase<CharacterWeaponViewModel, CharacterWeapon> public interface ICharacterWeaponService : IServiceBase<CharacterWeaponViewModel, CharacterWeapon>
{ {
Task<List<CharacterWeaponWithWeaponDetailsViewModel>> GetCharacterWeaponsList(int characterId);
} }
} }

View File

@ -16,10 +16,24 @@ namespace SessionCompanion.Services.Services
using SessionCompanion.Services.Base; using SessionCompanion.Services.Base;
using SessionCompanion.Services.Interfaces; using SessionCompanion.Services.Interfaces;
using SessionCompanion.ViewModels.CharacterArmorViewModels; using SessionCompanion.ViewModels.CharacterArmorViewModels;
using SessionCompanion.ViewModels.CharacterOtherEquipmentViewModels;
public class CharacterArmorService : ServiceBase<CharacterArmorViewModel, CharacterArmor>, ICharacterArmorService public class CharacterArmorService : ServiceBase<CharacterArmorViewModel, CharacterArmor>, ICharacterArmorService
{ {
public CharacterArmorService(IMapper mapper, IRepository<CharacterArmor> repository) : base(mapper, repository) public CharacterArmorService(IMapper mapper, IRepository<CharacterArmor> repository) : base(mapper, repository)
{ } { }
/// <summary>
/// Metoda pobiera listę pancerzy konkretnej postaci
/// </summary>
/// <param name="characterId"> Id postaci </param>
/// <returns> Lista pancerzy posiadanych przez postać </returns>
public async Task<List<CharacterArmorViewModelDetails>> GetCharacterArmorsTaskList(int characterId)
{
var characterWeapons = await Repository.Get().Where(a => a.CharacterId.Equals(characterId)).Include(a => a.Armor).ToListAsync();
var result = Mapper.Map<List<CharacterArmorViewModelDetails>>(characterWeapons);
return result;
}
} }
} }

View File

@ -1,7 +1,11 @@
namespace SessionCompanion.Services.Services namespace SessionCompanion.Services.Services
{ {
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AutoMapper; using AutoMapper;
using Microsoft.EntityFrameworkCore;
using SessionCompanion.Database.Repositories.Base; using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables; using SessionCompanion.Database.Tables;
using SessionCompanion.Services.Base; using SessionCompanion.Services.Base;
@ -13,5 +17,17 @@
public CharacterOtherEquipmentService(IMapper mapper, IRepository<CharacterOtherEquipment> repository) : base(mapper, repository) public CharacterOtherEquipmentService(IMapper mapper, IRepository<CharacterOtherEquipment> repository) : base(mapper, repository)
{ } { }
/// <summary>
/// Metoda pobiera listę pozostałego ekwipunku konkretnej postaci
/// </summary>
/// <param name="characterId"> Id postaci </param>
/// <returns> Lista pozostałego ekwpinuku posiadanego przez postać </returns>
public async Task<List<CharacterOtherEquipmentWithDetailsViewModel>> GetCharacterOtherEquipmentList(int characterId)
{
var characterWeapons = await Repository.Get().Where(a => a.CharacterId.Equals(characterId)).Include(a => a.OtherEquipment).ToListAsync();
var result = Mapper.Map<List<CharacterOtherEquipmentWithDetailsViewModel>>(characterWeapons);
return result;
}
} }
} }

View File

@ -16,12 +16,14 @@ using System.IO;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using SessionCompanion.ViewModels.UniversalModels; using SessionCompanion.ViewModels.UniversalModels;
using SessionCompanion.Services.Helpers; using SessionCompanion.Services.Helpers;
using SessionCompanion.ViewModels.RaceViewModels;
using SessionCompanion.ViewModels.ClassViewModels;
namespace SessionCompanion.Services.Services namespace SessionCompanion.Services.Services
{ {
public class CharacterService : ServiceBase<CharacterViewModel, Character>, ICharacterService public class CharacterService : ServiceBase<CharacterViewModel, Character>, ICharacterService
{ {
public CharacterService(IMapper mapper, IRepository<Character> repository) : base(mapper, repository) public CharacterService(IMapper mapper, IRepository<Character> repository, IRepository<Class> classRepository) : base(mapper, repository)
{ } { }
/// <summary> /// <summary>
@ -111,5 +113,31 @@ namespace SessionCompanion.Services.Services
var result = Mapper.Map<CharacterBasicInfoViewModel>(character); var result = Mapper.Map<CharacterBasicInfoViewModel>(character);
return result; return result;
} }
/// <summary>
/// Function returns basic stats from Characters in templates
/// </summary>
/// <returns></returns>
public async Task<IEnumerable<CharacterFromTemplatesSimpleViewModel>> GetCharactersFromTemplate(List<RaceViewModel> raceViewModels, List<ClassViewModel> classViewModels)
{
const string file = "../SessionCompanion.Database/JsonData/characters_templates.json";
List<CharacterFromTemplatesSimpleViewModel> basicStats = new List<CharacterFromTemplatesSimpleViewModel>();
using (StreamReader reader = new StreamReader(file))
{
var json = await reader.ReadToEndAsync();
foreach (var item in JArray.Parse(json))
{
CharacterFromTemplatesSimpleViewModel characterFromTemplatesSimpleViewModel = new CharacterFromTemplatesSimpleViewModel()
{
Id = (int)item["id"],
Class = classViewModels.Where(c => c.Id.Equals((int)item["biography"]["ClassId"])).Select(c => c.Name).Single(),
Race = raceViewModels.Where(r => r.Id.Equals((int)item["biography"]["RaceId"])).Select(r => r.Name).Single(),
Name = (string)item["biography"]["Name"]
};
basicStats.Add(characterFromTemplatesSimpleViewModel);
}
}
return basicStats;
}
} }
} }

View File

@ -7,9 +7,28 @@ using SessionCompanion.ViewModels.CharacterWeaponViewModels;
namespace SessionCompanion.Services.Services namespace SessionCompanion.Services.Services
{ {
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
public class CharacterWeaponService : ServiceBase<CharacterWeaponViewModel, CharacterWeapon>, ICharacterWeaponService public class CharacterWeaponService : ServiceBase<CharacterWeaponViewModel, CharacterWeapon>, ICharacterWeaponService
{ {
public CharacterWeaponService(IMapper mapper, IRepository<CharacterWeapon> repository) : base(mapper, repository) public CharacterWeaponService(IMapper mapper, IRepository<CharacterWeapon> repository) : base(mapper, repository)
{ } { }
/// <summary>
/// Metoda pobiera listę broni konkretnej postaci
/// </summary>
/// <param name="characterId"> Id postaci </param>
/// <returns> Lista broni posiadanych przez postać </returns>
public async Task<List<CharacterWeaponWithWeaponDetailsViewModel>> GetCharacterWeaponsList(int characterId)
{
var characterWeapons = await Repository.Get().Where(w => w.CharacterId.Equals(characterId)).Include(w => w.Weapon).ToListAsync();
var result = Mapper.Map<List<CharacterWeaponWithWeaponDetailsViewModel>>(characterWeapons);
return result;
}
} }
} }

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionCompanion.ViewModels.CharacterViewModels
{
public class CharacterFromTemplatesSimpleViewModel
{
/// <summary>
/// Id postaci
/// </summary>
public int Id { get; set; }
/// <summary>
/// Imie postaci
/// </summary>
public string Name { get; set; }
/// <summary>
/// Nazwa rasy postaci
/// </summary>
public string Race { get; set; }
/// <summary>
/// Nazwa Klasy postaci
/// </summary>
public string Class { get; set; }
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.ViewModels.GameActionViewModels
{
public class GameActionViewModel
{
public int Id { get; set; }
public string Name { get; set; }
/// <summary>
/// Opis akcji
/// </summary>
public string Description { get; set; }
public int AttackBonus { get; set; }
public int? DamageDice { get; set; }
public int? DamageDiceAmount { get; set; }
public int? DamageBonus { get; set; }
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.ViewModels.LegendaryActionViewModels
{
public class LegendaryActionViewModel
{
public int Id { get; set; }
// <summary>
/// Nazwa legendarnej akcji
/// </summary>
public string Name { get; set; }
/// <summary>
/// Opis akcji
/// </summary>
public string Description { get; set; }
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.ViewModels.MonsterActionsViewModels
{
public class MonsterActionsViewModel
{
public int Id { get; set; }
/// <summary>
/// Id potwora
/// </summary>
public int MonsterId { get; set; }
public int GameActionId { get; set; }
}
}

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.ViewModels.MonsterLegendaryActionsViewModels
{
public class MonsterLegendaryActionsViewModel
{
public int Id { get; set; }
public int MonsterId { get; set; }
public int LegendaryActionId { get; set; }
}
}

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.ViewModels.MonsterSpecialAbilitiesViewModels
{
public class MonsterSpecialAbilitiesViewModel
{
public int Id { get; set; }
public int MonsterId { get; set; }
public int LegendaryActionId { get; set; }
}
}

View File

@ -0,0 +1,156 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.ViewModels.MonsterViewModels
{
using SessionCompanion.ViewModels.GameActionViewModels;
using SessionCompanion.ViewModels.LegendaryActionViewModels;
using SessionCompanion.ViewModels.SpecialAbilityViewModels;
public class MonsterAllInformationViewModel
{
public int Id { get; set; }
/// <summary>
/// Nazwa potwora
/// </summary>
public string Name { get; set; }
/// <summary>
/// Rozmiar potwora
/// </summary>
public string Size { get; set; }
/// <summary>
/// Rodzaj potwora
/// </summary>
public string Type { get; set; }
/// <summary>
/// Podtyp potwora
/// </summary>
public string Subtype { get; set; }
/// <summary>
/// Charakter potwora
/// </summary>
public string Alignment { get; set; }
/// <summary>
/// Poziom pancerza potwora
/// </summary>
public int ArmorClass { get; set; }
/// <summary>
/// Iloś punktów zycia potwora
/// </summary>
public int HitPoints { get; set; }
/// <summary>
/// Ilość kości określajacych punkty życia potwora
/// </summary>
public int HitDiceAmount { get; set; }
/// <summary>
/// Kość którą rzucamy aby określić punkty życia potwora
/// </summary>
public int HitDiceType { get; set; }
/// <summary>
/// Szybkość chodzenia potwora
/// </summary>
public string WalkSpeed { get; set; }
/// <summary>
/// Szybkość pływania potwora
/// </summary>
public string SwimSpeed { get; set; }
/// <summary>
/// Szybkość latania potwora
/// </summary>
public string FlySpeed { get; set; }
/// <summary>
/// Punkty zręczności potwora
/// </summary>
public int Dexterity { get; set; }
public int? DexteritySave { get; set; }
/// <summary>
/// Punkty siły potwora
/// </summary>
public int Strength { get; set; }
public int? StrengthSave { get; set; }
/// <summary>
/// Punkty kondycji potwora
/// </summary>
public int Constitution { get; set; }
public int? ConstitutionSave { get; set; }
/// <summary>
/// Punkty inteligencji potwora
/// </summary>
public int Intelligence { get; set; }
public int? IntelligenceSave { get; set; }
/// <summary>
/// Punkty mądrości potwora
/// </summary>
public int Wisdom { get; set; }
public int? WisdomSave { get; set; }
/// <summary>
/// Punkty charyzmy potwora
/// </summary>
public int Charisma { get; set; }
public int? CharismaSave { get; set; }
/// <summary>
/// Poziom trudności potwora
/// </summary>
public int ChallengeRating { get; set; }
/// <summary>
/// Punkty doświadczenia za zabicie potwora
/// </summary>
public int ExperiencePoints { get; set; }
/// <summary>
/// Na jakie stany odporny jest potwor
/// </summary>
public string MonsterConditionImmunities { get; set; }
/// <summary>
/// Na jakie obrazenia odporny jest potwor
/// </summary>
public string MonsterDamageImmunities { get; set; }
/// <summary>
/// Na jakie obrazenia potwor ma zmniejszoną słabosc
/// </summary>
public string MonsterDamageResistances { get; set; }
/// <summary>
/// Na co potwor jest wrazliwy
/// </summary>
public string MonsterDamageVulnerabilities { get; set; }
/// <summary>
/// Jezyki jakimi wlada potwor
/// </summary>
public string MonsterLanguages { get; set; }
/// <summary>
/// Połączenie z tabelą MonsterSenses
/// </summary>
public string MonsterSenses { get; set; }
public ICollection<GameActionViewModel> MonsterGameActions { get; set; }
public ICollection<LegendaryActionViewModel> MonsteLegendaryActions { get; set; }
public ICollection<SpecialAbilityViewModel> MonsterSpecialAbilities { get; set; }
}
}

View File

@ -0,0 +1,146 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.ViewModels.MonsterViewModels
{
public class MonsterViewModel
{
public int Id { get; set; }
/// <summary>
/// Nazwa potwora
/// </summary>
public string Name { get; set; }
/// <summary>
/// Rozmiar potwora
/// </summary>
public string Size { get; set; }
/// <summary>
/// Rodzaj potwora
/// </summary>
public string Type { get; set; }
/// <summary>
/// Podtyp potwora
/// </summary>
public string Subtype { get; set; }
/// <summary>
/// Charakter potwora
/// </summary>
public string Alignment { get; set; }
/// <summary>
/// Poziom pancerza potwora
/// </summary>
public int ArmorClass { get; set; }
/// <summary>
/// Iloś punktów zycia potwora
/// </summary>
public int HitPoints { get; set; }
/// <summary>
/// Ilość kości określajacych punkty życia potwora
/// </summary>
public int HitDiceAmount { get; set; }
/// <summary>
/// Kość którą rzucamy aby określić punkty życia potwora
/// </summary>
public int HitDiceType { get; set; }
/// <summary>
/// Szybkość chodzenia potwora
/// </summary>
public string WalkSpeed { get; set; }
/// <summary>
/// Szybkość pływania potwora
/// </summary>
public string SwimSpeed { get; set; }
/// <summary>
/// Szybkość latania potwora
/// </summary>
public string FlySpeed { get; set; }
/// <summary>
/// Punkty zręczności potwora
/// </summary>
public int Dexterity { get; set; }
public int? DexteritySave { get; set; }
/// <summary>
/// Punkty siły potwora
/// </summary>
public int Strength { get; set; }
public int? StrengthSave { get; set; }
/// <summary>
/// Punkty kondycji potwora
/// </summary>
public int Constitution { get; set; }
public int? ConstitutionSave { get; set; }
/// <summary>
/// Punkty inteligencji potwora
/// </summary>
public int Intelligence { get; set; }
public int? IntelligenceSave { get; set; }
/// <summary>
/// Punkty mądrości potwora
/// </summary>
public int Wisdom { get; set; }
public int? WisdomSave { get; set; }
/// <summary>
/// Punkty charyzmy potwora
/// </summary>
public int Charisma { get; set; }
public int? CharismaSave { get; set; }
/// <summary>
/// Poziom trudności potwora
/// </summary>
public int ChallengeRating { get; set; }
/// <summary>
/// Punkty doświadczenia za zabicie potwora
/// </summary>
public int ExperiencePoints { get; set; }
/// <summary>
/// Na jakie stany odporny jest potwor
/// </summary>
public string MonsterConditionImmunities { get; set; }
/// <summary>
/// Na jakie obrazenia odporny jest potwor
/// </summary>
public string MonsterDamageImmunities { get; set; }
/// <summary>
/// Na jakie obrazenia potwor ma zmniejszoną słabosc
/// </summary>
public string MonsterDamageResistances { get; set; }
/// <summary>
/// Na co potwor jest wrazliwy
/// </summary>
public string MonsterDamageVulnerabilities { get; set; }
/// <summary>
/// Jezyki jakimi wlada potwor
/// </summary>
public string MonsterLanguages { get; set; }
/// <summary>
/// Połączenie z tabelą MonsterSenses
/// </summary>
public string MonsterSenses { get; set; }
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SessionCompanion.ViewModels.SpecialAbilityViewModels
{
public class SpecialAbilityViewModel
{
public int Id { get; set; }
// <summary>
/// Nazwa umiejętności
/// </summary>
public string Name { get; set; }
/// <summary>
/// Opis umiejętności
/// </summary>
public string Description { get; set; }
public int? DamageDice { get; set; }
public int? DamageDiceAmount { get; set; }
}
}

View File

@ -26,6 +26,7 @@ import {
MatTableModule, MatTableModule,
MatSortModule, MatSortModule,
MatDialogModule, MatDialogModule,
MatTooltipModule,
} from '@angular/material'; } from '@angular/material';
import { UserService } from '../services/user.service'; import { UserService } from '../services/user.service';
import { StoreModule } from '@ngrx/store'; import { StoreModule } from '@ngrx/store';
@ -39,6 +40,10 @@ import { GameMasterArmorsTableComponent } from './components/game-master-armors-
import { GameMasterCharacterActionsDialogComponent } from './components/game-master-character-actions-dialog/game-master-character-actions-dialog.component'; import { GameMasterCharacterActionsDialogComponent } from './components/game-master-character-actions-dialog/game-master-character-actions-dialog.component';
import { GameMasterWeaponsTableComponent } from './components/game-master-weapons-table/game-master-weapons-table.component'; import { GameMasterWeaponsTableComponent } from './components/game-master-weapons-table/game-master-weapons-table.component';
import { AbilitiesComponent } from './components/abilities/abilities.component'; import { AbilitiesComponent } from './components/abilities/abilities.component';
import { SpellService } from '../services/spell.service';
import { WeaponService } from '../services/weapon.service';
import { ArmorService } from '../services/armor.service';
import { OtherEquipmentService } from '../services/other-equipment.service';
@NgModule({ @NgModule({
declarations: [ declarations: [
@ -81,8 +86,16 @@ import { AbilitiesComponent } from './components/abilities/abilities.component';
}), }),
MatTableModule, MatTableModule,
MatSortModule, MatSortModule,
MatTooltipModule,
],
providers: [
UserService,
CharacterService,
SpellService,
WeaponService,
ArmorService,
OtherEquipmentService,
], ],
providers: [UserService, CharacterService],
bootstrap: [AppComponent], bootstrap: [AppComponent],
entryComponents: [ entryComponents: [
GameMasterSpellsTableComponent, GameMasterSpellsTableComponent,

View File

@ -1,38 +1,48 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import {CharacterStatsViewModel} from "../../../types/viewmodels/character-viewmodels/CharacterStatsViewModel"; import { CharacterStatsViewModel } from '../../../types/viewmodels/character-viewmodels/CharacterStatsViewModel';
import {Store} from "@ngrx/store"; import { Store } from '@ngrx/store';
import {AppState} from "../../store/models/app-state.model"; import { AppState } from '../../store/models/app-state.model';
import {CharacterService} from "../../../services/character.service"; import { CharacterService } from '../../../services/character.service';
import {first} from "rxjs/operators"; import { first } from 'rxjs/operators';
import {ErrorResponse} from "../../../types/ErrorResponse"; import { ErrorResponse } from '../../../types/ErrorResponse';
import {HttpErrorResponse} from "@angular/common/http"; import { HttpErrorResponse } from '@angular/common/http';
@Component({ @Component({
selector: 'app-abilities', selector: 'app-abilities',
templateUrl: './abilities.component.html', templateUrl: './abilities.component.html',
styleUrls: ['./abilities.component.css'] styleUrls: ['./abilities.component.css'],
}) })
export class AbilitiesComponent implements OnInit { export class AbilitiesComponent implements OnInit {
characterStats: CharacterStatsViewModel[]; characterStats: CharacterStatsViewModel[];
constructor(private store: Store<AppState>, private characterService: CharacterService) {} constructor(
private store: Store<AppState>,
private characterService: CharacterService
) {}
ngOnInit() { ngOnInit() {
this.getCharacterStats(); this.getCharacterStats();
} }
getCharacterStats() { getCharacterStats() {
this.store.select( s => s.playerStore.characterId).pipe(first()).subscribe((characterId) => { this.store
this.characterService.getCharacterStats(characterId).pipe(first()).subscribe((characterStats) => { .select((s) => s.playerStore.characterId)
console.log(characterStats) .pipe(first())
.subscribe((characterId) => {
this.characterService
.getCharacterStats(characterId)
.pipe(first())
.subscribe(
(characterStats) => {
this.characterStats = characterStats; this.characterStats = characterStats;
}, (error: ErrorResponse | HttpErrorResponse) => { },
(error: ErrorResponse | HttpErrorResponse) => {
if (error instanceof HttpErrorResponse) { if (error instanceof HttpErrorResponse) {
error = error.error as ErrorResponse; error = error.error as ErrorResponse;
} }
console.error(error.message); console.error(error.message);
}
);
}); });
})
} }
} }

View File

@ -1,6 +1,5 @@
import { Component, Input, OnInit } from '@angular/core'; import { Component, Input, OnInit } from '@angular/core';
import { AbilityViewModel } from '../../../types/viewmodels/ability-viewmodels/AbilityViewModel'; import {CharacterStatsViewModel} from '../../../types/viewmodels/character-viewmodels/CharacterStatsViewModel';
import {CharacterStatsViewModel} from "../../../types/viewmodels/character-viewmodels/CharacterStatsViewModel";
@Component({ @Component({
selector: 'app-ability-card', selector: 'app-ability-card',
@ -15,7 +14,9 @@ export class AbilityCardComponent implements OnInit {
constructor() {} constructor() {}
ngOnInit() { ngOnInit() {
if (this.ability.skills != null) {
this.ability.skills.sort((a, b) => (a.name > b.name ? 1 : -1)); this.ability.skills.sort((a, b) => (a.name > b.name ? 1 : -1));
}
this.changeColors(); this.changeColors();
} }
@ -28,7 +29,7 @@ export class AbilityCardComponent implements OnInit {
this.headStyle.bgColor = '#4BBE9C'; this.headStyle.bgColor = '#4BBE9C';
break; break;
case 'Constitution': case 'Constitution':
this.headStyle.bgColor = 'red'; this.headStyle.bgColor = '#e9cca7';
break; break;
case 'Intelligence': case 'Intelligence':
this.headStyle.bgColor = '#5AA9E6'; this.headStyle.bgColor = '#5AA9E6';

View File

@ -3,6 +3,10 @@ import { MatTableDataSource } from '@angular/material/table';
import { ArmorViewModel } from '../../../types/viewmodels/armor-viewmodels/ArmorViewModel'; import { ArmorViewModel } from '../../../types/viewmodels/armor-viewmodels/ArmorViewModel';
import { MatPaginator } from '@angular/material/paginator'; import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort'; import { MatSort } from '@angular/material/sort';
import { first } from 'rxjs/operators';
import { ErrorResponse } from '../../../types/ErrorResponse';
import { HttpErrorResponse } from '@angular/common/http';
import { ArmorService } from '../../../services/armor.service';
@Component({ @Component({
selector: 'app-game-master-armors-table', selector: 'app-game-master-armors-table',
@ -22,29 +26,26 @@ export class GameMasterArmorsTableComponent implements OnInit {
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
@ViewChild(MatSort, { static: true }) sort: MatSort; @ViewChild(MatSort, { static: true }) sort: MatSort;
constructor() { constructor(private armorService: ArmorService) {
const armors = [ armorService
{ .GetAllArmors()
id: 1, .pipe(first())
name: 'Test', .subscribe(
category: 'Testowa', (result) => {
minimumStrength: 12, this.dataSource = new MatTableDataSource(result);
weight: 98,
cost: 123,
armorClassBase: 10,
haveDexterityBonus: false,
haveStealthDisadvantage: false,
currencyType: 1,
},
];
this.dataSource = new MatTableDataSource(armors);
}
ngOnInit() {
this.dataSource.paginator = this.paginator; this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort; this.dataSource.sort = this.sort;
},
(error: ErrorResponse | HttpErrorResponse) => {
if (error instanceof HttpErrorResponse) {
error = error.error as ErrorResponse;
} }
console.log(error.message);
}
);
}
ngOnInit() {}
applyFilter(event: Event) { applyFilter(event: Event) {
const filterValue = (event.target as HTMLInputElement).value; const filterValue = (event.target as HTMLInputElement).value;

View File

@ -41,6 +41,11 @@
</div> </div>
</div> </div>
</div> </div>
<mat-list-item (click)="onLogoutClick()">
<mat-icon matListIcon>exit_to_app</mat-icon>
<span [@animateText]="leftSidenavTextExpanded ? 'show' : 'hide'" class="mat-list-text" style="color: white">Log out</span>
</mat-list-item>
<mat-divider></mat-divider>
</mat-nav-list> </mat-nav-list>
</mat-sidenav> </mat-sidenav>
<mat-sidenav-content> <mat-sidenav-content>

View File

@ -16,6 +16,10 @@ import { GameMasterArmorsTableComponent } from '../game-master-armors-table/game
import { MatDialog } from '@angular/material'; import { MatDialog } from '@angular/material';
import { GameMasterCharacterActionsDialogComponent } from '../game-master-character-actions-dialog/game-master-character-actions-dialog.component'; import { GameMasterCharacterActionsDialogComponent } from '../game-master-character-actions-dialog/game-master-character-actions-dialog.component';
import { GameMasterWeaponsTableComponent } from '../game-master-weapons-table/game-master-weapons-table.component'; import { GameMasterWeaponsTableComponent } from '../game-master-weapons-table/game-master-weapons-table.component';
import { ClearStore } from '../../store/actions/app.actions';
import { Store } from '@ngrx/store';
import { AppState } from '../../store/models/app-state.model';
import { Router } from '@angular/router';
@Component({ @Component({
selector: 'app-game-master-dashboard', selector: 'app-game-master-dashboard',
@ -61,6 +65,8 @@ export class GameMasterDashboardComponent implements OnInit, OnDestroy {
loggedCharacters: LoggedCharactersViewModel[]; loggedCharacters: LoggedCharactersViewModel[];
constructor( constructor(
private store: Store<AppState>,
private router: Router,
private signalRService: GMSignalRService, private signalRService: GMSignalRService,
private characterService: CharacterService, private characterService: CharacterService,
public dialog: MatDialog public dialog: MatDialog
@ -129,6 +135,11 @@ export class GameMasterDashboardComponent implements OnInit, OnDestroy {
} }
} }
onLogoutClick() {
this.store.dispatch(new ClearStore());
this.router.navigate(['/']);
}
private SubscribeToEvents(): void { private SubscribeToEvents(): void {
this.signalRService.message.subscribe((message: string) => { this.signalRService.message.subscribe((message: string) => {
if ( if (

View File

@ -13,7 +13,7 @@
<ng-container matColumnDef="Range"> <ng-container matColumnDef="Range">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Range </th> <th mat-header-cell *matHeaderCellDef mat-sort-header> Range </th>
<td mat-cell *matCellDef="let row"> {{row.range}}% </td> <td mat-cell *matCellDef="let row"> {{row.range}} </td>
</ng-container> </ng-container>
<ng-container matColumnDef="Level"> <ng-container matColumnDef="Level">

View File

@ -2,13 +2,11 @@ import { Component, OnInit, ViewChild } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator'; import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort'; import { MatSort } from '@angular/material/sort';
import { MatTableDataSource } from '@angular/material/table'; import { MatTableDataSource } from '@angular/material/table';
import { SpellViewModel } from '../../../types/viewmodels/spell-viewmodels/SpellViewModel';
export interface SpellData { import { SpellService } from '../../../services/spell.service';
name: string; import { first } from 'rxjs/operators';
range: string; import { ErrorResponse } from '../../../types/ErrorResponse';
level: number; import { HttpErrorResponse } from '@angular/common/http';
school: string;
}
@Component({ @Component({
selector: 'app-game-master-spells-table', selector: 'app-game-master-spells-table',
@ -17,25 +15,31 @@ export interface SpellData {
}) })
export class GameMasterSpellsTableComponent implements OnInit { export class GameMasterSpellsTableComponent implements OnInit {
displayedColumns: string[] = ['Name', 'Range', 'Level', 'School']; displayedColumns: string[] = ['Name', 'Range', 'Level', 'School'];
dataSource: MatTableDataSource<SpellData>; dataSource: MatTableDataSource<SpellViewModel>;
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
@ViewChild(MatSort, { static: true }) sort: MatSort; @ViewChild(MatSort, { static: true }) sort: MatSort;
constructor() { constructor(private spellService: SpellService) {
const users = Array.from({ length: 100 }, (_, k) => this.createSepll()); spellService
.GetAllSpells()
this.dataSource = new MatTableDataSource(users); .pipe(first())
} .subscribe(
(result) => {
createSepll(): SpellData { this.dataSource = new MatTableDataSource(result);
return { name: 'test', range: 'asd', level: 2, school: 'UAM!!!!' };
}
ngOnInit() {
this.dataSource.paginator = this.paginator; this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort; this.dataSource.sort = this.sort;
},
(error: ErrorResponse | HttpErrorResponse) => {
if (error instanceof HttpErrorResponse) {
error = error.error as ErrorResponse;
} }
console.log(error.message);
}
);
}
ngOnInit() {}
applyFilter(event: Event) { applyFilter(event: Event) {
const filterValue = (event.target as HTMLInputElement).value; const filterValue = (event.target as HTMLInputElement).value;

View File

@ -1,11 +1,11 @@
.description-weapon-column { .text-cut {
max-width: 60px; /* feel free to include any other value */
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
table { table {
width: 100%;
background-color: initial; background-color: initial;
} }
@ -34,5 +34,4 @@ mat-paginator {
td, td,
th { th {
color: whitesmoke; color: whitesmoke;
width: 25%;
} }

View File

@ -4,7 +4,7 @@
</mat-form-field> </mat-form-field>
<div class="mat-elevation-z8"> <div class="mat-elevation-z8">
<table mat-table [dataSource]="dataSource" matSort> <table mat-table [dataSource]="dataSource" matSort class="w-100">
<ng-container matColumnDef="Name"> <ng-container matColumnDef="Name">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th> <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
@ -28,7 +28,9 @@
<ng-container matColumnDef="Description"> <ng-container matColumnDef="Description">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Description </th> <th mat-header-cell *matHeaderCellDef mat-sort-header> Description </th>
<td mat-cell *matCellDef="let row" class="description-weapon-column"> {{row.description}} </td> <td mat-cell *matCellDef="let row" class="text-cut" [matTooltip]="row.description">
{{row.description}}
</td>
</ng-container> </ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>

View File

@ -3,6 +3,10 @@ import { MatTableDataSource } from '@angular/material/table';
import { MatPaginator } from '@angular/material/paginator'; import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort'; import { MatSort } from '@angular/material/sort';
import { WeaponViewModel } from '../../../types/viewmodels/weapon-viewmodels/WeaponViewModel'; import { WeaponViewModel } from '../../../types/viewmodels/weapon-viewmodels/WeaponViewModel';
import { WeaponService } from '../../../services/weapon.service';
import { first } from 'rxjs/operators';
import { ErrorResponse } from '../../../types/ErrorResponse';
import { HttpErrorResponse } from '@angular/common/http';
@Component({ @Component({
selector: 'app-game-master-weapons-table', selector: 'app-game-master-weapons-table',
@ -22,30 +26,26 @@ export class GameMasterWeaponsTableComponent implements OnInit {
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
@ViewChild(MatSort, { static: true }) sort: MatSort; @ViewChild(MatSort, { static: true }) sort: MatSort;
constructor() { constructor(private weaponService: WeaponService) {
const weapons = [ weaponService
{ .GetAllWeapons()
id: 1, .pipe(first())
name: 'Test', .subscribe(
cost: 123, (result) => {
weight: 98, this.dataSource = new MatTableDataSource(result);
diceCount: 2,
diceValue: 20,
twoHandDamageType: 'Toxic',
description:
'A japanase battleaxe with a spike on the opposite side of the blade.',
weaponType: 'Two-Handed Melee Weapons',
rangeMeele: 50,
},
];
this.dataSource = new MatTableDataSource(weapons);
}
ngOnInit() {
this.dataSource.paginator = this.paginator; this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort; this.dataSource.sort = this.sort;
},
(error: ErrorResponse | HttpErrorResponse) => {
if (error instanceof HttpErrorResponse) {
error = error.error as ErrorResponse;
} }
console.log(error.message);
}
);
}
ngOnInit() {}
applyFilter(event: Event) { applyFilter(event: Event) {
const filterValue = (event.target as HTMLInputElement).value; const filterValue = (event.target as HTMLInputElement).value;

View File

@ -40,7 +40,7 @@
<a matLine>Shop</a> <a matLine>Shop</a>
</mat-list-item> </mat-list-item>
<mat-list-item [routerLink]="['/']" [routerLinkActive]="['active']"> <mat-list-item (click)="onLogoutClick()">
<mat-icon [class.active]="selected" matListIcon>exit_to_app</mat-icon> <mat-icon [class.active]="selected" matListIcon>exit_to_app</mat-icon>
<a matLine>Log out</a> <a matLine>Log out</a>
</mat-list-item> </mat-list-item>

View File

@ -1,9 +1,12 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { PlayerSignalRService } from "../../shared/signalR-service/player-signalR.service"; import { PlayerSignalRService } from '../../shared/signalR-service/player-signalR.service';
import { first } from "rxjs/operators"; import { first } from 'rxjs/operators';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { AppState } from 'src/app/store/models/app-state.model'; import { AppState } from 'src/app/store/models/app-state.model';
import { AbilitiesComponent } from '../abilities/abilities.component'; import { AbilitiesComponent } from '../abilities/abilities.component';
import {ClearStore, ClearUserId} from '../../store/actions/app.actions';
import { Router } from '@angular/router';
import {ClearCharacterId} from "../../store/actions/player.action";
@Component({ @Component({
selector: 'app-player-dashboard', selector: 'app-player-dashboard',
@ -15,13 +18,13 @@ export class PlayerDashboardComponent implements OnInit {
isExpanded = false; isExpanded = false;
selected = false; selected = false;
constructor(private signalRService: PlayerSignalRService, private store: Store<AppState>) {} constructor(private signalRService: PlayerSignalRService, private store: Store<AppState>, private router: Router) {}
ngOnInit() { ngOnInit() {
this.store.select(s => s.playerStore.characterId).pipe(first()).subscribe((id) => { this.store.select(s => s.playerStore.characterId).pipe(first()).subscribe((id) => {
this.signalRService.Login(id); this.signalRService.Login(id);
});
this.SwitchMiddleComponent('AbilitiesComponent'); this.SwitchMiddleComponent('AbilitiesComponent');
});
} }
toggle() { toggle() {
@ -34,4 +37,10 @@ export class PlayerDashboardComponent implements OnInit {
this.middleComponent = AbilitiesComponent; this.middleComponent = AbilitiesComponent;
} }
} }
onLogoutClick() {
this.store.dispatch(new ClearCharacterId());
this.store.dispatch(new ClearStore());
this.router.navigate(['/']);
}
} }

View File

@ -3,7 +3,8 @@ import {Action} from '@ngrx/store';
export enum AppActionTypes { export enum AppActionTypes {
ADD_USER_ID = '[APP] Add user id', ADD_USER_ID = '[APP] Add user id',
ADD_ROLE = '[APP] Add role', ADD_ROLE = '[APP] Add role',
CLEAR_USER_ID = '[APP] Clear user id' CLEAR_USER_ID = '[APP] Clear user id',
CLEAR_STORE = '[APP] Clear user id and user role'
} }
export class AddUserId implements Action { export class AddUserId implements Action {
@ -27,6 +28,12 @@ export class ClearUserId implements Action {
} }
} }
export class ClearStore implements Action {
readonly type = AppActionTypes.CLEAR_STORE;
constructor() {
}
}
export type AppAction = AddUserId | AddRole | ClearUserId; export type AppAction = AddUserId | AddRole | ClearUserId | ClearStore;

View File

@ -1,7 +1,8 @@
import {Action} from "@ngrx/store"; import {Action} from '@ngrx/store';
export enum PlayerActionTypes { export enum PlayerActionTypes {
ADD_CHARACTER_ID= '[PLAYER] Add character id' ADD_CHARACTER_ID= '[PLAYER] Add character id',
CLEAR_CHARACTER_ID = '[PLAYER] Clear character id'
} }
export class AddCharacterId implements Action { export class AddCharacterId implements Action {
@ -12,4 +13,12 @@ export class AddCharacterId implements Action {
} }
} }
export type PlayerAction = AddCharacterId; export class ClearCharacterId implements Action {
readonly type = PlayerActionTypes.CLEAR_CHARACTER_ID;
constructor() {
}
}
export type PlayerAction = AddCharacterId | ClearCharacterId;

View File

@ -14,6 +14,8 @@ export function AppReducer(state: AppStoreModel = initialState, action: AppActio
return {...state, role: action.payload.role}; return {...state, role: action.payload.role};
case AppActionTypes.CLEAR_USER_ID: case AppActionTypes.CLEAR_USER_ID:
return {...state, userId: null}; return {...state, userId: null};
case AppActionTypes.CLEAR_STORE:
return {userId: null, role: null};
default: default:
return state; return state;
} }

View File

@ -9,6 +9,8 @@ export function PlayerReducer(state: PlayerStoreModel = initialState, action: Pl
switch (action.type) { switch (action.type) {
case PlayerActionTypes.ADD_CHARACTER_ID: case PlayerActionTypes.ADD_CHARACTER_ID:
return {...state, characterId: action.payload.characterId}; return {...state, characterId: action.payload.characterId};
case PlayerActionTypes.CLEAR_CHARACTER_ID:
return { characterId: null};
default: default:
return state; return state;
} }

View File

@ -0,0 +1,34 @@
import { Inject, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of, throwError } from 'rxjs';
import { WeaponViewModel } from '../types/viewmodels/weapon-viewmodels/WeaponViewModel';
import { Either } from '../types/Either';
import { ErrorResponse } from '../types/ErrorResponse';
import { switchMap } from 'rxjs/operators';
import { ArmorViewModel } from '../types/viewmodels/armor-viewmodels/ArmorViewModel';
Injectable({
providedIn: 'root',
});
export class ArmorService {
private baseUrl = 'api/armor/';
constructor(private http: HttpClient, @Inject('BASE_URL') baseUrl: string) {
this.baseUrl = baseUrl + this.baseUrl;
}
GetAllArmors(): Observable<ArmorViewModel[]> {
return this.http
.get<Either<ArmorViewModel[], ErrorResponse>>(
this.baseUrl + 'getAllArmor'
)
.pipe(
switchMap((response) => {
if (response.isLeft) {
return of(response.left);
} else {
return throwError(response.right);
}
})
);
}
}

View File

@ -0,0 +1,12 @@
import { Inject, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
Injectable({
providedIn: 'root',
});
export class OtherEquipmentService {
private baseUrl = 'api/otherEquipment/';
constructor(private http: HttpClient, @Inject('BASE_URL') baseUrl: string) {
this.baseUrl = baseUrl + this.baseUrl;
}
}

View File

@ -0,0 +1,33 @@
import { Inject, Injectable } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable, of, throwError } from 'rxjs';
import { SpellViewModel } from '../types/viewmodels/spell-viewmodels/SpellViewModel';
import { Either } from '../types/Either';
import { ErrorResponse } from '../types/ErrorResponse';
import { switchMap } from 'rxjs/operators';
Injectable({
providedIn: 'root',
});
export class SpellService {
private baseUrl = 'api/spell/';
constructor(private http: HttpClient, @Inject('BASE_URL') baseUrl: string) {
this.baseUrl = baseUrl + this.baseUrl;
}
GetAllSpells(): Observable<SpellViewModel[]> {
return this.http
.get<Either<SpellViewModel[], ErrorResponse>>(
this.baseUrl + 'getAllSpells'
)
.pipe(
switchMap((response) => {
if (response.isLeft) {
return of(response.left);
} else {
return throwError(response.right);
}
})
);
}
}

View File

@ -0,0 +1,34 @@
import { Inject, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of, throwError } from 'rxjs';
import { SpellViewModel } from '../types/viewmodels/spell-viewmodels/SpellViewModel';
import { Either } from '../types/Either';
import { ErrorResponse } from '../types/ErrorResponse';
import { switchMap } from 'rxjs/operators';
import { WeaponViewModel } from '../types/viewmodels/weapon-viewmodels/WeaponViewModel';
Injectable({
providedIn: 'root',
});
export class WeaponService {
private baseUrl = 'api/weapon/';
constructor(private http: HttpClient, @Inject('BASE_URL') baseUrl: string) {
this.baseUrl = baseUrl + this.baseUrl;
}
GetAllWeapons(): Observable<WeaponViewModel[]> {
return this.http
.get<Either<WeaponViewModel[], ErrorResponse>>(
this.baseUrl + 'getAllWeapons'
)
.pipe(
switchMap((response) => {
if (response.isLeft) {
return of(response.left);
} else {
return throwError(response.right);
}
})
);
}
}

View File

@ -0,0 +1,17 @@
export interface SpellViewModel {
id: number;
name: string;
descriptions: string[];
higherLevel: string[];
range: string;
components: string;
material: string;
ritual: boolean;
duration: string;
concentration: boolean;
castingTime: string;
level: number;
school: string;
classes: string;
subclasses: string;
}

View File

@ -36,6 +36,13 @@ namespace SessionCompanion.Configurations
services.AddScoped<IRepository<CharacterOtherEquipment>, CharacterOtherEquipmentRepository>(); services.AddScoped<IRepository<CharacterOtherEquipment>, CharacterOtherEquipmentRepository>();
services.AddScoped<IRepository<Weapon>, WeaponRepository>(); services.AddScoped<IRepository<Weapon>, WeaponRepository>();
services.AddScoped<IRepository<CharacterWeapon>, CharacterWeaponRepository>(); services.AddScoped<IRepository<CharacterWeapon>, CharacterWeaponRepository>();
services.AddScoped<IRepository<GameAction>, GameActionRepository>();
services.AddScoped<IRepository<LegendaryAction>, LegendaryActionRepository>();
services.AddScoped<IRepository<MonsterAction>, MonsterActionsRepository>();
services.AddScoped<IRepository<MonsterLegendaryAction>, MonsterLegendaryActionsRepository>();
services.AddScoped<IRepository<Monster>, MonsterRepository>();
services.AddScoped<IRepository<MonsterSpecialAbility>, MonsterSpecialAbilitiesRepository>();
services.AddScoped<IRepository<SpecialAbility>, SpecialAbilityRepository>();
return services; return services;
} }
} }

View File

@ -9,6 +9,7 @@ namespace SessionCompanion.Controllers
{ {
using SessionCompanion.Hubs; using SessionCompanion.Hubs;
using SessionCompanion.ViewModels.UniversalModels; using SessionCompanion.ViewModels.UniversalModels;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
@ -19,11 +20,15 @@ namespace SessionCompanion.Controllers
{ {
private readonly ICharacterService _service; private readonly ICharacterService _service;
private readonly SessionHubData _sessionHubData; private readonly SessionHubData _sessionHubData;
private readonly IRaceService _raceService;
private readonly IClassService _classService;
public CharacterController(ICharacterService service) public CharacterController(ICharacterService service, IRaceService raceService, IClassService classService)
{ {
this._service = service; this._service = service;
this._sessionHubData = new SessionHubData(); this._sessionHubData = new SessionHubData();
this._raceService = raceService;
this._classService = classService;
} }
/// <summary> /// <summary>
@ -105,5 +110,29 @@ namespace SessionCompanion.Controllers
}; };
return info; return info;
} }
/// <summary>
/// Metoda zwraca podstawowe informacje dla postaci z Templatek
/// </summary>
/// <returns>liste podstawowych informacji o postaciach z templatki</returns>
[HttpGet("getTemplateCharacters")]
public async Task<Either<ErrorResponse, List<CharacterFromTemplatesSimpleViewModel>>> GetTemplateCharacters()
{
var races = _raceService.Get().ToList();
var classes = _classService.Get().ToList();
try
{
var templateCharacters = await _service.GetCharactersFromTemplate(races, classes);
return templateCharacters.ToList();
}
catch (Exception e)
{
return new ErrorResponse()
{
StatusCode = 500,
Message = e.Message
};
}
}
} }
} }

View File

@ -0,0 +1,69 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SessionCompanion.Controllers
{
using SessionCompanion.Extensions.EitherType;
using SessionCompanion.Services.Interfaces;
using SessionCompanion.ViewModels.ApiResponses;
using SessionCompanion.ViewModels.CharacterArmorViewModels;
using SessionCompanion.ViewModels.CharacterOtherEquipmentViewModels;
using SessionCompanion.ViewModels.CharacterWeaponViewModels;
[Route("api/character/equipment")]
[ApiController]
public class EquipmentController : Controller
{
private readonly ICharacterArmorService _characterArmorServic;
private readonly ICharacterOtherEquipmentService _characterOtherEquipmentService;
private readonly ICharacterWeaponService _characterWeaponService;
public EquipmentController(ICharacterArmorService characterArmorService,
ICharacterOtherEquipmentService characterOtherEquipmentService,
ICharacterWeaponService characterWeaponService)
{
this._characterArmorServic = characterArmorService;
this._characterOtherEquipmentService = characterOtherEquipmentService;
this._characterWeaponService = characterWeaponService;
}
/// <summary>
/// Zwraca listę pozostałego ekwipunku dla danej postaci
/// </summary>
/// <param name="characterId"> Id postaci </param>
/// <returns> Lista pozostałego ekwipunku lub błąd </returns>
[HttpGet("getOtherEquipment")]
public async Task<Either<List<CharacterOtherEquipmentWithDetailsViewModel>, ErrorResponse>> GetCharacterOtherEquipment(int characterId)
{
return await this._characterOtherEquipmentService.GetCharacterOtherEquipmentList(characterId);
}
/// <summary>
/// Zwraca listę pancerzy posiadanych przez daną postać
/// </summary>
/// <param name="characterId"> Id postaci </param>
/// <returns> Lista pozostałego ekwipunku lub błąd </returns>
[HttpGet("getArmors")]
public async Task<Either<List<CharacterArmorViewModelDetails>, ErrorResponse>> GetCharacterArmors(int characterId)
{
return await this._characterArmorServic.GetCharacterArmorsTaskList(characterId);
}
/// <summary>
/// Zwraca listę broni posiadanej przez daną postać
/// </summary>
/// <param name="characterId"> Id postaci </param>
/// <returns> Lista broni lub błąd </returns>
[HttpGet("getWeapons")]
public async Task<Either<List<CharacterWeaponWithWeaponDetailsViewModel>, ErrorResponse>> GetCharacterWeapons(int characterId)
{
return await this._characterWeaponService.GetCharacterWeaponsList(characterId);
}
}
}