r_logentry->[RECIPIENT_definite]'s [destroyed_targets] was [destroyed_past] by [INITIATOR_definite]'s [WEAPON_projectile_label].
+
r_logentry->[RECIPIENT_definite]'s [destroyed_targets] was [destroyed_past] by [INITIATOR_definite]'s [expert] [WEAPON_projectile_label].
+
r_logentry->[RECIPIENT_definite]'s [destroyed_targets] was [destroyed_past] into [destroyed_suffix] by [INITIATOR_definite]'s [WEAPON_projectile_label].
+
r_logentry->[INITIATOR_definite] [expertly] returned the incoming fire. It [destroyed_past] [RECIPIENT_definite]'s [destroyed_targets].
+
r_logentry(p=0.7)->[INITIATOR_definite], wielding [INITIATOR_possessive] [WEAPON_label] [expertly], [damaged_past] [RECIPIENT_definite] in the [damaged_targets].
r_logentry(recipient_partDestroyed_count==0)->[RECIPIENT_definite]'s [damaged_targets] was [damaged_past] by [INITIATOR_definite]'s [WEAPON_projectile_label].
+
r_logentry(recipient_partDestroyed_count==0)->[RECIPIENT_definite]'s [damaged_targets] was [damaged_past] by [INITIATOR_definite]'s [expert] [WEAPON_projectile_label].
+
r_logentry(recipient_partDestroyed_count==0)->[RECIPIENT_definite]'s [damaged_targets] was [damaged_past] by [INITIATOR_definite]'s shot.
+
+
+
r_logentry(p=3)->[INITIATOR_definite]'s [WEAPON_projectile_label] [destroyed_past] [RECIPIENT_definite]'s [destroyed_targets] and [damaged_past] [RECIPIENT_possessive] [damaged_targets].
r_logentry(p=6)->[INITIATOR_definite] sent a wild ricochet - [destroyed_present] [RECIPIENT_definite]'s [destroyed_targets] and [damaged_present] [RECIPIENT_possessive] [damaged_targets].
+
+
+
r_logentry(p=0.2)->[INITIATOR_definite] hit [RECIPIENT_definite] with a [WEAPON_projectile_label].
+
r_logentry(p=0.2)->[INITIATOR_definite]'s [WEAPON_projectile_label] hit [RECIPIENT_definite].
+
r_logentry(p=0.4)->[INITIATOR_definite] [missed] [ORIGINALTARGET_definite] and hit [RECIPIENT_definite] with a [WEAPON_projectile_label].
+
r_logentry(p=0.4)->[INITIATOR_definite]'s [WEAPON_projectile_label] [missed] [ORIGINALTARGET_definite] and hit [RECIPIENT_definite].
+
r_logentry(p=0.2)->[INITIATOR_definite] hit [RECIPIENT_definite] with a [WEAPON_projectile_label] intended for [ORIGINALTARGET_definite].
+
r_logentry(p=0.2)->[INITIATOR_definite] hit [RECIPIENT_definite] with a projectile.
r_logentry(p=2)->[INITIATOR_definite]'s [WEAPON_projectile_label] [missed] [ORIGINALTARGET_definite] and [damaged_past] [RECIPIENT_definite][damaged_target_possessive_opt] [deflected_result].
+
r_logentry->[RECIPIENT_definite][damaged_target_possessive_opt] was [damaged_past] by [INITIATOR_definite]'s [WEAPON_projectile_label] [deflected_result].
+
+
r_logentry(p=0.2)->[INITIATOR_definite] hit [RECIPIENT_definite][damaged_target_possessive_opt] with a shot [deflected_result].
+
r_logentry(p=0.2)->[INITIATOR_definite]'s projectile hit [RECIPIENT_definite][damaged_target_possessive_opt] [deflected_result].
+
r_logentry(p=0.4)->[INITIATOR_definite] [missed] [ORIGINALTARGET_definite] and hit [RECIPIENT_definite][damaged_target_possessive_opt] with a [WEAPON_projectile_label] [deflected_result].
+
r_logentry(p=0.4)->[INITIATOR_definite]'s [WEAPON_projectile_label] [missed] [ORIGINALTARGET_definite] and hit [RECIPIENT_definite][damaged_target_possessive_opt] [deflected_result].
+
r_logentry(p=0.2)->[INITIATOR_definite] hit [RECIPIENT_definite][damaged_target_possessive_opt] with a [WEAPON_projectile_label] intended for [ORIGINALTARGET_definite] [deflected_result].
+
+
+
+
+
+
+
diff --git a/1.4/Defs/ThinkTreeDefs/InsertHook_AbilityUserAI.xml b/1.4/Defs/ThinkTreeDefs/InsertHook_AbilityUserAI.xml
new file mode 100644
index 00000000..dbea8898
--- /dev/null
+++ b/1.4/Defs/ThinkTreeDefs/InsertHook_AbilityUserAI.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ InsertHookTest
+ Humanlike_PostMentalState
+ 1000
+
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/1.4/Defs/WorldObjectDefs/WorldObjects.xml b/1.4/Defs/WorldObjectDefs/WorldObjects.xml
new file mode 100644
index 00000000..eaeee9ce
--- /dev/null
+++ b/1.4/Defs/WorldObjectDefs/WorldObjects.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ WorldObject_ProgressBar
+
+ true
+ This should not be visible to players.
+ JecsTools.WorldObject_ProgressBar
+ World/WorldObjects/TribalFactionBase
+ true
+ World/WorldObjects/Expanding/RoutePlannerWaypoint
+ 1
+ true
+ false
+ false
+
+
+
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/DamageDef/AbilityUser_Damages.xml b/1.4/Languages/ChineseSimplified/DefInjected/DamageDef/AbilityUser_Damages.xml
new file mode 100644
index 00000000..ad77ae87
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/DamageDef/AbilityUser_Damages.xml
@@ -0,0 +1,8 @@
+
+
+
+ 灼伤(光剑)
+ {0}被击毙了。
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/JobDef/AbilityUser_Jobs.xml b/1.4/Languages/ChineseSimplified/DefInjected/JobDef/AbilityUser_Jobs.xml
new file mode 100644
index 00000000..8d26f05d
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/JobDef/AbilityUser_Jobs.xml
@@ -0,0 +1,8 @@
+
+
+
+ 使用原力技
+ 使用原力技
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompDeflector_Jobs.xml b/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompDeflector_Jobs.xml
new file mode 100644
index 00000000..67ca2bd1
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompDeflector_Jobs.xml
@@ -0,0 +1,7 @@
+
+
+
+ 偏转了
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompInstalledPart_Jobs.xml b/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompInstalledPart_Jobs.xml
new file mode 100644
index 00000000..b704c3e8
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompInstalledPart_Jobs.xml
@@ -0,0 +1,8 @@
+
+
+
+ 安装TargetA。
+ 卸载TargetA。
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompSlotLoadable_Jobs.xml b/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompSlotLoadable_Jobs.xml
new file mode 100644
index 00000000..dafa94e2
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/JobDef/CompSlotLoadable_Jobs.xml
@@ -0,0 +1,7 @@
+
+
+
+ 装备TargetA。
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/RecipeDef/Recipes_Add_Make.xml b/1.4/Languages/ChineseSimplified/DefInjected/RecipeDef/Recipes_Add_Make.xml
new file mode 100644
index 00000000..30b216a8
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/RecipeDef/Recipes_Add_Make.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+ 打造[SW]开槽刀
+ 打造一把开槽刀。
+ 正在打造开槽刀中。
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/StatDef/CompDeflection_StatWorkers.xml b/1.4/Languages/ChineseSimplified/DefInjected/StatDef/CompDeflection_StatWorkers.xml
new file mode 100644
index 00000000..f670f100
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/StatDef/CompDeflection_StatWorkers.xml
@@ -0,0 +1,8 @@
+
+
+
+ 偏转几率
+ 以近战武器偏转远程抛射物的几率。
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/ThingDef/CompSlotLoadable_Slots.xml b/1.4/Languages/ChineseSimplified/DefInjected/ThingDef/CompSlotLoadable_Slots.xml
new file mode 100644
index 00000000..bf4304e2
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/ThingDef/CompSlotLoadable_Slots.xml
@@ -0,0 +1,7 @@
+
+
+
+ 测试
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/ThingDef/CompSlotLoadable_ThingDefExample.xml b/1.4/Languages/ChineseSimplified/DefInjected/ThingDef/CompSlotLoadable_ThingDefExample.xml
new file mode 100644
index 00000000..36d751d1
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/ThingDef/CompSlotLoadable_ThingDefExample.xml
@@ -0,0 +1,8 @@
+
+
+
+ [SW]开槽刀
+ 一件人类早期使用的原始工具,既可以当日常工具也可以当武器使用。
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/DefInjected/WorldObjectDef/WorldObjects.xml b/1.4/Languages/ChineseSimplified/DefInjected/WorldObjectDef/WorldObjects.xml
new file mode 100644
index 00000000..6943461d
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/DefInjected/WorldObjectDef/WorldObjects.xml
@@ -0,0 +1,8 @@
+
+
+
+ progress bar
+ This should not be visible to players.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/Keyed/AbilityUser.xml b/1.4/Languages/ChineseSimplified/Keyed/AbilityUser.xml
new file mode 100644
index 00000000..f344b80a
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/Keyed/AbilityUser.xml
@@ -0,0 +1,25 @@
+
+
+
+ 禁用
+
+ 类型:
+ 有效范围
+ 以自己为目标
+ 以其他为目标
+ 目标位置
+ 冷却:
+ 附加
+ 精神影响几率
+ 影响几率
+ {0}需要时间恢复能量
+
+
+ 有效范围属性
+ 目标:
+ 角色
+ 误伤:
+ 最大目标数:
+ 从施法者开始:
+
+
diff --git a/1.4/Languages/ChineseSimplified/Keyed/CompActivatableEffect.xml b/1.4/Languages/ChineseSimplified/Keyed/CompActivatableEffect.xml
new file mode 100644
index 00000000..20831c8f
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/Keyed/CompActivatableEffect.xml
@@ -0,0 +1,6 @@
+
+
+
+ 警告:{0}当前装备武器是无效的!
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/Keyed/CompDeflector.xml b/1.4/Languages/ChineseSimplified/Keyed/CompDeflector.xml
new file mode 100644
index 00000000..a9cd358f
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/Keyed/CompDeflector.xml
@@ -0,0 +1,19 @@
+
+
+
+ 没有配备导流板
+
+ 偏转几率
+ 决定该武器反射袭击者的抛射物或子弹的偏转几率。
+
+ 最大偏转几率
+ 每点{0}技能能提供角色{1}的反射目标抛射物的偏转几率。理论上最大的偏转几率为{2}。
+
+ 每点{0}技能增加的偏转百分比
+ 每点{0}技能提供角的偏转抛射物的几率。
+
+ 偏转几率=(基础偏转几率+(原力等级*每级加成))×操作能力
+ 基础偏转几率
+ 每点技能增加的偏转百分比
+
+
\ No newline at end of file
diff --git a/1.4/Languages/ChineseSimplified/Keyed/CompInstalledPart.xml b/1.4/Languages/ChineseSimplified/Keyed/CompInstalledPart.xml
new file mode 100644
index 00000000..b3fa95f5
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/Keyed/CompInstalledPart.xml
@@ -0,0 +1,9 @@
+
+
+
+ 安装在{2}上
+ 卸下{0}
+ {0}将{1}安装在{2}上
+ {0}将{1}从{2}上卸下
+
+
diff --git a/1.4/Languages/ChineseSimplified/Keyed/Eng_WorldObjectMods.xml b/1.4/Languages/ChineseSimplified/Keyed/Eng_WorldObjectMods.xml
new file mode 100644
index 00000000..e3666220
--- /dev/null
+++ b/1.4/Languages/ChineseSimplified/Keyed/Eng_WorldObjectMods.xml
@@ -0,0 +1,8 @@
+
+
+
+ 该位置没有可交易的商队
+ 资源:{0}
+ 失败。需要材料{0}:{1} 。
+
+
diff --git a/1.4/Languages/English/Keyed/AbilityUser.xml b/1.4/Languages/English/Keyed/AbilityUser.xml
new file mode 100644
index 00000000..1e3b7cd6
--- /dev/null
+++ b/1.4/Languages/English/Keyed/AbilityUser.xml
@@ -0,0 +1,29 @@
+
+
+
+No line of sight
+
+No targets available
+
+DISABLED
+
+Type:
+Area of Effect
+Targets Self
+Targets Other
+Targets Location
+Cooldown:
+Extra
+Mental State Chance
+Effect Chance
+{0} needs time to recharge
+
+
+Area of Effect Properties
+Targets:
+Characters
+Friendly Fire:
+Max Targets:
+Starts from caster:
+
+
diff --git a/1.4/Languages/English/Keyed/CompActivatableEffect.xml b/1.4/Languages/English/Keyed/CompActivatableEffect.xml
new file mode 100644
index 00000000..3142c3bf
--- /dev/null
+++ b/1.4/Languages/English/Keyed/CompActivatableEffect.xml
@@ -0,0 +1,6 @@
+
+
+
+ WARNING: {0}'s current weapon is deactivated!
+
+
\ No newline at end of file
diff --git a/1.4/Languages/English/Keyed/CompDeflector.xml b/1.4/Languages/English/Keyed/CompDeflector.xml
new file mode 100644
index 00000000..2051f04d
--- /dev/null
+++ b/1.4/Languages/English/Keyed/CompDeflector.xml
@@ -0,0 +1,20 @@
+
+
+
+ No deflector equipped
+
+ Deflect chance
+ Determines how often this weapon returns projectiles back at the attacker.
+
+ Max deflect chance
+ For each point in {0}, the user gains a {1} chance of deflecting the projectile back the target. {2} is the maximum possible deflection chance.
+
+
+ Deflect % per {0} skill
+ For each level in {0}, the user gains this much % chance to deflect a projectile.
+
+ Deflection chance = (Base deflect chance + (Skill Level * % per Skill Level)) * Manipulation
+ Base deflect chance
+ Deflect % per skill level
+
+
\ No newline at end of file
diff --git a/1.4/Languages/English/Keyed/CompInstalledPart.xml b/1.4/Languages/English/Keyed/CompInstalledPart.xml
new file mode 100644
index 00000000..fa0df1f3
--- /dev/null
+++ b/1.4/Languages/English/Keyed/CompInstalledPart.xml
@@ -0,0 +1,9 @@
+
+
+
+Install on something
+Uninstall {0}
+{0} installed the {1} onto {2}
+{0} uninstalled the {1} from {2}
+
+
diff --git a/1.4/Languages/English/Keyed/CompShield.xml b/1.4/Languages/English/Keyed/CompShield.xml
new file mode 100644
index 00000000..ad7bf608
--- /dev/null
+++ b/1.4/Languages/English/Keyed/CompShield.xml
@@ -0,0 +1,18 @@
+
+
+
+ no shield equipped
+
+ shield never blocks melee attacks
+ shield never blocks ranged attacks
+ shield never absorbs damage from a blocked attack
+
+ Discard threshold
+ The hit points percentage threshold when the shield is automatically discarded by the wielder
+ shield is never automatically discarded by the wielder
+
+ Damage to fatigue factor
+ How much percent of the damage is converted to fatigue damage on a blocked attack.
+ shield wielder never gets fatigued from a blocked attack
+
+
\ No newline at end of file
diff --git a/1.4/Languages/English/Keyed/Eng_WorldObjectMods.xml b/1.4/Languages/English/Keyed/Eng_WorldObjectMods.xml
new file mode 100644
index 00000000..ff1c8a5f
--- /dev/null
+++ b/1.4/Languages/English/Keyed/Eng_WorldObjectMods.xml
@@ -0,0 +1,9 @@
+
+
+
+because no caravan is available at this location
+Resources: {0}
+Missing Specific Items. Need {1}x {2}, have only {0}
+Missing {2} Stuff. Need {1}x, have only {0}
+Failed to build {0} due to lack of resources
+
diff --git a/1.4/Languages/English/Keyed/Grapple.xml b/1.4/Languages/English/Keyed/Grapple.xml
new file mode 100644
index 00000000..7eb8aaae
--- /dev/null
+++ b/1.4/Languages/English/Keyed/Grapple.xml
@@ -0,0 +1,12 @@
+
+
+
+Grapple Success
+Grapple Failed
+Downed Attack: Grapple Success
+Sneak Attack: Grapple Success
+Restrained Victim: Grapple Success
+Sleeping Victim: Grapple Success
+Pet Victim: Grapple Success
+
+
diff --git a/1.4/Languages/English/Keyed/Misc.xml b/1.4/Languages/English/Keyed/Misc.xml
new file mode 100644
index 00000000..2a10068e
--- /dev/null
+++ b/1.4/Languages/English/Keyed/Misc.xml
@@ -0,0 +1,10 @@
+
+
+Must be placed under a ceiling.
+Must be placed on a wall.
+{0} absorbed
+Soak Amount: {0}
+Knockback Chance: {0}
+Extra Damages:
+Explosive
+
diff --git a/1.4/Languages/French/DefInjected/DamageDef/AbilityUser_Damages.xml b/1.4/Languages/French/DefInjected/DamageDef/AbilityUser_Damages.xml
new file mode 100644
index 00000000..ccff4a2d
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/DamageDef/AbilityUser_Damages.xml
@@ -0,0 +1,8 @@
+
+
+
+ brûlé
+ {0} a été abattu
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/JobDef/AbilityUser_Jobs.xml b/1.4/Languages/French/DefInjected/JobDef/AbilityUser_Jobs.xml
new file mode 100644
index 00000000..96c0d2e5
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/JobDef/AbilityUser_Jobs.xml
@@ -0,0 +1,8 @@
+
+
+
+ utiliser une capacité
+ utilise une capacité
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/JobDef/CompDeflector_Jobs.xml b/1.4/Languages/French/DefInjected/JobDef/CompDeflector_Jobs.xml
new file mode 100644
index 00000000..33627009
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/JobDef/CompDeflector_Jobs.xml
@@ -0,0 +1,7 @@
+
+
+
+ renvoit
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/JobDef/CompInstalledPart_Jobs.xml b/1.4/Languages/French/DefInjected/JobDef/CompInstalledPart_Jobs.xml
new file mode 100644
index 00000000..543ab396
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/JobDef/CompInstalledPart_Jobs.xml
@@ -0,0 +1,8 @@
+
+
+
+ installe TargetA.
+ désinstalle TargetA.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/JobDef/CompSlotLoadable_Jobs.xml b/1.4/Languages/French/DefInjected/JobDef/CompSlotLoadable_Jobs.xml
new file mode 100644
index 00000000..e09b3bf3
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/JobDef/CompSlotLoadable_Jobs.xml
@@ -0,0 +1,7 @@
+
+
+
+ équipe TargetA.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/RecipeDef/Recipes_Add_Make.xml b/1.4/Languages/French/DefInjected/RecipeDef/Recipes_Add_Make.xml
new file mode 100644
index 00000000..14bb1bd4
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/RecipeDef/Recipes_Add_Make.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+ faire un couteau d'entraînement
+ faire un couteau d'entraînement
+ fait un couteau d'entraînement
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/StatDef/CompDeflection_StatWorkers.xml b/1.4/Languages/French/DefInjected/StatDef/CompDeflection_StatWorkers.xml
new file mode 100644
index 00000000..cc66a243
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/StatDef/CompDeflection_StatWorkers.xml
@@ -0,0 +1,8 @@
+
+
+
+ chance de renvoi
+ Chance de dévier des projectiles à distance avec une arme de mêlée
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/ThingDef/CompSlotLoadable_Slots.xml b/1.4/Languages/French/DefInjected/ThingDef/CompSlotLoadable_Slots.xml
new file mode 100644
index 00000000..73ce1273
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/ThingDef/CompSlotLoadable_Slots.xml
@@ -0,0 +1,7 @@
+
+
+
+ test
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/ThingDef/CompSlotLoadable_ThingDefExample.xml b/1.4/Languages/French/DefInjected/ThingDef/CompSlotLoadable_ThingDefExample.xml
new file mode 100644
index 00000000..027fc41f
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/ThingDef/CompSlotLoadable_ThingDefExample.xml
@@ -0,0 +1,8 @@
+
+
+
+ [SW]Couteau d'entraînement
+ Outil primitif utilisé par l'humanité à ses débuts, il peut être utilisé comme outil quotidien ou comme arme.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/DefInjected/WorldObjectDef/WorldObjects.xml b/1.4/Languages/French/DefInjected/WorldObjectDef/WorldObjects.xml
new file mode 100644
index 00000000..ed041cfe
--- /dev/null
+++ b/1.4/Languages/French/DefInjected/WorldObjectDef/WorldObjects.xml
@@ -0,0 +1,8 @@
+
+
+
+ barre de progression
+ Cela ne devrait pas être visible pour les joueurs.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/Keyed/AbilityUser.xml b/1.4/Languages/French/Keyed/AbilityUser.xml
new file mode 100644
index 00000000..7da0f2ca
--- /dev/null
+++ b/1.4/Languages/French/Keyed/AbilityUser.xml
@@ -0,0 +1,25 @@
+
+
+
+DISABLED
+
+Type:
+Zone d'effet
+Cibler (moi)
+Cibler (autres)
+Emplacement de la cible
+Recharge:
+Extra
+probabilit d'tat mental
+probabilit d'effet
+{0} a besoin de temps pour recharger
+
+
+Proprits de la zone d'effet
+Cibles:
+Personnages
+Tir amie:
+Nombre de cibles maximal:
+Se dclenche a partir du sorcier:
+
+
diff --git a/1.4/Languages/French/Keyed/CompActivatableEffect.xml b/1.4/Languages/French/Keyed/CompActivatableEffect.xml
new file mode 100644
index 00000000..845d8675
--- /dev/null
+++ b/1.4/Languages/French/Keyed/CompActivatableEffect.xml
@@ -0,0 +1,6 @@
+
+
+
+ Attention: L'arme de {0} est dsactive!
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/Keyed/CompDeflector.xml b/1.4/Languages/French/Keyed/CompDeflector.xml
new file mode 100644
index 00000000..364534f5
--- /dev/null
+++ b/1.4/Languages/French/Keyed/CompDeflector.xml
@@ -0,0 +1,20 @@
+
+
+
+ Aucun déflecteur équipé
+
+ probabilité de renvoyer
+ Détermine à quelle fréquence cette arme renvoie des projectiles à l'agresseur.
+
+ Probabilité maximale de renvoi
+ Pour chaque point {0}, l'utilisateur a une probabilité de détourner le tir de {1}. La probabilité maximale de renvoi est de {2}.
+
+
+ Détournement % par {0} compétence
+ Pour chaque niveau en {0}, l'utilisateur gagne tel % de probabilité de renvoyer un projectile.
+
+ Probabilité de détournement = (probabilité de détournement + (Niveau * % par Niveau)) * Manipulation
+ Probabilité de renvoi de base
+ Renvoit % par Niveau
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/Keyed/CompInstalledPart.xml b/1.4/Languages/French/Keyed/CompInstalledPart.xml
new file mode 100644
index 00000000..3e9dabcd
--- /dev/null
+++ b/1.4/Languages/French/Keyed/CompInstalledPart.xml
@@ -0,0 +1,9 @@
+
+
+
+Installer sur quelque chose
+Retirer {0}
+{0} a install {1} sur {2}
+{0} a retir {1} de {2}
+
+
diff --git a/1.4/Languages/French/Keyed/CompShield.xml b/1.4/Languages/French/Keyed/CompShield.xml
new file mode 100644
index 00000000..7dcd3f87
--- /dev/null
+++ b/1.4/Languages/French/Keyed/CompShield.xml
@@ -0,0 +1,18 @@
+
+
+
+ pas de bouclier équipé
+
+ le bouclier ne bloque jamais les attaques de mêlée
+ le bouclier ne bloque jamais les attaques à distance
+ le bouclier n'absorbe jamais les dégâts d'une attaque bloquée
+
+ Seuil de défausse
+ Le seuil de pourcentage de points de vie nécessaire pour que le bouclier soit automatiquement défaussé par le porteur
+ Le bouclier n'est jamais automatiquement rejeté par le porteur
+
+ Facteur de dommages de fatigue
+ Quel pourcentage des dégâts est converti en dégâts de fatigue lors d'une attaque bloquée.
+ Le porteur du bouclier ne se fatigue jamais d'une attaque bloquée
+
+
\ No newline at end of file
diff --git a/1.4/Languages/French/Keyed/Eng_WorldObjectMods.xml b/1.4/Languages/French/Keyed/Eng_WorldObjectMods.xml
new file mode 100644
index 00000000..4c5b9b13
--- /dev/null
+++ b/1.4/Languages/French/Keyed/Eng_WorldObjectMods.xml
@@ -0,0 +1,8 @@
+
+
+
+car aucun convoi n'est prsent cet endroit
+Ressources: {0}
+chou construire {0} en raison d'un manque de ressources.
+
+
diff --git a/1.4/Languages/French/Keyed/Grapple.xml b/1.4/Languages/French/Keyed/Grapple.xml
new file mode 100644
index 00000000..bbad95c9
--- /dev/null
+++ b/1.4/Languages/French/Keyed/Grapple.xml
@@ -0,0 +1,12 @@
+
+
+
+Succès du grappin
+Echec du grappin
+Attaque abattue: succès du grappin
+Attaque furtive: succès du grappin
+Victime retenue: succès du grappin
+Victime endormie: succès du grappin
+Victime animal de compagnie: succès du grappin
+
+
diff --git a/1.4/Languages/French/Keyed/Misc.xml b/1.4/Languages/French/Keyed/Misc.xml
new file mode 100644
index 00000000..30aba2a1
--- /dev/null
+++ b/1.4/Languages/French/Keyed/Misc.xml
@@ -0,0 +1,10 @@
+
+
+Doit être placé sous un plafond.
+Doit être placé sur un mur.
+{0} absorbé
+Quantité de trempage: {0}
+Chance de recul: {0}
+Dégâts supplémentaires:
+Explosif
+
diff --git a/1.4/Languages/Japanese/DefInjected/DamageDef/AbilityUser_Damages.xml b/1.4/Languages/Japanese/DefInjected/DamageDef/AbilityUser_Damages.xml
new file mode 100644
index 00000000..2fb18e0d
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/DamageDef/AbilityUser_Damages.xml
@@ -0,0 +1,7 @@
+
+
+
+ 火傷
+ {0}はレーザーに焼かれて死んだ。
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/HediffDef/Shields.xml b/1.4/Languages/Japanese/DefInjected/HediffDef/Shields.xml
new file mode 100644
index 00000000..3c37f56f
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/HediffDef/Shields.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ シールド損耗
+ 少し
+ かなり
+ 厳しい
+ 枯渇
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/JobDef/AbilityUser_Jobs.xml b/1.4/Languages/Japanese/DefInjected/JobDef/AbilityUser_Jobs.xml
new file mode 100644
index 00000000..4f4d3f89
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/JobDef/AbilityUser_Jobs.xml
@@ -0,0 +1,7 @@
+
+
+
+ 能力を使用中
+ 能力を使用中
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/JobDef/CompDeflector_Jobs.xml b/1.4/Languages/Japanese/DefInjected/JobDef/CompDeflector_Jobs.xml
new file mode 100644
index 00000000..07662d64
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/JobDef/CompDeflector_Jobs.xml
@@ -0,0 +1,6 @@
+
+
+
+ 逸らしている
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/JobDef/CompInstalledPart_Jobs.xml b/1.4/Languages/Japanese/DefInjected/JobDef/CompInstalledPart_Jobs.xml
new file mode 100644
index 00000000..753833c7
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/JobDef/CompInstalledPart_Jobs.xml
@@ -0,0 +1,7 @@
+
+
+
+ TargetAを装着中
+ TargetAを取り外し中
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/JobDef/CompSlotLoadable_Jobs.xml b/1.4/Languages/Japanese/DefInjected/JobDef/CompSlotLoadable_Jobs.xml
new file mode 100644
index 00000000..9534d0cd
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/JobDef/CompSlotLoadable_Jobs.xml
@@ -0,0 +1,6 @@
+
+
+
+ TargetAをスロットに装着中
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/RulePackDef/JT_GrappleRules.xml b/1.4/Languages/Japanese/DefInjected/RulePackDef/JT_GrappleRules.xml
new file mode 100644
index 00000000..0e83ea9d
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/RulePackDef/JT_GrappleRules.xml
@@ -0,0 +1,32 @@
+
+
+
+ r_logentry->[INITIATOR_nameDef]は、[SUBJECT_definite][grappled]。
+ grappled->と取っ組み合った
+ grappled->を抑えつけた
+ grappled->を手で掴みました
+
+ r_logentry->[INITIATOR_nameDef]は、[SUBJECT_definite]を[triedtograpple]、[but][failedmeta]。
+ tried->試みた
+ tried->attempted
+ grappleinf->捕まえようと
+ grappleinf->捕らえようと
+ grappleinf->抑えつけようと
+ triedtograpple->[grappleinf][tried]が
+ but->しかし
+ but->またしても
+ but->それでも
+ but->すでに
+ failed->失敗しました
+ failed->逃げられました
+ dodged->避けました
+ dodged->外しました
+ spectacularly->見事に
+ spectacularly->無様に
+ spectacularly->完全に
+ spectacularly->ことごとく
+ failedmeta->[INITIATOR_pronoun]は[failed]
+ failedmeta->[INITIATOR_pronoun]は[spectacularly][failed]
+ failedmeta->[SUBJECT_definite]は[dodged]
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/StatCategoryDef/Shields.xml b/1.4/Languages/Japanese/DefInjected/StatCategoryDef/Shields.xml
new file mode 100644
index 00000000..099e37f5
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/StatCategoryDef/Shields.xml
@@ -0,0 +1,6 @@
+
+
+
+ シールド
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/StatDef/CompDeflection_StatWorkers.xml b/1.4/Languages/Japanese/DefInjected/StatDef/CompDeflection_StatWorkers.xml
new file mode 100644
index 00000000..8def147d
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/StatDef/CompDeflection_StatWorkers.xml
@@ -0,0 +1,7 @@
+
+
+
+ 逸らす確率
+ 近距離武器で遠距離攻撃の発射物を逸らす確率
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/StatDef/Shields.xml b/1.4/Languages/Japanese/DefInjected/StatDef/Shields.xml
new file mode 100644
index 00000000..595ebda9
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/StatDef/Shields.xml
@@ -0,0 +1,25 @@
+
+
+
+ 近接防御補正
+ シールドを構えた者の近接攻撃を防ぐ確率はこの値で補正乗算されます。より高いほど防御率が高い。
+
+ 遠距離防御補正
+ シールドを構えた者の遠距離攻撃を防ぐ確率はこの値で補正乗算されます。より高いほど防御率が高い。
+
+ ダメージ吸収
+ 防御した攻撃からシールドがどれだけのダメージを吸収できるか。
+
+
+
+
+ 近接防御率
+ 近接攻撃を阻止する確立で、失敗すると攻撃が命中します。
+
+
+
+
+ 遠距離防御率
+ 遠距離攻撃を阻止する確立で、失敗すると攻撃が命中します。
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/ThingDef/CompSlotLoadable_Slots.xml b/1.4/Languages/Japanese/DefInjected/ThingDef/CompSlotLoadable_Slots.xml
new file mode 100644
index 00000000..f0c19f89
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/ThingDef/CompSlotLoadable_Slots.xml
@@ -0,0 +1,6 @@
+
+
+
+ テスト
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/ThingDef/JT_Projectiles.xml b/1.4/Languages/Japanese/DefInjected/ThingDef/JT_Projectiles.xml
new file mode 100644
index 00000000..ebe7213a
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/ThingDef/JT_Projectiles.xml
@@ -0,0 +1,6 @@
+
+
+
+ 飛翔体
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/DefInjected/WorldObjectDef/WorldObjects.xml b/1.4/Languages/Japanese/DefInjected/WorldObjectDef/WorldObjects.xml
new file mode 100644
index 00000000..f17fe8e5
--- /dev/null
+++ b/1.4/Languages/Japanese/DefInjected/WorldObjectDef/WorldObjects.xml
@@ -0,0 +1,7 @@
+
+
+
+ 進展度
+ これはプレーヤーには見えないはずです。
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/Keyed/AbilityUser.xml b/1.4/Languages/Japanese/Keyed/AbilityUser.xml
new file mode 100644
index 00000000..4713458f
--- /dev/null
+++ b/1.4/Languages/Japanese/Keyed/AbilityUser.xml
@@ -0,0 +1,27 @@
+
+
+
+ 指定可能な目標がありません。
+
+ 機能停止
+
+ タイプ:
+ 目標(範囲)
+ 目標(自分)
+ 目標(他者)
+ 目標(場所)
+ クールダウン:
+ 特殊
+ 精神状態変化率
+ 影響確率
+ {0}は回復する時間が必要
+
+
+ 影響範囲の詳細
+ 目標:
+ キャラクター
+ 味方への誤射:
+ 最大目標数:
+ 使用者から開始:
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/Keyed/CompActivatableEffect.xml b/1.4/Languages/Japanese/Keyed/CompActivatableEffect.xml
new file mode 100644
index 00000000..5bf0cc6d
--- /dev/null
+++ b/1.4/Languages/Japanese/Keyed/CompActivatableEffect.xml
@@ -0,0 +1,6 @@
+
+
+
+ 警告:{0}の現在所持している武器は不活性です!
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/Keyed/CompDeflector.xml b/1.4/Languages/Japanese/Keyed/CompDeflector.xml
new file mode 100644
index 00000000..bf49557f
--- /dev/null
+++ b/1.4/Languages/Japanese/Keyed/CompDeflector.xml
@@ -0,0 +1,19 @@
+
+
+
+ デフレクターなし
+
+ 反射率
+ この武器が発射体を攻撃者に跳ね返す頻度を決定します。
+
+ 最大反射率
+ {0}ヵ所の各射撃地点に対して、使用者は攻撃してきた目標に対して発射された攻撃を反射する可能性が{1}回あります。反射可能な最大回数は{2}回です。
+
+ {0}スキルLv毎の反射率(%)
+ 使用者は{0}の各レベルごとに、この反射率(%)を加算して発射体を跳ね返すことができます。
+
+ 反射率=(基本反射率+(スキルレベル×スキルLvごとの反射率(%)))×指の機能
+ 基本反射率
+ スキルLvごとの反射率(%)
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/Keyed/CompInstalledPart.xml b/1.4/Languages/Japanese/Keyed/CompInstalledPart.xml
new file mode 100644
index 00000000..f3783cb8
--- /dev/null
+++ b/1.4/Languages/Japanese/Keyed/CompInstalledPart.xml
@@ -0,0 +1,9 @@
+
+
+
+ 何かを装着します
+ {0}を取り外す
+ {0}は{2}に{1}を装着しました
+ {0}は{2}から{1}を取り外しました
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/Keyed/Eng_WorldObjectMods.xml b/1.4/Languages/Japanese/Keyed/Eng_WorldObjectMods.xml
new file mode 100644
index 00000000..57c5c404
--- /dev/null
+++ b/1.4/Languages/Japanese/Keyed/Eng_WorldObjectMods.xml
@@ -0,0 +1,10 @@
+
+
+
+ この場所にキャラバン隊がありません
+ 必要な資源:{0}
+ 特定のアイテムが足りません。{2}が{1}が必要ですが、{0}しかありません
+ {2}が不足しています。{1}が{1}が必要ですが、{0}しかありません
+ 資源不足のために、{0}の建設に失敗しました
+
+
diff --git a/1.4/Languages/Japanese/Keyed/Grapple.xml b/1.4/Languages/Japanese/Keyed/Grapple.xml
new file mode 100644
index 00000000..986a776d
--- /dev/null
+++ b/1.4/Languages/Japanese/Keyed/Grapple.xml
@@ -0,0 +1,11 @@
+
+
+
+ 捕縛に成功
+ 捕縛に失敗
+ 倒れている相手:捕縛に成功
+ 奇襲攻撃の相手:捕縛に成功
+ 拘束中の相手:捕縛に成功
+ 睡眠中の相手:捕縛に成功
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/Keyed/Misc.xml b/1.4/Languages/Japanese/Keyed/Misc.xml
new file mode 100644
index 00000000..012588fb
--- /dev/null
+++ b/1.4/Languages/Japanese/Keyed/Misc.xml
@@ -0,0 +1,11 @@
+
+
+ 天井の下に置く必要があります。
+ 壁に置く必要があります。
+ {0}ダメージ吸収した
+ 貫通量:{0}
+ ノックバック率:{0}
+ 追加ダメージ:
+ 炸裂
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Japanese/LanguageInfo.xml b/1.4/Languages/Japanese/LanguageInfo.xml
new file mode 100644
index 00000000..d74dc636
--- /dev/null
+++ b/1.4/Languages/Japanese/LanguageInfo.xml
@@ -0,0 +1,13 @@
+
+
+ 日本語
+ Japanese
+ true
+ LanguageWorker_Japanese
+
+
+ Translator
+ Proxyer
+
+
+
diff --git a/1.4/Languages/Spanish/DefInjected/DamageDef/AbilityUser_Damages.xml b/1.4/Languages/Spanish/DefInjected/DamageDef/AbilityUser_Damages.xml
new file mode 100644
index 00000000..57fca9f6
--- /dev/null
+++ b/1.4/Languages/Spanish/DefInjected/DamageDef/AbilityUser_Damages.xml
@@ -0,0 +1,8 @@
+
+
+
+ Quemadura
+ {0} Fue fusilado por armas laser.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Spanish/DefInjected/JobDef/AbilityUser_Jobs.xml b/1.4/Languages/Spanish/DefInjected/JobDef/AbilityUser_Jobs.xml
new file mode 100644
index 00000000..5ce0b377
--- /dev/null
+++ b/1.4/Languages/Spanish/DefInjected/JobDef/AbilityUser_Jobs.xml
@@ -0,0 +1,8 @@
+
+
+
+ Usando una abilidad
+ Usando una abilidad
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/Spanish/Keyed/AbilityUser.xml b/1.4/Languages/Spanish/Keyed/AbilityUser.xml
new file mode 100644
index 00000000..9085a1a7
--- /dev/null
+++ b/1.4/Languages/Spanish/Keyed/AbilityUser.xml
@@ -0,0 +1,25 @@
+
+
+
+DISABLED
+
+Type:
+Area de efecto
+Concentar en ti mismo
+Concentar en otro
+Localizacion del objetivo
+Cooldown:
+Extra
+Chance de Estado Mental
+Chance de efecto
+{0} Necesita tiempo para recargar
+
+
+Propiedades del Area de Efecto
+Objetivos:
+Personajes
+Fuego Amigo:
+Max Targets:
+Empieza desde el caster:
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/DamageDef/AbilityUser_Damages.xml b/1.4/Languages/SpanishLatin/DefInjected/DamageDef/AbilityUser_Damages.xml
new file mode 100644
index 00000000..5a92f877
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/DamageDef/AbilityUser_Damages.xml
@@ -0,0 +1,8 @@
+
+
+
+ quemadura
+ {0} fue disparado hasta morir.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/JobDef/AbilityUser_Jobs.xml b/1.4/Languages/SpanishLatin/DefInjected/JobDef/AbilityUser_Jobs.xml
new file mode 100644
index 00000000..30592e33
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/JobDef/AbilityUser_Jobs.xml
@@ -0,0 +1,8 @@
+
+
+
+ Usando una habilidad
+ Usando una habilidad
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompDeflector_Jobs.xml b/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompDeflector_Jobs.xml
new file mode 100644
index 00000000..daff1817
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompDeflector_Jobs.xml
@@ -0,0 +1,7 @@
+
+
+
+ Desviando
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompInstalledPart_Jobs.xml b/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompInstalledPart_Jobs.xml
new file mode 100644
index 00000000..1aa92b6c
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompInstalledPart_Jobs.xml
@@ -0,0 +1,8 @@
+
+
+
+ instalando TargetA.
+ desinstalando TargetA.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompSlotLoadable_Jobs.xml b/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompSlotLoadable_Jobs.xml
new file mode 100644
index 00000000..c43a6051
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/JobDef/CompSlotLoadable_Jobs.xml
@@ -0,0 +1,7 @@
+
+
+
+ equipando TargetA.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/RulePackDef/JT_GrappleRules.xml b/1.4/Languages/SpanishLatin/DefInjected/RulePackDef/JT_GrappleRules.xml
new file mode 100644
index 00000000..3512ff9d
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/RulePackDef/JT_GrappleRules.xml
@@ -0,0 +1,33 @@
+
+
+
+ r_logentry->[INITIATOR_nameDef] [grappled] [SUBJECT_definite] with [SUBJECT_possessive] [culpritHediff_originaltarget_label].
+ grappled->grappled
+ grappled->seized
+ grappled->took hold of
+
+ r_logentry->[INITIATOR_nameDef] [triedtograpple] [SUBJECT_definite] with [SUBJECT_possessive] [culpritHediff_originaltarget_label], [but] [failedmeta].
+ tried->tried
+ tried->attempted
+ grappleinf->to grapple
+ grappleinf->to seize
+ grappleinf->to hold onto
+ triedtograpple->[tried] [grappleinf]
+ but->but
+ but->however
+ but->even so
+ but->yet
+ failed->failed
+ failed->missed
+ dodged->dodged
+ dodged->slipped away
+ spectacularly->spectacularly
+ spectacularly->miserably
+ spectacularly->completely
+ spectacularly->utterly
+ failedmeta->[INITIATOR_pronoun] [failed]
+ failedmeta->[INITIATOR_pronoun] [failed] [spectacularly]
+ failedmeta->[SUBJECT_definite] [dodged]
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/StatDef/CompDeflection_StatWorkers.xml b/1.4/Languages/SpanishLatin/DefInjected/StatDef/CompDeflection_StatWorkers.xml
new file mode 100644
index 00000000..637577a5
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/StatDef/CompDeflection_StatWorkers.xml
@@ -0,0 +1,8 @@
+
+
+
+ chance de desvío
+ Chance de desviar un proyectil de rango largo con una arma.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/ThingDef/CompSlotLoadable_Slots.xml b/1.4/Languages/SpanishLatin/DefInjected/ThingDef/CompSlotLoadable_Slots.xml
new file mode 100644
index 00000000..bdfa1aee
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/ThingDef/CompSlotLoadable_Slots.xml
@@ -0,0 +1,7 @@
+
+
+
+ Test
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/ThingDef/JT_Projectiles.xml b/1.4/Languages/SpanishLatin/DefInjected/ThingDef/JT_Projectiles.xml
new file mode 100644
index 00000000..3199d6c4
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/ThingDef/JT_Projectiles.xml
@@ -0,0 +1,7 @@
+
+
+
+ objeto volando
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/DefInjected/WorldObjectDef/WorldObjects.xml b/1.4/Languages/SpanishLatin/DefInjected/WorldObjectDef/WorldObjects.xml
new file mode 100644
index 00000000..af48a3e2
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/DefInjected/WorldObjectDef/WorldObjects.xml
@@ -0,0 +1,8 @@
+
+
+
+ barra de progreso
+ Esto no debe ser visible a los jugadores.
+
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/Keyed/AbilityUser.xml b/1.4/Languages/SpanishLatin/Keyed/AbilityUser.xml
new file mode 100644
index 00000000..6b73110d
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/Keyed/AbilityUser.xml
@@ -0,0 +1,25 @@
+
+
+
+ DESABILITADO
+
+ Tipo:
+ Área de efecto
+ Dirige así mismo
+ Dirige a Otros
+ Locación a donde se dirige
+ Enfriamiento:
+ Extra
+ Chance del Estado Mental
+ Chance de efecto
+ {0} Necesita tiempo para recargar
+
+
+ Propiedades del Área de Efecto
+ Objetivo:
+ Personajes
+ Fuego Amigo:
+ Objetivos Máximos:
+ Comienza desde el emisor:
+
+
diff --git a/1.4/Languages/SpanishLatin/Keyed/CompActivatableEffect.xml b/1.4/Languages/SpanishLatin/Keyed/CompActivatableEffect.xml
new file mode 100644
index 00000000..011e0b58
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/Keyed/CompActivatableEffect.xml
@@ -0,0 +1,6 @@
+
+
+
+ PELIGRO: el arma de {0} está desactivada!
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/Keyed/CompDeflector.xml b/1.4/Languages/SpanishLatin/Keyed/CompDeflector.xml
new file mode 100644
index 00000000..5713efa7
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/Keyed/CompDeflector.xml
@@ -0,0 +1,20 @@
+
+
+
+ Sin deflector equipado
+
+ Chance de desvío
+ Determina que tan seguido esta arma devuelve los proyectiles a los atacantes.
+
+ Chance de desvío máximo
+ Por cada punto en {0}, el usuario recibe un {1} de chance de desviar el proyectil devuelta al objetivo. {2} es la chance máxima posible de desviar.
+
+
+ Desvío en % por {0} de habilidad
+ Por cada nivel en {0}, el usuario recibe esta cantidad en % de chance para desviar un proyectil.
+
+ Chance de Desvío = (Chance base para desviar + (Nivel de Habilidad * % por Nivel de Habilidad)) * Manipulación
+ Chance base para desviar
+ Desvío en % por nivel de habilidad
+
+
\ No newline at end of file
diff --git a/1.4/Languages/SpanishLatin/Keyed/CompInstalledPart.xml b/1.4/Languages/SpanishLatin/Keyed/CompInstalledPart.xml
new file mode 100644
index 00000000..c8fb3c08
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/Keyed/CompInstalledPart.xml
@@ -0,0 +1,9 @@
+
+
+
+ Instalar en algo
+ Desinstalar {0}
+ {0} Instalo el/la {1} en el/la {2}
+ {0} Desinstalo el/la {1} desde {2}
+
+
diff --git a/1.4/Languages/SpanishLatin/Keyed/Eng_WorldObjectMods.xml b/1.4/Languages/SpanishLatin/Keyed/Eng_WorldObjectMods.xml
new file mode 100644
index 00000000..f13cc1b4
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/Keyed/Eng_WorldObjectMods.xml
@@ -0,0 +1,8 @@
+
+
+
+ porque no hay caravana disponible en esta locación
+ Recursos: {0}
+ Fallido. {1} de los {0} materiales es requirido.
+
+
diff --git a/1.4/Languages/SpanishLatin/Keyed/Grapple.xml b/1.4/Languages/SpanishLatin/Keyed/Grapple.xml
new file mode 100644
index 00000000..b0f508bb
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/Keyed/Grapple.xml
@@ -0,0 +1,11 @@
+
+
+
+ Se aferro exitosamente
+ Fallo en aferrarse
+ Ataque a un caído: Se aferro exitosamente
+ Ataque sigiloso: Se aferro exitosamente
+ Victima Contenida: Se aferro exitosamente
+ Victima Durmiendo: Se aferro exitosamente
+
+
diff --git a/1.4/Languages/SpanishLatin/Keyed/Misc.xml b/1.4/Languages/SpanishLatin/Keyed/Misc.xml
new file mode 100644
index 00000000..be63353a
--- /dev/null
+++ b/1.4/Languages/SpanishLatin/Keyed/Misc.xml
@@ -0,0 +1,10 @@
+
+
+ Debe ser colocado en la pared.
+ {0} absorbido
+ Monto absorbido: {0}
+ Chance de Retroceso: {0}
+ Daño extra:
+ Explosivo
+
+
diff --git a/About/About.xml b/About/About.xml
index ebe13ea0..0a85bfd5 100644
--- a/About/About.xml
+++ b/About/About.xml
@@ -9,6 +9,7 @@
- 1.3.0.4 (08-08-2022)
+ 1.3.0.5 (10-09-2022)
Adds modding components to RimWorld: vehicles, spell casting, weapon slots, oversized weapons, and more!
diff --git a/About/Changelog.txt b/About/Changelog.txt
index 1aba3c7a..50a29654 100644
--- a/About/Changelog.txt
+++ b/About/Changelog.txt
@@ -1,3 +1,8 @@
+1.3.0.5 (10-09-2022)
+========================
+Updated assemblies for RimWorld 1.4 unstable support.
+- JecsTools BackstoryDef now inherits new RimWorld BackstoryDef setup. Once again based on erdelf's work.
+
1.3.0.4 (08-08-2022)
========================
damageTypesToExclude was not working correctly and has been fixed. Grappling a pet will always succeed which should prevent some fustration. Credit for this update goes to Gefallener from our RoM Discord.
diff --git a/About/Manifest.xml b/About/Manifest.xml
index 06427202..61d04602 100644
--- a/About/Manifest.xml
+++ b/About/Manifest.xml
@@ -1,7 +1,7 @@
JecsTools
- 1.3.0.4
+ 1.3.0.5https://raw.githubusercontent.com/jecrell/JecsTools/master/About/Manifest.xml
diff --git a/About/Version.txt b/About/Version.txt
index 4cabeb63..e474c207 100644
--- a/About/Version.txt
+++ b/About/Version.txt
@@ -1 +1 @@
-1.3.0.4
+1.3.0.5
diff --git a/LoadFolders.xml b/LoadFolders.xml
index e91dc0ab..d5543cf7 100644
--- a/LoadFolders.xml
+++ b/LoadFolders.xml
@@ -18,4 +18,8 @@
/
1.3
+
+
/
+
1.4
+
diff --git a/Source/AllModdingComponents/AbilityUserAI/AbilityUserAI.csproj b/Source/AllModdingComponents/AbilityUserAI/AbilityUserAI.csproj
index 73df7105..1d2eb57e 100644
--- a/Source/AllModdingComponents/AbilityUserAI/AbilityUserAI.csproj
+++ b/Source/AllModdingComponents/AbilityUserAI/AbilityUserAI.csproj
@@ -3,6 +3,7 @@
AbilityUserAI
+ RW1.3;RW1.3Unstable;RW1.4;RW1.4Unstable
diff --git a/Source/AllModdingComponents/CompAbilityUser/Controller/JobDriver_CastAbilityVerb.cs b/Source/AllModdingComponents/CompAbilityUser/Controller/JobDriver_CastAbilityVerb.cs
index ef8787ea..b5cb1bb2 100644
--- a/Source/AllModdingComponents/CompAbilityUser/Controller/JobDriver_CastAbilityVerb.cs
+++ b/Source/AllModdingComponents/CompAbilityUser/Controller/JobDriver_CastAbilityVerb.cs
@@ -59,12 +59,22 @@ protected override IEnumerable MakeNewToils()
}
//from the JobDriver_Wait in Vanilla RimWorld
+ //Updated 10/9/2022
public static void CheckForAutoAttack(Pawn searcher)
{
- if (searcher.Downed || searcher.stances.FullBodyBusy)
+ if (searcher.Downed)
{
return;
}
+ if (searcher.stances.FullBodyBusy)
+ {
+ return;
+ }
+ if (searcher.IsCarryingPawn(null))
+ {
+ return;
+ }
+ //this.collideWithPawns = false;
var flag = searcher.story == null || !searcher.WorkTagIsDisabled(WorkTags.Violent);
var flag2 = searcher.RaceProps.ToolUser && searcher.Faction == Faction.OfPlayer &&
!searcher.WorkTagIsDisabled(WorkTags.Firefighting);
@@ -81,17 +91,24 @@ public static void CheckForAutoAttack(Pawn searcher)
{
if (flag)
{
- if (thingList[j] is Pawn pawn && !pawn.Downed && searcher.HostileTo(pawn))
+ if (thingList[j] is Pawn pawn &&
+ !pawn.Downed &&
+ searcher.HostileTo(pawn) &&
+ !searcher.ThreatDisabledBecauseNonAggressiveRoamer(pawn) &&
+ GenHostility.IsActiveThreatTo(pawn,searcher.Faction))
{
searcher.meleeVerbs.TryMeleeAttack(pawn, null, false);
+ //this.collideWithPawns = true;
return;
}
}
if (flag2)
{
- if (thingList[j] is Fire fire2 && (fire == null || fire2.fireSize < fire.fireSize || i == 8) &&
- (fire2.parent == null || fire2.parent != searcher))
- {
+ if (thingList[j] is Fire fire2 &&
+ fire2 != null &&
+ (fire == null || fire2.fireSize < fire.fireSize || i == 8)
+ && (fire2.parent == null || fire2.parent != searcher))
+ {
fire = fire2;
}
}
@@ -112,7 +129,7 @@ public static void CheckForAutoAttack(Pawn searcher)
{
var targetScanFlags = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns |
TargetScanFlags.NeedThreat;
- if (verb.IsIncendiary())
+ if (verb.IsIncendiary_Ranged())
{
targetScanFlags |= TargetScanFlags.NeedNonBurning;
}
@@ -121,6 +138,7 @@ public static void CheckForAutoAttack(Pawn searcher)
if (thing != null)
{
searcher.TryStartAttack(thing);
+ //this.collideWithPawns = true;
}
}
}
diff --git a/Source/AllModdingComponents/CompAbilityUser/Controller/Projectile_AbilityBase.cs b/Source/AllModdingComponents/CompAbilityUser/Controller/Projectile_AbilityBase.cs
index dae3b90d..5a58c95c 100644
--- a/Source/AllModdingComponents/CompAbilityUser/Controller/Projectile_AbilityBase.cs
+++ b/Source/AllModdingComponents/CompAbilityUser/Controller/Projectile_AbilityBase.cs
@@ -150,7 +150,7 @@ public void Launch(Thing launcher, AbilityDef abilityDef, Vector3 origin, LocalT
Launch(launcher, targ, targ, hitFlags, preventFriendlyFire, equipment); //TODO
}
- protected override void Impact(Thing hitThing)
+ protected override void Impact(Thing hitThing, bool blockedByShield = false)
{
//Log.Message($"Projectile_AbilityBase.Impact({this}, {hitThing})");
Impact_Override(hitThing);
@@ -164,7 +164,7 @@ protected override void Impact(Thing hitThing)
//Log.Message($"Projectile_AbilityBase.Impact({this}, {hitThing}) extraDinfo={extraDinfo}");
hitThing.TakeDamage(extraDinfo);
}
- base.Impact(hitThing);
+ base.Impact(hitThing, blockedByShield);
}
}
}
diff --git a/Source/AllModdingComponents/CompAbilityUser/FlyingObject.cs b/Source/AllModdingComponents/CompAbilityUser/FlyingObject.cs
index fb4f0a9f..3341b9a9 100644
--- a/Source/AllModdingComponents/CompAbilityUser/FlyingObject.cs
+++ b/Source/AllModdingComponents/CompAbilityUser/FlyingObject.cs
@@ -250,14 +250,30 @@ protected virtual void Impact(Thing hitThing)
effecter.Trigger(target, target);
effecter.Cleanup();
}
- GenExplosion.DoExplosion(center: pos, map, props.explosionRadius, props.damageDef,
- instigator: this, props.GetDamageAmount(1f), props.GetArmorPenetration(1f),
- props.soundExplode, weapon: null, projectile: null, intendedTarget: null,
- props.postExplosionSpawnThingDef, props.postExplosionSpawnChance,
- props.postExplosionSpawnThingCount, props.applyDamageToExplosionCellsNeighbors,
- props.preExplosionSpawnThingDef, props.preExplosionSpawnChance,
- props.preExplosionSpawnThingCount, props.explosionChanceToStartFire,
- props.explosionDamageFalloff, direction: null, ignoredThings: null);
+ GenExplosion.DoExplosion(
+ center: pos,
+ map,
+ props.explosionRadius,
+ props.damageDef,
+ instigator: this,
+ props.GetDamageAmount(1f),
+ props.GetArmorPenetration(1f),
+ props.soundExplode,
+ weapon: null,
+ projectile: null,
+ intendedTarget: null,
+ props.postExplosionSpawnThingDef,
+ props.postExplosionSpawnChance,
+ props.postExplosionSpawnThingCount,
+ props.postExplosionGasType,
+ props.applyDamageToExplosionCellsNeighbors,
+ props.preExplosionSpawnThingDef,
+ props.preExplosionSpawnChance,
+ props.preExplosionSpawnThingCount,
+ props.explosionChanceToStartFire,
+ props.explosionDamageFalloff,
+ direction: null,
+ ignoredThings: null);
}
GenSpawn.Spawn(flyingThing, pos, map);
diff --git a/Source/AllModdingComponents/CompAbilityUser/_HarmonyPatches.cs b/Source/AllModdingComponents/CompAbilityUser/_HarmonyPatches.cs
index 754f6fd0..30f93bbb 100644
--- a/Source/AllModdingComponents/CompAbilityUser/_HarmonyPatches.cs
+++ b/Source/AllModdingComponents/CompAbilityUser/_HarmonyPatches.cs
@@ -47,7 +47,7 @@ public AbilityUserMod(ModContentPack content) : base(content)
prefix: new HarmonyMethod(type, nameof(get_DirectOwner_Prefix)));
harmony.Patch(AccessTools.Method(typeof(Verb), nameof(Verb.TryStartCastOn),
- new[] { typeof(LocalTargetInfo), typeof(LocalTargetInfo), typeof(bool), typeof(bool), typeof(bool) }),
+ new[] { typeof(LocalTargetInfo), typeof(LocalTargetInfo), typeof(bool), typeof(bool), typeof(bool), typeof(bool) }),
prefix: new HarmonyMethod(type, nameof(TryStartCastOn_Prefix)));
}
diff --git a/Source/AllModdingComponents/CompActivatableEffect/HarmonyCompActivatableEffect.cs b/Source/AllModdingComponents/CompActivatableEffect/HarmonyCompActivatableEffect.cs
index e5b6f851..9ee3df9f 100644
--- a/Source/AllModdingComponents/CompActivatableEffect/HarmonyCompActivatableEffect.cs
+++ b/Source/AllModdingComponents/CompActivatableEffect/HarmonyCompActivatableEffect.cs
@@ -23,7 +23,7 @@ static HarmonyCompActivatableEffect()
postfix: new HarmonyMethod(type, nameof(DrawEquipmentAimingPostFix)));
harmony.Patch(AccessTools.Method(typeof(Verb), nameof(Verb.TryStartCastOn),
- new[] { typeof(LocalTargetInfo), typeof(LocalTargetInfo), typeof(bool), typeof(bool), typeof(bool) }),
+ new[] { typeof(LocalTargetInfo), typeof(LocalTargetInfo), typeof(bool), typeof(bool), typeof(bool), typeof(bool) }),
prefix: new HarmonyMethod(type, nameof(TryStartCastOnPrefix)));
harmony.Patch(AccessTools.PropertySetter(typeof(Pawn_DraftController), nameof(Pawn_DraftController.Drafted)),
@@ -33,58 +33,19 @@ static HarmonyCompActivatableEffect()
prefix: new HarmonyMethod(type, nameof(ExitMap_PreFix)));
}
- public static void ExitMap_PreFix(Pawn __instance)
- {
- if (__instance.equipment?.Primary?.GetCompActivatableEffect() is CompActivatableEffect compActivatableEffect &&
- compActivatableEffect.CurrentState == CompActivatableEffect.State.Activated)
- compActivatableEffect.TryDeactivate();
- }
-
- public static void set_DraftedPostFix(Pawn_DraftController __instance, bool value)
+ public static void GetGizmosPostfix(Pawn_EquipmentTracker __instance, ref IEnumerable __result)
{
- if (__instance.pawn?.equipment?.Primary?.GetCompActivatableEffect() is CompActivatableEffect compActivatableEffect)
- if (value == false)
+ if (__instance.Primary?.GetCompActivatableEffect() is CompActivatableEffect compActivatableEffect)
+ if (__instance.pawn.Faction == Faction.OfPlayer)
{
- if (compActivatableEffect.CurrentState == CompActivatableEffect.State.Activated)
- compActivatableEffect.TryDeactivate();
+ if (compActivatableEffect.GizmosOnEquip)
+ __result = __result.Concat(compActivatableEffect.EquippedGizmos());
}
else
{
if (compActivatableEffect.CurrentState == CompActivatableEffect.State.Deactivated)
- compActivatableEffect.TryActivate();
- }
- }
-
- public static bool TryStartCastOnPrefix(ref bool __result, Verb __instance)
- {
- if (__instance.caster is Pawn pawn && pawn.Spawned && pawn.equipment?.Primary is ThingWithComps thingWithComps &&
- thingWithComps.GetCompActivatableEffect() is CompActivatableEffect compActivatableEffect)
- {
- // EquipmentSource throws errors when checked while casting abilities with a weapon equipped.
- // to avoid this error preventing our code from executing, we do a try/catch.
- // TODO: Is this still the case?
- try
- {
- if (__instance.EquipmentSource != thingWithComps)
- return true;
- }
- catch (Exception ex)
- {
- Log.ErrorOnce("Verb.TryStartCastOn EquipmentSource threw exception: " + ex,
- __instance.GetUniqueLoadID().GetHashCode());
+ compActivatableEffect.Activate();
}
-
- if (compActivatableEffect.CurrentState == CompActivatableEffect.State.Activated)
- return true;
- else if (compActivatableEffect.TryActivate())
- return true;
- if (Find.TickManager.TicksGame % GenTicks.TickRareInterval == 0)
- Messages.Message("DeactivatedWarning".Translate(pawn.Label),
- MessageTypeDefOf.RejectInput);
- __result = false;
- return false;
- }
- return true;
}
///
@@ -147,6 +108,63 @@ public static void DrawEquipmentAimingPostFix(Pawn ___pawn, Thing eq, Vector3 dr
Graphics.DrawMesh(flip ? MeshPool.plane10Flip : MeshPool.plane10, matrix, matSingle, 0);
}
+
+ public static bool TryStartCastOnPrefix(ref bool __result, Verb __instance)
+ {
+ if (__instance.caster is Pawn pawn && pawn.Spawned && pawn.equipment?.Primary is ThingWithComps thingWithComps &&
+ thingWithComps.GetCompActivatableEffect() is CompActivatableEffect compActivatableEffect)
+ {
+ // EquipmentSource throws errors when checked while casting abilities with a weapon equipped.
+ // to avoid this error preventing our code from executing, we do a try/catch.
+ // TODO: Is this still the case?
+ try
+ {
+ if (__instance.EquipmentSource != thingWithComps)
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Log.ErrorOnce("Verb.TryStartCastOn EquipmentSource threw exception: " + ex,
+ __instance.GetUniqueLoadID().GetHashCode());
+ }
+
+ if (compActivatableEffect.CurrentState == CompActivatableEffect.State.Activated)
+ return true;
+ else if (compActivatableEffect.TryActivate())
+ return true;
+ if (Find.TickManager.TicksGame % GenTicks.TickRareInterval == 0)
+ Messages.Message("DeactivatedWarning".Translate(pawn.Label),
+ MessageTypeDefOf.RejectInput);
+ __result = false;
+ return false;
+ }
+ return true;
+ }
+
+
+ public static void ExitMap_PreFix(Pawn __instance)
+ {
+ if (__instance.equipment?.Primary?.GetCompActivatableEffect() is CompActivatableEffect compActivatableEffect &&
+ compActivatableEffect.CurrentState == CompActivatableEffect.State.Activated)
+ compActivatableEffect.TryDeactivate();
+ }
+
+ public static void set_DraftedPostFix(Pawn_DraftController __instance, bool value)
+ {
+ if (__instance.pawn?.equipment?.Primary?.GetCompActivatableEffect() is CompActivatableEffect compActivatableEffect)
+ if (value == false)
+ {
+ if (compActivatableEffect.CurrentState == CompActivatableEffect.State.Activated)
+ compActivatableEffect.TryDeactivate();
+ }
+ else
+ {
+ if (compActivatableEffect.CurrentState == CompActivatableEffect.State.Deactivated)
+ compActivatableEffect.TryActivate();
+ }
+ }
+
+
// Workaround for mod lists that contain other mods with an outdated copy of CompOversizedWeapon that's loaded before ours:
// avoid calling new code that's in our version.
private static Vector3 OffsetFromRotation(CompOversizedWeapon.CompProperties_OversizedWeapon weaponComp, Rot4 rotation)
@@ -161,19 +179,5 @@ private static Vector3 OffsetFromRotation(CompOversizedWeapon.CompProperties_Ove
return weaponComp.southOffset;
}
- public static void GetGizmosPostfix(Pawn_EquipmentTracker __instance, ref IEnumerable __result)
- {
- if (__instance.Primary?.GetCompActivatableEffect() is CompActivatableEffect compActivatableEffect)
- if (__instance.pawn.Faction == Faction.OfPlayer)
- {
- if (compActivatableEffect.GizmosOnEquip)
- __result = __result.Concat(compActivatableEffect.EquippedGizmos());
- }
- else
- {
- if (compActivatableEffect.CurrentState == CompActivatableEffect.State.Deactivated)
- compActivatableEffect.Activate();
- }
- }
}
}
diff --git a/Source/AllModdingComponents/CompSlotLoadable/_HarmonyCompSlotLoadable.cs b/Source/AllModdingComponents/CompSlotLoadable/_HarmonyCompSlotLoadable.cs
index adc1b5e5..4f58a50d 100644
--- a/Source/AllModdingComponents/CompSlotLoadable/_HarmonyCompSlotLoadable.cs
+++ b/Source/AllModdingComponents/CompSlotLoadable/_HarmonyCompSlotLoadable.cs
@@ -29,142 +29,25 @@ static HarmonyCompSlotLoadable()
harmony.Patch(AccessTools.Method(typeof(Pawn), nameof(Pawn.PostApplyDamage)),
postfix: new HarmonyMethod(type, nameof(PostApplyDamage_PostFix)));
// TODO: Patch StatWorker.GetExplanationUnfinalized to include stat augment explanation?
- harmony.Patch(AccessTools.Method(typeof(StatWorker), nameof(StatWorker.GetValue), new[] { typeof(Thing), typeof(bool) }),
+ harmony.Patch(AccessTools.Method(typeof(StatWorker), nameof(StatWorker.GetValue), new[] { typeof(Thing), typeof(bool), typeof(int) }),
postfix: new HarmonyMethod(type, nameof(StatWorker_GetValue_PostFix)));
harmony.Patch(AccessTools.Method(typeof(StatWorker), nameof(StatWorker.StatOffsetFromGear)),
postfix: new HarmonyMethod(type, nameof(StatOffsetFromGear_PostFix)));
}
- public static void StatWorker_GetValue_PostFix(ref float __result, Thing thing, StatDef ___stat)
- {
- __result += SlotLoadableUtility.CheckThingSlotsForStatAugment(thing, ___stat);
- }
-
- public static void StatOffsetFromGear_PostFix(ref float __result, Thing gear, StatDef stat)
- {
- __result += SlotLoadableUtility.CheckThingSlotsForStatAugment(gear, stat);
- }
-
- ///
- /// Applies the special properties to the slot loadable.
- ///
- public static void PostApplyDamage_PostFix(Pawn __instance)
- {
- if (__instance.Dead)
- return;
- var slots = __instance.equipment?.Primary?.GetSlots();
- if (slots != null)
- foreach (var slot in slots)
- {
- var defensiveHealChance = slot.SlotOccupant?.TryGetCompSlottedBonus()?.Props?.defensiveHealChance;
- if (defensiveHealChance != null)
- {
- var randValue = Rand.Value;
- //Log.Message("defensiveHealingCalled: randValue = " + randValue);
- if (randValue <= defensiveHealChance.chance)
- {
- MoteMaker.ThrowText(__instance.DrawPos, __instance.Map, "Heal Chance: Success", 6f); // TODO: Translate()?
- ApplyHealing(__instance, defensiveHealChance.woundLimit, defensiveHealChance.amountRange);
- }
- }
- }
- }
-
- [ThreadStatic]
- private static List tempInjuredParts;
-
- public static void ApplyHealing(Pawn pawn, int woundLimit, FloatRange amountRange, Pawn vampiricTarget = null,
- DamageDef vampiricDamageDef = null, float vampiricArmorPenetration = 0f, Vector3? vampiricDamageAngle = default)
+ // Pawn_EquipmentTracker.GetGizmos
+ public static void GetGizmos_PostFix(Pawn_EquipmentTracker __instance, ref IEnumerable __result)
{
- if (tempInjuredParts == null)
- tempInjuredParts = new List();
- else
- tempInjuredParts.Clear();
-
- // This heals non-permanent injury hediffs for x randomly chosen injured body parts,
- // where x = woundLimit (or all injured body parts if woundLimit is 0).
- // The amount healed per body part is randomly chosen from amountRange.
- // If there are multiple injury hediffs that can be healed, they are healed in FIFO order.
- var hediffSet = pawn.health.hediffSet;
- var hediffs = hediffSet.hediffs;
- var maxInjuriesToHeal = woundLimit;
- foreach (var bodyPart in hediffSet.GetInjuredParts().InRandomOrder(tempInjuredParts))
- {
- if (maxInjuriesToHeal == 0)
- break;
- var maxHealAmount = -1f;
- for (var i = 0; i < hediffs.Count; i++)
- {
- var hediff = hediffs[i];
- if (hediff.Part == bodyPart && (Hediff_Injury)hediff is var injury &&
- !injury.ShouldRemove && injury.CanHealNaturally()) // basically check for scars and old wounds
- {
- if (maxHealAmount < 0f)
- {
- maxHealAmount = amountRange.RandomInRange;
- //Log.Message($"{pawn} {bodyPart} total heal amount {maxHealAmount}");
- }
- var healAmount = Mathf.Min(maxHealAmount, injury.Severity); // this should be >0
- //Log.Message($"{pawn} {bodyPart} healed {healAmount} of {injury.Severity}; " +
- // $"remaining max heal amount {maxHealAmount - healAmount}; " +
- // $"remaining max injuries to heal {maxInjuriesToHeal - 1}");
- // Note: even if fully healing, not using HealthUtility.CureHediff since it modifies
- // hediffs list and doesn't call the CompPostInjuryHeal hook.
- injury.Heal(healAmount);
- maxInjuriesToHeal--;
- if (maxInjuriesToHeal == 0)
- break;
- maxHealAmount -= healAmount;
- if (maxHealAmount <= 0f)
- break;
- }
- }
- }
-
- if (vampiricTarget != null)
+ if (__instance.pawn.Faction == Faction.OfPlayer)
{
- var maxInjuriesToMake = woundLimit;
- foreach (var bodyPart in vampiricTarget.health.hediffSet.GetNotMissingParts().InRandomOrder(tempInjuredParts))
+ var compSlotLoadable = __instance.Primary?.GetCompSlotLoadable();
+ if (compSlotLoadable != null && compSlotLoadable.GizmosOnEquip)
{
- if (maxInjuriesToMake == 0)
- break;
- var dinfo = new DamageInfo(vampiricDamageDef, amountRange.RandomInRange, vampiricArmorPenetration, -1f,
- pawn, bodyPart);
- dinfo.SetAngle(vampiricDamageAngle.Value);
- //Log.Message($"{vampiricTarget} {bodyPart} vampiric dinfo {dinfo}; " +
- // $"remaining max injuries to make {maxInjuriesToMake - 1}");
- vampiricTarget.TakeDamage(dinfo);
- maxInjuriesToMake--;
+ __result = __result.Concat(compSlotLoadable.EquippedGizmos());
}
}
}
- public static void DrawThingRow_PostFix(ref float y, float width, Thing thing)
- {
- var slots = thing.GetSlots();
- if (slots != null)
- foreach (var slot in slots)
- if (slot.SlotOccupant is Thing slotOccupant)
- {
- var rect = new Rect(0f, y, width, 28f);
- Widgets.InfoCardButton(rect.width - 24f, y, slotOccupant);
- rect.width -= 24f;
- if (Mouse.IsOver(rect))
- {
- GUI.color = HighlightColor;
- GUI.DrawTexture(rect, TexUI.HighlightTex);
- }
- if (slotOccupant.def.DrawMatSingle?.mainTexture != null)
- Widgets.ThingIcon(new Rect(4f, y, 28f, 28f), slotOccupant, 1f);
- Text.Anchor = TextAnchor.MiddleLeft;
- GUI.color = ThingLabelColor;
- var rect4 = new Rect(36f, y, width - 36f, 28f);
- var text = slotOccupant.LabelCap;
- Widgets.Label(rect4, text);
- y += 28f;
- }
- }
-
// XXX: If any slot has a CompSlottedBonus with damageDef, all existing melee attacks are replaced with a custom melee attack
// that uses that damageDef & custom armorPenetration & damage = orig damage * 0.8~1.2. The logic is based off Verb_MeleeAttackDamage's,
// but is missing extra damages, surprise attack, and potentially other logic.
@@ -256,16 +139,144 @@ public static void DamageInfosToApply_PostFix(Verb_MeleeAttack __instance, ref I
}
}
- public static void GetGizmos_PostFix(Pawn_EquipmentTracker __instance, ref IEnumerable __result)
+ //ITab_Pawn_Gear.DrawThingRow
+ public static void DrawThingRow_PostFix(ref float y, float width, Thing thing, bool inventory)
{
- if (__instance.pawn.Faction == Faction.OfPlayer)
+ var slots = thing.GetSlots();
+ if (slots != null)
+ foreach (var slot in slots)
+ if (slot.SlotOccupant is Thing slotOccupant)
+ {
+ var rect = new Rect(0f, y, width, 28f);
+ Widgets.InfoCardButton(rect.width - 24f, y, slotOccupant);
+ rect.width -= 24f;
+ if (Mouse.IsOver(rect))
+ {
+ GUI.color = HighlightColor;
+ GUI.DrawTexture(rect, TexUI.HighlightTex);
+ }
+ if (slotOccupant.def.DrawMatSingle?.mainTexture != null)
+ Widgets.ThingIcon(new Rect(4f, y, 28f, 28f), slotOccupant, 1f);
+ Text.Anchor = TextAnchor.MiddleLeft;
+ GUI.color = ThingLabelColor;
+ var rect4 = new Rect(36f, y, width - 36f, 28f);
+ var text = slotOccupant.LabelCap;
+ Widgets.Label(rect4, text);
+ y += 28f;
+ }
+ }
+
+
+ //Pawn.PostApplyDamage
+ ///
+ /// Applies the special properties to the slot loadable.
+ ///
+ public static void PostApplyDamage_PostFix(Pawn __instance, DamageInfo dinfo, float totalDamageDealt)
+ {
+ if (__instance.Dead)
+ return;
+ var slots = __instance.equipment?.Primary?.GetSlots();
+ if (slots != null)
+ foreach (var slot in slots)
+ {
+ var defensiveHealChance = slot.SlotOccupant?.TryGetCompSlottedBonus()?.Props?.defensiveHealChance;
+ if (defensiveHealChance != null)
+ {
+ var randValue = Rand.Value;
+ //Log.Message("defensiveHealingCalled: randValue = " + randValue);
+ if (randValue <= defensiveHealChance.chance)
+ {
+ MoteMaker.ThrowText(__instance.DrawPos, __instance.Map, "Heal Chance: Success", 6f); // TODO: Translate()?
+ ApplyHealing(__instance, defensiveHealChance.woundLimit, defensiveHealChance.amountRange);
+ }
+ }
+ }
+ }
+
+ public static void StatWorker_GetValue_PostFix(ref float __result, Thing thing, StatDef ___stat)
+ {
+ __result += SlotLoadableUtility.CheckThingSlotsForStatAugment(thing, ___stat);
+ }
+
+ public static void StatOffsetFromGear_PostFix(ref float __result, Thing gear, StatDef stat)
+ {
+ __result += SlotLoadableUtility.CheckThingSlotsForStatAugment(gear, stat);
+ }
+
+
+ [ThreadStatic]
+ private static List tempInjuredParts;
+
+ public static void ApplyHealing(Pawn pawn, int woundLimit, FloatRange amountRange, Pawn vampiricTarget = null,
+ DamageDef vampiricDamageDef = null, float vampiricArmorPenetration = 0f, Vector3? vampiricDamageAngle = default)
+ {
+ if (tempInjuredParts == null)
+ tempInjuredParts = new List();
+ else
+ tempInjuredParts.Clear();
+
+ // This heals non-permanent injury hediffs for x randomly chosen injured body parts,
+ // where x = woundLimit (or all injured body parts if woundLimit is 0).
+ // The amount healed per body part is randomly chosen from amountRange.
+ // If there are multiple injury hediffs that can be healed, they are healed in FIFO order.
+ var hediffSet = pawn.health.hediffSet;
+ var hediffs = hediffSet.hediffs;
+ var maxInjuriesToHeal = woundLimit;
+ foreach (var bodyPart in hediffSet.GetInjuredParts().InRandomOrder(tempInjuredParts))
{
- var compSlotLoadable = __instance.Primary?.GetCompSlotLoadable();
- if (compSlotLoadable != null && compSlotLoadable.GizmosOnEquip)
+ if (maxInjuriesToHeal == 0)
+ break;
+ var maxHealAmount = -1f;
+ for (var i = 0; i < hediffs.Count; i++)
{
- __result = __result.Concat(compSlotLoadable.EquippedGizmos());
+ var hediff = hediffs[i];
+ if (hediff.Part == bodyPart && (Hediff_Injury)hediff is var injury &&
+ !injury.ShouldRemove && injury.CanHealNaturally()) // basically check for scars and old wounds
+ {
+ if (maxHealAmount < 0f)
+ {
+ maxHealAmount = amountRange.RandomInRange;
+ //Log.Message($"{pawn} {bodyPart} total heal amount {maxHealAmount}");
+ }
+ var healAmount = Mathf.Min(maxHealAmount, injury.Severity); // this should be >0
+ //Log.Message($"{pawn} {bodyPart} healed {healAmount} of {injury.Severity}; " +
+ // $"remaining max heal amount {maxHealAmount - healAmount}; " +
+ // $"remaining max injuries to heal {maxInjuriesToHeal - 1}");
+ // Note: even if fully healing, not using HealthUtility.CureHediff since it modifies
+ // hediffs list and doesn't call the CompPostInjuryHeal hook.
+ injury.Heal(healAmount);
+ maxInjuriesToHeal--;
+ if (maxInjuriesToHeal == 0)
+ break;
+ maxHealAmount -= healAmount;
+ if (maxHealAmount <= 0f)
+ break;
+ }
+ }
+ }
+
+ if (vampiricTarget != null)
+ {
+ var maxInjuriesToMake = woundLimit;
+ foreach (var bodyPart in vampiricTarget.health.hediffSet.GetNotMissingParts().InRandomOrder(tempInjuredParts))
+ {
+ if (maxInjuriesToMake == 0)
+ break;
+ var dinfo = new DamageInfo(vampiricDamageDef, amountRange.RandomInRange, vampiricArmorPenetration, -1f,
+ pawn, bodyPart);
+ dinfo.SetAngle(vampiricDamageAngle.Value);
+ //Log.Message($"{vampiricTarget} {bodyPart} vampiric dinfo {dinfo}; " +
+ // $"remaining max injuries to make {maxInjuriesToMake - 1}");
+ vampiricTarget.TakeDamage(dinfo);
+ maxInjuriesToMake--;
}
}
}
+
+
+
+
+
+
}
}
diff --git a/Source/AllModdingComponents/Directory.Build.props b/Source/AllModdingComponents/Directory.Build.props
index 79bc2e68..4feec134 100644
--- a/Source/AllModdingComponents/Directory.Build.props
+++ b/Source/AllModdingComponents/Directory.Build.props
@@ -2,8 +2,8 @@
- RW1.3;RW1.3Unstable
- RW1.3Unstable
+ RW1.4;RW1.4Unstable
+ RW1.4Unstablenet472true9.0
@@ -22,20 +22,20 @@
TRACE
-
+
- ..\..\..\1.3\Assemblies\
+ ..\..\..\1.4\Assemblies\
-
+
-
+
- ..\..\..\1.3\Assemblies\
+ ..\..\..\1.4\Assemblies\
-
+
diff --git a/Source/AllModdingComponents/JecsTools/Backstories/BackstoryDef.cs b/Source/AllModdingComponents/JecsTools/Backstories/BackstoryDef.cs
index 58824fa9..af749a1d 100644
--- a/Source/AllModdingComponents/JecsTools/Backstories/BackstoryDef.cs
+++ b/Source/AllModdingComponents/JecsTools/Backstories/BackstoryDef.cs
@@ -10,166 +10,55 @@ namespace JecsTools
//Pulled from erdelf's Alien Races 2.0
//Original credit and work belong to erdelf (https://github.com/erdelf)
//Link -> https://github.com/RimWorld-CCL-Reborn/AlienRaces/blob/94bf6b6d7a91e9587bdc40e8a231b18515cb6bb7/Source/AlienRace/AlienRace/BackstoryDef.cs
- public class BackstoryDef : Def
+ public class BackstoryDef : RimWorld.BackstoryDef
{
- public string baseDescription;
- public BodyTypeDef bodyTypeGlobal;
- public BodyTypeDef bodyTypeMale;
- public BodyTypeDef bodyTypeFemale;
- public string title;
- public string titleFemale;
- public string titleShort;
- public string titleShortFemale;
- public BackstorySlot slot = BackstorySlot.Adulthood;
- public bool shuffleable = true;
- public bool addToDatabase = true;
- public List workAllows = new List();
- public List workDisables = new List();
- public List requiredWorkTags = new List();
- public List skillGains = new List();
- public List spawnCategories = new List();
- public List forcedTraits = new List();
- public List disallowedTraits = new List();
+
+ public static HashSet checkBodyType = new HashSet();
+
+ public List forcedTraitsChance = new List();
+ public List disallowedTraitsChance = new List();
+ public WorkTags workAllows = WorkTags.AllWork;
public float maleCommonality = 100f;
public float femaleCommonality = 100f;
- public string linkedBackstory;
- //public RelationSettings relationSettings = new RelationSettings();
+ public BackstoryDef linkedBackstory;
public List forcedHediffs = new List();
+ public List passions = new List();
public IntRange bioAgeRange;
public IntRange chronoAgeRange;
public List forcedItems = new List();
- public Backstory backstory;
-
- public class ChancedTraitEntry
- {
- public string defName;
- public int degree = 0;
- public float chance = 100;
- public float commonalityMale = -1f;
- public float commonalityFemale = -1f;
- }
-
- public bool CommonalityApproved(Gender g) => Rand.Range(0, 100) < (g == Gender.Female ? femaleCommonality : maleCommonality);
- public bool Approved(Pawn p) =>
- CommonalityApproved(p.gender) &&
- RangeIncludes(bioAgeRange, p.ageTracker.AgeBiologicalYears) &&
- RangeIncludes(chronoAgeRange, p.ageTracker.AgeChronologicalYears);
+ public bool CommonalityApproved(Gender g) => Rand.Range(min: 0, max: 100) < (g == Gender.Female ? this.femaleCommonality : this.maleCommonality);
- private static bool RangeIncludes(IntRange range, int val) => range == default || (val >= range.min && val <= range.max);
+ public bool Approved(Pawn p) => this.CommonalityApproved(p.gender) &&
+ (this.bioAgeRange == default || (this.bioAgeRange.min < p.ageTracker.AgeBiologicalYears && p.ageTracker.AgeBiologicalYears < this.bioAgeRange.max)) &&
+ (this.chronoAgeRange == default || (this.chronoAgeRange.min < p.ageTracker.AgeChronologicalYears && p.ageTracker.AgeChronologicalYears < this.chronoAgeRange.max));
public override void ResolveReferences()
{
+ this.identifier = this.defName;
base.ResolveReferences();
- if (!addToDatabase || BackstoryDatabase.allBackstories.ContainsKey(defName) || title.NullOrEmpty() || spawnCategories.NullOrEmpty())
- return;
-
- static List ForcedTraits(BackstoryDef bs)
- {
- if (bs.forcedTraits.NullOrEmpty())
- return null;
- var forcedTraits = new List();
- foreach (var trait in bs.forcedTraits)
- {
- if (Rand.Range(0, 100) < trait.chance)
- forcedTraits.Add(new TraitEntry(TraitDef.Named(trait.defName), trait.degree));
- }
- return forcedTraits;
- }
-
- static List DisallowedTraits(BackstoryDef bs)
- {
- if (bs.disallowedTraits.NullOrEmpty())
- return null;
- var disallowedTraits = new List();
- foreach (var trait in bs.disallowedTraits)
- {
- if (Rand.Range(0, 100) < trait.chance)
- disallowedTraits.Add(new TraitEntry(TraitDef.Named(trait.defName), trait.degree));
- }
- return disallowedTraits;
- }
-
- static WorkTags WorkDisables(BackstoryDef bs)
- {
- var wt = WorkTags.None;
- if (bs.workAllows.NullOrEmpty())
- {
- if (bs.workDisables != null)
- {
- foreach (var tag in bs.workDisables)
- wt |= tag;
- }
- }
- else
- {
- foreach (WorkTags tag in Enum.GetValues(typeof(WorkTags)))
- {
- if (!bs.workAllows.Contains(tag))
- wt |= tag;
- }
- }
- return wt;
- }
+ this.forcedTraits = (this.forcedTraits ??= new List()).
+ Concat(this.forcedTraitsChance.Where(predicate: trait => Rand.Range(min: 0, max: 100) < trait.chance).ToList().ConvertAll(converter: trait => new BackstoryTrait { def = trait.defName, degree = trait.degree })).ToList();
+ this.disallowedTraits = (this.disallowedTraits ??= new List()).
+ Concat(this.disallowedTraitsChance.Where(predicate: trait => Rand.Range(min: 0, max: 100) < trait.chance).ToList().ConvertAll(converter: trait => new BackstoryTrait { def = trait.defName, degree = trait.degree })).ToList();
+ this.workDisables = (this.workAllows & WorkTags.AllWork) != 0 ? this.workDisables : ~this.workAllows;
- static WorkTags RequiredWorkTags(BackstoryDef bs)
+ if (this.bodyTypeGlobal == null && this.bodyTypeFemale == null && this.bodyTypeMale == null)
{
- var wt = WorkTags.None;
- foreach (var tag in bs.requiredWorkTags)
- wt |= tag;
- return wt;
+ checkBodyType.Add(this);
+ this.bodyTypeGlobal = DefDatabase.GetRandom();
}
-
- backstory = new Backstory
- {
- slot = slot,
- shuffleable = shuffleable,
- spawnCategories = spawnCategories,
- forcedTraits = ForcedTraits(this),
- disallowedTraits = DisallowedTraits(this),
- workDisables = WorkDisables(this),
- identifier = defName,
- requiredWorkTags = RequiredWorkTags(this),
- };
-
- bsBodyTypeGlobalResolved(backstory) = bodyTypeGlobal;
- bsBodyTypeFemaleResolved(backstory) = bodyTypeFemale;
- bsBodyTypeMaleResolved(backstory) = bodyTypeMale;
- bsSkillGains(backstory) = skillGains.ToDictionary(i => i.defName, i => i.amount);
-
- UpdateTranslateableFields(this);
-
- backstory.ResolveReferences();
- backstory.PostLoad();
-
- backstory.identifier = defName;
-
- var errors = backstory.ConfigErrors(ignoreNoSpawnCategories: false);
- if (!errors.Any())
- BackstoryDatabase.AddBackstory(backstory);
- else
- Log.Error(defName + " has errors:\n" + string.Join("\n", errors));
}
- private static readonly AccessTools.FieldRef bsBodyTypeGlobalResolved =
- AccessTools.FieldRefAccess("bodyTypeGlobalResolved");
- private static readonly AccessTools.FieldRef bsBodyTypeFemaleResolved =
- AccessTools.FieldRefAccess("bodyTypeFemaleResolved");
- private static readonly AccessTools.FieldRef bsBodyTypeMaleResolved =
- AccessTools.FieldRefAccess("bodyTypeMaleResolved");
- private static readonly AccessTools.FieldRef> bsSkillGains =
- AccessTools.FieldRefAccess>("skillGains");
- internal static void UpdateTranslateableFields(BackstoryDef bs)
+ public class ChancedTraitEntry
{
- if (bs.backstory == null)
- return;
-
- bs.backstory.baseDesc = bs.baseDescription.NullOrEmpty() ? "Empty." : bs.baseDescription;
- bs.backstory.SetTitle(newTitle: bs.title, newTitleFemale: bs.titleFemale);
- bs.backstory.SetTitleShort(newTitleShort: bs.titleShort.NullOrEmpty() ? bs.backstory.title : bs.titleShort,
- newTitleShortFemale: bs.titleShortFemale.NullOrEmpty() ? bs.backstory.titleFemale : bs.titleShortFemale);
+ public TraitDef defName;
+ public int degree = 0;
+ public float chance = 100;
+ public float commonalityMale = -1f;
+ public float commonalityFemale = -1f;
}
public struct BackstoryDefSkillListItem
@@ -179,5 +68,34 @@ public struct BackstoryDefSkillListItem
public int amount;
#pragma warning restore CS0649
}
+
+
+ //public string baseDescription;
+ //public BodyTypeDef bodyTypeGlobal;
+ //public BodyTypeDef bodyTypeMale;
+ //public BodyTypeDef bodyTypeFemale;
+ //public string title;
+ //public string titleFemale;
+ //public string titleShort;
+ //public string titleShortFemale;
+ //public BackstorySlot slot = BackstorySlot.Adulthood;
+ //public bool shuffleable = true;
+ //public bool addToDatabase = true;
+ //public List workAllows = new List();
+ //public List workDisables = new List();
+ //public List requiredWorkTags = new List();
+ //public List skillGains = new List();
+ //public List spawnCategories = new List();
+ //public List forcedTraits = new List();
+ //public List disallowedTraits = new List();
+ //public float maleCommonality = 100f;
+ //public float femaleCommonality = 100f;
+ //public string linkedBackstory;
+ ////public RelationSettings relationSettings = new RelationSettings();
+ //public List forcedHediffs = new List();
+ //public IntRange bioAgeRange;
+ //public IntRange chronoAgeRange;
+ //public List forcedItems = new List();
+ //public Backstory backstory;
}
}
diff --git a/Source/AllModdingComponents/JecsTools/HediffComp_Knockback.cs b/Source/AllModdingComponents/JecsTools/HediffComp_Knockback.cs
index 4c92ccf7..1249964a 100644
--- a/Source/AllModdingComponents/JecsTools/HediffComp_Knockback.cs
+++ b/Source/AllModdingComponents/JecsTools/HediffComp_Knockback.cs
@@ -57,14 +57,32 @@ public void ApplyKnockback(Pawn target, float damageAbsorbedPercent)
effecter.Trigger(targetInfo, targetInfo);
effecter.Cleanup();
}
- GenExplosion.DoExplosion(center: pos, map, explosiveProps.explosiveRadius, explosiveProps.explosiveDamageType,
- instigator, explosiveProps.damageAmountBase, explosiveProps.armorPenetrationBase,
- explosiveProps.explosionSound, weapon: null, projectile: null, intendedTarget: null,
- explosiveProps.postExplosionSpawnThingDef, explosiveProps.postExplosionSpawnChance,
- explosiveProps.postExplosionSpawnThingCount, explosiveProps.applyDamageToExplosionCellsNeighbors,
- explosiveProps.preExplosionSpawnThingDef, explosiveProps.preExplosionSpawnChance,
- explosiveProps.preExplosionSpawnThingCount, explosiveProps.chanceToStartFire,
- explosiveProps.damageFalloff, direction: null, ignoredThings: null);
+ GenExplosion.DoExplosion(
+ center: pos,
+ map,
+ explosiveProps.
+ explosiveRadius,
+ explosiveProps.explosiveDamageType,
+ instigator,
+ explosiveProps.damageAmountBase,
+ explosiveProps.armorPenetrationBase,
+ explosiveProps.explosionSound,
+ weapon: null,
+ projectile: null,
+ intendedTarget: null,
+ explosiveProps.postExplosionSpawnThingDef,
+ explosiveProps.postExplosionSpawnChance,
+ explosiveProps.postExplosionSpawnThingCount,
+ explosiveProps.postExplosionGasType,
+ explosiveProps.applyDamageToExplosionCellsNeighbors,
+ explosiveProps.preExplosionSpawnThingDef,
+ explosiveProps.preExplosionSpawnChance,
+ explosiveProps.preExplosionSpawnThingCount,
+ explosiveProps.chanceToStartFire,
+ explosiveProps.damageFalloff,
+ direction: null,
+ ignoredThings: null
+ );
}
if (damageAbsorbedPercent < 1f && target != instigator && !target.Dead && !target.Downed && target.Spawned)
diff --git a/Source/AllModdingComponents/JecsTools/Projectile_Laser.cs b/Source/AllModdingComponents/JecsTools/Projectile_Laser.cs
index 492d9b11..1631fec7 100644
--- a/Source/AllModdingComponents/JecsTools/Projectile_Laser.cs
+++ b/Source/AllModdingComponents/JecsTools/Projectile_Laser.cs
@@ -56,13 +56,29 @@ protected virtual void Explode(Thing hitThing, bool destroy = false)
new TargetInfo(targetPosition, map));
effecter.Cleanup();
}
- GenExplosion.DoExplosion(targetPosition, map, def.projectile.explosionRadius, def.projectile.damageDef,
- launcher, def.projectile.GetDamageAmount(1f), 0f, def.projectile.soundExplode, equipmentDef, def, null,
- def.projectile.postExplosionSpawnThingDef, def.projectile.postExplosionSpawnChance,
- def.projectile.postExplosionSpawnThingCount, def.projectile.applyDamageToExplosionCellsNeighbors,
- def.projectile.preExplosionSpawnThingDef, def.projectile.preExplosionSpawnChance,
- def.projectile.preExplosionSpawnThingCount, def.projectile.explosionChanceToStartFire,
- def.projectile.explosionDamageFalloff);
+ GenExplosion.DoExplosion(
+ targetPosition,
+ map,
+ def.projectile.explosionRadius,
+ def.projectile.damageDef,
+ launcher,
+ def.projectile.GetDamageAmount(1f),
+ 0f,
+ def.projectile.soundExplode,
+ equipmentDef,
+ def,
+ null,
+ def.projectile.postExplosionSpawnThingDef,
+ def.projectile.postExplosionSpawnChance,
+ def.projectile.postExplosionSpawnThingCount,
+ def.projectile.postExplosionGasType,
+ def.projectile.applyDamageToExplosionCellsNeighbors,
+ def.projectile.preExplosionSpawnThingDef,
+ def.projectile.preExplosionSpawnChance,
+ def.projectile.preExplosionSpawnThingCount,
+ def.projectile.explosionChanceToStartFire,
+ def.projectile.explosionDamageFalloff
+ );
}
public override void SpawnSetup(Map map, bool blabla)
@@ -411,7 +427,7 @@ protected void ImpactSomething()
///
/// Impacts a pawn/object or the ground.
///
- protected override void Impact(Thing hitThing)
+ protected override void Impact(Thing hitThing, bool blockedByShield = false)
{
if (Def.createsExplosion)
{
diff --git a/Source/JecsTools.sln b/Source/JecsTools.sln
index 3fba437d..1b508d86 100755
--- a/Source/JecsTools.sln
+++ b/Source/JecsTools.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.30104.148
+# Visual Studio Version 17
+VisualStudioVersion = 17.1.32210.238
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CompAbilityUser", "AllModdingComponents\CompAbilityUser\CompAbilityUser.csproj", "{417B8649-7A66-4580-8C75-473E46DA9C7A}"
EndProject
@@ -54,80 +54,154 @@ Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
RW1.3|Any CPU = RW1.3|Any CPU
RW1.3Unstable|Any CPU = RW1.3Unstable|Any CPU
+ RW1.4|Any CPU = RW1.4|Any CPU
+ RW1.4Unstable|Any CPU = RW1.4Unstable|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{417B8649-7A66-4580-8C75-473E46DA9C7A}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{417B8649-7A66-4580-8C75-473E46DA9C7A}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{417B8649-7A66-4580-8C75-473E46DA9C7A}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{417B8649-7A66-4580-8C75-473E46DA9C7A}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {417B8649-7A66-4580-8C75-473E46DA9C7A}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {417B8649-7A66-4580-8C75-473E46DA9C7A}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {417B8649-7A66-4580-8C75-473E46DA9C7A}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {417B8649-7A66-4580-8C75-473E46DA9C7A}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{EC1AEA45-45FE-4A6A-A835-81B289E03BC9}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{EC1AEA45-45FE-4A6A-A835-81B289E03BC9}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{EC1AEA45-45FE-4A6A-A835-81B289E03BC9}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{EC1AEA45-45FE-4A6A-A835-81B289E03BC9}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {EC1AEA45-45FE-4A6A-A835-81B289E03BC9}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {EC1AEA45-45FE-4A6A-A835-81B289E03BC9}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {EC1AEA45-45FE-4A6A-A835-81B289E03BC9}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {EC1AEA45-45FE-4A6A-A835-81B289E03BC9}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{4A2FA470-0CA5-442B-B04D-2C4A62859CA7}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{4A2FA470-0CA5-442B-B04D-2C4A62859CA7}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{4A2FA470-0CA5-442B-B04D-2C4A62859CA7}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{4A2FA470-0CA5-442B-B04D-2C4A62859CA7}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {4A2FA470-0CA5-442B-B04D-2C4A62859CA7}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {4A2FA470-0CA5-442B-B04D-2C4A62859CA7}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {4A2FA470-0CA5-442B-B04D-2C4A62859CA7}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {4A2FA470-0CA5-442B-B04D-2C4A62859CA7}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{05E24FAB-C6BF-43B5-BF69-B92AA38338CA}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{05E24FAB-C6BF-43B5-BF69-B92AA38338CA}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{05E24FAB-C6BF-43B5-BF69-B92AA38338CA}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{05E24FAB-C6BF-43B5-BF69-B92AA38338CA}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {05E24FAB-C6BF-43B5-BF69-B92AA38338CA}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {05E24FAB-C6BF-43B5-BF69-B92AA38338CA}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {05E24FAB-C6BF-43B5-BF69-B92AA38338CA}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {05E24FAB-C6BF-43B5-BF69-B92AA38338CA}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{CF56EA3A-AEC6-4817-BF46-A886FBEAA49B}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{CF56EA3A-AEC6-4817-BF46-A886FBEAA49B}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{CF56EA3A-AEC6-4817-BF46-A886FBEAA49B}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{CF56EA3A-AEC6-4817-BF46-A886FBEAA49B}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {CF56EA3A-AEC6-4817-BF46-A886FBEAA49B}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {CF56EA3A-AEC6-4817-BF46-A886FBEAA49B}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {CF56EA3A-AEC6-4817-BF46-A886FBEAA49B}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {CF56EA3A-AEC6-4817-BF46-A886FBEAA49B}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{08E20D0E-4493-4DFE-9212-DEC323F26E89}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{08E20D0E-4493-4DFE-9212-DEC323F26E89}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{08E20D0E-4493-4DFE-9212-DEC323F26E89}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{08E20D0E-4493-4DFE-9212-DEC323F26E89}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {08E20D0E-4493-4DFE-9212-DEC323F26E89}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {08E20D0E-4493-4DFE-9212-DEC323F26E89}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {08E20D0E-4493-4DFE-9212-DEC323F26E89}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {08E20D0E-4493-4DFE-9212-DEC323F26E89}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{6EC26D07-B5A0-4075-8919-3B05AF74CE87}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{6EC26D07-B5A0-4075-8919-3B05AF74CE87}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{6EC26D07-B5A0-4075-8919-3B05AF74CE87}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{6EC26D07-B5A0-4075-8919-3B05AF74CE87}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {6EC26D07-B5A0-4075-8919-3B05AF74CE87}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {6EC26D07-B5A0-4075-8919-3B05AF74CE87}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {6EC26D07-B5A0-4075-8919-3B05AF74CE87}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {6EC26D07-B5A0-4075-8919-3B05AF74CE87}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{6ADE9377-5108-4C79-A3E8-034A7EBCC37F}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{6ADE9377-5108-4C79-A3E8-034A7EBCC37F}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{6ADE9377-5108-4C79-A3E8-034A7EBCC37F}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{6ADE9377-5108-4C79-A3E8-034A7EBCC37F}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {6ADE9377-5108-4C79-A3E8-034A7EBCC37F}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {6ADE9377-5108-4C79-A3E8-034A7EBCC37F}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {6ADE9377-5108-4C79-A3E8-034A7EBCC37F}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {6ADE9377-5108-4C79-A3E8-034A7EBCC37F}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{9BECA870-0C2F-4F40-BEA1-6E99D68F9EDF}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{9BECA870-0C2F-4F40-BEA1-6E99D68F9EDF}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{9BECA870-0C2F-4F40-BEA1-6E99D68F9EDF}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{9BECA870-0C2F-4F40-BEA1-6E99D68F9EDF}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {9BECA870-0C2F-4F40-BEA1-6E99D68F9EDF}.RW1.4|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
+ {9BECA870-0C2F-4F40-BEA1-6E99D68F9EDF}.RW1.4|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {9BECA870-0C2F-4F40-BEA1-6E99D68F9EDF}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {9BECA870-0C2F-4F40-BEA1-6E99D68F9EDF}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{106BF102-0379-41CF-9C5D-E21AAC5F051B}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{106BF102-0379-41CF-9C5D-E21AAC5F051B}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{106BF102-0379-41CF-9C5D-E21AAC5F051B}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{106BF102-0379-41CF-9C5D-E21AAC5F051B}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {106BF102-0379-41CF-9C5D-E21AAC5F051B}.RW1.4|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
+ {106BF102-0379-41CF-9C5D-E21AAC5F051B}.RW1.4|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {106BF102-0379-41CF-9C5D-E21AAC5F051B}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {106BF102-0379-41CF-9C5D-E21AAC5F051B}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{4074F652-2FDA-41D0-A631-F6C83A2351F1}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{4074F652-2FDA-41D0-A631-F6C83A2351F1}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{4074F652-2FDA-41D0-A631-F6C83A2351F1}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{4074F652-2FDA-41D0-A631-F6C83A2351F1}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {4074F652-2FDA-41D0-A631-F6C83A2351F1}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {4074F652-2FDA-41D0-A631-F6C83A2351F1}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {4074F652-2FDA-41D0-A631-F6C83A2351F1}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {4074F652-2FDA-41D0-A631-F6C83A2351F1}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{4FC16277-5CB6-4A78-90FB-27F09888708A}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{4FC16277-5CB6-4A78-90FB-27F09888708A}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{4FC16277-5CB6-4A78-90FB-27F09888708A}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{4FC16277-5CB6-4A78-90FB-27F09888708A}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {4FC16277-5CB6-4A78-90FB-27F09888708A}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {4FC16277-5CB6-4A78-90FB-27F09888708A}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {4FC16277-5CB6-4A78-90FB-27F09888708A}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {4FC16277-5CB6-4A78-90FB-27F09888708A}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{947FF025-5DE9-4475-8779-4E9B02D06FB7}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{947FF025-5DE9-4475-8779-4E9B02D06FB7}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{947FF025-5DE9-4475-8779-4E9B02D06FB7}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{947FF025-5DE9-4475-8779-4E9B02D06FB7}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {947FF025-5DE9-4475-8779-4E9B02D06FB7}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {947FF025-5DE9-4475-8779-4E9B02D06FB7}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {947FF025-5DE9-4475-8779-4E9B02D06FB7}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {947FF025-5DE9-4475-8779-4E9B02D06FB7}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{29E2AEA4-3154-42DF-87CF-AEAFF042F2E0}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{29E2AEA4-3154-42DF-87CF-AEAFF042F2E0}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{29E2AEA4-3154-42DF-87CF-AEAFF042F2E0}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{29E2AEA4-3154-42DF-87CF-AEAFF042F2E0}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {29E2AEA4-3154-42DF-87CF-AEAFF042F2E0}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {29E2AEA4-3154-42DF-87CF-AEAFF042F2E0}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {29E2AEA4-3154-42DF-87CF-AEAFF042F2E0}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {29E2AEA4-3154-42DF-87CF-AEAFF042F2E0}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{9A3BF1D4-6693-481F-BBF1-3D66AFD8BE6C}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{9A3BF1D4-6693-481F-BBF1-3D66AFD8BE6C}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{9A3BF1D4-6693-481F-BBF1-3D66AFD8BE6C}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{9A3BF1D4-6693-481F-BBF1-3D66AFD8BE6C}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {9A3BF1D4-6693-481F-BBF1-3D66AFD8BE6C}.RW1.4|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
+ {9A3BF1D4-6693-481F-BBF1-3D66AFD8BE6C}.RW1.4|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {9A3BF1D4-6693-481F-BBF1-3D66AFD8BE6C}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {9A3BF1D4-6693-481F-BBF1-3D66AFD8BE6C}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{CE293DBE-D76A-4F24-A086-42051996698D}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{CE293DBE-D76A-4F24-A086-42051996698D}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{CE293DBE-D76A-4F24-A086-42051996698D}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{CE293DBE-D76A-4F24-A086-42051996698D}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {CE293DBE-D76A-4F24-A086-42051996698D}.RW1.4|Any CPU.ActiveCfg = RW1.4|Any CPU
+ {CE293DBE-D76A-4F24-A086-42051996698D}.RW1.4|Any CPU.Build.0 = RW1.4|Any CPU
+ {CE293DBE-D76A-4F24-A086-42051996698D}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {CE293DBE-D76A-4F24-A086-42051996698D}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.RW1.4|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
+ {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.RW1.4|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
{CB5B70DA-38FB-4C54-A816-7112CA045235}.RW1.3|Any CPU.ActiveCfg = RW1.3|Any CPU
{CB5B70DA-38FB-4C54-A816-7112CA045235}.RW1.3|Any CPU.Build.0 = RW1.3|Any CPU
{CB5B70DA-38FB-4C54-A816-7112CA045235}.RW1.3Unstable|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
{CB5B70DA-38FB-4C54-A816-7112CA045235}.RW1.3Unstable|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {CB5B70DA-38FB-4C54-A816-7112CA045235}.RW1.4|Any CPU.ActiveCfg = RW1.3Unstable|Any CPU
+ {CB5B70DA-38FB-4C54-A816-7112CA045235}.RW1.4|Any CPU.Build.0 = RW1.3Unstable|Any CPU
+ {CB5B70DA-38FB-4C54-A816-7112CA045235}.RW1.4Unstable|Any CPU.ActiveCfg = RW1.4Unstable|Any CPU
+ {CB5B70DA-38FB-4C54-A816-7112CA045235}.RW1.4Unstable|Any CPU.Build.0 = RW1.4Unstable|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/updateinfo b/updateinfo
new file mode 100644
index 00000000..f3cbf58a
--- /dev/null
+++ b/updateinfo
@@ -0,0 +1,38 @@
+==============================
+==========Steam Format========
+==============================
+
+JecsTools Update
+v1.3.0.4 (07-31-2021)
+====================
+
+Workaround for mod lists that contain other mods with an outdated copy of CompOversizedWeapon that's loaded before ours -lbmaian
+--------------------
+
+Download now on...
+- Patreon: https://www.patreon.com/posts/54071148
+- GitHub: https://github.com/jecrell/JecsTools
+- Steam: https://steamcommunity.com/sharedfiles/filedetails/?id=932008009
+Discuss the mod on...
+- Discord: https://discord.gg/AaVFA7V
+- Ludeon forums: https://ludeon.com/forums/index.php?topic=32868.0
+
+==============================
+===========BBS Format=========
+==============================
+
+[center][b][glow=red,2,300][size=18pt]JecsTools[/size][/glow][/b]
+[img width=260]https://raw.githubusercontent.com/jecrell/JecsTools/master/About/Preview.png[/img]
+[hr]
+[b]JecsTools
+Version: 1.3.0.4
+Updated: 07-31-2021
+Description: [color=orange]Workaround for mod lists that contain other mods with an outdated copy of CompOversizedWeapon that's loaded before ours -lbmaian[/color]
+[hr]
+[b]Download now on...[/b]
+[url=https://www.patreon.com/posts/54071148]Patreon[/url]
+[url=https://github.com/jecrell/JecsTools]GitHub[/url]
+[url=https://steamcommunity.com/sharedfiles/filedetails/?id=932008009]Steam[/url]
+[b]Discuss the mod on...[/b]
+[url=https://discord.gg/AaVFA7V]Discord[/url]
+[url=https://ludeon.com/forums/index.php?topic=32868.0]Ludeon[/url]