├── .gitignore ├── Config ├── DefaultEditor.ini ├── DefaultEditorPerProjectUserSettings.ini ├── DefaultEngine.ini ├── DefaultGame.ini └── DefaultInput.ini ├── Content ├── Demo │ ├── Blueprints │ │ ├── BP_DemoCharacter.uasset │ │ ├── BP_DemoEnemy.uasset │ │ ├── BP_DemoEnemyStats.uasset │ │ └── GI_DemoStats.uasset │ ├── Icons │ │ ├── Adrenalin_Power.uasset │ │ ├── Healing.uasset │ │ ├── Intimidated.uasset │ │ ├── Paralyzed.uasset │ │ └── Poisoned.uasset │ ├── ThirdPersonStuff │ │ ├── Geometry │ │ │ └── Meshes │ │ │ │ ├── 1M_Cube.uasset │ │ │ │ ├── 1M_Cube_Chamfer.uasset │ │ │ │ ├── CubeMaterial.uasset │ │ │ │ └── TemplateFloor.uasset │ │ ├── Mannequin │ │ │ ├── Animations │ │ │ │ ├── ThirdPersonIdle.uasset │ │ │ │ ├── ThirdPersonJump_End.uasset │ │ │ │ ├── ThirdPersonJump_Loop.uasset │ │ │ │ ├── ThirdPersonJump_Start.uasset │ │ │ │ ├── ThirdPersonRun.uasset │ │ │ │ ├── ThirdPersonWalk.uasset │ │ │ │ ├── ThirdPerson_AnimBP.uasset │ │ │ │ ├── ThirdPerson_IdleRun_2D.uasset │ │ │ │ └── ThirdPerson_Jump.uasset │ │ │ └── Character │ │ │ │ ├── Materials │ │ │ │ ├── M_UE4Man_Body.uasset │ │ │ │ ├── M_UE4Man_ChestLogo.uasset │ │ │ │ └── MaterialLayers │ │ │ │ │ ├── ML_GlossyBlack_Latex_UE4.uasset │ │ │ │ │ ├── ML_Plastic_Shiny_Beige.uasset │ │ │ │ │ ├── ML_Plastic_Shiny_Beige_LOGO.uasset │ │ │ │ │ ├── ML_SoftMetal_UE4.uasset │ │ │ │ │ ├── T_ML_Aluminum01.uasset │ │ │ │ │ ├── T_ML_Aluminum01_N.uasset │ │ │ │ │ ├── T_ML_Rubber_Blue_01_D.uasset │ │ │ │ │ └── T_ML_Rubber_Blue_01_N.uasset │ │ │ │ ├── Mesh │ │ │ │ ├── SK_Mannequin.uasset │ │ │ │ ├── SK_Mannequin_PhysicsAsset.uasset │ │ │ │ └── UE4_Mannequin_Skeleton.uasset │ │ │ │ └── Textures │ │ │ │ ├── UE4Man_Logo_N.uasset │ │ │ │ ├── UE4_LOGO_CARD.uasset │ │ │ │ ├── UE4_Mannequin_MAT_MASKA.uasset │ │ │ │ └── UE4_Mannequin__normals.uasset │ │ ├── ThirdPerson │ │ │ └── Meshes │ │ │ │ ├── Bump_StaticMesh.uasset │ │ │ │ ├── LeftArm_StaticMesh.uasset │ │ │ │ ├── Linear_Stair_StaticMesh.uasset │ │ │ │ ├── RampMaterial.uasset │ │ │ │ ├── Ramp_StaticMesh.uasset │ │ │ │ └── RightArm_StaticMesh.uasset │ │ └── ThirdPersonBP │ │ │ ├── Blueprints │ │ │ └── ThirdPersonGameMode.uasset │ │ │ ├── Maps │ │ │ ├── ThirdPersonExampleMap.umap │ │ │ └── ThirdPersonExampleMap_BuiltData.uasset │ │ │ └── ThirdPersonOverview.uasset │ └── Widgets │ │ ├── WB_DemoEnemy.uasset │ │ ├── WB_DemoMain.uasset │ │ └── WB_DemoStatsWindow.uasset └── OpenRPG_Stats │ ├── Blueprints │ ├── BPL_Stats.uasset │ ├── BP_StatsSaveObject.uasset │ ├── Components │ │ ├── BPC_Attributes.uasset │ │ ├── BPC_Leveling.uasset │ │ └── BPC_Stats.uasset │ └── Interfaces │ │ ├── BPI_Attributes.uasset │ │ ├── BPI_Buffs.uasset │ │ ├── BPI_Effects.uasset │ │ ├── BPI_Leveling.uasset │ │ ├── BPI_Stats.uasset │ │ └── BP_SaveLoad.uasset │ ├── Datatables │ ├── DT_Attributes.uasset │ ├── DT_Buffs.uasset │ ├── DT_Effects.uasset │ ├── DT_Leveling.uasset │ └── DT_Stats.uasset │ ├── Enums │ ├── e_Attribute.uasset │ ├── e_ExperienceFormulaType.uasset │ └── e_Stat.uasset │ ├── Structs │ ├── s_Attribute.uasset │ ├── s_AttributeBonus.uasset │ ├── s_AttributesData.uasset │ ├── s_AttributesSaveData.uasset │ ├── s_Buff.uasset │ ├── s_BuffStatic.uasset │ ├── s_DynamicBuffData.uasset │ ├── s_DynamicEffectData.uasset │ ├── s_Effect.uasset │ ├── s_EffectStatic.uasset │ ├── s_LevelUpReward.uasset │ ├── s_LevelingData.uasset │ ├── s_LevelingSaveData.uasset │ ├── s_Stat.uasset │ ├── s_StatBonus.uasset │ ├── s_StatsData.uasset │ └── s_StatsSaveData.uasset │ └── UI │ ├── WB_Attribute.uasset │ ├── WB_Bar.uasset │ ├── WB_BarSlot.uasset │ └── WB_Stat.uasset ├── LICENSE ├── OpenRPG_Stats.uproject ├── README.md └── docs ├── Makefile ├── attributes.rst ├── conf.py ├── core_components.rst ├── features.rst ├── folder_structure.rst ├── index.rst ├── integration.rst ├── leveling.rst ├── make.bat ├── migration.rst └── stats.rst /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ -------------------------------------------------------------------------------- /Config/DefaultEditor.ini: -------------------------------------------------------------------------------- 1 | [UnrealEd.SimpleMap] 2 | SimpleMapName=/Game/TP_ThirdPerson/Maps/ThirdPersonExampleMap 3 | 4 | [EditoronlyBP] 5 | bAllowClassAndBlueprintPinMatching=true 6 | bReplaceBlueprintWithClass= true 7 | bDontLoadBlueprintOutsideEditor= true 8 | bBlueprintIsNotBlueprintType= true -------------------------------------------------------------------------------- /Config/DefaultEditorPerProjectUserSettings.ini: -------------------------------------------------------------------------------- 1 | [ContentBrowser] 2 | ContentBrowserTab1.SelectedPaths=/Game/ThirdPersonBP -------------------------------------------------------------------------------- /Config/DefaultEngine.ini: -------------------------------------------------------------------------------- 1 | [URL] 2 | GameName=OpenRPG_Stats 3 | 4 | [/Script/EngineSettings.GameMapsSettings] 5 | EditorStartupMap=/Game/Demo/ThirdPersonStuff/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap 6 | GameDefaultMap=/Game/Demo/ThirdPersonStuff/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap 7 | TransitionMap= 8 | bUseSplitscreen=True 9 | TwoPlayerSplitscreenLayout=Horizontal 10 | ThreePlayerSplitscreenLayout=FavorTop 11 | GlobalDefaultGameMode=/Game/ThirdPersonBP/Blueprints/ThirdPersonGameMode.ThirdPersonGameMode_C 12 | GlobalDefaultServerGameMode=None 13 | GameInstanceClass=/Game/Demo/Blueprints/GI_DemoStats.GI_DemoStats_C 14 | 15 | [/Script/IOSRuntimeSettings.IOSRuntimeSettings] 16 | MinimumiOSVersion=IOS_9 17 | bSupportsPortraitOrientation=False 18 | bSupportsUpsideDownOrientation=False 19 | bSupportsLandscapeLeftOrientation=True 20 | PreferredLandscapeOrientation=LandscapeLeft 21 | 22 | [/Script/Engine.Engine] 23 | +ActiveGameNameRedirects=(OldGameName="TP_ThirdPersonBP",NewGameName="/Script/OpenRPG_Stats") 24 | +ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPersonBP",NewGameName="/Script/OpenRPG_Stats") 25 | 26 | [/Script/HardwareTargeting.HardwareTargetingSettings] 27 | TargetedHardwareClass=Desktop 28 | AppliedTargetedHardwareClass=Desktop 29 | DefaultGraphicsPerformance=Maximum 30 | AppliedDefaultGraphicsPerformance=Maximum 31 | 32 | [/Script/Engine.PhysicsSettings] 33 | DefaultGravityZ=-980.000000 34 | DefaultTerminalVelocity=4000.000000 35 | DefaultFluidFriction=0.300000 36 | SimulateScratchMemorySize=262144 37 | RagdollAggregateThreshold=4 38 | TriangleMeshTriangleMinAreaThreshold=5.000000 39 | bEnableShapeSharing=False 40 | bEnablePCM=True 41 | bEnableStabilization=False 42 | bWarnMissingLocks=True 43 | bEnable2DPhysics=False 44 | PhysicErrorCorrection=(PingExtrapolation=0.100000,PingLimit=100.000000,ErrorPerLinearDifference=1.000000,ErrorPerAngularDifference=1.000000,MaxRestoredStateError=1.000000,MaxLinearHardSnapDistance=400.000000,PositionLerp=0.000000,AngleLerp=0.400000,LinearVelocityCoefficient=100.000000,AngularVelocityCoefficient=10.000000,ErrorAccumulationSeconds=0.500000,ErrorAccumulationDistanceSq=15.000000,ErrorAccumulationSimilarity=100.000000) 45 | LockedAxis=Invalid 46 | DefaultDegreesOfFreedom=Full3D 47 | BounceThresholdVelocity=200.000000 48 | FrictionCombineMode=Average 49 | RestitutionCombineMode=Average 50 | MaxAngularVelocity=3600.000000 51 | MaxDepenetrationVelocity=0.000000 52 | ContactOffsetMultiplier=0.020000 53 | MinContactOffset=2.000000 54 | MaxContactOffset=8.000000 55 | bSimulateSkeletalMeshOnDedicatedServer=True 56 | DefaultShapeComplexity=CTF_UseSimpleAndComplex 57 | bDefaultHasComplexCollision=True 58 | bSuppressFaceRemapTable=False 59 | bSupportUVFromHitResults=False 60 | bDisableActiveActors=False 61 | bDisableKinematicStaticPairs=False 62 | bDisableKinematicKinematicPairs=False 63 | bDisableCCD=False 64 | bEnableEnhancedDeterminism=False 65 | MaxPhysicsDeltaTime=0.033333 66 | bSubstepping=False 67 | bSubsteppingAsync=False 68 | MaxSubstepDeltaTime=0.016667 69 | MaxSubsteps=6 70 | SyncSceneSmoothingFactor=0.000000 71 | InitialAverageFrameRate=0.016667 72 | PhysXTreeRebuildRate=10 73 | DefaultBroadphaseSettings=(bUseMBPOnClient=False,bUseMBPOnServer=False,MBPBounds=(Min=(X=0.000000,Y=0.000000,Z=0.000000),Max=(X=0.000000,Y=0.000000,Z=0.000000),IsValid=0),MBPNumSubdivs=2) 74 | 75 | -------------------------------------------------------------------------------- /Config/DefaultGame.ini: -------------------------------------------------------------------------------- 1 | [/Script/EngineSettings.GeneralProjectSettings] 2 | ProjectID=F16E5B1B414BB8C7A8D52BB193C6FFD1 3 | ProjectName=Third Person BP Game Template 4 | -------------------------------------------------------------------------------- /Config/DefaultInput.ini: -------------------------------------------------------------------------------- 1 | 2 | [/Script/Engine.InputSettings] 3 | -AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 4 | -AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 5 | -AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 6 | -AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 7 | -AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) 8 | -AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) 9 | +AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 10 | +AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 11 | +AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 12 | +AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 13 | +AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 14 | +AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 15 | +AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 16 | +AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 17 | +AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 18 | +AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 19 | +AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 20 | +AxisConfig=(AxisKeyName="MotionController_Left_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 21 | +AxisConfig=(AxisKeyName="MotionController_Left_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 22 | +AxisConfig=(AxisKeyName="MotionController_Left_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 23 | +AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 24 | +AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 25 | +AxisConfig=(AxisKeyName="MotionController_Right_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 26 | +AxisConfig=(AxisKeyName="MotionController_Right_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 27 | +AxisConfig=(AxisKeyName="MotionController_Right_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 28 | +AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 29 | +AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 30 | +AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Z",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 31 | +AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Z",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 32 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 33 | +AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 34 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 35 | +AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 36 | +AxisConfig=(AxisKeyName="OculusTouch_Left_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 37 | +AxisConfig=(AxisKeyName="OculusTouch_Left_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 38 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 39 | +AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 40 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 41 | +AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 42 | +AxisConfig=(AxisKeyName="OculusTouch_Right_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 43 | +AxisConfig=(AxisKeyName="OculusTouch_Right_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 44 | +AxisConfig=(AxisKeyName="OculusTouchpad_Touchpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 45 | +AxisConfig=(AxisKeyName="OculusTouchpad_Touchpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 46 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Left_HandGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 47 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Left_IndexGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 48 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Left_MiddleGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 49 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Left_RingGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 50 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Left_PinkyGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 51 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Right_HandGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 52 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Right_IndexGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 53 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Right_MiddleGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 54 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Right_RingGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 55 | +AxisConfig=(AxisKeyName="SteamVR_Knuckles_Right_PinkyGrip",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 56 | bAltEnterTogglesFullscreen=True 57 | bF11TogglesFullscreen=True 58 | bUseMouseForTouch=False 59 | bEnableMouseSmoothing=True 60 | bEnableFOVScaling=True 61 | bCaptureMouseOnLaunch=True 62 | bDefaultViewportMouseLock=True 63 | bAlwaysShowTouchInterface=False 64 | bShowConsoleOnFourFingerTap=True 65 | bEnableGestureRecognizer=False 66 | bUseAutocorrect=False 67 | DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown 68 | DefaultViewportMouseLockMode=LockOnCapture 69 | FOVScale=0.011110 70 | DoubleClickTime=0.200000 71 | +ActionMappings=(ActionName="Jump",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar) 72 | +ActionMappings=(ActionName="Jump",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Bottom) 73 | +ActionMappings=(ActionName="Jump",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Left_Trigger) 74 | +ActionMappings=(ActionName="ResetVR",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=R) 75 | +ActionMappings=(ActionName="ResetVR",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Left_Grip1) 76 | +ActionMappings=(ActionName="Jump",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Right_Trigger) 77 | +ActionMappings=(ActionName="Jump",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=OculusTouchpad_Touchpad) 78 | +AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=W) 79 | +AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=S) 80 | +AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=Up) 81 | +AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=Down) 82 | +AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=Gamepad_LeftY) 83 | +AxisMappings=(AxisName="MoveRight",Scale=-1.000000,Key=A) 84 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=D) 85 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Gamepad_LeftX) 86 | +AxisMappings=(AxisName="TurnRate",Scale=1.000000,Key=Gamepad_RightX) 87 | +AxisMappings=(AxisName="TurnRate",Scale=-1.000000,Key=Left) 88 | +AxisMappings=(AxisName="TurnRate",Scale=1.000000,Key=Right) 89 | +AxisMappings=(AxisName="Turn",Scale=1.000000,Key=MouseX) 90 | +AxisMappings=(AxisName="LookUpRate",Scale=1.000000,Key=Gamepad_RightY) 91 | +AxisMappings=(AxisName="LookUp",Scale=-1.000000,Key=MouseY) 92 | +AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=MotionController_Left_Thumbstick_Y) 93 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=MotionController_Left_Thumbstick_X) 94 | +AxisMappings=(AxisName="TurnRate",Scale=-1.000000,Key=MotionController_Right_Thumbstick_X) 95 | DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks 96 | ConsoleKey=None 97 | -ConsoleKeys=Tilde 98 | +ConsoleKeys=Tilde 99 | 100 | 101 | -------------------------------------------------------------------------------- /Content/Demo/Blueprints/BP_DemoCharacter.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Blueprints/BP_DemoCharacter.uasset -------------------------------------------------------------------------------- /Content/Demo/Blueprints/BP_DemoEnemy.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Blueprints/BP_DemoEnemy.uasset -------------------------------------------------------------------------------- /Content/Demo/Blueprints/BP_DemoEnemyStats.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Blueprints/BP_DemoEnemyStats.uasset -------------------------------------------------------------------------------- /Content/Demo/Blueprints/GI_DemoStats.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Blueprints/GI_DemoStats.uasset -------------------------------------------------------------------------------- /Content/Demo/Icons/Adrenalin_Power.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Icons/Adrenalin_Power.uasset -------------------------------------------------------------------------------- /Content/Demo/Icons/Healing.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Icons/Healing.uasset -------------------------------------------------------------------------------- /Content/Demo/Icons/Intimidated.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Icons/Intimidated.uasset -------------------------------------------------------------------------------- /Content/Demo/Icons/Paralyzed.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Icons/Paralyzed.uasset -------------------------------------------------------------------------------- /Content/Demo/Icons/Poisoned.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Icons/Poisoned.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Geometry/Meshes/1M_Cube.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Geometry/Meshes/1M_Cube.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Geometry/Meshes/1M_Cube_Chamfer.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Geometry/Meshes/1M_Cube_Chamfer.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Geometry/Meshes/CubeMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Geometry/Meshes/CubeMaterial.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Geometry/Meshes/TemplateFloor.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Geometry/Meshes/TemplateFloor.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonIdle.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonIdle.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonJump_End.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonJump_End.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonJump_Loop.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonJump_Loop.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonJump_Start.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonJump_Start.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonRun.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonRun.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonWalk.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPersonWalk.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPerson_AnimBP.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPerson_AnimBP.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPerson_IdleRun_2D.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPerson_IdleRun_2D.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPerson_Jump.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Animations/ThirdPerson_Jump.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/M_UE4Man_Body.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/M_UE4Man_Body.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/M_UE4Man_ChestLogo.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/M_UE4Man_ChestLogo.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/ML_GlossyBlack_Latex_UE4.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/ML_GlossyBlack_Latex_UE4.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/ML_Plastic_Shiny_Beige.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/ML_Plastic_Shiny_Beige.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/ML_Plastic_Shiny_Beige_LOGO.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/ML_Plastic_Shiny_Beige_LOGO.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/ML_SoftMetal_UE4.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/ML_SoftMetal_UE4.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/T_ML_Aluminum01.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/T_ML_Aluminum01.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/T_ML_Aluminum01_N.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/T_ML_Aluminum01_N.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/T_ML_Rubber_Blue_01_D.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/T_ML_Rubber_Blue_01_D.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/T_ML_Rubber_Blue_01_N.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Materials/MaterialLayers/T_ML_Rubber_Blue_01_N.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Mesh/SK_Mannequin.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Mesh/SK_Mannequin.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Mesh/SK_Mannequin_PhysicsAsset.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Mesh/SK_Mannequin_PhysicsAsset.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Mesh/UE4_Mannequin_Skeleton.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Mesh/UE4_Mannequin_Skeleton.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Textures/UE4Man_Logo_N.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Textures/UE4Man_Logo_N.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Textures/UE4_LOGO_CARD.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Textures/UE4_LOGO_CARD.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Textures/UE4_Mannequin_MAT_MASKA.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Textures/UE4_Mannequin_MAT_MASKA.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/Mannequin/Character/Textures/UE4_Mannequin__normals.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/Mannequin/Character/Textures/UE4_Mannequin__normals.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/Bump_StaticMesh.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/Bump_StaticMesh.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/LeftArm_StaticMesh.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/LeftArm_StaticMesh.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/Linear_Stair_StaticMesh.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/Linear_Stair_StaticMesh.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/RampMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/RampMaterial.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/Ramp_StaticMesh.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/Ramp_StaticMesh.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/RightArm_StaticMesh.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPerson/Meshes/RightArm_StaticMesh.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPersonBP/Blueprints/ThirdPersonGameMode.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPersonBP/Blueprints/ThirdPersonGameMode.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPersonBP/Maps/ThirdPersonExampleMap.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPersonBP/Maps/ThirdPersonExampleMap.umap -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPersonBP/Maps/ThirdPersonExampleMap_BuiltData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPersonBP/Maps/ThirdPersonExampleMap_BuiltData.uasset -------------------------------------------------------------------------------- /Content/Demo/ThirdPersonStuff/ThirdPersonBP/ThirdPersonOverview.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/ThirdPersonStuff/ThirdPersonBP/ThirdPersonOverview.uasset -------------------------------------------------------------------------------- /Content/Demo/Widgets/WB_DemoEnemy.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Widgets/WB_DemoEnemy.uasset -------------------------------------------------------------------------------- /Content/Demo/Widgets/WB_DemoMain.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Widgets/WB_DemoMain.uasset -------------------------------------------------------------------------------- /Content/Demo/Widgets/WB_DemoStatsWindow.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/Demo/Widgets/WB_DemoStatsWindow.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/BPL_Stats.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/BPL_Stats.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/BP_StatsSaveObject.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/BP_StatsSaveObject.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Components/BPC_Attributes.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Components/BPC_Attributes.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Components/BPC_Leveling.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Components/BPC_Leveling.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Components/BPC_Stats.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Components/BPC_Stats.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Attributes.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Attributes.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Buffs.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Buffs.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Effects.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Effects.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Leveling.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Leveling.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Stats.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Interfaces/BPI_Stats.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Blueprints/Interfaces/BP_SaveLoad.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Blueprints/Interfaces/BP_SaveLoad.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Datatables/DT_Attributes.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Datatables/DT_Attributes.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Datatables/DT_Buffs.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Datatables/DT_Buffs.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Datatables/DT_Effects.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Datatables/DT_Effects.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Datatables/DT_Leveling.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Datatables/DT_Leveling.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Datatables/DT_Stats.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Datatables/DT_Stats.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Enums/e_Attribute.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Enums/e_Attribute.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Enums/e_ExperienceFormulaType.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Enums/e_ExperienceFormulaType.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Enums/e_Stat.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Enums/e_Stat.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_Attribute.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_Attribute.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_AttributeBonus.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_AttributeBonus.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_AttributesData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_AttributesData.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_AttributesSaveData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_AttributesSaveData.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_Buff.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_Buff.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_BuffStatic.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_BuffStatic.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_DynamicBuffData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_DynamicBuffData.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_DynamicEffectData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_DynamicEffectData.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_Effect.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_Effect.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_EffectStatic.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_EffectStatic.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_LevelUpReward.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_LevelUpReward.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_LevelingData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_LevelingData.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_LevelingSaveData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_LevelingSaveData.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_Stat.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_Stat.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_StatBonus.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_StatBonus.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_StatsData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_StatsData.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/Structs/s_StatsSaveData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/Structs/s_StatsSaveData.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/UI/WB_Attribute.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/UI/WB_Attribute.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/UI/WB_Bar.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/UI/WB_Bar.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/UI/WB_BarSlot.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/UI/WB_BarSlot.uasset -------------------------------------------------------------------------------- /Content/OpenRPG_Stats/UI/WB_Stat.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelhodar/OpenRPG_Stats/7493e85de49e235c9e0a94f0b65a8ca18bbcc634/Content/OpenRPG_Stats/UI/WB_Stat.uasset -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Angel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /OpenRPG_Stats.uproject: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "EngineAssociation": "4.22", 4 | "Category": "", 5 | "Description": "" 6 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenRPG_Stats 2 | 3 | [![MIT license](https://img.shields.io/badge/License-MIT-blue.svg)](https://lbesson.mit-license.org/) 4 | [![Discord Server](https://discord.com/api/guilds/814412583988756581/embed.png)](https://discord.gg/SkYcWZrEEM) 5 | 6 | ## Features 7 | 8 | ### Stats 9 | 10 | * Create your own stats like health, mana, hunger, fire resistance, shield power, critical chance, etc. You can also 11 | make your own sets of stats! 12 | * All of them managed via datatable, you dont have to touch code to create your custom character stats! 13 | * You can also configure if you want to track the current value of any stat. This is useful in some stats like health, when you have the current and the maximum health. 14 | 15 | ### Attributes 16 | 17 | * Create your own attributes like intelligence, strenght, vitality, etc. As said with stats, you can also create your own sets of attributes. 18 | * Managed via datatable. 19 | * Add your custom bonuses to stats when any of the attributes values are modified! 20 | * Receive attribute points and spend them in the attributes you want. 21 | 22 | ### Leveling System 23 | 24 | * Create your own per level needed experience values to level up, manually or by formula. 25 | * Everything handled by datatable, extremely easy to configure and use. 26 | * Add your custom functionality when leveling up (give rewards, show notification, etc). 27 | * Scale stats and attributes when leveling up. 28 | 29 | ### Buffs 30 | 31 | * Dynamic bonuses to stats and/or attributes for a specific time duration or even permanent. 32 | * Possitive or negative bonuses. 33 | * Possibility to display icon on UI showing the remaining time. 34 | 35 | ### Effects 36 | 37 | * Over a specific time duration (or permanent), you can set a tick interval and create your own funcionality when the tick is executed. 38 | * Also displayable as buffs. 39 | 40 | ## Documentation 41 | 42 | You can find full documentation and tutorials about the system [here](https://openrpg-stats.readthedocs.io/en/latest/). I will be expanding it in my free time with engine pics and more, but with the actual content you can understand every aspect of the system. 43 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SOURCEDIR = . 8 | BUILDDIR = _build 9 | 10 | # Put it first so that "make" without argument is like "make help". 11 | help: 12 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 13 | 14 | .PHONY: help Makefile 15 | 16 | # Catch-all target: route all unknown targets to Sphinx using the new 17 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 18 | %: Makefile 19 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /docs/attributes.rst: -------------------------------------------------------------------------------- 1 | Attributes 2 | ========== 3 | 4 | In this section i will follow the same structure as in the :doc:`stats` section, as the process is very similar. First you will learn how to create 5 | your own attributes and also your own sets of them. Then i will explain the ``BPC_Attributes`` to make sure you understand its functionality. 6 | 7 | .. _adding_attributes: 8 | 9 | Adding new attributes 10 | --------------------- 11 | 12 | Adding new attributes, as with stats, is very easy: 13 | 14 | 1. Go to ``e_Attribute`` under the :ref:`enums` folder and add your new attribute. 15 | 2. Then in your widget that displays all the attributes, add a new ``WB_Attribute``, select it and you will see in the *Details* 16 | panel that it has some exposed variables. Fill the enum variable with your new attribute and configure the rest of variables as you want. 17 | 3. Make sure you add that new widget to the widgets that the component has to refresh with the **AddCustomWidgets** function. 18 | 19 | .. Tip:: To remove an attribute the process is exactly the inverse, just remove the widget and the entry in the enum. 20 | 21 | .. _creating_attributes_sets: 22 | 23 | Creating sets of attributes 24 | --------------------------- 25 | 26 | Once you have created your desired attributes, the process is the same as with stats: 27 | 28 | 1. Go to :ref:`dt_attributes` and create a new row, you can call it *Warrior* for example. 29 | 2. Then just fill the attributes you want to have for that particular set. 30 | 3. Go to your class that has the attributes component you want to load that data (lets suppose you have a *BP_Warrior* class). 31 | 4. Click on the attributes component and in the *Details* panel you will see the ``AttributesTableRow`` variable under the *Settings* category, 32 | just put the row name you created before (in this case it would be *Warrior*). 33 | 34 | .. Note:: I have used ``DT_Attributes`` as the datatable for the example, if you have created your own one then its perfect, just make sure you put that 35 | table in the ``AttributesTable`` of the component. 36 | 37 | **Done!** Now when your *BP_Warrior* class is initialized, it will load the set of attributes you have configured in the datatable (remember 38 | it will only happen if there is no previous saved data). 39 | 40 | .. _bpc_attributes: 41 | 42 | BPC_Attributes 43 | -------------- 44 | 45 | .. _attributes_variables: 46 | 47 | Variables 48 | ^^^^^^^^^ 49 | 50 | * ``Attributes``: The updated values of the attributes set. It also keeps the bonuses. 51 | * ``AvailableAttributePoints``: The attribute points that the owning actor can spend on improving attributes. 52 | * ``SpentAttributePoints``: The attribute points that the owning actor has spent already. 53 | 54 | .. _attributes_functions: 55 | 56 | Functions 57 | ^^^^^^^^^ 58 | 59 | * ``GetAttributeValue``: Returns the final value of the attribute passed as input, with all the bonuses applied and calculated. 60 | * ``AddAttributeBonuses``: It receives flat and percentage bonuses and sums them to the **Attributes** component variable, then it calls 61 | **CalculateAttributesFinalValues** to recalculate the final attributes values. 62 | * ``RemoveAttributeBonuses``: Same as the previous one, but it will substract the bonuses instead of summing them. 63 | * ``SpendAttributePoints``: It will substract the points passed as input to the **AvailableAttributePoints** variable, then it will call 64 | **AddPointsToAttribute**. 65 | * ``AddPointsToAttribute``: Adds the points passed as input to the attribute base value, then it recalculates the final value and also 66 | recalculates the stats bonuses this attribute can have. 67 | * ``ReceiveAttributePoints``: Just sum the points passed as input to the **AvailableAttributePoints** variable. 68 | * ``CalculateAttributesFinalValues``: Recalculates the final values of the attributes it receives as input. 69 | * ``AddAttributesPerLevel``: It will be called by **BPC_Leveling** if the owning actor implements leveling system and it levels up, adding 70 | the values you have set up in the **AttributesPerLevel** on **AttributesTable**. 71 | * ``ResetAttributes``: It resets the current attributes to the default attributes in the datatable row assigned. It will just reset and recalculate 72 | the base values. Bonuses will be still applied until they are removed by other functions. 73 | * ``AddAttributeBonusesToStats``: When an attribute is modified, this function will recalculate the stats bonuses if the attribute has any bonuses on stats. 74 | * ``GetAttributesData``: Used to get the data in **AttributesTable** with the row you have set up in the variable **AttributesDataRow**. 75 | 76 | .. _attributes_dispatchers: 77 | 78 | Dispatchers 79 | ^^^^^^^^^^^ 80 | 81 | * ``OnAttributePointsReceived`` 82 | * ``OnAttributesResetted`` 83 | * ``OnAttributeFinalValueChanged`` 84 | * ``OnAttributePointsSpent`` 85 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # http://www.sphinx-doc.org/en/master/config 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | # import os 14 | # import sys 15 | # sys.path.insert(0, os.path.abspath('.')) 16 | 17 | 18 | # -- Project information ----------------------------------------------------- 19 | 20 | project = 'OpenRPG: Stats' 21 | copyright = '2019, Ángel' 22 | author = 'Ángel' 23 | 24 | # The full version, including alpha/beta/rc tags 25 | release = '1.0' 26 | 27 | master_doc="index" 28 | 29 | # -- General configuration --------------------------------------------------- 30 | 31 | # Add any Sphinx extension module names here, as strings. They can be 32 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 33 | # ones. 34 | extensions = [ 35 | ] 36 | 37 | # Add any paths that contain templates here, relative to this directory. 38 | templates_path = ['_templates'] 39 | 40 | # List of patterns, relative to source directory, that match files and 41 | # directories to ignore when looking for source files. 42 | # This pattern also affects html_static_path and html_extra_path. 43 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 44 | 45 | 46 | # -- Options for HTML output ------------------------------------------------- 47 | 48 | # The theme to use for HTML and HTML Help pages. See the documentation for 49 | # a list of builtin themes. 50 | # 51 | html_theme = "sphinx_rtd_theme" 52 | 53 | # Add any paths that contain custom static files (such as style sheets) here, 54 | # relative to this directory. They are copied after the builtin static files, 55 | # so a file named "default.css" will overwrite the builtin "default.css". 56 | html_static_path = ['_static'] 57 | -------------------------------------------------------------------------------- /docs/core_components.rst: -------------------------------------------------------------------------------- 1 | System Core: Components 2 | ================================ 3 | When we refer to the system functionality, the majority is implemented in ``BPC_Stats``, ``BPC_Attributes`` 4 | and ``BPC_Leveling``. However, when we refer to the system core, that is the ``BPC_Stats`` component, 5 | because ``BPC_Attributes`` and ``BPC_Leveling`` can be considered as extensions to the main purpose of 6 | the whole system, which is giving stats functionality to an actor. 7 | 8 | .. Note:: Each component work as isolated as they can, they just communicate the minimum to have as less 9 | dependencies between them as possible. 10 | 11 | Lets say you want to use ``BPC_Attributes`` and ``BPC_Stats`` in an actor. When ``BPC_Attributes`` 12 | gets one attribute modified, it will search if the **owning actor** has a ``BPC_Stats`` component. If not, 13 | it wont do anything related to the stats, but if it is found, it will tell the ``BPC_Stats`` component 14 | about that attribute modification (attributes can affect stats). For example if you get +1 point of 15 | *Strenght*, you can set it to increase *Attack Value* by +15. 16 | 17 | General Behaviour 18 | ----------------- 19 | 20 | In this section we will see that even though the components have different functionality, there are a few aspects that all of them share. 21 | 22 | .. _settings_variables: 23 | 24 | Settings Variables 25 | ^^^^^^^^^^^^^^^^^^ 26 | 27 | Every component has a few variables to configure it. The names of the variables will vary a bit depending 28 | on the component, but the functionality is the same for all of them: 29 | 30 | * ``DataTable``: The datatable from which to extract the data. 31 | * ``TableDataRow``: The name of the row data in ``DataTable`` 32 | * ``DebugEnabled?``: If true, the component will print messages on the screen 33 | showing possible errors and warnings when its initialized. 34 | 35 | These settings are enough to setup the component, because all the data is in the assigned datatable, 36 | so you only need to write the name of the row in ``TableDataRow`` and the component will load the data 37 | from there. 38 | 39 | .. _widgets_refreshing: 40 | 41 | Widgets Refreshing 42 | ^^^^^^^^^^^^^^^^^^ 43 | 44 | When communicating with widgets to send them data, all the components uses some of the interfaces showed in the ``Blueprints`` section, 45 | depending on the data it is going to send. Also, all components have a ``Widgets`` variable, which contains the widgets that the component 46 | is going to send data when some events happen.. There are also 2 common functions: 47 | 48 | * ``AddCustomWidgets``: Before any component is initialized, we need to pass it the widgets it has to refresh as said before, so this function 49 | just adds widgets to the ``Widgets`` variable mentioned before. For example, the ``BPC_Stats`` component in ``BP_DemoCharacter`` will refresh 50 | the ``WB_DemoDebugStats`` and its stats subwidgets, but it doesnt refresh the attributes or the current experience widgets. Its a simple way 51 | to link a component with the widgets you want. 52 | 53 | * ``RefreshWidgets``: Its called when the component has loaded the neccessary data, either from saved before or by datatable, to refresh its widgets with 54 | all the data it has. For example, the ``BPC_Attributes`` will refresh every attribute and the available attribute points. 55 | 56 | .. _saving: 57 | 58 | Save / Load 59 | ^^^^^^^^^^^ 60 | 61 | All the components have built-in save / load functionality. They can save and load data either by ``GameInstance`` or using a ``SaveGame`` class. 62 | 63 | .. Note:: If you dont know about ``GameInstance`` and ``SaveGame`` classes, `here `__ you have a nice YouTube 64 | video from Mathew Wadstein explaining the ``GameInstance`` class and `this `__ other 65 | link explains perfectly how the ``SaveGame`` class work. 66 | 67 | There are 4 functions used for this purpose: 68 | 69 | * ``CreateSaveData``: It gets the current component data and creates the proper struct (you can see it as a packet) with all the data, 70 | depending on the component: ``s_AttributesSaveData`` , ``s_StatsSaveData`` or ``s_LevelingSaveData``. 71 | 72 | * ``SaveData``: It will send the data created by ``CreateSaveData`` to the corresponding container that will store the data with an "identifier" of that data, 73 | given by the ``SaveName`` input. The container will save the data with the value from the ``SaveName`` variable, and it will be different 74 | depending on the ``ToGameInstance`` boolean input. If it is true, it will get the game's ``GameInstance`` object to send the data there. 75 | Remember that this class is persistent across levels, so if we go from one level to another, we can send the data to that object and retrieve it in 76 | the new level. If the boolean is false, then it will get the ``.sav`` file on disk (if it doesnt exists it will create it) 77 | to save the data there. 78 | 79 | * ``LoadData``: Exactly the inverse of the ``SaveData``, it will get the data that has the label given by the input ``SaveName`` assigned to it, 80 | also depending on the container it will ask for that data to ``GameInstance`` or ``.sav`` file. When it gets the data it will update the 81 | component variables with it, and it will also set the boolean ``HasLoadBeenSuccessful?`` to true (false if no saved data was found). And if no data was found, 82 | what do we do? Here the ``LoadTableData`` function comes to the rescue! 83 | 84 | * ``LoadTableData``: It will be called in both ``BPC_Stats`` and ``BPC_Attributes`` **only** when the component hasnt received saved data before. If so, 85 | the function will take the value of ``TableDataRow`` mentioned before to extract the data from the assigned datatable, just like default data. In ``BPC_Leveling`` 86 | it will be called always **but** the value of ``HasBeenLoadSuccessful?`` will branch inside the function. Thats because we need to construct the needed 87 | experience for each level, because that data is not saved by the ``SaveData`` function. 88 | 89 | .. Note:: Typically you would only save data to the .sav file disk when the user clicks on some menu button to save the current game state or if you have 90 | a menu button that closes the game, you can save there to the disk before closing the game. Anyway, it depends on how have you configured the saving 91 | and loading options in your game. 92 | 93 | .. _consistency: 94 | 95 | Consistency 96 | ^^^^^^^^^^^ 97 | 98 | Every component has a function called ``CheckConsistency``. This function will tell you if there is any unconsistency in the component settings. 99 | For example if the variable ``DataTable`` doenst have a valid value, or if the row assigned in ``TableDataRow`` doesnt exist in the datatable if you 100 | have assigned a valid value to it. It will check more consistency errors depending on the component, because each of them has its own consistency settings. 101 | This function is also callable from the editor, that means that you can call it without running the game. To try it just go to the ``BP_DemoCharacter`` 102 | blueprint, select one of the system components in the left side and you will see at the component details that you have a button with the same name as 103 | the function, just click it. 104 | 105 | .. _initialization: 106 | 107 | Initialization Pipeline 108 | ^^^^^^^^^^^^^^^^^^^^^^^ 109 | At this point, you have seen a lot of functions and what they do, so the last thing to clarify is when some of them are called and in what order. Typically 110 | the initialization process is done in the event BeginPlay of your character or player controller. In the demo content, it has been implemented in the character. 111 | The steps would be the following ones: 112 | 113 | 1. Get the component and call the function AddCustomWidgets and pass it an array of the widgets it has to refresh. 114 | 2. Call the functin LoadData and give it a SaveName value, for example if you have a main menu and the user can give a name to the character, that would be 115 | a perfect value to put here. 116 | 3. Call the Initialize event of the component. 117 | 118 | Every component has an event called ``Initialize``. The pipeline of this event is the following one: 119 | 120 | 1. Searches for other system components in the owning actor. For example ``BPC_Leveling`` will search for ``BPC_Attributes`` and ``BPC_Stats`` to perform 121 | some actions when the owning actor levels up. If the component hasnt found other components, nothing happens. 122 | 2. Calls the function ``CheckConsistency`` if the variable ``DebugEnabled?`` is true, which will print some strings in the screen if there is any 123 | configuration error. 124 | 3. Calls ``LoadTableData`` if ``HasLoadBeenSuccessful?`` is false (with the special case of the ``BPC_Leveling`` component mentioned before) to load 125 | the default data from the proper datatable. 126 | 4. Refresh all the widgets with the loaded data. 127 | 128 | .. Tip:: The previous process is the same for all the components. 129 | 130 | Now that you have understood the main idea about how the components work, lets see the details of each component in the next sections. 131 | -------------------------------------------------------------------------------- /docs/features.rst: -------------------------------------------------------------------------------- 1 | ======== 2 | Features 3 | ======== 4 | 5 | Stats 6 | ----- 7 | * Create your own stats like health, mana, hunger, fire resistance, shield power, critical chance, etc. You can also 8 | make your own sets of stats! 9 | * All of them managed via datatable, you dont have to touch code to create your custom character stats! 10 | * You can also configure if you want to track the current value of any stat. This is useful in some stats like health, when you have 11 | the current and the maximum health. 12 | 13 | Attributes 14 | ---------- 15 | * Create your own attributes like intelligence, strenght, vitality, etc. As said with stats, you can also create your own sets of attributes. 16 | * Managed via datatable. 17 | * Add your custom bonuses to stats when any of the attributes values are modified! 18 | * Receive attribute points and spend them in the attributes you want. 19 | 20 | Leveling System 21 | --------------- 22 | * Create your own per level needed experience values to level up, manually or by formula. 23 | * Everything handled by datatable, extremely easy to configure and use. 24 | * Add your custom functionality when leveling up (give rewards, show notification, etc). 25 | * Scale stats and attributes when leveling up. 26 | 27 | Buffs 28 | ----- 29 | * Dynamic bonuses to stats and/or attributes for a specific time duration or even permanent. 30 | * Possitive or negative bonuses. 31 | * Possibility to display icon on UI showing the remaining time. 32 | 33 | Effects 34 | ------- 35 | * Over a specific time duration (or permanent), you can set a tick interval and create your own funcionality when the tick is executed. 36 | * Also displayable as buffs. 37 | -------------------------------------------------------------------------------- /docs/folder_structure.rst: -------------------------------------------------------------------------------- 1 | ================ 2 | Folder Structure 3 | ================ 4 | 5 | This section will cover the project folder structure and a brief description of the main files on it. 6 | When you download the project from `GitHub `__ and you open it with Unreal Engine, 7 | the first thing you will see at the root of the project folder are the ``Demo`` and ``OpenRPG_Stats`` folders. Lets quickly see 8 | what each one contains: 9 | 10 | Demo 11 | ---- 12 | This folder contains blueprints, icons, widgets and stuff from the *Third Person Template* and other ones created just 13 | to test and explore the system. Lets focus on the blueprints and widgets folders: 14 | 15 | Blueprints 16 | ^^^^^^^^^^ 17 | * ``BP_DemoCharacter``: Used to test the system when you run the project. It has all the system related functionality in 18 | a separated ``StatsSystem`` graph, which contains components initialization, keyboard controls, enemy selection 19 | with the mouse and interaction with the saving / loading functionality. 20 | * ``BP_DemoEnemy``: Just to see what the system is capable of, i have included an enemy that can be selected with the mouse and 21 | implementats stats functionality, as i think its something very common in RPG games and helps you see the flexibility of the 22 | system components, which arent limited to be implemented only in the character for example. 23 | * ``BP_DemoEnemyStats``: The implementation of the stats functionality for the enemies. The only thing you need to know by now is that 24 | it has all the system stats functionality but with a very little modification to handle the widget that displays the health of the selected enemies. 25 | * ``GI_DemoStats``: This is a ``GameInstance`` object. As you will see later, the system can save and load the data using a file in the hard drive with 26 | the ``.sav`` extension, or by using the ``GameInstance``, which is commonly used to keep data between game levels without needing to use the hard disk 27 | ``.sav`` file, so its much faster and easy to manage. Its functionality is very simple and you can get it implemented in your own game instance in just 28 | a few minutes. When the game starts, this class will dump all the saved data in the file disk into itself. 29 | 30 | Widgets 31 | ^^^^^^^^^^ 32 | * ``WB_DemoStatsWindow``: Simple widget to watch the system values updated when you use keyboard controls, you can also check 33 | my weak artist concepts :( 34 | * ``WB_DemoMain``: Its the widget added to the viewport and displayed in the game, which contains all the other widgets. 35 | * ``WB_DemoEnemy``: The widget that displays the health of the selected enemy. 36 | 37 | .. Note:: Its a good practice to create a main HUD widget as the WB_DemoMain, that contains all your widgets, and then add it to the viewport 38 | instead of adding all of them individually. 39 | 40 | OpenRPG_Stats 41 | ------------- 42 | It contains all the system functionality. Lets see exactly what each folder contains: 43 | 44 | Blueprints 45 | ^^^^^^^^^^ 46 | This is by far **the most important folder, because it contains the system core functionality**. This folder has the blueprint 47 | function library ``BPL_Stats``, which includes utility functions that we can call anywhere, and the ``BP_StatsSaveObject``, which 48 | is the container for the saved data in your hard disk, so it will keep the saved data even if the player leaves the game. This folder also 49 | contains another 2 subfolders: 50 | 51 | .. _components: 52 | 53 | Components 54 | ********** 55 | 56 | These components will provide any actor they are added to with stats functionality with buffs and effects 57 | (``BPC_Stats``), attributes (``BPC_Attributes``) and customizable leveling system (``BPC_Leveling``). These components are 58 | independent from each other, so you can just implement the ones you want on your actors, but they can work together perfectly! 59 | Each one will have its own section in the documentation as they implement most of the overall system functionality. 60 | 61 | .. _interfaces: 62 | 63 | Interfaces 64 | ********** 65 | 66 | They are used mainly to implement the interaction between the components and the widgets. They allow the components 67 | to be independent of the widgets, so you can use your own widgets and just implement the interface on them to be able 68 | to receive components data! There are 5 interfaces with this purpose: 69 | 70 | * ``BPI_Stats``: Used by ``BPC_Stats`` to notify the widgets when a stat value is modified. 71 | * ``BPI_Attributes``: Used by ``BPC_Attributes`` to notify the widgets when an attribute value or the attribute points are modified. 72 | * ``BPI_Leveling``: Used by ``BPC_Leveling`` to notify the widgets when some experience is received or the actor levels up. 73 | * ``BPI_Buffs``: Used by ``BPC_Stats`` to notify the widgets when a buff is applied or removed. 74 | * ``BPI_Effects``: Used by ``BPC_Stats`` to notify the widgets when an effect is applied, removed or ticks. 75 | 76 | There is also an extra interface used by the built-in save / load system: 77 | 78 | * ``BPI_SaveLoad``: It is responsible of the communication between the components and the saving containers 79 | (``BP_StatsSaveObject`` and ``GameInstance``). Its useful to make the components independent from the saving containers, 80 | they will just send and receive data using the interface, but they dont care about the type of container the data is going or 81 | coming from. 82 | 83 | .. Note:: If you dont know how interfaces work `here `__ 84 | you have the link of the official documentacion. 85 | 86 | .. _data tables: 87 | 88 | DataTables 89 | ^^^^^^^^^^ 90 | 91 | This folder contains all the tables where you configure your own default system data. When you create a new row and fill its data, 92 | you can just use that row name putting it in the corresponding component, so it will load the data you filled in that row, which allows you to create 93 | your own sets of attributes and stats. 94 | 95 | .. Note:: This tables will be accesed by their respective components **only** when there is no saved data to load, so 96 | they take the tables data as **default**. 97 | 98 | .. _dt_stats: 99 | 100 | DT_Stats 101 | ************ 102 | 103 | * ``Stats``: Here you configure stats and the default values they are going to have when ``BPC_Stats`` loads them. 104 | * ``CurrentStats``: The default values of the stats that have current value. For example health, mana, hunger, 105 | stamina and so on are stats that have a value between 0 and the maximum value they can get, that value is called current stat. 106 | So all the stats you add in this variable will have a current stat value. 107 | * ``StatsPerLevel``: If an actor implementes leveling system and stats system, when it levels up, the component 108 | ``BPC_Leveling`` will tell ``BPC_Stats`` to add the stats you configure here. 109 | 110 | .. _dt_attributes: 111 | 112 | DT_Attributes 113 | ***************** 114 | 115 | * ``Attributes``: Here you configure attributes and the default values they are going to have when ``BPC_Attributes`` loads them. 116 | * ``AttributesBonusesToStats``: When an attribute is modified, here you can configure what bonuses are going to be applied to a set 117 | of stats. The best way to see this is with an example. Lets say you add the *Strenght* attribute, and then you say that when it is 118 | increased, the stat *AttackValue* is going to be increased by 1%. You can do it with as many stats as you want, either 119 | flat or percentage bonuses as seen in the example. 120 | * ``AttributesPerLevel``: If an actor implements leveling system and attributes system, when it levels up, the component 121 | ``BPC_Leveling`` will tell ``BPC_Attributes`` to add the attribute points you configure here. 122 | 123 | .. _dt_leveling: 124 | 125 | DT_Leveling 126 | *********** 127 | 128 | * ``StartingLevel``: The starting level the actor is going to have. 129 | * ``MaxLevel``: The maximum level the actor can reach. When this level is reached and actor receives more experience points, 130 | they will be ignored. 131 | * ``UseCustomExperienceFormula?``: There are some RPG games where the experience per level is defined by a formula. So if you 132 | set this to true, system will use the formula specified by ``ExperienceFormulaType``. If you leave it to false, you need to set the 133 | ``NeededExperiencePerLevel`` map variable manually. 134 | * ``ExperienceFormulaType``: The formula you want to apply. I have included 2 examples, which are implemented in ``BPC_Leveling``. 135 | If you add new formulas make sure you implement them there! 136 | * ``NeededExperiencePerLevel``: As said before, if you dont use a custom formula, you need to manually set it up. The key is a 137 | level, and the value is the needed experience to reach next level. If custom formula is used, it will be constructed from ``StartingLevel`` 138 | to ``MaxLevel`` using the formula. Even if you use a formula, you can put default values that can be useful for some types of formulas. For 139 | example, in the *Type2* formula that i have implemented, the needed experience for each level is the needed experience in the previous level 140 | + 10% of that experience, but what do we do for level 1? I have simply added a level 0 entry, so when the data is constructed, for level 1 it will 141 | see that entry :) 142 | * ``LevelUpRewards``: The reward given to the player when it levels up, you can customize it as you want. Each key represents the reached level. 143 | 144 | .. _dt_buffs: 145 | 146 | DT_Buffs 147 | ******** 148 | 149 | * ``DisplayedName``: The name you want to assing to that buff when displayed (for example if you have a tooltip or something like that). 150 | * ``Description``: The buff description (can be used in tooltips as mentioned before). 151 | * ``Icon``: The icon to display when buff is applied. 152 | * ``Displayable``: Controls if the buff should be displayed or not when applied. 153 | 154 | .. _dt_effects: 155 | 156 | DT_Effects 157 | ********** 158 | 159 | * ``DisplayedName``: The name you want to assing to that effect when displayed (for example if you have a tooltip or something like that). 160 | * ``Description``: The effect description (can be used in tooltips as mentioned before). In this case, if you write *{value}* in it, 161 | it will be parsed with the value the effect has. 162 | * ``Icon``: The icon to display when effect is applied. 163 | * ``Displayable``: Controls if the effect should be displayed or not when applied. 164 | 165 | As you can see ``DT_Buffs`` and ``DT_Effects`` are almost identical, but i prefered to have them in separate data tables so if you want to 166 | add new data for buffs or i decide to include new features on them, it can be done without interfere in the effects and viceversa. Moreover, 167 | these tables are not used by components as ``DT_Stats``, ``DT_Attributes`` or ``DT_Leveling``, in this case we use them to refer to a buff 168 | or effect, very useful to retrieve neccessary data on demand (in widgets for example). 169 | 170 | .. Tip:: You can create your own data tables if you want to organize them differently. For example, you can have one datatable for the sets of stats 171 | of your enemies, and other one for your each of your character types of your game. `Here `__ you have 172 | a video explaining data tables. 173 | 174 | .. _enums: 175 | 176 | Enums 177 | ^^^^^ 178 | All the enums used in the system: 179 | 180 | * ``e_Stat``: Contains all the stats that you have in your game. 181 | * ``e_Attribute`` : Contains all the attributes that you have in your game. 182 | * ``e_ExperienceFormulaType``: The leveling experience formulas that you use in your game. 183 | 184 | .. _structs: 185 | 186 | Structs 187 | ^^^^^^^ 188 | All the structs used in the system by the components, data tables, save / load system, etc. 189 | 190 | * ``s_Attribute``: It is used by ``BPC_Attributes`` to keep your attributes bonuses and final values correctly calculated. 191 | * ``s_AttributeBonus``: Used to store the flat and percentage bonuses that can be applied to attributes. 192 | * ``s_AttributesData``: Specifies the data each row has on :ref:`dt_attributes`. 193 | * ``s_AttributesSaveData``: You can see it as a data packet that contains all the attributes saved data for a particular actor. 194 | * ``s_Buff``: Contains the stats and attributes bonuses, duration and so on that you configure when applying a buff. 195 | * ``s_BuffStatic``: Buff data which is always the same for that buff (used in :ref:`dt_buffs`). 196 | * ``s_DynamicBuffData``: Used internally by ``BPC_Stats`` to keep track of the buffs timing. 197 | * ``s_Effect``: Contains the effect value, duration and so on that you configure when applying a effect. 198 | * ``s_EffectStatic``: Effect data which is always the same for that effect (used in :ref:`dt_effects`). 199 | * ``s_DynamicEffectData``: Used internally by ``BPC_Stats`` to keep track of the effects ticks and timing. 200 | * ``s_LevelingData``: Specifies the data each row has on :ref:`dt_leveling`. 201 | * ``s_LevelUpReward``: Here you can configure the reward you want to give to an actor when it levels up (applied also by yourself). 202 | * ``s_LevelingSaveData``: Contains all the leveling data to be saved, like level, experience, etc. 203 | * ``s_Stat``: It is used by ``BPC_Stats`` to keep your stats bonues and final values correctly calculated. 204 | * ``s_StatBonus``: Used to store the flat and percentage bonuses that can be applied to stats. 205 | * ``s_StatsData``: Specifies the data each row has on :ref:`dt_stats`. 206 | * ``s_StatsSaveData``: All the stats data used to save and load from it. 207 | 208 | .. _ui: 209 | 210 | UI 211 | ^^ 212 | This folder contain a set of widgets to show how your own widget could be implemented, if you dont have you own widgets design yet, you can use this ones! 213 | The only thing you need to do for your custom widgets is adding the :ref:`interfaces` you want depending on what data is going to be displayed in that widget. 214 | For example you can see that the ``WB_Stat`` implements the ``BPI_Stats`` interface, and the ``WB_Bar`` implements both ``BPI_Buffs`` and 215 | ``BPI_Effects`` interfaces to display buffs and effects on it. 216 | 217 | As they are only 4 widgets with very little code, i suggest you to give a look at them and the variables they have. It wont take you much time and it will help you 218 | later when adding new stats and attributes ;) 219 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. OpenRPG: Stats documentation master file, created by 2 | sphinx-quickstart on Wed May 8 09:43:36 2019. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | OpenRPG: Stats 7 | ============== 8 | 9 | Overview 10 | -------- 11 | 12 | Welcome to the OpenRPG Stats system documentation! This **powerful, modular, flexible** and **efficient** stats system will allow you 13 | to create not only stats with **buffs** and **effects**, but **also attributes** and **custom leveling system**, very common in most RPG games. 14 | You will be able to **extend any actor functionality** in your game with the features of this system **easily** and getting it implemented very quickly! 15 | 16 | It has been structured to be **easy to understand and follow**, so everyone is capable of understanding how the whole system works, and with 17 | this documentation every aspect of it will be carefully explained. Even though im a completely beginner on documenting, i have tried to 18 | structure it from a **general overview** of the folder structure and its content to a **deeper look** at each part of the whole system. On each part i will show 19 | you some comprehensive guides that will clarify how to expand the system to adapt every aspect of it to your needs, as well as a look at the most important 20 | blueprints that handles the overall system functionality, which are the actor components. Then you will learn how to migrate and integrate the system into 21 | your own project. 22 | 23 | .. Hint:: If you like it dont forget to leave a star on `GitHub `__ 24 | and also it would be a huge help if you give me all your feedback about errors you find or some features that you would like to be implemented! 25 | 26 | .. toctree:: 27 | :maxdepth: 2 28 | :caption: Contents: 29 | 30 | features.rst 31 | folder_structure.rst 32 | core_components.rst 33 | stats.rst 34 | attributes.rst 35 | leveling.rst 36 | migration.rst 37 | integration.rst 38 | -------------------------------------------------------------------------------- /docs/integration.rst: -------------------------------------------------------------------------------- 1 | Integration 2 | =========== 3 | 4 | In the previous section you learned how to migrate the system into your own project. Now im going to 5 | show you the necessary steps to get it integrated into your project. 6 | 7 | If you migrated the system with the demo content, the only thing you need to do is telling your project 8 | to use the demo classes already built. You can achieve it by setting the ``BP_DemoGI`` as your game instance in your project 9 | settings (just search game instance and select it) and in your **GameMode** set the ``BP_DemoCharacter`` as 10 | the **Pawn** class. With that, you have everything ready to go! 11 | 12 | On the other hand, if you have migrated the system with no demo content, there are more things to do, but i promise 13 | they are easy and fast (just as done in the demo content). Lets go step by step. 14 | 15 | Widgets setup 16 | ------------- 17 | 18 | First you will need a widget that contains all of the other widgets you have created to show your stats, attributes and/or 19 | leveling data. In your widgets just make sure you implement the proper :ref:`interfaces` that provides the data you want to display on them. 20 | If you dont have one main widget then just simply create a new widget blueprint (lets call it ``WB_MainWidget``) and add the widgets into its canvas panel. 21 | Adjust them to fit your needs and the widgets setup will be completed! 22 | 23 | Character setup 24 | --------------- 25 | 26 | In your character blueprint add the components you want using the green button *Add Component* at the top left side. When done, click on each component 27 | and configure the variables under the *Settings* category in the details panel (check the explanation of each variable in the :ref:`settings_variables`). 28 | Now go to the **BeginPlay** event (or whatever event you have that is called when game initializes), then you need to create a widget and that will be 29 | the ``WB_MainWidget`` we created before, then save it in a variable. Now for each component you have to set them up like explained in the :ref:`initialization` section. 30 | Remember that now you have access to all the widgets because we saved the main one in a variable. Then if you want to put some keyboard controls thats completely 31 | up to you, for example you can set the C key to save all the data. 32 | 33 | .. Note:: Its not 100% necessary to have a ``WB_MainWidget`` that has all of your other widgets. If you have added some widgets directly to the viewport in your project, 34 | its ok as long as you can give the proper component a reference to the widget you want, using the **AddCustomWidgets** function. 35 | 36 | With that done, **everything is finished and you have completely integrated the system into your project!** Easy, right? Now its your turn to create your own stats, attributes, 37 | leveling profiles, buffs, effects and everything you need to suit your game requirements ;) 38 | -------------------------------------------------------------------------------- /docs/leveling.rst: -------------------------------------------------------------------------------- 1 | Leveling 2 | ======== 3 | 4 | This section will cover all the leveling system related functionality. In this case i will explain you how to create your own leveling profiles 5 | and your own experience formulas if you have a formula based experience assignation to each of your levels. For example you can have one leveling 6 | profile depending on your character type or the difficulty mode of your game. As all the leveling functionality is implemented in ``BPC_Leveling``, 7 | you have a detailed explanation of its variables, functions and dispatchers at the end of this section. 8 | 9 | .. _creating_leveling_profiles: 10 | 11 | Creating new leveling profiles 12 | ------------------------------ 13 | 14 | This process is also datatable oriented, which makes the process very easy to manage: 15 | 16 | 1. Go to :ref:`dt_leveling` and create a new row name (lets call it *Test* for example). 17 | 2. Fill the leveling settings you want to have for that profile. 18 | 3. Go to your class that has the leveling component you want to load that data. 19 | 4. Click on the leveling component and in the *Details* panel, you will see the ``LevelingTableRow`` variable under the *Settings* category, 20 | just put the row name you created before (in this case it would be *Test*). 21 | 22 | .. Note:: If you dont use a formula, make sure you fill the ``NeededExperiencePerLevel`` variable 23 | manually from ``StartingLevel`` to ``MaxLevel`` in the datatable. 24 | 25 | .. _adding_exp_formulas: 26 | 27 | Adding new experience formulas 28 | ------------------------------ 29 | 30 | This process has 2 steps: creating the formula itself and its calculus implementation. 31 | 32 | 1. Go to ``e_ExperienceFormulaType`` under the :ref:`enums` folder and add your 33 | new formula name. 34 | 2. In ``BPC_Leveling``, you will see there is a function called **ApplyExperienceFormula**, just open it 35 | and now you will have a new pin available in the *Switch* node. You just have to implement your calculations there 36 | as you see in the examples i have provided. The function will give you the level that the experience is calculated for. 37 | 38 | .. Tip:: Unreal Engine has a dedicated node for math expressions as you have seen in the examples, if you want to get more 39 | information about it `here `__ you 40 | have a link to the official documentation. 41 | 42 | .. _bpc_leveling: 43 | 44 | BPC_Leveling 45 | ------------ 46 | 47 | .. _leveling_variables: 48 | 49 | Variables 50 | ^^^^^^^^^ 51 | 52 | * ``StartingLevel``: The actor starting level. 53 | * ``MaxLevel``: Maximum level the actor can reach. When reached, it wont accept any experience points. 54 | * ``CurrentLevel``: The current actor level. 55 | * ``CurrentExperience``: The current actor experience. 56 | * ``NeededExperience``: The experience that the actor needs to reach next level. 57 | * ``TotalExperience``: The total experience that the actor has received (from **StartingLevel** to **CurrentLevel** + **CurrentExperience**) 58 | * ``NeededExperiencePerLevel``: The levels that the actor can reach and the needed experience for each one. It will be constructed by formula or 59 | by datatable as said in the :ref:`dt_leveling` section. 60 | 61 | .. _leveling_functions: 62 | 63 | Functions 64 | ^^^^^^^^^ 65 | 66 | * ``ReceiveExperience``: Takes some experience and sums it to the **TotalExperience** and **CurrentExperience** variables. 67 | If this one is greater than the **NeededExperience** it will loop leveling up and updating them until **CurrentExperience** is less 68 | than the **NeededExperience**. This is because the actor can get a huge amount of experience which can cause leveling a few levels at once with just 1 call 69 | to the function. 70 | * ``UpdateNeededExperience``: Just updates **NeededExperience** with the value in **NeededExperiencePerLevel** for the new reached level. 71 | * ``LevelUp``: Increases **CurrentLevel** by 1, then it calls **AddStatsPerLevel** and **AddAttributesPerLevel** if any **BPC_Stats** or 72 | **BPC_Attributes** was found on initialization, then it gets and send the level reward to be handled by the owning actor through the 73 | **OnReceiveLevelUpReward** dispatcher. 74 | * ``ApplyExperienceFormula``: Here you implement you own formulas calculations as explained in :ref:`adding_exp_formulas`. 75 | * ``CreateNeededExperienceByFormula``: Called in the initialization when using a formula to set the experience per level. It will loop from **StartingLevel** to 76 | **MaxLevel** applying the formula for each level and setting the values in the **NeededExperiencePerLevel** variable. 77 | * ``GetLevelingData``: Used to get the data in **LevelingTable** with the row you have set up in the variable **LevelingDataRow**. 78 | 79 | .. _leveling_dispatchers: 80 | 81 | Dispatchers 82 | ^^^^^^^^^^^ 83 | 84 | * ``OnExperienceReceived`` 85 | * ``OnLevelUp`` 86 | * ``OnReceiveLevelUpReward`` 87 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/migration.rst: -------------------------------------------------------------------------------- 1 | Migration 2 | ========== 3 | 4 | In this section im going to show you how extremely easy it is to migrate the system into your own project. 5 | Typically, the migration process is very easy, but the problem is that usually, due to assets that references 6 | other ones, you get some assets that you didnt want to have in your project, and you need to remove them manually. 7 | While developing this system, i tried my best to isolate funtionality, making the systems as much modular as possible, which 8 | reduces the dependencies between them, so when migrating you will only get the most important assets. 9 | 10 | As you have seen, the project has two folders: ``Demo`` and ``OpenRPG_Stats``. You have 2 options when migrating: 11 | 12 | Migrating system only 13 | --------------------- 14 | 15 | If you want to migrate the system to implement it by your own with no demo content, just follow these steps: 16 | 17 | 1. Right click the ``OpenRPG_Stats`` folder and in the context menu click on the **Migrate** option. The engine will show you 18 | a list with all the files that are going to be migrated. 19 | 2. Click **Ok** and you will now have to look for the *Content* folder of your project 20 | 3. Select it and confirm the migration. 21 | 22 | When done, the system will be completely migrated and you can start implementing it into your project! 23 | 24 | .. Note:: If you noticed, in the migration files list, the *Icons* folder of the ``Demo`` folder will be migrated as well, because the data tables 25 | *DT_Buffs* and *DT_Effects* are using those icons. If you dont want to migrate them because they are horrible, then 26 | before starting the migration you just need to clear the icons for those data tables and save everything. 27 | 28 | Migrating system and demo content 29 | --------------------------------- 30 | 31 | If you also want the demo implementation, the process is almost the same as before. 32 | The only difference is that you need to right click the ``Demo`` folder, not the ``OpenRPG_Stats``. 33 | 34 | If you have any problem just take a look at the `migration documentation `__ 35 | from the Unreal Engine official docs. Once you have migrated what you want, you are ready to go to the :doc:`./integration` section. 36 | -------------------------------------------------------------------------------- /docs/stats.rst: -------------------------------------------------------------------------------- 1 | Stats 2 | ===== 3 | 4 | In this section firstly im going to show you how easy is to add new stats and sets of stats to your actors like enemies or characters, 5 | as well as how to add new buffs and effects to your game. After that, as all functionality related to stats is implemented in ``BPC_Stats``, 6 | i will explain its variables, functions and dispatchers so you can understand how it works and what can you do with it. 7 | 8 | .. _adding_new_stats: 9 | 10 | Adding new stats 11 | ---------------- 12 | 13 | Adding new stats is a very straightforward process: 14 | 15 | 1. Go to ``e_Stat`` under the :ref:`enums` folder and add your new stat. 16 | 2. Then in your widget that displays all the stats, add a new ``WB_Stat``, select it and you will see in the *Details* 17 | panel that it has some exposed variables. Fill the enum variable with your new stat and configure the rest of variables as you want. 18 | 3. Make sure you add that new widget to the widgets that the component has to refresh with the **AddCustomWidgets** function. 19 | 20 | .. Tip:: To remove a stat the process is exactly the inverse, just remove the widget and the entry in the enum. 21 | 22 | .. _creating_stats_sets: 23 | 24 | Creating sets of stats 25 | ---------------------- 26 | 27 | Once you have created your desired stats, then im sure you want to create a set of stats to, for example, assign a different one 28 | per character race in your game. This is also extremely easy: 29 | 30 | 1. Go to :ref:`dt_stats` and create a new row, you can call it *Ninja* for example. 31 | 2. Then just fill the stats you want to have for that particular set. 32 | 3. Go to your class that has the stats component you want to load that data (lets suppose you have a *BP_Ninja* class). 33 | 4. Click on the stats component and in the *Details* panel you will see the ``StatsTableRow`` variable under the *Settings* category, 34 | just put the row name you created before (in this case it would be *Ninja*). 35 | 36 | .. Note:: I have used ``DT_Stats`` as the datatable for the example, if you have created your own one then its perfect, just make sure you put that 37 | table in the ``StatsTable`` of the component. 38 | 39 | **Done!** Now when your *BP_Ninja* class is initialized, it will load the set of stats you have configured in the datatable (remember 40 | it will only happen if there is no previous saved data). 41 | 42 | .. _adding_new_buffs: 43 | 44 | Adding new buffs 45 | ---------------- 46 | 47 | Buffs have two parts of data. One of them is the static data, which means it will never change (like the icon, the description, etc). The other one 48 | is the dynamic data, which can be the duration, the bonuses to stats and attributes, if it is going to be permanent, etc. Lets create the static 49 | data first: 50 | 51 | 1. Go to :ref:`dt_buffs` and create a new row (lets call it *FireBall* for example). 52 | 2. Fill the required data for that particular buff. 53 | 54 | With that now you are able to apply a buff. When you apply a buff using the *ApplyBuff* function in ``BPC_Stats``, it will ask you for the row name 55 | you have created (the static data, *FireBall* in the example) and the dynamic data of the buff in that moment. This last one is completely up to you 56 | as it will may change depending on the situation and your own game requirements. 57 | 58 | .. _adding_new_effects: 59 | 60 | Adding new effects 61 | ------------------ 62 | 63 | The process is almost the same as buffs. The difference is that the implementation of each effect is completely up to you. 64 | 65 | 1. Go to :ref:`dt_effects` and create a new row (lets call it *Poison* for example). 66 | 2. Fill the required data for that particular effect. 67 | 68 | Now, as mentioned, the way each effect is implemented is completely up to you using the dispatcher **OnEffectTick** in the actors that implement the stats component. 69 | For example the *Poison* effect of the example can remove 3% of the actor's *Health* each time it ticks. You can see the ``BP_DemoCharacter`` to 70 | check some examples. 71 | 72 | .. Note:: Buffs and effects have the same static data, but they have been kept separated to make it more flexible, so if you expand 73 | the buffs static data, it doesnt interfer with the effects data. 74 | 75 | .. _bpc_stats: 76 | 77 | BPC_Stats 78 | --------- 79 | 80 | .. _stats_variables: 81 | 82 | Variables 83 | ^^^^^^^^^ 84 | 85 | * ``UseAttributeBonusForPercentageCalculations?``: If true, the system will treat the stat base value **and** the bonuses 86 | from attributes for the percentage bonus calculations. If false, it will only consider the stat base value. 87 | 88 | * ``Stats``: The updated values of the stats set. It also keeps the bonuses. 89 | 90 | * ``CurrentStats``: The value of the stats that have current value, for example health, mana, hunger, etc. 91 | 92 | * ``Buffs``: The currently applied buffs and its dynamic data. 93 | 94 | * ``BuffsTimer``: This timer will keep track of the buffs remaining time and will fire an event to remove 95 | the one whose duration has expired. 96 | * ``NextShortestBuff``: The buff with the shortest remaining time, it will be 97 | the next one to be removed when **BuffsTimer** expires. 98 | * ``Effects``: The currently applied effects and its dynamic data. 99 | * ``EffectsTimer``: This timer will keep track of the effects remaining tick time and will fire an event to remove 100 | and tick them when needed. 101 | * ``NextEffectToTick``: The effect with the shortest remaining tick time, which will 102 | get its ticks count increased by 1 when **EffectsTimer** expires. 103 | 104 | .. _stats_functions: 105 | 106 | Functions 107 | ^^^^^^^^^ 108 | 109 | Stats 110 | """"" 111 | 112 | * ``GetStatValue``: Returns the final value of the stat passed as input, with all the bonuses applied and calculated. 113 | If that stat is also a current stat, you will get the proper value in the *Current Stat* output pin. 114 | * ``AddStatBonuses``: It receives flat and percentage bonuses and sums them to the **Stats** component variable, then it calls 115 | **CalculateStatsFinalValues**. 116 | * ``RemoveStatBonuses``: Same as the previous one, but it will substract the bonuses instead of summing them. 117 | * ``CalculateStatsFinalValues``: Recalculates the values of the stats it receives as input. It will also take care of the 118 | current stat values to clamp them properly. 119 | * ``ModifyCurrentStatValue``: Modifies the stat passed as input with a value. It will make sure to clamp it between 0 and the final 120 | value that the stat has at the moment (it would be a problem if you can have more health than the maximum health). 121 | * ``AddStatsPerLevel``: It wil be called by **BPC_Leveling** if the owning actor implements leveling system and it levels up, adding 122 | the values you have set up in the **StatsPerLevel** on **StatsTable**. 123 | * ``IsCurrentStat``: It will return true if the stat passed as input is a current stat. 124 | * ``GetStatsData``: Used to get the data in **StatsTable** with the row you have set up in the variable **TableDataRow**. 125 | 126 | Buffs 127 | """"" 128 | 129 | * ``ApplyBuff``: Applies the buff passed as input. If the buff is already applied, it will just remove the current one to apply the new one. 130 | * ``RemoveBuff``: Removes the buff passed as input if it is already applied. 131 | * ``IsBuffActive?``: Returns true whether a buff is applied. 132 | * ``UpdateBuffsRemainingTime``: It will update the remaining time of each applied buff. 133 | * ``GetShortestBuffTime``: When the buffs remaining time is updated, this function will return the buff with the shortest remaining time, that is, 134 | the next buff to be removed when the **BuffsTimer** expires. 135 | * ``IsBuffPermanent?``: Returns true if buff is applied and permanent. 136 | 137 | Effects 138 | """"""" 139 | 140 | * ``ApplyEffect``: Applies the buff passed as input. If the effect is already applied, it will just remove the current one to apply the new one. 141 | * ``RemoveEffect``: Removes the effect passed as input. 142 | * ``IsEffectActive?``: Returns true whether an effect is applied. 143 | * ``UpdateEffectRemainingIntervalTime``: It will update the remaining tick time of each applied effect. 144 | * ``IncrementEffectTicks``: When an effect tick is executed, this function will increment its ticks count and if that updated count is equal 145 | to the ticks it was going to do, it will call **RemoveEffect** (except when its permanent). 146 | * ``GetShortestEffectTime``: When the effects remaining tick time is updated, this function will return the effect with the shortest remaining tick time, that is, 147 | the next effect to tick when the **EffectsTimer** expires. 148 | * ``IsEffectPermanent?``: Returns true if effect is applied and permanent. 149 | 150 | .. _stats_dispatchers: 151 | 152 | Dispatchers 153 | ^^^^^^^^^^^ 154 | 155 | The component has a set of dispatchers that will be called when certain events happen, so you can override them in the actor that owns the component. 156 | The names are very descriptive so im just going to mention them: 157 | 158 | * ``OnBuffApplied`` 159 | * ``OnBuffRemoved`` 160 | * ``OnEffectApplied`` 161 | * ``OnEffectRemoved`` 162 | * ``OnEffectTick`` 163 | * ``OnStatFinalValueChanged`` 164 | * ``OnStatCurrentValueChanged`` 165 | --------------------------------------------------------------------------------